From: Ronan Desplanques <[email protected]>

A recent patch made Multi_Module_Symbolic_Traceback have two consecutive
formal parameters of type Boolean, which opens the door for mixing up
actual parameters in calls. And that mistake was actually made in a call
introduced by the same patch.

This commit fixes the call and also introduces a new enumerated type to
make this kind of mistake less likely in the future.

gcc/ada/ChangeLog:

        * libgnat/s-dwalin.ads (Display_Mode_Type): New enumerated type.
        (Symbolic_Traceback): Use new type in profile.
        * libgnat/s-dwalin.adb (Symbolic_Traceback): Use new type in profile
        and adapt body.
        * libgnat/s-trasym__dwarf.adb (Multi_Module_Symbolic_Traceback): Fix
        wrong call in body of one overload. Use new type in profile. Adapt
        body.
        (Symbolic_Traceback, Symbolic_Traceback_No_Lock,
        Module_Symbolic_Traceback): Use new type in profile and adapt body.
        (Calling_Entity): Adapt body.

Tested on x86_64-pc-linux-gnu, committed on master.

---
 gcc/ada/libgnat/s-dwalin.adb        |   8 +-
 gcc/ada/libgnat/s-dwalin.ads        |  18 ++--
 gcc/ada/libgnat/s-trasym__dwarf.adb | 144 +++++++++++++---------------
 3 files changed, 85 insertions(+), 85 deletions(-)

diff --git a/gcc/ada/libgnat/s-dwalin.adb b/gcc/ada/libgnat/s-dwalin.adb
index 713aad4a304..75c96619f99 100644
--- a/gcc/ada/libgnat/s-dwalin.adb
+++ b/gcc/ada/libgnat/s-dwalin.adb
@@ -1915,7 +1915,7 @@ package body System.Dwarf_Lines is
      (Cin              : Dwarf_Context;
       Traceback        : STE.Tracebacks_Array;
       Suppress_Hex     : Boolean;
-      Subprg_Name_Only : Boolean;
+      Display_Mode     : Display_Mode_Type;
       Symbol_Found     : out Boolean;
       Res              : in out System.Bounded_Strings.Bounded_String)
    is
@@ -1954,7 +1954,7 @@ package body System.Dwarf_Lines is
 
          --  If we're not requested to suppress hex addresses, emit it now.
 
-         if not Suppress_Hex and then not Subprg_Name_Only then
+         if not Suppress_Hex and then Display_Mode = Full then
             Append_Address (Res, Addr_In_Traceback);
             Append (Res, ' ');
          end if;
@@ -2007,7 +2007,7 @@ package body System.Dwarf_Lines is
                   Append (Res, "???");
                end if;
 
-               if not Subprg_Name_Only then
+               if Display_Mode = Full then
                   Append (Res, " at ");
                   Append (Res, String (File_Name (1 .. Last)));
                   Append (Res, ':');
@@ -2023,7 +2023,7 @@ package body System.Dwarf_Lines is
                Append (Res, "???");
             end if;
 
-            if not Subprg_Name_Only then
+            if Display_Mode = Full then
                Append (Res, " at ???");
             end if;
          end if;
diff --git a/gcc/ada/libgnat/s-dwalin.ads b/gcc/ada/libgnat/s-dwalin.ads
index 641e515e62f..17bf0937608 100644
--- a/gcc/ada/libgnat/s-dwalin.ads
+++ b/gcc/ada/libgnat/s-dwalin.ads
@@ -79,13 +79,19 @@ package System.Dwarf_Lines is
    procedure Enable_Cache (C : in out Dwarf_Context);
    --  Read symbol information to speed up Symbolic_Traceback.
 
+   type Display_Mode_Type is (Full, Subprg_Name_Only);
+   --  This type is used to configure how frames are displayed.
+   --  In Subprg_Name_Only mode, only the name of the subprogram is displayed
+   --  for a frame. In Full mode, additional information is displayed on top of
+   --  that.
+
    procedure Symbolic_Traceback
-     (Cin              : Dwarf_Context;
-      Traceback        : STE.Tracebacks_Array;
-      Suppress_Hex     : Boolean;
-      Subprg_Name_Only : Boolean;
-      Symbol_Found     : out Boolean;
-      Res              : in out System.Bounded_Strings.Bounded_String);
+     (Cin          : Dwarf_Context;
+      Traceback    : STE.Tracebacks_Array;
+      Suppress_Hex : Boolean;
+      Display_Mode : Display_Mode_Type;
+      Symbol_Found : out Boolean;
+      Res          : in out System.Bounded_Strings.Bounded_String);
    --  Generate a string for a traceback suitable for displaying to the user.
    --  If one or more symbols are found, Symbol_Found is set to True. This
    --  allows the caller to fall back to hexadecimal addresses.
