diff mbox series

[Ada] Propagate load addresses for traceback cache on Linux

Message ID 20180521150033.GA78107@adacore.com
State New
Headers show
Series [Ada] Propagate load addresses for traceback cache on Linux | expand

Commit Message

Pierre-Marie de Rodat May 21, 2018, 3 p.m. UTC
Symbolization of traceback addresses through shared libraries
requires information on the shared libraries load addresses, which
was at hand on Linuxbut not propagated through the runtime when
caching is enabled.  This change fixes this.

Tested on x86_64-pc-linux-gnu, committed on trunk

2018-05-21  Olivier Hainque  <hainque@adacore.com>

gcc/ada/

	* libgnat/s-trasym__dwarf.adb (Add_Module_To_Cache): Expect a
	Load_Address argument and pass it down to Init_Module.
	* libgnat/s-tsmona__linux.adb (Build_Cache_For_All_Modules): Pass
	lm.l_addr as the Load_Address to Add_Module_To_Cache.
diff mbox series

Patch

--- gcc/ada/libgnat/s-trasym__dwarf.adb
+++ gcc/ada/libgnat/s-trasym__dwarf.adb
@@ -123,7 +123,8 @@  package body System.Traceback.Symbolic is
    --  Return the String contained in Item, up until the first NUL character
 
    pragma Warnings (Off, "*Add_Module_To_Cache*");
-   procedure Add_Module_To_Cache (Module_Name : String);
+   procedure Add_Module_To_Cache (Module_Name : String;
+                                  Load_Address : System.Address);
    --  To be called by Build_Cache_For_All_Modules to add a new module to the
    --  list. May not be referenced.
 
@@ -217,12 +218,14 @@  package body System.Traceback.Symbolic is
    -- Add_Module_To_Cache --
    -------------------------
 
-   procedure Add_Module_To_Cache (Module_Name : String) is
+   procedure Add_Module_To_Cache (Module_Name : String;
+                                  Load_Address : System.Address)
+   is
       Module  : Module_Cache_Acc;
       Success : Boolean;
    begin
       Module := new Module_Cache;
-      Init_Module (Module.all, Success, Module_Name);
+      Init_Module (Module.all, Success, Module_Name, Load_Address);
       if not Success then
          Free (Module);
          return;

--- gcc/ada/libgnat/s-tsmona__linux.adb
+++ gcc/ada/libgnat/s-tsmona__linux.adb
@@ -122,7 +122,7 @@  package body Module_Name is
       while lm /= null loop
          if Big_String_Conv.To_Pointer (lm.l_name) (1) /= ASCII.NUL then
             --  Discard non-file (like the executable itself or the gate).
-            Add_Module_To_Cache (Value (lm.l_name));
+            Add_Module_To_Cache (Value (lm.l_name), lm.l_addr);
          end if;
          lm := lm.l_next;
       end loop;