From 92846e72ad2df2adc38e1e1db776576cf74db2df Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Fri, 24 Apr 2009 18:31:29 +0000 Subject: [PATCH] * NEWS: Add item about discriminator support. * dwarf2dbg.h (struct dwarf2_line_info): Add discriminator field. * dwarf2dbg.c (current): Add discriminator field. (dwarf2_where): Copy discriminator value. (dwarf2_consume_line_info): Set discriminator to 0. (dwarf2_directive_loc): Process discriminator sub-op. (out_leb128): New function. (process_entries): Output DW_LNE_set_discriminator. * doc/as.texinfo: Add discriminator operand to .loc directive. * testsuite/gas/lns/lns-common-1.d: Add test for discriminator. * testsuite/gas/lns/lns-common-1.s: Likewise. --- gas/ChangeLog | 14 +++++++++++ gas/NEWS | 3 +++ gas/doc/as.texinfo | 4 +++ gas/dwarf2dbg.c | 37 ++++++++++++++++++++++++++-- gas/dwarf2dbg.h | 1 + gas/testsuite/gas/lns/lns-common-1.d | 2 ++ gas/testsuite/gas/lns/lns-common-1.s | 2 ++ 7 files changed, 61 insertions(+), 2 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 70b9a1e5d69..ca8122769aa 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,17 @@ +2009-04-24 Cary Coutant + + * NEWS: Add item about discriminator support. + * dwarf2dbg.h (struct dwarf2_line_info): Add discriminator field. + * dwarf2dbg.c (current): Add discriminator field. + (dwarf2_where): Copy discriminator value. + (dwarf2_consume_line_info): Set discriminator to 0. + (dwarf2_directive_loc): Process discriminator sub-op. + (out_leb128): New function. + (process_entries): Output DW_LNE_set_discriminator. + * doc/as.texinfo: Add discriminator operand to .loc directive. + * testsuite/gas/lns/lns-common-1.d: Add test for discriminator. + * testsuite/gas/lns/lns-common-1.s: Likewise. + 2009-04-22 Nathan Sidwell * config/tc-mips.c (macro_end, md_convert_frag): Use '%s' for diff --git a/gas/NEWS b/gas/NEWS index d4a69189fa6..e94438f0c00 100644 --- a/gas/NEWS +++ b/gas/NEWS @@ -1,5 +1,8 @@ -*- text -*- +* Add support for the new discriminator column in the DWARF line table, + with a discriminator operand for the .loc directive. + * Add support for Sunplus score architecture. * Add support for Lattice Mico32 (lm32) architecture. diff --git a/gas/doc/as.texinfo b/gas/doc/as.texinfo index f43e5380b25..682b368a6b6 100644 --- a/gas/doc/as.texinfo +++ b/gas/doc/as.texinfo @@ -5108,6 +5108,10 @@ either 0 or 1. This directive will set the @code{isa} register in the @code{.debug_line} state machine to @var{value}, which must be an unsigned integer. +@item discriminator @var{value} +This directive will set the @code{discriminator} register in the @code{.debug_line} +state machine to @var{value}, which must be an unsigned integer. + @end table @node Loc_mark_labels diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c index f332865d5a6..48a1ae7ba61 100644 --- a/gas/dwarf2dbg.c +++ b/gas/dwarf2dbg.c @@ -25,7 +25,8 @@ .file FILENO "file.c" .loc FILENO LINENO [COLUMN] [basic_block] [prologue_end] \ - [epilogue_begin] [is_stmt VALUE] [isa VALUE] + [epilogue_begin] [is_stmt VALUE] [isa VALUE] \ + [discriminator VALUE] */ #include "as.h" @@ -194,7 +195,8 @@ bfd_boolean dwarf2_loc_mark_labels; /* Current location as indicated by the most recent .loc directive. */ static struct dwarf2_line_info current = { 1, 1, 0, 0, - DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0 + DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0, + 0 }; /* The size of an address on the target. */ @@ -331,6 +333,7 @@ dwarf2_where (struct dwarf2_line_info *line) line->column = 0; line->flags = DWARF2_FLAG_IS_STMT; line->isa = current.isa; + line->discriminator = current.discriminator; } else *line = current; @@ -379,6 +382,7 @@ dwarf2_consume_line_info (void) current.flags &= ~(DWARF2_FLAG_BASIC_BLOCK | DWARF2_FLAG_PROLOGUE_END | DWARF2_FLAG_EPILOGUE_BEGIN); + current.discriminator = 0; } /* Called for each (preferably code) label. If dwarf2_loc_mark_labels @@ -581,6 +585,7 @@ dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED) current.filenum = filenum; current.line = line; + current.discriminator = 0; #ifndef NO_LISTING if (listing) @@ -659,6 +664,18 @@ dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED) return; } } + else if (strcmp (p, "discriminator") == 0) + { + *input_line_pointer = c; + value = get_absolute_expression (); + if (value >= 0) + current.discriminator = value; + else + { + as_bad (_("discriminator less than zero")); + return; + } + } else { as_bad (_("unknown .loc sub-directive `%s'"), p); @@ -748,6 +765,14 @@ out_uleb128 (addressT value) output_leb128 (frag_more (sizeof_leb128 (value, 0)), value, 0); } +/* Emit a signed "little-endian base 128" number. */ + +static void +out_leb128 (addressT value) +{ + output_leb128 (frag_more (sizeof_leb128 (value, 1)), value, 1); +} + /* Emit a tuple for .debug_abbrev. */ static inline void @@ -1208,6 +1233,14 @@ process_entries (segT seg, struct line_entry *e) out_uleb128 (column); } + if (e->loc.discriminator != 0) + { + out_opcode (DW_LNS_extended_op); + out_leb128 (1 + sizeof_leb128 (e->loc.discriminator, 0)); + out_opcode (DW_LNE_set_discriminator); + out_uleb128 (e->loc.discriminator); + } + if (isa != e->loc.isa) { isa = e->loc.isa; diff --git a/gas/dwarf2dbg.h b/gas/dwarf2dbg.h index ee943ce3ea2..3295bd85a9d 100644 --- a/gas/dwarf2dbg.h +++ b/gas/dwarf2dbg.h @@ -34,6 +34,7 @@ struct dwarf2_line_info { unsigned int column; unsigned int isa; unsigned int flags; + unsigned int discriminator; }; /* Implements the .file FILENO "FILENAME" directive. FILENO can be 0 diff --git a/gas/testsuite/gas/lns/lns-common-1.d b/gas/testsuite/gas/lns/lns-common-1.d index 81b4e9f2e62..e28896f37d8 100644 --- a/gas/testsuite/gas/lns/lns-common-1.d +++ b/gas/testsuite/gas/lns/lns-common-1.d @@ -21,6 +21,8 @@ Raw dump of debug contents of section \.debug_line: Special opcode .*: advance Address by .* to .* and Line by 1 to 6 Set is_stmt to 1 Special opcode .*: advance Address by .* to .* and Line by 1 to 7 + Extended opcode 4: set Discriminator to 1 + Special opcode .*: advance Address by .* to .* and Line by 0 to 7 Advance PC by .* to .* Extended opcode 1: End of Sequence #... diff --git a/gas/testsuite/gas/lns/lns-common-1.s b/gas/testsuite/gas/lns/lns-common-1.s index f1d590b457b..2fef2bd5d10 100644 --- a/gas/testsuite/gas/lns/lns-common-1.s +++ b/gas/testsuite/gas/lns/lns-common-1.s @@ -13,3 +13,5 @@ nop .loc 1 7 is_stmt 1 nop + .loc 1 7 discriminator 1 + nop -- 2.30.2