diff options
author | Ben Gamari <ben@smart-cactus.org> | 2019-12-27 12:38:27 -0500 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2020-11-11 03:20:00 -0500 |
commit | c6264a2d652517954b7cd076c7bc4487ed17c97d (patch) | |
tree | bd11c475186c63a147f5b58958458c9fc4eef68e /compiler/GHC/CmmToAsm.hs | |
parent | 6e23695e7d84aa248e7ca20bdb8d133f9b356548 (diff) | |
download | haskell-c6264a2d652517954b7cd076c7bc4487ed17c97d.tar.gz |
codeGen: Produce local symbols for module-internal functions
It turns out that some important native debugging/profiling tools (e.g.
perf) rely only 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). For instance, `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).
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-internal-symbols` flag.
With this `perf record` can finally be used against Haskell executables.
Even more, with `-g3` `perf annotate` provides inline source code.
Diffstat (limited to 'compiler/GHC/CmmToAsm.hs')
-rw-r--r-- | compiler/GHC/CmmToAsm.hs | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/compiler/GHC/CmmToAsm.hs b/compiler/GHC/CmmToAsm.hs index af358d5dee..223eb33fb5 100644 --- a/compiler/GHC/CmmToAsm.hs +++ b/compiler/GHC/CmmToAsm.hs @@ -1190,5 +1190,6 @@ initNCGConfig dflags this_mod = NCGConfig , ncgDwarfEnabled = debugLevel dflags > 0 , ncgDwarfUnwindings = debugLevel dflags >= 1 , ncgDwarfStripBlockInfo = debugLevel dflags < 2 -- We strip out block information when running with -g0 or -g1. + , ncgExposeInternalSymbols = gopt Opt_ExposeInternalSymbols dflags } |