[Ada] Tighten Object_Reader.Get_Memory_Bounds
authorOlivier Hainque <hainque@adacore.com>
Mon, 21 May 2018 14:50:44 +0000 (14:50 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Mon, 21 May 2018 14:50:44 +0000 (14:50 +0000)
Symbolization of traceback entries from dwarf info was
failing in some cases with shared libraries on ELF targets,
from unexpected overlapping of what we believed were code
regions for distinct modules.

This is caused by the inclusion of all SHF_ALLOC sections in
the set of sections of possible relevance to determine the span
of possible code addresses for a module.

This change renames the Get_memory_Bound subprogram to better
convey that we really care about sections hosting executable code
in particular, matching what the spec comments already claims.

It also renames the boolean flag conveying the info of relevance
in the Object_Section record, and adjusts the ELF implementation
of Get_Section to feed this flag from SHF_EXECINSTR instead of
SHF_ALLOC.

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

gcc/ada/

* libgnat/s-objrea.ads (Get_Memory_Bounds): Rename as Get_Xcode_Bounds.
(Object_Section): Rename Flag_Alloc component as Flag_Xcode.
* libgnat/s-objrea.adb (Get_Xcode_Bounds): Adjust to new subprogram and
component name.
(Get_Section, ELF case): Set Flag_Xcode from SHF_EXECINSTR.
* libgnat/s-dwalin.adb (Open): Adjust to the Get_Memory_Bounds name
change.

From-SVN: r260451

gcc/ada/ChangeLog
gcc/ada/libgnat/s-dwalin.adb
gcc/ada/libgnat/s-objrea.adb
gcc/ada/libgnat/s-objrea.ads

index c54f4ad344c40fd5e95bf9b194435cf511eed0e3..faa11548eadbaba619cf7b5eb2d35ef9edcf039c 100644 (file)
@@ -1,3 +1,13 @@
+2018-04-04  Olivier Hainque  <hainque@adacore.com>
+
+       * libgnat/s-objrea.ads (Get_Memory_Bounds): Rename as Get_Xcode_Bounds.
+       (Object_Section): Rename Flag_Alloc component as Flag_Xcode.
+       * libgnat/s-objrea.adb (Get_Xcode_Bounds): Adjust to new subprogram and
+       component name.
+       (Get_Section, ELF case): Set Flag_Xcode from SHF_EXECINSTR.
+       * libgnat/s-dwalin.adb (Open): Adjust to the Get_Memory_Bounds name
+       change.
+
 2018-04-04  Olivier Hainque  <hainque@adacore.com>
 
        * libgnat/s-dwalin.ads (Dwarf_Context): Change type of Load_Address to
index a83dae707665d94f87d5e52514ee9c88340132a1..b6fa1111379a18bc0fa0d4cf8645fbf092840c61 100644 (file)
@@ -414,9 +414,10 @@ package body System.Dwarf_Lines is
 
       Success := True;
 
-      --  Get memory bounds
+      --  Get memory bounds for executable code.  Note that such code
+      --  might come from multiple sections.
 
-      Get_Memory_Bounds (C.Obj.all, Lo, Hi);
+      Get_Xcode_Bounds (C.Obj.all, Lo, Hi);
       C.Low  := Storage_Offset (Lo);
       C.High := Storage_Offset (Hi);
 
index 4c949654dbcc45bcdf7fae133848529c17848104..bea13d937525090561df04c4c41a98a68991569c 100644 (file)
@@ -114,6 +114,7 @@ package body System.Object_Reader is
       end record;
 
       SHF_ALLOC : constant := 2;
+      SHF_EXECINSTR : constant := 4;
 
       type Symtab_Entry32 is record
          St_Name  : uint32;  --  Name (string table index)
@@ -552,7 +553,7 @@ package body System.Object_Reader is
                  Offset (SHdr.Sh_Offset),
                  uint64 (SHdr.Sh_Addr),
                  uint64 (SHdr.Sh_Size),
-                 (SHdr.Sh_Flags and SHF_ALLOC) /= 0);
+                 (SHdr.Sh_Flags and SHF_EXECINSTR) /= 0);
       end Get_Section;
 
       ------------------------
@@ -1679,11 +1680,11 @@ package body System.Object_Reader is
       end if;
    end Get_Section;
 
-   -----------------------
-   -- Get_Memory_Bounds --
-   -----------------------
+   ----------------------
+   -- Get_Xcode_Bounds --
+   ----------------------
 
-   procedure Get_Memory_Bounds
+   procedure Get_Xcode_Bounds
      (Obj   : in out Object_File;
       Low, High : out uint64) is
       Sec : Object_Section;
@@ -1692,9 +1693,11 @@ package body System.Object_Reader is
       Low := uint64'Last;
       High := uint64'First;
 
+      --  Now find the lowest and highest offsets
+      --  attached to executable code sections
       for Idx in 1 .. Num_Sections (Obj) loop
          Sec := Get_Section (Obj, Idx - 1);
-         if Sec.Flag_Alloc then
+         if Sec.Flag_Xcode then
             if Sec.Addr < Low then
                Low := Sec.Addr;
             end if;
@@ -1703,7 +1706,7 @@ package body System.Object_Reader is
             end if;
          end if;
       end loop;
-   end Get_Memory_Bounds;
+   end Get_Xcode_Bounds;
 
    ----------
    -- Name --
index d82e21a430f935e0d3e5c003643bef118a146ba1..1cb08cffc2b5e7c5981383b34fa65d54a42a9e23 100644 (file)
@@ -277,7 +277,7 @@ package System.Object_Reader is
       Sec : Object_Section) return Mapped_Stream;
    --  Create a stream for section Sec
 
-   procedure Get_Memory_Bounds
+   procedure Get_Xcode_Bounds
      (Obj   : in out Object_File;
       Low, High : out uint64);
    --  Return the low and high addresses of the code for the object file. Can
@@ -434,8 +434,8 @@ private
       Size       : uint64 := 0;
       --  Length of the section in bytes
 
-      Flag_Alloc : Boolean := False;
-      --  True if the section is mapped in memory by the OS loader
+      Flag_Xcode : Boolean := False;
+      --  True if the section is advertised to contain executable code
    end record;
 
    Null_Section : constant Object_Section := (0, 0, 0, 0, False);