This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: enhance .loc directive for dwarf3 special features


Like so.  Tested on i686, cris, and mips64.

Sorry, I mistakenly the cris and mips64 fixup mail from a machine
with a misconfigured mailer (and I know it beforehand, dammit),
and so they've vanished into the ether.  I could regenerate the
patches from cvs, but so could anyone else.  Since they're not
very interesting, I'll not bother.


r~


        * dwarf2dbg.c (dwarf2_where): Set line->isa.
        (dwarf2_set_isa): New.
        (dwarf2_directive_loc): Rearrange to allow all options on one line.
        * dwarf2dbg.h (dwarf2_set_isa): Declare.
        * doc/as.texinfo: Update .loc documentation.

        * gas/lns/lns-common-1.d: Don't match header or special opcode numbers.
        * gas/lns/lns-common-1.s: Update for syntax change.
        * gas/lns/lns-diag-1.[sl]: Likewise.

Index: dwarf2dbg.c
===================================================================
RCS file: /cvs/src/src/gas/dwarf2dbg.c,v
retrieving revision 1.77
diff -u -p -r1.77 dwarf2dbg.c
--- dwarf2dbg.c	7 Sep 2005 11:41:24 -0000	1.77
+++ dwarf2dbg.c	7 Sep 2005 19:18:36 -0000
@@ -24,12 +24,8 @@
    following directives:
 
 	.file FILENO "file.c"
-	.loc  FILENO LINENO [COLUMN]
-	.loc  basic_block
-	.loc  prologue_end
-	.loc  epilogue_begin
-	.loc  is_stmt [VALUE]
-	.loc  isa [VALUE]
+	.loc  FILENO LINENO [COLUMN] [basic_block] [prologue_end] \
+	      [epilogue_begin] [is_stmt VALUE] [isa VALUE]
 */
 
 #include "ansidecl.h"
@@ -287,6 +283,11 @@ dwarf2_gen_line_info (addressT ofs, stru
   ss->ptail = &e->next;
 }
 
+/* Returns the current source information.  If .file directives have
+   been encountered, the info for the corresponding source file is
+   returned.  Otherwise, the info for the assembly source file is
+   returned.  */
+
 void
 dwarf2_where (struct dwarf2_line_info *line)
 {
@@ -297,11 +298,21 @@ dwarf2_where (struct dwarf2_line_info *l
       line->filenum = get_filenum (filename, 0);
       line->column = 0;
       line->flags = DWARF2_FLAG_IS_STMT;
+      line->isa = current.isa;
     }
   else
     *line = current;
 }
 
