From: Ronan Desplanques <desplanq...@adacore.com>

The old specifications were ambiguous as to whether they expected
actuals to have %s/%b suffixes. The new specifications also increases
modularity across the board.

gcc/ada/ChangeLog:

        * uname.ads (Is_Internal_Unit_Name, Is_Predefined_Unit_Name): Change
        specifications to take a Unit_Name_Type as input.
        (Encoded_Library_Unit_Name): New subprogram.
        (Is_Predefined_Unit_Name): New overloaded subprogram.
        (Get_External_Unit_Name_String): Make use of new
        Encoded_Library_Unit_Name subprogram.
        * uname.adb (Is_Internal_Unit_Name, Is_Predefined_Unit_Name): Adapt
        bodies to specification changes.
        * fname-uf.adb (Get_File_Name): Adapt to Uname interface changes.

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

---
 gcc/ada/fname-uf.adb |  2 +-
 gcc/ada/uname.adb    | 67 +++++++++++++++++++++++++++++++-------------
 gcc/ada/uname.ads    |  8 +++---
 3 files changed, 52 insertions(+), 25 deletions(-)

diff --git a/gcc/ada/fname-uf.adb b/gcc/ada/fname-uf.adb
index 4afb3b01b34..3f65957a6a2 100644
--- a/gcc/ada/fname-uf.adb
+++ b/gcc/ada/fname-uf.adb
@@ -324,7 +324,7 @@ package body Fname.UF is
                   declare
                      Is_Predef : constant Boolean :=
                        Is_Predefined_Unit_Name
-                         (+Unit_Buf, Renamings_Included => True);
+                         (Uname, Renamings_Included => True);
 
                      Buf : Bounded_String;
                   begin
diff --git a/gcc/ada/uname.adb b/gcc/ada/uname.adb
index 5a7dac53b3d..598b55467e9 100644
--- a/gcc/ada/uname.adb
+++ b/gcc/ada/uname.adb
@@ -42,6 +42,15 @@ package body Uname is
    --  True if Prefix is at the beginning of X. For example,
    --  Has_Prefix("a-filename.ads", Prefix => "a-") is True.
 
+   function Encoded_Library_Unit_Name (N : Unit_Name_Type) return String;
+   --  Returns the name of the library unit N as a string without a %s or %b
+   --  suffix.
+
+   function Is_Predefined_Unit_Name
+     (Name : String; Renamings_Included : Boolean := True) return Boolean;
+   --  Same as Fname.Is_Predefined_File_Name, except it works with the name of
+   --  the unit, rather than the file name.
+
    -------------------
    -- Get_Body_Name --
    -------------------
@@ -55,6 +64,16 @@ package body Uname is
       return Name_Find (Buffer);
    end Get_Body_Name;
 
+   -------------------------------
+   -- Encoded_Library_Unit_Name --
+   -------------------------------
+
+   function Encoded_Library_Unit_Name (N : Unit_Name_Type) return String is
+      S : constant String := Get_Name_String (N);
+   begin
+      return S (S'First .. S'Last - 2);
+   end Encoded_Library_Unit_Name;
+
    -----------------------------------
    -- Get_External_Unit_Name_String --
    -----------------------------------
@@ -64,10 +83,8 @@ package body Uname is
       Newlen : Natural;
 
    begin
-      --  Get unit name and eliminate trailing %s or %b
-
-      Get_Name_String (N);
-      Name_Len := Name_Len - 2;
+      Name_Len := 0;
+      Add_Str_To_Name_Buffer (Encoded_Library_Unit_Name (N));
 
       --  Find number of components
 
@@ -489,21 +506,22 @@ package body Uname is
    ---------------------------
 
    function Is_Internal_Unit_Name
-     (Name               : String;
-      Renamings_Included : Boolean := True) return Boolean
+     (Name : Unit_Name_Type; Renamings_Included : Boolean := True)
+      return Boolean
    is
       Gnat : constant String := "gnat";
 
+      Lib_Unit_Name : constant String := Encoded_Library_Unit_Name (Name);
    begin
-      if Name = Gnat then
+      if Lib_Unit_Name = Gnat then
          return True;
       end if;
 
-      if Has_Prefix (Name, Prefix => Gnat & ".") then
+      if Has_Prefix (Lib_Unit_Name, Prefix => Gnat & ".") then
          return True;
       end if;
 
-      return Is_Predefined_Unit_Name (Name, Renamings_Included);
+      return Is_Predefined_Unit_Name (Lib_Unit_Name, Renamings_Included);
    end Is_Internal_Unit_Name;
 
    -----------------------------
@@ -511,13 +529,20 @@ package body Uname is
    -----------------------------
 
    function Is_Predefined_Unit_Name
-     (Name               : String;
-      Renamings_Included : Boolean := True) return Boolean
+     (Name : Unit_Name_Type; Renamings_Included : Boolean := True)
+      return Boolean is
+   begin
+      return
+        Is_Predefined_Unit_Name
+          (Encoded_Library_Unit_Name (Name), Renamings_Included);
+   end Is_Predefined_Unit_Name;
+
+   function Is_Predefined_Unit_Name
+     (Name : String; Renamings_Included : Boolean := True) return Boolean
    is
       Ada        : constant String := "ada";
       Interfaces : constant String := "interfaces";
       System     : constant String := "system";
-
    begin
       if Name in Ada | Interfaces | System then
          return True;
@@ -536,14 +561,16 @@ package body Uname is
 
       --  The following are the predefined renamings
 
-      return Name in "calendar"
-        | "machine_code"
-        | "unchecked_conversion"
-        | "unchecked_deallocation"
-        | "direct_io"
-        | "io_exceptions"
-        | "sequential_io"
-        | "text_io";
+      return
+        Name in
+          "calendar"
+          | "machine_code"
+          | "unchecked_conversion"
+          | "unchecked_deallocation"
+          | "direct_io"
+          | "io_exceptions"
+          | "sequential_io"
+          | "text_io";
    end Is_Predefined_Unit_Name;
 
    ------------------
diff --git a/gcc/ada/uname.ads b/gcc/ada/uname.ads
index 57ff8a61ad2..394472e41ec 100644
--- a/gcc/ada/uname.ads
+++ b/gcc/ada/uname.ads
@@ -126,14 +126,14 @@ package Uname is
    --  body or a spec).
 
    function Is_Internal_Unit_Name
-     (Name               : String;
-      Renamings_Included : Boolean := True) return Boolean;
+     (Name : Unit_Name_Type; Renamings_Included : Boolean := True)
+      return Boolean;
    --  Same as Fname.Is_Internal_File_Name, except it works with the name of
    --  the unit, rather than the file name.
 
    function Is_Predefined_Unit_Name
-     (Name               : String;
-      Renamings_Included : Boolean := True) return Boolean;
+     (Name : Unit_Name_Type; Renamings_Included : Boolean := True)
+      return Boolean;
    --  Same as Fname.Is_Predefined_File_Name, except it works with the name of
    --  the unit, rather than the file name.
 
-- 
2.43.0

Reply via email to