summaryrefslogtreecommitdiff
path: root/compiler/nativeGen
diff options
context:
space:
mode:
authorBertram Felgenhauer <int-e@gmx.de>2018-05-03 18:03:53 +0300
committerÖmer Sinan Ağacan <omeragacan@gmail.com>2018-05-03 18:04:04 +0300
commit358b508051333882d4099acca8f269e6fb2b7d65 (patch)
treec176b8379495e1502ce40c31361f3df7b07de0d2 /compiler/nativeGen
parent5de0be8d7ee48eac0af42387eb40b5a5a9b08a35 (diff)
downloadhaskell-358b508051333882d4099acca8f269e6fb2b7d65.tar.gz
Compute DW_FORM_block length correctly; also fixes #15068
Before this patch, the pprUnwindwExpr function computed the length of by the following assembly fragment: .uleb128 1f-.-1 <expression data> 1: That is, to compute the length, it takes the difference of the label 1 and the address of the .uleb128 directive, and subtracts 1. In #15068 it was reported that `as` from binutils 4.30 has trouble with evaluating the `.` part of the expression. However, there is actually a problem with the expression, if the length of the data ever becomes larger than 128: In that case, the .uleb128 directive will emit more than 1 byte, and the computed length will be wrong. The present patch changes the assembly fragment to use two labels, which fixes both these problems. .uleb128 2f-1f 1: <expression data> 2: Test Plan: validate Reviewers: bgamari, osa1 Reviewed By: bgamari Subscribers: thomie, carter GHC Trac Issues: #15068 Differential Revision: https://phabricator.haskell.org/D4654
Diffstat (limited to 'compiler/nativeGen')
-rw-r--r--compiler/nativeGen/Dwarf/Types.hs6
1 files changed, 4 insertions, 2 deletions
diff --git a/compiler/nativeGen/Dwarf/Types.hs b/compiler/nativeGen/Dwarf/Types.hs
index 23a2c920e7..579ed0d256 100644
--- a/compiler/nativeGen/Dwarf/Types.hs
+++ b/compiler/nativeGen/Dwarf/Types.hs
@@ -492,9 +492,11 @@ pprUnwindExpr spIsCFA expr
pprE (UwPlus u1 u2) = pprE u1 $$ pprE u2 $$ pprByte dW_OP_plus
pprE (UwMinus u1 u2) = pprE u1 $$ pprE u2 $$ pprByte dW_OP_minus
pprE (UwTimes u1 u2) = pprE u1 $$ pprE u2 $$ pprByte dW_OP_mul
- in text "\t.uleb128 1f-.-1" $$ -- DW_FORM_block length
+ in text "\t.uleb128 2f-1f" $$ -- DW_FORM_block length
+ -- computed as the difference of the following local labels 2: and 1:
+ text "1:" $$
pprE expr $$
- text "1:"
+ text "2:"
-- | Generate code for re-setting the unwind information for a
-- register to @undefined@