[GHC] #11353: DWARF call frame information incorrect in the presence of unsafe foreign calls

GHC ghc-devs at haskell.org
Sat Mar 26 14:05:48 UTC 2016


#11353: DWARF call frame information incorrect in the presence of unsafe foreign
calls
-------------------------------------+-------------------------------------
        Reporter:  bgamari           |                Owner:
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.2.1
       Component:  Compiler          |              Version:  7.10.3
  (CodeGen)                          |
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:  x86_64
 Type of failure:  Debugging         |  (amd64)
  information is incorrect           |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  #11338, #11337    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by bgamari):

 The problem is that you need both details from the code generator (to
 account for the unwind adjustments as described in this ticket) as well as
 the procedure's control flow graph (in order to push unwind information
 down to successor blocks).

 My current plan is,
  * Introduce a `UNWIND` pseudo-instruction
  * `CmmUnwind` nodes will be translated by the `UNWIND` instructions
  * Add a lazy field to `NEWBLOCK` which will capture the successors of the
 block
  * Introduce a pass after code generation which traverses the
 `[Instruction]` of each block and,
    * extract the `UNWIND` and `DELTA` instructions from a block's
 `[Instruction]` and use them to build a `LabelMap (UnwindTable,
 [SuccessorBlockId])` (the `SuccessorBlockId` being taken from the
 successors field of the block's `NEWBLOCK` instruction)
    * accumulate a `[BlockId]` to preserve the order in which we must emit
 unwinding tables (since they must be written in order of increasing
 address)
  * Introduce another pass of shape `LabelMap (UnwindTable,
 [SuccessorBlockId]) -> LabelMap UnwindTable` which pushes blocks' unwind
 tables "down" to their successors
  * Pass the resulting `UnwindTable`s to the existing unwinding table
 generation code

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11353#comment:6>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list