Generate DWARF unwind information
authorPeter Wortmann <scpmw@leeds.ac.uk>
Wed, 10 Dec 2014 11:00:49 +0000 (12:00 +0100)
committerAustin Seipp <austin@well-typed.com>
Wed, 17 Dec 2014 00:34:08 +0000 (18:34 -0600)
commitedd6d676847b94648c18b7f3790852ab4043759d
tree2e45124f65b0b8872dbc5a9d871c26a103b35e65
parentcc481ec8657e0b91e2f8f9a9eeb3f9ee030635ae
Generate DWARF unwind information

This tells debuggers such as GDB how to "unwind" a program state,
which allows them to walk the stack up.

Notes:

* The code is quite general, perhaps unnecessarily so. Unless we get
  more unwind information, only the first case of pprSetUnwind will
  get used - and pprUnwindExpr and pprUndefUnwind will never be
  called. It just so happens that this is a point where we can get a
  lot of features cheaply, even if we don't use them.

* When determining what location to show for a return address, most
  debuggers check the map for "rip-1", assuming that's where the
  "call" instruction is. For tables-next-to-code, that happens to
  always be the end of an info table. We therefore cheat a bit here by
  shifting .debug_frame information so it covers the end of the info
  table, as well as generating a .loc directive for the info table
  data.

  Debuggers will still show the wrong label for the return address,
  though.  Haven't found a way around that one yet.

(From Phabricator D396)
compiler/nativeGen/Dwarf.hs
compiler/nativeGen/Dwarf/Constants.hs
compiler/nativeGen/Dwarf/Types.hs
compiler/nativeGen/X86/Ppr.hs