Skip to content

nativeGen: Produce local symbols for module-internal functions (approach B)

Ben Gamari requested to merge wip/local-symbols-2 into master

This is another approach to !2378 (closed) which provides slightly more informative (e.g. module-qualified) local labels along with slightly less implementation impact

It turns out that some important native debugging/profiling tools (e.g. perf) rely solely on symbol tables for function name resolution (as opposed to using DWARF DIEs). However, previously GHC would emit temporary symbols (e.g. .La42b) to identify module-internal entities. Such symbols are dropped during linking and therefore not visible to runtime tools (in addition to having rather un-helpful unique names). As a result, perf report would often end up attributing all cost to the libc frame_dummy symbol since Haskell code was no covered by any proper symbol (see #17605 (closed)).

We now rather follow the model of C compilers and emit descriptively-named local symbols for module internal things. Since this will increase object file size this behavior can be disabled with the -fno-expose-all-symbols flag.

With this perf record can finally be used against Haskell executables. Even more, with -g3 perf annotate provides inline source code.

Edited by Ben Gamari

Merge request reports