diff --git a/gcc/ada/libgnat/s-trasym__dwarf.adb 
b/gcc/ada/libgnat/s-trasym__dwarf.adb
index 09026c91efe..0c4a036e139 100644
--- a/gcc/ada/libgnat/s-trasym__dwarf.adb
+++ b/gcc/ada/libgnat/s-trasym__dwarf.adb
@@ -96,16 +96,15 @@ package body System.Traceback.Symbolic is
    --  Initialize Exec_Module if not already initialized
 
    function Symbolic_Traceback
-     (Traceback        : System.Traceback_Entries.Tracebacks_Array;
-      Suppress_Hex     : Boolean;
-      Subprg_Name_Only : Boolean) return String;
+     (Traceback    : System.Traceback_Entries.Tracebacks_Array;
+      Suppress_Hex : Boolean;
+      Display_Mode : Display_Mode_Type) return String;
    function Symbolic_Traceback
      (E            : Ada.Exceptions.Exception_Occurrence;
       Suppress_Hex : Boolean) return String;
    --  Suppress_Hex means do not print any hexadecimal addresses, even if the
-   --  symbol is not available. Subprg_Name_Only means to only print the
-   --  subprogram name for each frame, as opposed to the complete description
-   --  of the frame.
+   --  symbol is not available. Display_Mode configures how frames for which
+   --  symbols are available are printed.
 
    function Lt (Left, Right : Module_Cache_Acc) return Boolean;
    --  Sort function for Module_Cache
@@ -169,34 +168,34 @@ package body System.Traceback.Symbolic is
    --  Non-symbolic traceback (simply write addresses in hexa)
 
    procedure Symbolic_Traceback_No_Lock
-     (Traceback        : Tracebacks_Array;
-      Suppress_Hex     : Boolean;
-      Subprg_Name_Only : Boolean;
-      Res              : in out Bounded_String);
+     (Traceback    : Tracebacks_Array;
+      Suppress_Hex : Boolean;
+      Display_Mode : Display_Mode_Type;
+      Res          : in out Bounded_String);
    --  Like the public Symbolic_Traceback except there is no provision against
    --  concurrent accesses.
 
    procedure Module_Symbolic_Traceback
-     (Traceback        : Tracebacks_Array;
-      Module           : Module_Cache;
-      Suppress_Hex     : Boolean;
-      Subprg_Name_Only : Boolean;
-      Res              : in out Bounded_String);
+     (Traceback    : Tracebacks_Array;
+      Module       : Module_Cache;
+      Suppress_Hex : Boolean;
+      Display_Mode : Display_Mode_Type;
+      Res          : in out Bounded_String);
    --  Returns the Traceback for a given module
 
    procedure Multi_Module_Symbolic_Traceback
-     (Traceback        : Tracebacks_Array;
-      Suppress_Hex     : Boolean;
-      Subprg_Name_Only : Boolean;
-      Res              : in out Bounded_String);
+     (Traceback    : Tracebacks_Array;
+      Suppress_Hex : Boolean;
+      Display_Mode : Display_Mode_Type;
+      Res          : in out Bounded_String);
    --  Build string containing symbolic traceback for the given call chain
 
    procedure Multi_Module_Symbolic_Traceback
-     (Traceback        : Tracebacks_Array;
-      Module           : Module_Cache;
-      Suppress_Hex     : Boolean;
-      Subprg_Name_Only : Boolean;
-      Res              : in out Bounded_String);
+     (Traceback    : Tracebacks_Array;
+      Module       : Module_Cache;
+      Suppress_Hex : Boolean;
+      Display_Mode : Display_Mode_Type;
+      Res          : in out Bounded_String);
    --  Likewise but using Module
 
    Max_String_Length : constant := 4096;
@@ -357,7 +356,9 @@ package body System.Traceback.Symbolic is
       declare
          With_Trailing_Newline : constant String :=
            Symbolic_Traceback
-             (Traceback, Suppress_Hex => True, Subprg_Name_Only => True);
+             (Traceback,
+              Suppress_Hex => True,
+              Display_Mode => Subprg_Name_Only);
       begin
          return
            With_Trailing_Newline
@@ -487,31 +488,28 @@ package body System.Traceback.Symbolic is
    -------------------------------
 
    procedure Module_Symbolic_Traceback
