summaryrefslogtreecommitdiff
path: root/rts
diff options
context:
space:
mode:
authorBen Gamari <bgamari.foss@gmail.com>2017-02-07 22:49:06 -0500
committerBen Gamari <ben@smart-cactus.org>2017-02-08 10:25:59 -0500
commit3eb737ee3f900f256a7474b199a4ab40178a8cac (patch)
treec29fff652630ff28224c730faae7a4ace67f7049 /rts
parent421308ef6ae3987f8077c6bfe1d9a6a03e53458c (diff)
downloadhaskell-3eb737ee3f900f256a7474b199a4ab40178a8cac.tar.gz
Generalize CmmUnwind and pass unwind information through NCG
As discussed in D1532, Trac Trac #11337, and Trac Trac #11338, the stack unwinding information produced by GHC is currently quite approximate. Essentially we assume that register values do not change at all within a basic block. While this is somewhat true in normal Haskell code, blocks containing foreign calls often break this assumption. This results in unreliable call stacks, especially in the code containing foreign calls. This is worse than it sounds as unreliable unwinding information can at times result in segmentation faults. This patch set attempts to improve this situation by tracking unwinding information with finer granularity. By dispensing with the assumption of one unwinding table per block, we allow the compiler to accurately represent the areas surrounding foreign calls. Towards this end we generalize the representation of unwind information in the backend in three ways, * Multiple CmmUnwind nodes can occur per block * CmmUnwind nodes can now carry unwind information for multiple registers (while not strictly necessary; this makes emitting unwinding information a bit more convenient in the compiler) * The NCG backend is given an opportunity to modify the unwinding records since it may need to make adjustments due to, for instance, native calling convention requirements for foreign calls (see #11353). This sets the stage for resolving #11337 and #11338. Test Plan: Validate Reviewers: scpmw, simonmar, austin, erikd Subscribers: qnikst, thomie Differential Revision: https://phabricator.haskell.org/D2741
Diffstat (limited to 'rts')
-rw-r--r--rts/StgStartup.cmm4
1 files changed, 2 insertions, 2 deletions
diff --git a/rts/StgStartup.cmm b/rts/StgStartup.cmm
index aad4fab139..a3a75d8211 100644
--- a/rts/StgStartup.cmm
+++ b/rts/StgStartup.cmm
@@ -70,8 +70,8 @@ INFO_TABLE_RET(stg_stop_thread, STOP_FRAME,
for us by StgRun.
*/
#ifdef x86_64_HOST_ARCH
- unwind MachSp = MachSp + RESERVED_C_STACK_BYTES + 0x38 + 8
- unwind UnwindReturnReg = W_[MachSp + RESERVED_C_STACK_BYTES + 0x38]
+ unwind MachSp = MachSp + RESERVED_C_STACK_BYTES + 0x38 + 8,
+ UnwindReturnReg = W_[MachSp + RESERVED_C_STACK_BYTES + 0x38];
#endif
Sp = Sp + SIZEOF_StgStopFrame - WDS(2);