Commit 56812d6f authored by Bertram Felgenhauer's avatar Bertram Felgenhauer Committed by Ben Gamari

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>

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
	<expression data>

Test Plan: validate

Reviewers: bgamari, osa1

Reviewed By: bgamari

Subscribers: thomie, carter

GHC Trac Issues: #15068

Differential Revision:

(cherry picked from commit 358b5080)
parent e4e61f77
......@@ -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@
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment