* [Ada] Fix DWARF parsing for 32-bit targets on 64-bit hosts
@ 2022-05-18 8:43 Pierre-Marie de Rodat
0 siblings, 0 replies; only message in thread
From: Pierre-Marie de Rodat @ 2022-05-18 8:43 UTC (permalink / raw)
To: gcc-patches; +Cc: Kévin Le Gouguec
[-- Attachment #1: Type: text/plain, Size: 709 bytes --]
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.
Tested on x86_64-pc-linux-gnu, committed on trunk
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.
[-- Attachment #2: patch.diff --]
[-- Type: text/x-diff, Size: 5375 bytes --]
diff --git a/gcc/ada/libgnat/s-dwalin.adb b/gcc/ada/libgnat/s-dwalin.adb
--- 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);
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-05-18 8:43 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-18 8:43 [Ada] Fix DWARF parsing for 32-bit targets on 64-bit hosts Pierre-Marie de Rodat
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).