]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ada: Split the unit System.Case_Utilities into two parts.
authorSteve Baird <baird@adacore.com>
Mon, 21 Apr 2025 22:28:39 +0000 (15:28 -0700)
committerMarc Poulhiès <dkm@gcc.gnu.org>
Tue, 1 Jul 2025 08:29:43 +0000 (10:29 +0200)
The package System.Case_Utilities provides some subprograms that do not make
use of the secondary stack and some that do. When compiling in a context
where no secondary stack support is provided, this makes the entire package
unusable (and similarly for any other package that withs this package).
Split the package into two packages named Case_Utilities_NSS and Case_Utilities
(NSS is for "no secondary stack"). The first package declares the
subprograms that do not need secondary stack support. The second package
declares the remaining subprograms, as well as renamings of everything declared
in the first part. A client that continues to reference Case_Utilities is
largely unaffected by this change. But if we change a client to reference
Case_Utilities_NSS instead, that removes an obstacle that would otherwise
prevent using that client unit in a no-secondary-stack-support environment.
We then make that change to the body of package System.Val_Util.

gcc/ada/ChangeLog:

* Makefile.rtl: Add entry for new unit's object file.
* libgnat/s-casuti.adb: Remove bodies of subprograms that were moved
to the new unit.
* libgnat/s-casuti.ads: Replace (with renamings) declarations for
subprograms that moved to the new unit.
* libgnat/s-cautns.adb: Body for new unit (a new source file).
* libgnat/s-cautns.ads: Spec for new unit (a new source file).
* libgnat/s-valuti.adb: Use the new unit instead of the old one.
* gcc-interface/Make-lang.in: Add entries for new unit's object file.
* gcc-interface/Makefile.in: Likewise.

gcc/ada/Makefile.rtl
gcc/ada/gcc-interface/Make-lang.in
gcc/ada/gcc-interface/Makefile.in
gcc/ada/libgnat/s-casuti.adb
gcc/ada/libgnat/s-casuti.ads
gcc/ada/libgnat/s-cautns.adb [new file with mode: 0644]
gcc/ada/libgnat/s-cautns.ads [new file with mode: 0644]
gcc/ada/libgnat/s-valuti.adb

index c2a4e1fde42104609b24ce5326baf1f7375e7554..8f925fce9e0d33a142822e29bb1addf12ea028b7 100644 (file)
@@ -544,6 +544,7 @@ GNATRTL_NONTASKING_OBJS= \
   s-caun16$(objext) \
   s-caun32$(objext) \
   s-caun64$(objext) \
+  s-cautns$(objext) \
   s-chepoo$(objext) \
   s-commun$(objext) \
   s-conca2$(objext) \
index 87942c47c41e5af138aa38b339e36501c90abbf4..1c93816b3197c972e041ab5551949f88911438e2 100644 (file)
@@ -531,6 +531,7 @@ GNAT_ADA_OBJS+= \
  ada/libgnat/s-bitops.o        \
  ada/libgnat/s-carun8.o        \
  ada/libgnat/s-casuti.o \
+ ada/libgnat/s-cautns.o \
  ada/libgnat/s-crtl.o  \
  ada/libgnat/s-conca2.o        \
  ada/libgnat/s-conca3.o        \
@@ -696,6 +697,7 @@ GNATBIND_OBJS +=  \
  ada/libgnat/s-assert.o   \
  ada/libgnat/s-carun8.o   \
  ada/libgnat/s-casuti.o   \
+ ada/libgnat/s-cautns.o   \
  ada/libgnat/s-conca2.o   \
  ada/libgnat/s-conca3.o   \
  ada/libgnat/s-conca4.o   \
index e686605cdc1311fdca3263326812026871a1ff3e..3557b46c64d1298cb912ecfffbc2d61094ec967a 100644 (file)
@@ -323,7 +323,7 @@ GNATMAKE_OBJS = a-except.o ali.o ali-util.o aspects.o s-casuti.o alloc.o \
  erroutc.o errutil.o err_vars.o fmap.o fname.o fname-uf.o fname-sf.o \
  gnatmake.o gnatvsn.o hostparm.o interfac.o i-c.o i-cstrin.o krunch.o lib.o \
  make.o makeusg.o make_util.o namet.o nlists.o opt.o osint.o osint-m.o \
- output.o restrict.o rident.o s-exctab.o \
+ output.o restrict.o rident.o s-exctab.o s-cautns.o \
  s-secsta.o s-stalib.o s-stoele.o scans.o scng.o sdefault.o sfn_scan.o \
  s-purexc.o s-htable.o scil_ll.o sem_aux.o sinfo.o sinput.o sinput-c.o \
  snames.o stand.o stringt.o styleg.o stylesw.o system.o validsw.o \