+/* A hook to allow the target backend to inform the line number state 
+   machine of isa changes when assembler debug info is enabled.  */
+
+void
+dwarf2_set_isa (unsigned int isa)
+{
+  current.isa = isa;
+}
+
 /* Called for each machine instruction, or relatively atomic group of
    machine instructions (ie built-in macro).  The instruction or group
    is SIZE bytes in length.  If dwarf2 line number generation is called
@@ -482,8 +493,55 @@ dwarf2_directive_file (int dummy ATTRIBU
 void
 dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
 {
+  offsetT filenum, line;
+
+  filenum = get_absolute_expression ();
+  SKIP_WHITESPACE ();
+  line = get_absolute_expression ();
+
+  if (filenum < 1)
+    {
+      as_bad (_("file number less than one"));
+      return;
+    }
+  if (filenum >= (int) files_in_use || files[filenum].filename == 0)
+    {
+      as_bad (_("unassigned file number %ld"), (long) filenum);
+      return;
+    }
+
+  current.filenum = filenum;
+  current.line = line;
+
+#ifndef NO_LISTING
+  if (listing)
+    {
+      if (files[filenum].dir)
+	{
+	  size_t dir_len = strlen (dirs[files[filenum].dir]);
+	  size_t file_len = strlen (files[filenum].filename);
+	  char *cp = (char *) alloca (dir_len + 1 + file_len + 1);
+
+	  memcpy (cp, dirs[files[filenum].dir], dir_len);
+	  cp[dir_len] = '/';
+	  memcpy (cp + dir_len + 1, files[filenum].filename, file_len);
+	  cp[dir_len + file_len + 1] = '\0';
+	  listing_source_file (cp);
+	}
+      else
+	listing_source_file (files[filenum].filename);
+      listing_source_line (line);
+    }
+#endif
+
   SKIP_WHITESPACE ();
-  if (ISALPHA (*input_line_pointer))
+  if (ISDIGIT (*input_line_pointer))
+    {
+      current.column = get_absolute_expression ();
+      SKIP_WHITESPACE ();
+    }
+
+  while (ISALPHA (*input_line_pointer))
     {
       char *p, c;
       offsetT value;
@@ -515,68 +573,31 @@ dwarf2_directive_loc (int dummy ATTRIBUT
 	  else if (value == 1)
 	    current.flags |= DWARF2_FLAG_IS_STMT;
 	  else
-	    as_bad (_("is_stmt value not 0 or 1"));
+	    {
+	      as_bad (_("is_stmt value not 0 or 1"));
+	      return;
+	    }
 	}
       else if (strcmp (p, "isa") == 0)
 	{
           *input_line_pointer = c;
 	  value = get_absolute_expression ();
-	  if (value < 0)
-	    as_bad (_("isa number less than zero"));
-	  else
+	  if (value >= 0)
 	    current.isa = value;
+	  else
+	    {
+	      as_bad (_("isa number less than zero"));
+	      return;
+	    }
 	}
       else
 	{
-	  as_bad (_("unknown .loc sub-directive %s"), p);
+	  as_bad (_("unknown .loc sub-directive `%s'"), p);
           *input_line_pointer = c;
-	}
-    }
-  else
-    {
-      offsetT filenum, line, column;
-
-      filenum = get_absolute_expression ();
-      SKIP_WHITESPACE ();
-      line = get_absolute_expression ();
-      SKIP_WHITESPACE ();
-      column = get_absolute_expression ();
-
-      if (filenum < 1)
-	{
-	  as_bad (_("file number less than one"));
-	  return;
-	}
-      if (filenum >= (int) files_in_use || files[filenum].filename == 0)
-	{
-	  as_bad (_("unassigned file number %ld"), (long) filenum);
 	  return;
 	}
 
-      current.filenum = filenum;
-      current.line = line;
-      current.column = column;
-
-#ifndef NO_LISTING
-      if (listing)
-	{
-	  if (files[filenum].dir)
-	    {
-	      size_t dir_len = strlen (dirs[files[filenum].dir]);
-	      size_t file_len = strlen (files[filenum].filename);
-	      char *cp = (char *) alloca (dir_len + 1 + file_len + 1);
-
-	      memcpy (cp, dirs[files[filenum].dir], dir_len);
-	      cp[dir_len] = '/';
-	      memcpy (cp + dir_len + 1, files[filenum].filename, file_len);
-	      cp[dir_len + file_len + 1] = '\0';
-	      listing_source_file (cp);
-	    }
-	  else
-	    listing_source_file (files[filenum].filename);
-	  listing_source_line (line);
-	}
-#endif
+      SKIP_WHITESPACE ();
     }
 
   demand_empty_rest_of_line ();
Index: dwarf2dbg.h
===================================================================
RCS file: /cvs/src/src/gas/dwarf2dbg.h,v
retrieving revision 1.16
diff -u -p -r1.16 dwarf2dbg.h
--- dwarf2dbg.h	7 Sep 2005 11:41:24 -0000	1.16
+++ dwarf2dbg.h	7 Sep 2005 19:18:36 -0000
@@ -55,6 +55,10 @@ extern void dwarf2_directive_loc (int du
    returned.  */
 extern void dwarf2_where (struct dwarf2_line_info *l);
 
