| # LLVM PC Sections Metadata |
| |
| ## Introduction |
| |
| PC Sections Metadata can be attached to instructions and functions, for which |
| addresses, viz. program counters (PCs), are to be emitted in specially encoded |
| binary sections. Metadata is assigned as an `MDNode` of the `MD_pcsections` |
| (`!pcsections`) kind; the following section describes the metadata format. |
| |
| ## Metadata Format |
| |
| An arbitrary number of interleaved `MDString` and constant operators can be |
| added, where a new `MDString` always denotes a section name, followed by an |
| arbitrary number of auxiliary constant data encoded along the PC of the |
| instruction or function. The first operator must be a `MDString` denoting the |
| first section. |
| |
| ```none |
| !0 = !{ |
| !"<section#1>" |
| [ , !1 ... ] |
| [ !"<section#2"> |
| [ , !2 ... ] |
| ... ] |
| } |
| !1 = !{ iXX <aux-consts#1>, ... } |
| !2 = !{ iXX <aux-consts#2>, ... } |
| ... |
| ``` |
| |
| The occurrence of `section#1`, `section#2`, ..., `section#N` in the |
| metadata causes the backend to emit the PC for the associated instruction or |
| function to all named sections. For each emitted PC in a section #N, the |
| constants `aux-consts#N` in the tuple `!N` will be emitted after the PC. |
| Multiple tuples with constant data may be provided after a section name string |
| (e.g. `!0 = !{"s1", !1, !2}`), and a single constant tuple may be reused for |
| different sections (e.g. `!0 = !{"s1", !1, "s2", !1}`). |
| |
| ## Binary Encoding |
| |
| *Instructions* result in emitting a single PC, and *functions* result in |
| emission of the start of the function and a 32-bit size. This is followed by |
| the auxiliary constants that followed the respective section name in the |
| `MD_pcsections` metadata. |
| |
| To avoid relocations in the final binary, each PC address stored at `entry` |
| is a relative relocation, computed as `pc - entry`. To decode, a user has to |
| compute `entry + *entry`. |
| |
| The size of each entry depends on the code model. With large and medium sized |
| code models, the entry size matches pointer size. For any smaller code model |
| the entry size is just 32 bits. |
| |
| ### Encoding Options |
| |
| Optional encoding options can be passed in the first `MDString` operator: |
| `<section>!<options>`. The following options are available: |
| |
| - `C` -- Compress constant integers of size 2-8 bytes as ULEB128; this |
| includes the function size (but excludes the PC entry). |
| |
| For example, `foo!C` will emit into section `foo` with all constants |
| encoded as ULEB128. |
| |
| ## Guarantees on Code Generation |
| |
| Attaching `!pcsections` metadata to LLVM IR instructions *shall not* affect |
| optimizations or code generation outside the requested PC sections. |
| |
| While relying on LLVM IR metadata to request PC sections makes the above |
| guarantee relatively trivial, propagation of metadata through the optimization |
| and code generation pipeline has the following guarantees. |
| |
| ### Metadata Propagation |
| |
| In general, LLVM *does not make any guarantees* about preserving IR metadata |
| (attached to an `Instruction`) through IR transformations. When using PC |
| sections metadata, this guarantee is unchanged, and `!pcsections` metadata is |
| remains *optional* until lowering to machine IR (MIR). |
| |
| ### Note for Code Generation |
| |
| As with other LLVM IR metadata, there are no requirements for LLVM IR |
| transformation passes to preserve `!pcsections` metadata, with the following |
| exceptions: |
| |
| - The `AtomicExpandPass` shall preserve `!pcsections` metadata |
| according to the below rules 1-4. |
| |
| When translating LLVM IR to MIR, the `!pcsections` metadata shall be copied |
| from the source `Instruction` to the target `MachineInstr` (set with |
| `MachineInstr::setPCSections()`). The instruction selectors and MIR |
| optimization passes shall preserve PC sections metadata as follows: |
| |
| 1. Replacements will preserve PC sections metadata of the replaced |
| instruction. |
| |
| 2. Duplications will preserve PC sections metadata of the copied |
| instruction. |
| |
| 3. Merging will preserve PC sections metadata of one of the two |
| instructions (no guarantee on which instruction's metadata is used). |
| |
| 4. Deletions will lose PC sections metadata. |
| |
| This is similar to debug info, and the `BuildMI()` helper provides a |
| convenient way to propagate debug info and `!pcsections` metadata in the |
| `MIMetadata` bundle. |
| |
| ### Note for Metadata Users |
| |
| Use cases for `!pcsections` metadata should either be fully tolerant to |
| missing metadata, or the passes inserting `!pcsections` metadata should run |
| *after* all LLVM IR optimization passes to preserve the metadata until being |
| translated to MIR. |