index af9879159a2701f1e24c6256ada432b5edbc7e7c..887cbbf5770787eb07657035a381f193ac2b5131 100644 (file)
@@ -36,27 +36,6 @@ is
    -- To_Lower --
    --------------
 
-   function To_Lower (A : Character) return Character is
-      A_Val : constant Natural := Character'Pos (A);
-
-   begin
-      if A in 'A' .. 'Z'
-        or else A_Val in 16#C0# .. 16#D6#
-        or else A_Val in 16#D8# .. 16#DE#
-      then
-         return Character'Val (A_Val + 16#20#);
-      else
-         return A;
-      end if;
-   end To_Lower;
-
-   procedure To_Lower (A : in out String) is
-   begin
-      for J in A'Range loop
-         A (J) := To_Lower (A (J));
-      end loop;
-   end To_Lower;
-
    function To_Lower (A : String) return String is
       Result : String := A;
    begin
@@ -68,21 +47,6 @@ is
    -- To_Mixed --
    --------------
 
-   procedure To_Mixed (A : in out String) is
-      Ucase : Boolean := True;
-
-   begin
-      for J in A'Range loop
-         if Ucase then
-            A (J) := To_Upper (A (J));
-         else
-            A (J) := To_Lower (A (J));
-         end if;
-
-         Ucase := A (J) = '_';
-      end loop;
-   end To_Mixed;
-
    function To_Mixed (A : String) return String is
       Result : String := A;
    begin
@@ -94,27 +58,6 @@ is
    -- To_Upper --
    --------------
 
-   function To_Upper (A : Character) return Character is
-      A_Val : constant Natural := Character'Pos (A);
-
-   begin
-      if A in 'a' .. 'z'
-        or else A_Val in 16#E0# .. 16#F6#
-        or else A_Val in 16#F8# .. 16#FE#
-      then
-         return Character'Val (A_Val - 16#20#);
-      else
-         return A;
-      end if;
-   end To_Upper;
-
-   procedure To_Upper (A : in out String) is
-   begin
-      for J in A'Range loop
-         A (J) := To_Upper (A (J));
-      end loop;
-   end To_Upper;
-
    function To_Upper (A : String) return String is
       Result : String := A;
    begin
index fbdec17dd54edd4498126117d8d6128f53f8f7db..967abe090e7dedb967f09febdd17e360f443332b 100644 (file)
 --  contract cases should not be executed at runtime as well, in order not to
 --  slow down the execution of these functions.
 
+--  The portion of this package that does not require use of the secondary
+--  stack (so all the subprograms except functions that return String)
+--  has been moved into a sibling package, Case_Util_NSS. See comments there.
+--  Clients who don't care about avoiding secondary stack usage can
+--  continue to use this package and are unaffected by this reorganization.
+
 pragma Assertion_Policy (Pre            => Ignore,
                          Post           => Ignore,
                          Contract_Cases => Ignore,
                          Ghost          => Ignore);
 
+with System.Case_Util_NSS;
+
 package System.Case_Util
   with Pure, SPARK_Mode
 is
    --  Note: all the following functions handle the full Latin-1 set
 
    function To_Upper (A : Character) return Character
