public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
From: Pierre-Marie de Rodat <pmderodat@gcc.gnu.org>
To: gcc-cvs@gcc.gnu.org
Subject: [gcc r13-605] [Ada] Fix DWARF parsing for 32-bit targets on 64-bit hosts
Date: Wed, 18 May 2022 08:44:38 +0000 (GMT)	[thread overview]
Message-ID: <20220518084438.DAA913857407@sourceware.org> (raw)

https://gcc.gnu.org/g:91b46ee298bf76401006f7699544ac9c107d92f9

commit r13-605-g91b46ee298bf76401006f7699544ac9c107d92f9
Author: Kévin Le Gouguec <legouguec@adacore.com>
Date:   Thu Apr 7 10:51:51 2022 +0200

    [Ada] Fix DWARF parsing for 32-bit targets on 64-bit hosts
    
    Currently, a 64-bit gnatsymbolize fails to output line numbers and
    accurate symbol names when run on 32-bit executables (and vice-versa).
    This is because a couple of spots in System.Dwarf_Lines expect the
    Address_Size found in the DWARF data to match the host Address'Size.
    
    This patch corrects that assumption.
    
    gcc/ada/
    
            * libgnat/s-dwalin.adb (Aranges_Lookup, Enable_Cache): Adapt to
            changes in the signature of Read_Aranges_*.
            (Debug_Info_Lookup): Do not control address size read from
            DWARF.
            (Read_Aranges_Header): Do not control address size read from
            DWARF; return this size.
            (Read_Aranges_Entry): Use the size returned by
            Read_Aranges_Header.

Diff:
---
 gcc/ada/libgnat/s-dwalin.adb | 45 ++++++++++++++++++++------------------------
 1 file changed, 20 insertions(+), 25 deletions(-)

diff --git a/gcc/ada/libgnat/s-dwalin.adb b/gcc/ada/libgnat/s-dwalin.adb
index aff552cf57b..50662ddceff 100644
--- a/gcc/ada/libgnat/s-dwalin.adb
+++ b/gcc/ada/libgnat/s-dwalin.adb
@@ -44,8 +44,6 @@ with System.Storage_Elements;  use System.Storage_Elements;
 
 package body System.Dwarf_Lines is
 
-   SSU : constant := System.Storage_Unit;
-
    function Get_Load_Displacement (C : Dwarf_Context) return Storage_Offset;
    --  Return the displacement between the load address present in the binary
    --  and the run-time address at which it is loaded (i.e. non-zero for PIE).
@@ -76,14 +74,16 @@ package body System.Dwarf_Lines is
    --  Read an entry format array, as specified by 6.2.4.1
 
    procedure Read_Aranges_Entry
-     (C     : in out Dwarf_Context;
-      Start :    out Address;
-      Len   :    out Storage_Count);
+     (C         : in out Dwarf_Context;
+      Addr_Size :        Natural;
+      Start     :    out Address;
+      Len       :    out Storage_Count);
    --  Read a single .debug_aranges pair
 
    procedure Read_Aranges_Header
      (C           : in out Dwarf_Context;
       Info_Offset :    out Offset;
+      Addr_Size   :    out Natural;
       Success     :    out Boolean);
    --  Read .debug_aranges header
 
@@ -1069,12 +1069,13 @@ package body System.Dwarf_Lines is
       Info_Offset :    out Offset;
       Success     :    out Boolean)
    is
+      Addr_Size : Natural;
    begin
       Info_Offset := 0;
       Seek (C.Aranges, 0);
 
       while Tell (C.Aranges) < Length (C.Aranges) loop
-         Read_Aranges_Header (C, Info_Offset, Success);
+         Read_Aranges_Header (C, Info_Offset, Addr_Size, Success);
          exit when not Success;
 
          loop
@@ -1082,7 +1083,7 @@ package body System.Dwarf_Lines is
                Start : Address;
                Len   : Storage_Count;
             begin
-               Read_Aranges_Entry (C, Start, Len);
+               Read_Aranges_Entry (C, Addr_Size, Start, Len);
                exit when Start = 0 and Len = 0;
                if Addr >= Start
                  and then Addr < Start + Len
