Mapping virtual block addresses to IR blocks at runtime

Hi everyone,

We are currently building a tracing JIT based on LLVM and are trying to map
virtual block addresses back to IR basic blocks (we are using ExecutionEngine
to emit code at runtime).

We have experimented with several flags, for example:
clang++ -fbasic-block-sections=labels -fno-discard-value-names -O0 main.cpp

This gives a binary with a `.llvm_bb_addr_map` section, containing the offsets
of machine basic blocks. However, we seem to lack sufficient information to
map the machine basic block address back to the corresponding IR block.

The documentation at
seems to suggest that this is possible:

This section stores the binary address of basic blocks along with other related
metadata. This information can be used to map binary profiles (like perf
profiles) directly to machine basic blocks.

Furthermore, a comment in BasicBlockSections.cpp says:

With -fbasic-block-sections=labels, we emit the offsets of BB addresses of
every function into the .llvm_bb_addr_map section. Along with the function
symbols, this allows for mapping of virtual addresses in PMU profiles back to
the corresponding basic blocks. This logic is implemented in AsmPrinter. This
pass only assigns the BBSectionType of every function to ``labels``.

If we use `-fbasic-block-sections=all` LLVM puts each basic block into its own
section and gives it a symbol which we believe can be used to map them back to
IR basic blocks. However, putting basic blocks in separate sections likely
leads to worse performance due to the extra jumps (falling thru sections isn't

In summary, what we'd like LLVM to annotate basic blocks in the binary with
symbol names which can be mapped back to their corresponding IR blocks, but
without changing the section structure of the binary. Is this possible?