Dwarf: Ensure block length is encoded correctly
authorBen Gamari <bgamari.foss@gmail.com>
Fri, 25 Sep 2015 10:51:54 +0000 (12:51 +0200)
committerBen Gamari <ben@smart-cactus.org>
Fri, 25 Sep 2015 10:52:04 +0000 (12:52 +0200)
This is supposed to be encoded with ULEB128 which the previous
implementation would only guarranty with short lengths. This likely
holds in nearly all cases, but I'd really rather not take changes.

I fix this using the `.uleb128` directive. I'm not certain that this is
portable across assemblers but it makes this quite straightforward and
at the moment I value correctness over portability.

Test Plan: Compare implementation to DWARF spec

Reviewers: scpmw, austin

Reviewed By: austin

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D1220

compiler/nativeGen/Dwarf/Types.hs

index 846f8dc..a2d07b8 100644 (file)
@@ -383,7 +383,7 @@ 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 ptext (sLit "\t.byte 1f-.-1") $$
+    in ptext (sLit "\t.uleb128 1f-.-1") $$ -- DW_FORM_block length
        pprE expr $$
        ptext (sLit "1:")