Incorrect .debug_line prologue header length for 64-bit DWARF
authorAlan Modra <amodra@gmail.com>
Fri, 28 Feb 2014 04:39:32 +0000 (15:09 +1030)
committerAlan Modra <amodra@gmail.com>
Fri, 28 Feb 2014 04:39:32 +0000 (15:09 +1030)
Don't be clever, calculate the length directly as the difference of
two symbols.

* dwarf2dbg.c (out_debug_line): Correct .debug_line header_length
field for 64-bit dwarf.

gas/ChangeLog
gas/dwarf2dbg.c

index 34698210a7b84932d267ffc06ef3518b4192fba0..09dd75749667dfd6136cc8b5190504c3618d9139 100644 (file)
@@ -1,3 +1,8 @@
+2014-02-28  Alan Modra  <amodra@gmail.com>
+
+       * dwarf2dbg.c (out_debug_line): Correct .debug_line header_length
+       field for 64-bit dwarf.
+
 2014-02-21  Ilya Tocar  <ilya.tocar@intel.com>
 
        * config/tc-i386.c (cpu_arch): Add .prefetchwt1.
index 6d6ee2dd1986874d0759add806a6e2c2a93095d8..ac6148fe7ec4c795b0031e5cd3ccba7ea0338add 100644 (file)
@@ -1515,7 +1515,7 @@ static void
 out_debug_line (segT line_seg)
 {
   expressionS exp;
-  symbolS *prologue_end;
+  symbolS *prologue_start, *prologue_end;
   symbolS *line_end;
   struct line_seg *s;
   int sizeof_offset;
@@ -1527,10 +1527,14 @@ out_debug_line (segT line_seg)
   out_two (DWARF2_LINE_VERSION);
 
   /* Length of the prologue following this length.  */
+  prologue_start = symbol_temp_make ();
   prologue_end = symbol_temp_make ();
+  exp.X_op = O_subtract;
   exp.X_add_symbol = prologue_end;
-  exp.X_add_number = - (4 + 2 + 4);
+  exp.X_op_symbol = prologue_start;
+  exp.X_add_number = 0;
   emit_expr (&exp, sizeof_offset);
+  symbol_set_value_now (prologue_start);
 
   /* Parameters of the state machine.  */
   out_byte (DWARF2_LINE_MIN_INSN_LENGTH);