This is the mail archive of the binutils@sources.redhat.com 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: dwarf2_find_nearest_line


On Fri, Sep 24, 2004 at 12:34:28AM +0930, Alan Modra wrote:
> On Thu, Sep 23, 2004 at 10:41:00AM -0400, Daniel Jacobowitz wrote:
> > On Fri, Sep 24, 2004 at 12:01:57AM +0930, Alan Modra wrote:
> > > Okayyy.  So you really only need to zap debug sections.  If we left
> > > other sections alone, then we'd properly calculate pc ranges in FDEs as
> > > per the final exe.  That allows multiple input text sections to be
> > > descriminated according to their final addresses.  I think..  I'll
> > > have a go at it tomorrow.

Committed.  The testsuite change is because the undefined references
on powerpc64-linux are in the TOC section.  Since we don't emit
debug info for the TOC, _bfd_dwarf2_find_nearest_line now correctly
does not return a bogus file, function, and line.

bfd/
	* dwarf2.c (_bfd_dwarf2_find_nearest_line): Add output section
	vma and output offset to address.
	* simple.c (simple_save_output_info): Only set output section
	and offset for debug sections, or those not already set up by
	the linker.
	(bfd_simple_get_relocated_section_contents): Update comment.
ld/testsuite/
	* ld-elfvsb/elfvsb.exp: Remove file name from "undefined ref" string.

Index: bfd/dwarf2.c
===================================================================
RCS file: /cvs/src/src/bfd/dwarf2.c,v
retrieving revision 1.57
diff -u -p -r1.57 dwarf2.c
--- bfd/dwarf2.c	24 Jun 2004 04:46:16 -0000	1.57
+++ bfd/dwarf2.c	24 Sep 2004 03:37:41 -0000
@@ -1703,13 +1703,19 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd
      We keep a list of all the previously read compilation units, and
      a pointer to the next un-read compilation unit.  Check the
      previously read units before reading more.  */
-  struct dwarf2_debug *stash = *pinfo;
+  struct dwarf2_debug *stash;
 
   /* What address are we looking for?  */
-  bfd_vma addr = offset + section->vma;
+  bfd_vma addr;
 
   struct comp_unit* each;
 
+  stash = *pinfo;
+  addr = offset;
+  if (section->output_section)
+    addr += section->output_section->vma + section->output_offset;
+  else
+    addr += section->vma;
   *filename_ptr = NULL;
   *functionname_ptr = NULL;
   *linenumber_ptr = 0;
Index: bfd/simple.c
===================================================================
RCS file: /cvs/src/src/bfd/simple.c,v
retrieving revision 1.17
diff -u -p -r1.17 simple.c
--- bfd/simple.c	29 Jun 2004 14:13:44 -0000	1.17
+++ bfd/simple.c	24 Sep 2004 03:37:41 -0000
@@ -92,8 +92,12 @@ simple_save_output_info (bfd *abfd ATTRI
   struct saved_output_info *output_info = ptr;
   output_info[section->index].offset = section->output_offset;
   output_info[section->index].section = section->output_section;
-  section->output_offset = 0;
-  section->output_section = section;
+  if ((section->flags & SEC_DEBUGGING) != 0
+      || section->output_section == NULL)
+    {
+      section->output_offset = 0;
+      section->output_section = section;
+    }
 }
 
 static void
@@ -117,13 +121,10 @@ SYNOPSIS
 DESCRIPTION
 	Returns the relocated contents of section @var{sec}.  The symbols in
 	@var{symbol_table} will be used, or the symbols from @var{abfd} if
-	@var{symbol_table} is NULL.  The output offsets for all sections will
+	@var{symbol_table} is NULL.  The output offsets for debug sections will
 	be temporarily reset to 0.  The result will be stored at @var{outbuf}
 	or allocated with @code{bfd_malloc} if @var{outbuf} is @code{NULL}.
 
-	Generally all sections in @var{abfd} should have their
-	@code{output_section} pointing back to the original section.
-
 	Returns @code{NULL} on a fatal error; ignores errors applying
 	particular relocations.
 */
Index: ld/testsuite/ld-elfvsb/elfvsb.exp
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-elfvsb/elfvsb.exp,v
retrieving revision 1.26
diff -u -p -r1.26 elfvsb.exp
--- ld/testsuite/ld-elfvsb/elfvsb.exp	17 Aug 2004 05:39:32 -0000	1.26
+++ ld/testsuite/ld-elfvsb/elfvsb.exp	24 Sep 2004 05:22:26 -0000
@@ -117,12 +117,12 @@ proc visibility_test { visibility progna
     }
     if {![ld_simple_link $CC $tmpdir/$progname.so "$shared $shldflags $tmpdir/$sh1 $tmpdir/$sh2"]} {
 	if { [ string match $visibility "hidden_undef" ]
-	     && [regexp ".*/sh1.c.*: undefined reference to \`\.?visibility\'" $link_output]
-	     && [regexp ".*/sh1.c.*: undefined reference to \`visibility_var\'" $link_output] } {
+	     && [regexp "undefined reference to \`\.?visibility\'" $link_output]
+	     && [regexp "undefined reference to \`visibility_var\'" $link_output] } {
     	    pass "$testname"
 	} else { if { [ string match $visibility "protected_undef" ]
-	     && [regexp ".*/sh1.c.*: undefined reference to \`\.?visibility\'" $link_output]
-	     && [regexp ".*/sh1.c.*: undefined reference to \`visibility_var\'" $link_output] } {
+	     && [regexp "undefined reference to \`\.?visibility\'" $link_output]
+	     && [regexp "undefined reference to \`visibility_var\'" $link_output] } {
     	    pass "$testname"
 	} else {
 	    fail "$testname"
@@ -140,14 +140,14 @@ proc visibility_test { visibility progna
     }
     if ![ld_simple_link $CC $tmpdir/$progname "-Wl,-rpath,$rpath $tmpdir/$main $tmpdir/$progname.so"] {
 	if { [ string match $visibility "hidden" ]
-	     && [regexp ".*/main.c.*: undefined reference to \`\.?visibility\'" $link_output]
-	     && [regexp ".*/main.c.*: undefined reference to \`visibility_var\'" $link_output] } {
+	     && [regexp "undefined reference to \`\.?visibility\'" $link_output]
+	     && [regexp "undefined reference to \`visibility_var\'" $link_output] } {
     	    pass "$testname"
 	} else { if { [ string match $visibility "hidden_undef_def" ]
-	     && [regexp ".*/main.c.*: undefined reference to \`\.?visibility\'" $link_output]
-	     && [regexp ".*/main.c.*: undefined reference to \`visibility_def\'" $link_output]
-	     && [regexp ".*/main.c.*: undefined reference to \`\.?visibility_func\'" $link_output]
-	     && [regexp ".*/main.c.*: undefined reference to \`visibility_var\'" $link_output] } {
+	     && [regexp "undefined reference to \`\.?visibility\'" $link_output]
+	     && [regexp "undefined reference to \`visibility_def\'" $link_output]
+	     && [regexp "undefined reference to \`\.?visibility_func\'" $link_output]
+	     && [regexp "undefined reference to \`visibility_var\'" $link_output] } {
     	    pass "$testname"
 	} else {
     	    fail "$testname"

-- 
Alan Modra
IBM OzLabs - Linux Technology Centre


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