-   with
-     Post => (declare
-                A_Val : constant Natural := Character'Pos (A);
-              begin
-                (if A in 'a' .. 'z'
-                   or else A_Val in 16#E0# .. 16#F6#
-                   or else A_Val in 16#F8# .. 16#FE#
-                 then
-                   To_Upper'Result = Character'Val (A_Val - 16#20#)
-                 else
-                   To_Upper'Result = A));
+     renames Case_Util_NSS.To_Upper;
    --  Converts A to upper case if it is a lower case letter, otherwise
    --  returns the input argument unchanged.
 
-   procedure To_Upper (A : in out String)
-   with
-     Post => (for all J in A'Range => A (J) = To_Upper (A'Old (J)));
+   procedure To_Upper (A : in out String) renames Case_Util_NSS.To_Upper;
 
    function To_Upper (A : String) return String
    with
@@ -78,23 +74,12 @@ is
    --  Folds all characters of string A to upper case
 
    function To_Lower (A : Character) return Character
-   with
-     Post => (declare
-                A_Val : constant Natural := Character'Pos (A);
-              begin
-                (if A in 'A' .. 'Z'
-                   or else A_Val in 16#C0# .. 16#D6#
-                   or else A_Val in 16#D8# .. 16#DE#
-                 then
-                   To_Lower'Result = Character'Val (A_Val + 16#20#)
-                 else
-                   To_Lower'Result = A));
+     renames Case_Util_NSS.To_Lower;
    --  Converts A to lower case if it is an upper case letter, otherwise
    --  returns the input argument unchanged.
 
    procedure To_Lower (A : in out String)
-   with
-     Post => (for all J in A'Range => A (J) = To_Lower (A'Old (J)));
+     renames Case_Util_NSS.To_Lower;
 
    function To_Lower (A : String) return String
    with
@@ -105,15 +90,7 @@ is
    --  Folds all characters of string A to lower case
 
    procedure To_Mixed (A : in out String)
-   with
-     Post =>
-       (for all J in A'Range =>
-          (if J = A'First
-             or else A'Old (J - 1) = '_'
-           then
-             A (J) = To_Upper (A'Old (J))
-           else
-             A (J) = To_Lower (A'Old (J))));
+     renames Case_Util_NSS.To_Mixed;
 
    function To_Mixed (A : String) return String
    with
diff --git a/gcc/ada/libgnat/s-cautns.adb b/gcc/ada/libgnat/s-cautns.adb
new file mode 100644 (file)
index 0000000..3e2d996
--- /dev/null
@@ -0,0 +1,127 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                         GNAT RUN-TIME COMPONENTS                         --
+--                                                                          --
+--                 S Y S T E M . C A S E _ U T I L _ N S S                  --
+--                                                                          --
+--                                 B o d y                                  --
+--                                                                          --
+--                     Copyright (C) 1995-2025, AdaCore                     --
+--                                                                          --
+-- GNAT is free software;  you can  redistribute it  and/or modify it under --
+-- terms of the  GNU General Public License as published  by the Free Soft- --
+-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
+-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
+--                                                                          --
+-- As a special exception under Section 7 of GPL version 3, you are granted --
+-- additional permissions described in the GCC Runtime Library Exception,   --
+-- version 3.1, as published by the Free Software Foundation.               --
+--                                                                          --
+-- You should have received a copy of the GNU General Public License and    --
+-- a copy of the GCC Runtime Library Exception along with this program;     --
+-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
+-- <http://www.gnu.org/licenses/>.                                          --
+--                                                                          --
+-- GNAT was originally developed  by the GNAT team at  New York University. --
+-- Extensive contributions were provided by Ada Core Technologies Inc.      --
+--                                                                          --
+------------------------------------------------------------------------------
+
+--  Ghost code, loop invariants and assertions in this unit are meant for
+--  analysis only, not for run-time checking, as it would be too costly
+--  otherwise. This is enforced by setting the assertion policy to Ignore.
+
+pragma Assertion_Policy (Ghost          => Ignore,
+                         Loop_Invariant => Ignore,
+                         Assert         => Ignore);
+
+package body System.Case_Util_NSS
+  with SPARK_Mode
+is
+   --------------
+   -- To_Lower --
+   --------------
+
+   function To_Lower (A : Character) return Character is
+      A_Val : constant Natural := Character'Pos (A);
+
+   begin
+      if A in 'A' .. 'Z'
+        or else A_Val in 16#C0# .. 16#D6#
+        or else A_Val in 16#D8# .. 16#DE#
+      then
+         return Character'Val (A_Val + 16#20#);
+      else
+         return A;
+      end if;
+   end To_Lower;
+
+   procedure To_Lower (A : in out String) is
+   begin
+      for J in A'Range loop
+         A (J) := To_Lower (A (J));
+
+         pragma Loop_Invariant
+           (for all K in A'First .. J => A (K) = To_Lower (A'Loop_Entry (K)));
+      end loop;
+   end To_Lower;
+
+   --------------
+   -- To_Mixed --
+   --------------
+
+   procedure To_Mixed (A : in out String) is
+      Ucase : Boolean := True;
+
+   begin
+      for J in A'Range loop
+         if Ucase then
+            A (J) := To_Upper (A (J));
+         else
+            A (J) := To_Lower (A (J));
+         end if;
+
+         pragma Loop_Invariant
+           (for all K in A'First .. J =>
+              (if K = A'First
+                 or else A'Loop_Entry (K - 1) = '_'
+               then
+                 A (K) = To_Upper (A'Loop_Entry (K))
+               else
+                 A (K) = To_Lower (A'Loop_Entry (K))));
+
+         Ucase := A (J) = '_';
+      end loop;
+   end To_Mixed;
+
+   --------------
+   -- To_Upper --
+   --------------
+
+   function To_Upper (A : Character) return Character is
+      A_Val : constant Natural := Character'Pos (A);
+
+   begin
+      if A in 'a' .. 'z'
+        or else A_Val in 16#E0# .. 16#F6#
+        or else A_Val in 16#F8# .. 16#FE#
+      then
+         return Character'Val (A_Val - 16#20#);
+      else
+         return A;
+      end if;
+   end To_Upper;
+
+   procedure To_Upper (A : in out String) is
+   begin
+      for J in A'Range loop
+         A (J) := To_Upper (A (J));
+
+         pragma Loop_Invariant
+           (for all K in A'First .. J => A (K) = To_Upper (A'Loop_Entry (K)));
+      end loop;
+   end To_Upper;
+
+end System.Case_Util_NSS;
diff --git a/gcc/ada/libgnat/s-cautns.ads b/gcc/ada/libgnat/s-cautns.ads
new file mode 100644 (file)
index 0000000..5c9c67b
--- /dev/null
@@ -0,0 +1,106 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                         GNAT RUN-TIME COMPONENTS                         --
+--                                                                          --
+--                 S Y S T E M . C A S E _ U T I L _ N S S                  --
+--                                                                          --
+--                                 S p e c                                  --
+--                                                                          --
+--          Copyright (C) 1995-2025, Free Software Foundation, Inc.         --
+--                                                                          --
+-- GNAT is free software;  you can  redistribute it  and/or modify it under --
+-- terms of the  GNU General Public License as published  by the Free Soft- --
+-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
+-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
+--                                                                          --
+-- As a special exception under Section 7 of GPL version 3, you are granted --
+-- additional permissions described in the GCC Runtime Library Exception,   --
+-- version 3.1, as published by the Free Software Foundation.               --
+--                                                                          --
+-- You should have received a copy of the GNU General Public License and    --
+-- a copy of the GCC Runtime Library Exception along with this program;     --
+-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
+-- <http://www.gnu.org/licenses/>.                                          --
+--                                                                          --
+-- GNAT was originally developed  by the GNAT team at  New York University. --
+-- Extensive contributions were provided by Ada Core Technologies Inc.      --
+--                                                                          --
+------------------------------------------------------------------------------
+
+--  The No_Secondary_Stack portion of System.Case_Util. Some of the functions
+--  provided in System.Case_Util make use of the secondary stack, and some
+--  do not. Lumping them all together makes even the non-secondary-stack
+--  portion of the package unusable in cases where references to
+--  secondary-stack-related code must be avoided (for example, if linking with
+--  a reduced version of the runtimes where that code is missing). That's a
+--  problem in some cases, so Case_Util is split into two parts. The first
+--  part (named Case_Util_NSS) is a subset of the original version which
+--  does not use the secondary stack; the second part presents the same
+--  complete interface to users as before, but avoids code duplication by
+--  renaming entities out of the first part.
+--
+--  See comments in s-casuti.ads for further explanations (e.g., of
+--  the Assertion_Policy specified here).
+
+pragma Assertion_Policy (Pre            => Ignore,
+                         Post           => Ignore,
+                         Contract_Cases => Ignore,
+                         Ghost          => Ignore);
+
+package System.Case_Util_NSS
+  with Pure, SPARK_Mode
+is
+   --  Note: all the following functions handle the full Latin-1 set
+
+   function To_Upper (A : Character) return Character
+   with
+     Post => (declare
+                A_Val : constant Natural := Character'Pos (A);
+              begin
+                (if A in 'a' .. 'z'
+                   or else A_Val in 16#E0# .. 16#F6#
+                   or else A_Val in 16#F8# .. 16#FE#
+                 then
+                   To_Upper'Result = Character'Val (A_Val - 16#20#)
+                 else
+                   To_Upper'Result = A));
+   --  Converts A to upper case if it is a lower case letter, otherwise
+   --  returns the input argument unchanged.
+
+   procedure To_Upper (A : in out String)
+   with
+     Post => (for all J in A'Range => A (J) = To_Upper (A'Old (J)));
+
+   function To_Lower (A : Character) return Character
+   with
+     Post => (declare
+                A_Val : constant Natural := Character'Pos (A);
+              begin
+                (if A in 'A' .. 'Z'
+                   or else A_Val in 16#C0# .. 16#D6#
+                   or else A_Val in 16#D8# .. 16#DE#
+                 then
+                   To_Lower'Result = Character'Val (A_Val + 16#20#)
+                 else
+                   To_Lower'Result = A));
+   --  Converts A to lower case if it is an upper case letter, otherwise
+   --  returns the input argument unchanged.
+
+   procedure To_Lower (A : in out String)
+   with
+     Post => (for all J in A'Range => A (J) = To_Lower (A'Old (J)));
+
+   procedure To_Mixed (A : in out String)
+   with
+     Post =>
+       (for all J in A'Range =>
+          (if J = A'First
+             or else A'Old (J - 1) = '_'
+           then
+             A (J) = To_Upper (A'Old (J))
+           else
+             A (J) = To_Lower (A'Old (J))));
+
+end System.Case_Util_NSS;
index 6332137d674f9061971cbfcb3795bafae4e4e7b0..a97ab002e7fbd4744204b7f8992fb3d68b5b41c7 100644 (file)
@@ -29,7 +29,7 @@
 --                                                                          --
 ------------------------------------------------------------------------------
 
-with System.Case_Util; use System.Case_Util;
+with System.Case_Util_NSS; use System.Case_Util_NSS;
 
 package body System.Val_Util
   with SPARK_Mode