-     (Traceback        : Tracebacks_Array;
-      Module           : Module_Cache;
-      Suppress_Hex     : Boolean;
-      Subprg_Name_Only : Boolean;
-      Res              : in out Bounded_String)
+     (Traceback    : Tracebacks_Array;
+      Module       : Module_Cache;
+      Suppress_Hex : Boolean;
+      Display_Mode : Display_Mode_Type;
+      Res          : in out Bounded_String)
    is
       Success : Boolean;
    begin
-      if Symbolic.Module_Name.Is_Supported and then not Subprg_Name_Only then
+      if Symbolic.Module_Name.Is_Supported and then Display_Mode = Full then
          Append (Res, '[');
          Append (Res, Module.Name.all);
          Append (Res, ']' & ASCII.LF);
       end if;
 
       Dwarf_Lines.Symbolic_Traceback
-        (Module.C,
-         Traceback,
-         Suppress_Hex,
-         Subprg_Name_Only,
-         Success,
-         Res);
+        (Module.C, Traceback, Suppress_Hex, Display_Mode, Success, Res);
 
       if not Success then
          Hexa_Traceback
-           (Traceback, Suppress_Hex or else Subprg_Name_Only, Res);
+           (Traceback,
+            Suppress_Hex or else Display_Mode = Subprg_Name_Only,
+            Res);
       end if;
 
       --  We must not allow an unhandled exception here, since this function
@@ -527,10 +525,10 @@ package body System.Traceback.Symbolic is
    -------------------------------------
 
    procedure Multi_Module_Symbolic_Traceback
-     (Traceback        : Tracebacks_Array;
-      Suppress_Hex     : Boolean;
-      Subprg_Name_Only : Boolean;
-      Res              : in out Bounded_String)
+     (Traceback    : Tracebacks_Array;
+      Suppress_Hex : Boolean;
+      Display_Mode : Display_Mode_Type;
+      Res          : in out Bounded_String)
    is
       F : constant Natural := Traceback'First;
    begin
@@ -555,8 +553,8 @@ package body System.Traceback.Symbolic is
                   Multi_Module_Symbolic_Traceback
                     (Traceback,
                      Modules_Cache (Mid).all,
-                     Subprg_Name_Only,
                      Suppress_Hex,
+                     Display_Mode,
                      Res);
                   return;
                else
