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: [PATCH 1/3] bfd: DW_AT_high_pc can be relative to DW_AT_low_pc.


On Fri, 2012-04-27 at 14:30 +0200, Jakub Jelinek wrote:
> And just if (high_pc_relative) here.
> Similarly elsewhere.
> 
> Ok for trunk with those changes, thanks.

Updated patch attached.
commit 506b7f75204e9e19200087dddc84612964852706
Author: Mark Wielaard <mjw@redhat.com>
Date:   Thu Apr 26 15:11:52 2012 +0200

    bfd: DW_AT_high_pc can be relative to DW_AT_low_pc.
    
           * dwarf2.c (scan_unit_for_symbols): Account for DW_AT_high_pc
           possibly being relative to DW_AT_low_pc.
           (parse_comp_unit): Likewise.

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index b46eb9c..0978890 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2012-04-26  Mark Wielaard  <mjw@redhat.com>
+
+	* dwarf2.c (scan_unit_for_symbols): Account for DW_AT_high_pc
+	possibly being relative to DW_AT_low_pc.
+	(parse_comp_unit): Likewise.
+
 2012-04-24  Hans-Peter Nilsson  <hp@axis.com>
 
 	PR ld/13990
diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c
index 66fd16f..51e27b4 100644
--- a/bfd/dwarf2.c
+++ b/bfd/dwarf2.c
@@ -2092,6 +2092,7 @@ scan_unit_for_symbols (struct comp_unit *unit)
       struct varinfo *var;
       bfd_vma low_pc = 0;
       bfd_vma high_pc = 0;
+      bfd_boolean high_pc_relative = FALSE;
 
       abbrev_number = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
       info_ptr += bytes_read;
@@ -2197,6 +2198,7 @@ scan_unit_for_symbols (struct comp_unit *unit)
 
 		case DW_AT_high_pc:
 		  high_pc = attr.u.val;
+		  high_pc_relative = attr.form != DW_FORM_addr;
 		  break;
 
 		case DW_AT_ranges:
@@ -2275,6 +2277,9 @@ scan_unit_for_symbols (struct comp_unit *unit)
 	    }
 	}
 
+      if (high_pc_relative)
+	high_pc += low_pc;
+
       if (func && high_pc != 0)
 	{
 	  if (!arange_add (unit->abfd, &func->arange, low_pc, high_pc))
@@ -2338,6 +2343,7 @@ parse_comp_unit (struct dwarf2_debug *stash,
   bfd_vma low_pc = 0;
   bfd_vma high_pc = 0;
   bfd *abfd = stash->bfd_ptr;
+  bfd_boolean high_pc_relative = FALSE;
 
   version = read_2_bytes (abfd, info_ptr);
   info_ptr += 2;
@@ -2440,6 +2446,7 @@ parse_comp_unit (struct dwarf2_debug *stash,
 
 	case DW_AT_high_pc:
 	  high_pc = attr.u.val;
+	  high_pc_relative = attr.form != DW_FORM_addr;
 	  break;
 
 	case DW_AT_ranges:
@@ -2467,6 +2474,8 @@ parse_comp_unit (struct dwarf2_debug *stash,
 	  break;
 	}
     }
+  if (high_pc_relative)
+    high_pc += low_pc;
   if (high_pc != 0)
     {
       if (!arange_add (unit->abfd, &unit->arange, low_pc, high_pc))

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