summaryrefslogtreecommitdiffstats
path: root/contrib/binutils/gas/dwarf2dbg.c
diff options
context:
space:
mode:
authoremaste <emaste@FreeBSD.org>2015-09-24 19:33:35 +0000
committeremaste <emaste@FreeBSD.org>2015-09-24 19:33:35 +0000
commit4521ad4bf5524ea1b55dd531bdbcaba18c818010 (patch)
tree0fe1d19eba4c487550ea3d3cb8197245b225a07b /contrib/binutils/gas/dwarf2dbg.c
parent7a28992cc53c78b019f0f84e8f42f280c63eec7a (diff)
downloadFreeBSD-src-4521ad4bf5524ea1b55dd531bdbcaba18c818010.zip
FreeBSD-src-4521ad4bf5524ea1b55dd531bdbcaba18c818010.tar.gz
MFC r256692: Fix .debug_line prologue header length calculation for 64-bit DWARF
The header_length field is the number of bytes following the field to the first byte of the line number program. The hard-coded constants previously here (4 + 2 + 4) were correct only for 32-bit DWARF. Sponsored by: DARPA, AFRL
Diffstat (limited to 'contrib/binutils/gas/dwarf2dbg.c')
-rw-r--r--contrib/binutils/gas/dwarf2dbg.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/contrib/binutils/gas/dwarf2dbg.c b/contrib/binutils/gas/dwarf2dbg.c
index 671a9b0..528f676 100644
--- a/contrib/binutils/gas/dwarf2dbg.c
+++ b/contrib/binutils/gas/dwarf2dbg.c
@@ -1271,6 +1271,7 @@ out_debug_line (segT line_seg)
symbolS *line_end;
struct line_seg *s;
enum dwarf2_format d2f;
+ int sizeof_initial_length;
int sizeof_offset;
subseg_set (line_seg, 0);
@@ -1287,27 +1288,24 @@ out_debug_line (segT line_seg)
d2f = DWARF2_FORMAT ();
if (d2f == dwarf2_format_32bit)
{
- expr.X_add_number = -4;
- emit_expr (&expr, 4);
- sizeof_offset = 4;
+ sizeof_initial_length = sizeof_offset = 4;
}
else if (d2f == dwarf2_format_64bit)
{
- expr.X_add_number = -12;
- out_four (-1);
- emit_expr (&expr, 8);
+ sizeof_initial_length = 12;
sizeof_offset = 8;
+ out_four (-1);
}
else if (d2f == dwarf2_format_64bit_irix)
{
- expr.X_add_number = -8;
- emit_expr (&expr, 8);
- sizeof_offset = 8;
+ sizeof_initial_length = sizeof_offset = 8;
}
else
{
as_fatal (_("internal error: unknown dwarf2 format"));
}
+ expr.X_add_number = -sizeof_initial_length;
+ emit_expr (&expr, sizeof_offset);
/* Version. */
out_two (2);
@@ -1316,7 +1314,7 @@ out_debug_line (segT line_seg)
expr.X_op = O_subtract;
expr.X_add_symbol = prologue_end;
expr.X_op_symbol = line_start;
- expr.X_add_number = - (4 + 2 + 4);
+ expr.X_add_number = - (sizeof_initial_length + 2 + sizeof_offset);
emit_expr (&expr, sizeof_offset);
/* Parameters of the state machine. */
OpenPOWER on IntegriCloud