@@ -569,7 +567,7 @@ package body System.Traceback.Symbolic is
             Multi_Module_Symbolic_Traceback
               (Traceback (F + 1 .. Traceback'Last),
                Suppress_Hex,
-               Subprg_Name_Only,
+               Display_Mode,
                Res);
          end;
       else
@@ -577,7 +575,7 @@ package body System.Traceback.Symbolic is
          --  First try the executable
          if Is_Inside (Exec_Module.C, Traceback (F)) then
             Multi_Module_Symbolic_Traceback
-              (Traceback, Exec_Module, Suppress_Hex, Subprg_Name_Only, Res);
+              (Traceback, Exec_Module, Suppress_Hex, Display_Mode, Res);
             return;
          end if;
 
@@ -593,7 +591,7 @@ package body System.Traceback.Symbolic is
             Init_Module (Module, Success, M_Name, Load_Addr);
             if Success then
                Multi_Module_Symbolic_Traceback
-                 (Traceback, Module, Suppress_Hex, Subprg_Name_Only, Res);
+                 (Traceback, Module, Suppress_Hex, Display_Mode, Res);
                Close_Module (Module);
             else
                --  Module not found
@@ -601,7 +599,7 @@ package body System.Traceback.Symbolic is
                Multi_Module_Symbolic_Traceback
                  (Traceback (F + 1 .. Traceback'Last),
                   Suppress_Hex,
-                  Subprg_Name_Only,
+                  Display_Mode,
                   Res);
             end if;
          end;
@@ -609,11 +607,11 @@ package body System.Traceback.Symbolic is
    end Multi_Module_Symbolic_Traceback;
 
    procedure Multi_Module_Symbolic_Traceback
-     (Traceback        : Tracebacks_Array;
-      Module           : Module_Cache;
-      Suppress_Hex     : Boolean;
-      Subprg_Name_Only : Boolean;
-      Res              : in out Bounded_String)
+     (Traceback    : Tracebacks_Array;
+      Module       : Module_Cache;
+      Suppress_Hex : Boolean;
+      Display_Mode : Display_Mode_Type;
+      Res          : in out Bounded_String)
    is
       Pos : Positive;
    begin
@@ -638,13 +636,10 @@ package body System.Traceback.Symbolic is
         (Traceback (Traceback'First .. Pos - 1),
          Module,
          Suppress_Hex,
-         Subprg_Name_Only,
+         Display_Mode,
          Res);
       Multi_Module_Symbolic_Traceback
-        (Traceback (Pos .. Traceback'Last),
-         Suppress_Hex,
-         Subprg_Name_Only,
-         Res);
+        (Traceback (Pos .. Traceback'Last), Suppress_Hex, Display_Mode, Res);
    end Multi_Module_Symbolic_Traceback;
 
    --------------------
@@ -674,22 +669,24 @@ package body System.Traceback.Symbolic is
    --------------------------------
 
    procedure Symbolic_Traceback_No_Lock
-     (Traceback        : Tracebacks_Array;
-      Suppress_Hex     : Boolean;
-      Subprg_Name_Only : Boolean;
-      Res              : in out Bounded_String) is
+     (Traceback    : Tracebacks_Array;
+      Suppress_Hex : Boolean;
+      Display_Mode : Display_Mode_Type;
+      Res          : in out Bounded_String) is
    begin
       if Symbolic.Module_Name.Is_Supported then
          Multi_Module_Symbolic_Traceback
-           (Traceback, Suppress_Hex, Subprg_Name_Only, Res);
+           (Traceback, Suppress_Hex, Display_Mode, Res);
       else
          if Exec_Module_State = Failed then
             Append (Res, "Call stack traceback locations:" & ASCII.LF);
             Hexa_Traceback
-              (Traceback, Suppress_Hex or else Subprg_Name_Only, Res);
+              (Traceback,
+               Suppress_Hex or else Display_Mode = Subprg_Name_Only,
+               Res);
          else
             Module_Symbolic_Traceback
-              (Traceback, Exec_Module, Suppress_Hex, Subprg_Name_Only, Res);
+              (Traceback, Exec_Module, Suppress_Hex, Display_Mode, Res);
          end if;
       end if;
    end Symbolic_Traceback_No_Lock;
@@ -702,9 +699,9 @@ package body System.Traceback.Symbolic is
    --  Copied from Ada.Exceptions.Exception_Data
 
    function Symbolic_Traceback
-     (Traceback        : Tracebacks_Array;
-      Suppress_Hex     : Boolean;
-      Subprg_Name_Only : Boolean) return String
+     (Traceback    : Tracebacks_Array;
+      Suppress_Hex : Boolean;
+      Display_Mode : Display_Mode_Type) return String
    is
       Load_Address : constant Address := Get_Executable_Load_Address;
       Res          : Bounded_String (Max_Length => Max_String_Length);
@@ -712,13 +709,12 @@ package body System.Traceback.Symbolic is
    begin
       System.Soft_Links.Lock_Task.all;
       Init_Exec_Module;
-      if not Subprg_Name_Only and then Load_Address /= Null_Address then
+      if Display_Mode = Full and then Load_Address /= Null_Address then
          Append (Res, LDAD_Header);
          Append_Address (Res, Load_Address);
          Append (Res, ASCII.LF);
       end if;
-      Symbolic_Traceback_No_Lock
-        (Traceback, Suppress_Hex, Subprg_Name_Only, Res);
+      Symbolic_Traceback_No_Lock (Traceback, Suppress_Hex, Display_Mode, Res);
       System.Soft_Links.Unlock_Task.all;
 
       return To_String (Res);
@@ -734,7 +730,7 @@ package body System.Traceback.Symbolic is
    begin
       return
         Symbolic_Traceback
-          (Traceback, Suppress_Hex => False, Subprg_Name_Only => False);
+          (Traceback, Suppress_Hex => False, Display_Mode => Full);
    end Symbolic_Traceback;
 
    function Symbolic_Traceback_No_Hex
@@ -742,7 +738,7 @@ package body System.Traceback.Symbolic is
    begin
       return
         Symbolic_Traceback
-          (Traceback, Suppress_Hex => True, Subprg_Name_Only => False);
+          (Traceback, Suppress_Hex => True, Display_Mode => Full);
    end Symbolic_Traceback_No_Hex;
 
    function Symbolic_Traceback
@@ -752,9 +748,7 @@ package body System.Traceback.Symbolic is
    begin
       return
         Symbolic_Traceback
-          (Ada.Exceptions.Traceback.Tracebacks (E),
-           Suppress_Hex,
-           False);
+          (Ada.Exceptions.Traceback.Tracebacks (E), Suppress_Hex, Full);
    end Symbolic_Traceback;
 
    function Symbolic_Traceback
-- 
2.51.0

Reply via email to