| ========================= | |
| 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. | |
| .. code-block:: 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. |