@@ -1280,9 +1281,6 @@ package body System.Dwarf_Lines is
          Unit_Type := Read (C.Info);
 
          Addr_Sz := Read (C.Info);
-         if Addr_Sz /= (Address'Size / SSU) then
-            return;
-         end if;
 
          Read_Section_Offset (C.Info, Abbrev_Offset, Is64);
 
@@ -1290,9 +1288,6 @@ package body System.Dwarf_Lines is
          Read_Section_Offset (C.Info, Abbrev_Offset, Is64);
 
          Addr_Sz := Read (C.Info);
-         if Addr_Sz /= (Address'Size / SSU) then
-            return;
-         end if;
 
       else
          return;
@@ -1354,6 +1349,7 @@ package body System.Dwarf_Lines is
    procedure Read_Aranges_Header
      (C           : in out Dwarf_Context;
       Info_Offset :    out Offset;
+      Addr_Size   :    out Natural;
       Success     :    out Boolean)
    is
       Unit_Length : Offset;
@@ -1376,10 +1372,7 @@ package body System.Dwarf_Lines is
 
       --  Read address_size (ubyte)
 
-      Sz := Read (C.Aranges);
-      if Sz /= (Address'Size / SSU) then
-         return;
-      end if;
+      Addr_Size := Natural (uint8'(Read (C.Aranges)));
 
       --  Read segment_size (ubyte)
 
@@ -1392,7 +1385,7 @@ package body System.Dwarf_Lines is
 
       declare
          Cur_Off : constant Offset := Tell (C.Aranges);
-         Align   : constant Offset := 2 * Address'Size / SSU;
+         Align   : constant Offset := 2 * Offset (Addr_Size);
          Space   : constant Offset := Cur_Off mod Align;
       begin
          if Space /= 0 then
@@ -1408,14 +1401,15 @@ package body System.Dwarf_Lines is
    ------------------------
 
    procedure Read_Aranges_Entry
-     (C     : in out Dwarf_Context;
-      Start :    out Address;
-      Len   :    out Storage_Count)
+     (C         : in out Dwarf_Context;
+      Addr_Size :        Natural;
+      Start     :    out Address;
+      Len       :    out Storage_Count)
    is
    begin
       --  Read table
 
-      if Address'Size = 32 then
+      if Addr_Size = 4 then
          declare
             S, L : uint32;
          begin
@@ -1425,7 +1419,7 @@ package body System.Dwarf_Lines is
             Len   := Storage_Count (L);
          end;
 
-      elsif Address'Size = 64 then
+      elsif Addr_Size = 8 then
          declare
             S, L : uint64;
          begin
@@ -1520,6 +1514,7 @@ package body System.Dwarf_Lines is
       declare
          Info_Offset : Offset;
          Line_Offset : Offset;
+         Addr_Size   : Natural;
          Success     : Boolean;
          Ar_Start    : Address;
          Ar_Len      : Storage_Count;
@@ -1531,7 +1526,7 @@ package body System.Dwarf_Lines is
          Seek (C.Aranges, 0);
 
          while Tell (C.Aranges) < Length (C.Aranges) loop
-            Read_Aranges_Header (C, Info_Offset, Success);
+            Read_Aranges_Header (C, Info_Offset, Addr_Size, Success);
             exit when not Success;
 
             Debug_Info_Lookup (C, Info_Offset, Line_Offset, Success);
@@ -1540,7 +1535,7 @@ package body System.Dwarf_Lines is
             --  Read table
 
             loop
-               Read_Aranges_Entry (C, Ar_Start, Ar_Len);
+               Read_Aranges_Entry (C, Addr_Size, Ar_Start, Ar_Len);
                exit when Ar_Start = Null_Address and Ar_Len = 0;
 
                Len   := uint32 (Ar_Len);


                 reply	other threads:[~2022-05-18  8:44 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220518084438.DAA913857407@sourceware.org \
    --to=pmderodat@gcc.gnu.org \
    --cc=gcc-cvs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).