Skip to content

codeGen: Enable Perf profiling by producing local symbols for module-internal functions

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

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.

TODO

  • Measure object size overhead
  • Determine whether the special case in Outputable Name is worthwhile; maybe we should just always emit the long-form label
  • Perhaps this should be enabled by -g1?
Edited by Ben Gamari

Merge request reports