+/* A hook to allow the target backend to inform the line number state 
+   machine of isa changes when assembler debug info is enabled.  */
+extern void dwarf2_set_isa (unsigned int isa);
+
 /* This function generates .debug_line info based on the address and
    source information passed in the arguments.  ADDR should be the
    frag-relative offset of the instruction the information is for and
Index: doc/as.texinfo
===================================================================
RCS file: /cvs/src/src/gas/doc/as.texinfo,v
retrieving revision 1.126
diff -u -p -r1.126 as.texinfo
--- doc/as.texinfo	7 Sep 2005 11:41:24 -0000	1.126
+++ doc/as.texinfo	7 Sep 2005 19:18:37 -0000
@@ -4065,7 +4065,7 @@ table is shared with the @code{.debug_in
 information, and thus the user must know the exact indicies that table
 entries will have.
 
-@section @code{.loc @var{fileno} @var{lineno} [@var{column}]}
+@section @code{.loc @var{fileno} @var{lineno} [@var{column}] [@var{options}]}
 @cindex @code{loc} directive
 The @code{.loc} directive will add row to the @code{.debug_line} line
 number matrix corresponding to the immediately following assembly
@@ -4073,26 +4073,30 @@ instruction.  The @var{fileno}, @var{lin
 arguments will be applied to the @code{.debug_line} state machine before
 the row is added.
 
-@section @code{.loc basic_block}
-This directive will set the @code{basic_block} register in the
+The @var{options} are a sequence of the following tokens in any order:
+
+@table @code
+@item basic_block
+This option will set the @code{basic_block} register in the
 @code{.debug_line} state machine to @code{true}.
 
-@section @code{.loc prologue_end}
-This directive will set the @code{prologue_end} register in the
+@item prologue_end
+This option will set the @code{prologue_end} register in the
 @code{.debug_line} state machine to @code{true}.
 
-@section @code{.loc epilogue_begin}
-This directive will set the @code{epilogue_begin} register in the
+@item epilogue_begin
+This option will set the @code{epilogue_begin} register in the
 @code{.debug_line} state machine to @code{true}.
 
-@section @code{.loc is_stmt @var{value}}
-This directive will set the @code{epilogue_begin} register in the
+@item is_stmt @var{value}
+This option will set the @code{is_stmt} register in the
 @code{.debug_line} state machine to @code{value}, which must be 
 either 0 or 1.
 
-@section @code{.loc isa @var{value}}
+@item isa @var{value}
 This directive will set the @code{isa} register in the @code{.debug_line}
 state machine to @var{value}, which must be an unsigned integer.
+@end table
 
 @node Data
 @section @code{.data @var{subsection}}
Index: testsuite/gas/lns/lns-common-1.d
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/lns/lns-common-1.d,v
retrieving revision 1.1
diff -u -p -r1.1 lns-common-1.d
--- testsuite/gas/lns/lns-common-1.d	7 Sep 2005 11:41:25 -0000	1.1
+++ testsuite/gas/lns/lns-common-1.d	7 Sep 2005 19:18:37 -0000
@@ -2,28 +2,25 @@
 #name: lns-common-1
 Dump of debug contents of section \.debug_line:
 #...
-  DWARF Version:               2
-  Prologue Length:             28
-  Minimum Instruction Length:  1
   Initial value of 'is_stmt':  1
-  Line Base:                   -5
-  Line Range:                  14
-  Opcode Base:                 13
 #...
  Line Number Statements:
-  Extended opcode 2: set Address to 0x0
+  Extended opcode 2: set Address to .*
   Copy
+  Set column to 3
+  Special opcode .*: advance Address by .* to .* and Line by 1 to 2
   Set prologue_end to true
-  Special opcode 19: advance Address by .* to .* and Line by 0 to 1
+  Special opcode .*: advance Address by .* to .* and Line by 1 to 3
+  Set column to 0
   Set epilogue_begin to true
-  Special opcode 20: advance Address by .* to .* and Line by 1 to 2
+  Special opcode .*: advance Address by .* to .* and Line by 1 to 4
   Set ISA to 1
   Set basic block
-  Special opcode 20: advance Address by .* to .* and Line by 1 to 3
+  Special opcode .*: advance Address by .* to .* and Line by 1 to 5
   Set is_stmt to 0
-  Special opcode 19: advance Address by .* to .* and Line by 0 to 3
+  Special opcode .*: advance Address by .* to .* and Line by 1 to 6
   Set is_stmt to 1
-  Special opcode 19: advance Address by .* to .* and Line by 0 to 3
+  Special opcode .*: advance Address by .* to .* and Line by 1 to 7
   Advance PC by .* to .*
   Extended opcode 1: End of Sequence
 #...
Index: testsuite/gas/lns/lns-common-1.s
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/lns/lns-common-1.s,v
retrieving revision 1.1
diff -u -p -r1.1 lns-common-1.s
--- testsuite/gas/lns/lns-common-1.s	7 Sep 2005 11:41:25 -0000	1.1
+++ testsuite/gas/lns/lns-common-1.s	7 Sep 2005 19:18:37 -0000
@@ -1,16 +1,15 @@
 	.file 1 "foo.c"
 	.loc 1 1
 	nop
-	.loc prologue_end
+	.loc 1 2 3
 	nop
-	.loc epilogue_begin
-	.loc 1 2
+	.loc 1 3 prologue_end
 	nop
-	.loc isa 1
-	.loc basic_block
-	.loc 1 3
+	.loc 1 4 0 epilogue_begin
 	nop
-	.loc is_stmt 0
+	.loc 1 5 isa 1 basic_block
 	nop
-	.loc is_stmt 1
+	.loc 1 6 is_stmt 0
+	nop
+	.loc 1 7 is_stmt 1
 	nop
Index: testsuite/gas/lns/lns-diag-1.l
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/lns/lns-diag-1.l,v
retrieving revision 1.1
diff -u -p -r1.1 lns-diag-1.l
--- testsuite/gas/lns/lns-diag-1.l	7 Sep 2005 11:41:25 -0000	1.1
+++ testsuite/gas/lns/lns-diag-1.l	7 Sep 2005 19:18:37 -0000
@@ -8,4 +8,8 @@
 .*:18: Error: is_stmt value not 0 or 1
 .*:19: Error: bad or irreducible absolute expression
 .*:23: Error: isa number less than zero
-.*:26: Error: unknown .loc sub-directive frobnitz
+.*:26: Error: bad or irreducible absolute expression
+.*:26: Error: file number less than one
+.*:27: Error: bad or irreducible absolute expression
+.*:28: Error: unknown .loc sub-directive `frobnitz'
+.*:29: Error: unknown .loc sub-directive `frobnitz'
Index: testsuite/gas/lns/lns-diag-1.s
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/lns/lns-diag-1.s,v
retrieving revision 1.1
diff -u -p -r1.1 lns-diag-1.s
--- testsuite/gas/lns/lns-diag-1.s	7 Sep 2005 11:41:25 -0000	1.1
+++ testsuite/gas/lns/lns-diag-1.s	7 Sep 2005 19:18:37 -0000
@@ -8,19 +8,22 @@
 	.loc 3 1
 	.loc 1 1 1 1
 
-	.loc basic_block
-	.loc basic_block 0
-	.loc prologue_end
-	.loc epilogue_begin
+	.loc 1 1 basic_block
+	.loc 1 1 basic_block 0
+	.loc 1 1 prologue_end
+	.loc 1 1 epilogue_begin
 
-	.loc is_stmt 0
-	.loc is_stmt 1
-	.loc is_stmt 2
-	.loc is_stmt foo
+	.loc 1 1 1 is_stmt 0
+	.loc 1 1 1 is_stmt 1
+	.loc 1 1 1 is_stmt 2
+	.loc 1 1 1 is_stmt foo
 
-	.loc isa 1
-	.loc isa 2
-	.loc isa -1
-	.loc isa 0
+	.loc 1 1 isa 1
+	.loc 1 1 isa 2
+	.loc 1 1 isa -1
+	.loc 1 1 isa 0
 
 	.loc frobnitz
+	.loc 1 frobnitz
+	.loc 1 1 frobnitz
+	.loc 1 1 1 frobnitz


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]