]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
system-linux-ia64.ads, [...] (Stack_Check_Limits): New target parameter.
authorEric Botcazou <ebotcazou@adacore.com>
Thu, 13 Dec 2007 10:19:19 +0000 (11:19 +0100)
committerArnaud Charlet <charlet@gcc.gnu.org>
Thu, 13 Dec 2007 10:19:19 +0000 (11:19 +0100)
2007-12-06  Eric Botcazou  <ebotcazou@adacore.com>
    Bob Duff  <duff@adacore.com>
    Tristan Gingold  <gingold@adacore.com>

* system-linux-ia64.ads, system-freebsd-x86.ads, system-lynxos-ppc.ads,
system-lynxos-x86.ads, system-linux-x86_64.ads, system-tru64.ads,
system-aix.ads, system-vxworks-sparcv9.ads, system-solaris-x86.ads,
system-irix-o32.ads, system-irix-n32.ads, system-hpux.ads,
system-vxworks-m68k.ads, system-linux-x86.ads, system-vxworks-mips.ads,
system-solaris-sparc.ads, system-solaris-sparcv9.ads, system-vms.ads,
system-mingw.ads, system-vms-zcx.ads, system-vxworks-ppc.ads,
system-vxworks-arm.ads, system-darwin-x86.ads, system.ads,
system-vms_64.ads, system-darwin-ppc.ads, system-vxworks-x86.ads,
system-linux-ppc.ads, system-linux-hppa.ads, system-hpux-ia64.ads,
system-vms-ia64.ads (Stack_Check_Limits): New target parameter.
(Always_Compatible_Rep): New flag to control trampolines globally.
(Dynamic_Trampolines_Used): New flag for implementing the
No_Implicit_Dynamic_Code restriction more correctly (not yet used,
and not yet set correctly for some targets).

* s-taprop-vxworks.adb: Use stack limit method of stack checking.
Simply indirectly call s-stchop when a task is created.

* ali.ads:
New flag added: Stack_Check_Switch_Set which is set when '-fstack-check'
appears as an argument (entries A) in an ALI file.

* fe.h (Stack_Check_Limits): Declare new target parameter.
(Check_Implicit_Dynamic_Code_Allowed): New procedure.

* init.c: Declare __gnat_set_stack_limit_hook for VxWorks kernel RTS.
This variable is declared in C to be sure not subject to elaboration
code.
(__gnat_map_signal, VxWorks): In kernel mode, map SIGILL to
Storage_Error.

* targparm.ads, targparm.adb (Stack_Check_Limits): New parameter.
(Always_Compatible_Rep, Dynamic_Trampolines_Used): New parameters.

* s-stchop.ads: Add comments.

* s-stchop-vxworks.adb: Package almost fully rewritten to use stack
limit method of stack checking.

* s-stchop-limit.ads: New file.

From-SVN: r130814

40 files changed:
gcc/ada/ali.ads
gcc/ada/fe.h
gcc/ada/init.c
gcc/ada/s-stchop-limit.ads [new file with mode: 0644]
gcc/ada/s-stchop-vxworks.adb
gcc/ada/s-stchop.ads
gcc/ada/s-taprop-vxworks.adb
gcc/ada/system-aix.ads
gcc/ada/system-darwin-ppc.ads
gcc/ada/system-darwin-x86.ads
gcc/ada/system-freebsd-x86.ads
gcc/ada/system-hpux-ia64.ads
gcc/ada/system-hpux.ads
gcc/ada/system-irix-n32.ads
gcc/ada/system-irix-o32.ads
gcc/ada/system-linux-hppa.ads
gcc/ada/system-linux-ia64.ads
gcc/ada/system-linux-ppc.ads
gcc/ada/system-linux-x86.ads
gcc/ada/system-linux-x86_64.ads
gcc/ada/system-lynxos-ppc.ads
gcc/ada/system-lynxos-x86.ads
gcc/ada/system-mingw.ads
gcc/ada/system-solaris-sparc.ads
gcc/ada/system-solaris-sparcv9.ads
gcc/ada/system-solaris-x86.ads
gcc/ada/system-tru64.ads
gcc/ada/system-vms-ia64.ads
gcc/ada/system-vms-zcx.ads
gcc/ada/system-vms.ads
gcc/ada/system-vms_64.ads
gcc/ada/system-vxworks-arm.ads
gcc/ada/system-vxworks-m68k.ads
gcc/ada/system-vxworks-mips.ads
gcc/ada/system-vxworks-ppc.ads
gcc/ada/system-vxworks-sparcv9.ads
gcc/ada/system-vxworks-x86.ads
gcc/ada/system.ads
gcc/ada/targparm.adb
gcc/ada/targparm.ads

index c90954acbcbd06e1031be47217fcc90771f5dff0..94715b31196ef5d0ea0fa544529ac3f3fc0309b2 100644 (file)
@@ -476,6 +476,10 @@ package ALI is
    --  ali files, showing whether a restriction pragma exists anywhere, and
    --  accumulating the aggregate knowledge of violations.
 
+   Stack_Check_Switch_Set : Boolean := False;
+   --  Set to True if at least one ALI file contains '-fstack-check' in its
+   --  argument list.
+
    Static_Elaboration_Model_Used : Boolean := False;
    --  Set to False by Initialize_ALI. Set to True if any ALI file for a
    --  non-internal unit compiled with the static elaboration model is
index 59ecea4612e754e2b3dfd4c2be45fb97db6384f0..09dd27920635c9b80c831901ea500fe1df4c6a28 100644 (file)
@@ -6,7 +6,7 @@
  *                                                                          *
  *                              C Header File                               *
  *                                                                          *
- *          Copyright (C) 1992-2006, Free Software Foundation, Inc.         *
+ *          Copyright (C) 1992-2007, 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- *
@@ -175,10 +175,12 @@ extern Boolean Back_Annotate_Rep_Info;
 #define No_Exception_Handlers_Set      restrict__no_exception_handlers_set
 #define Check_No_Implicit_Heap_Alloc   restrict__check_no_implicit_heap_alloc
 #define Check_Elaboration_Code_Allowed restrict__check_elaboration_code_allowed
+#define Check_Implicit_Dynamic_Code_Allowed restrict__check_implicit_dynamic_code_allowed
 
 extern Boolean No_Exception_Handlers_Set   (void);
 extern void Check_No_Implicit_Heap_Alloc   (Node_Id);
 extern void Check_Elaboration_Code_Allowed (Node_Id);
+extern void Check_Implicit_Dynamic_Code_Allowed (Node_Id);
 
 /* sem_elim: */
 
@@ -221,5 +223,7 @@ extern void Set_Has_No_Elaboration_Code     (Node_Id, Boolean);
 /* targparm: */
 
 #define Stack_Check_Probes_On_Target targparm__stack_check_probes_on_target
+#define Stack_Check_Limits_On_Target targparm__stack_check_limits_on_target
 
 extern Boolean Stack_Check_Probes_On_Target;
+extern Boolean Stack_Check_Limits_On_Target;
index 00f986bac34c79f13a96ec8b939394ad92887f7c..fdfd31a6e2a68568e8bfcd01a6b85485687b00a7 100644 (file)
@@ -1713,19 +1713,24 @@ __gnat_map_signal (int sig)
       msg = "SIGBUS: possible stack overflow";
       break;
 #else
+#ifdef __RTP__
+    /* In RTP mode a SIGSEGV is most likely due to a stack overflow,
+       since stack checking uses the probing mechanism.  */
     case SIGILL:
       exception = &constraint_error;
       msg = "SIGILL";
       break;
-/* In RTP mode a SIGSEGV is most likely due to a stack overflow. This is not
-   the case in kernel mode where stack overflow detection uses a comparison
-   method instead of memory probes. */
-#ifdef __RTP__
     case SIGSEGV:
       exception = &storage_error;
       msg = "SIGSEGV: possible stack overflow";
       break;
 #else
+    /* In kernel mode a SIGILL is most likely due to a stack overflow,
+       since stack checking uses the stack limit mechanism.  */
+    case SIGILL:
+      exception = &storage_error;
+      msg = "SIGILL: possible stack overflow";
+      break;
     case SIGSEGV:
       exception = &program_error;
       msg = "SIGSEGV";
@@ -1826,6 +1831,14 @@ __gnat_init_float (void)
 #endif
 }
 
+/* This subprogram is called by System.Task_Primitives.Operations.Enter_Task
+   (if not null) when a new task is created.  It is initialized by
+   System.Stack_Checking.Operations.Initialize_Stack_Limit.
+   The use of a hook avoids to drag stack checking subprograms if stack
+   checking is not used.  */
+void (*__gnat_set_stack_limit_hook)(void) = (void (*)(void))0;
+
+
 /******************/
 /* NetBSD Section */
 /******************/
diff --git a/gcc/ada/s-stchop-limit.ads b/gcc/ada/s-stchop-limit.ads
new file mode 100644 (file)
index 0000000..4795791
--- /dev/null
@@ -0,0 +1,55 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                 GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS                 --
+--                                                                          --
+--     S Y S T E M . S T A C K _ C H E C K I N G . O P E R A T I O N S      --
+--                                                                          --
+--                                  S p e c                                 --
+--                                                                          --
+--          Copyright (C) 1999-2007, Free Software Foundation, Inc.         --
+--                                                                          --
+-- GNARL 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 2,  or (at your option) any later ver- --
+-- sion. GNARL 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.  See the GNU General Public License --
+-- for  more details.  You should have  received  a copy of the GNU General --
+-- Public License  distributed with GNARL; see file COPYING.  If not, write --
+-- to  the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, --
+-- Boston, MA 02110-1301, USA.                                              --
+--                                                                          --
+-- As a special exception,  if other files  instantiate  generics from this --
+-- unit, or you link  this unit with other files  to produce an executable, --
+-- this  unit  does not  by itself cause  the resulting  executable  to  be --
+-- covered  by the  GNU  General  Public  License.  This exception does not --
+-- however invalidate  any other reasons why  the executable file  might be --
+-- covered by the  GNU Public License.                                      --
+--                                                                          --
+-- GNARL was developed by the GNARL team at Florida State University.       --
+-- Extensive contributions were provided by Ada Core Technologies, Inc.     --
+--                                                                          --
+------------------------------------------------------------------------------
+
+--  This version of this package is for implementations which use
+--  the stack limit approach (the limit of the stack is stored into a per
+--  thread variable).
+
+pragma Restrictions (No_Elaboration_Code);
+--  We want to guarantee the absence of elaboration code because the binder
+--  does not handle references to this package.
+
+pragma Polling (Off);
+--  Turn off polling, we do not want polling to take place during stack
+--  checking operations. It causes infinite loops and other problems.
+
+package System.Stack_Checking.Operations is
+   pragma Preelaborate;
+
+   procedure Initialize_Stack_Limit;
+   pragma Export (C, Initialize_Stack_Limit,
+                    "__gnat_initialize_stack_limit");
+   --  This procedure is called before elaboration to setup the stack limit
+   --  for the environment task and to register the hook to be called at
+   --  task creation.
+end System.Stack_Checking.Operations;
index 8ff103267035dad29a556d29718a1fb79e46e9a2..5ed7c982ee320ea368082f7f85cef5c4006501ac 100644 (file)
@@ -39,11 +39,8 @@ pragma Restrictions (No_Elaboration_Code);
 --  We want to guarantee the absence of elaboration code because the
 --  binder does not handle references to this package.
 
-with Ada.Exceptions;
-
 with System.Storage_Elements; use System.Storage_Elements;
 with System.Parameters; use System.Parameters;
-with System.Soft_Links;
 with Interfaces.C;
 
 package body System.Stack_Checking.Operations is
@@ -60,66 +57,55 @@ package body System.Stack_Checking.Operations is
    --    * selecting INCLUDE_TASK_SHOW when using the Tornado project
    --      facility.
 
-   function Set_Stack_Info
-     (Stack : not null access Stack_Access) return Stack_Access;
-
-   --  The function Set_Stack_Info is the actual function that updates the
-   --  cache containing a pointer to the Stack_Info. It may also be used for
-   --  detecting asynchronous abort in combination with Invalidate_Self_Cache.
-
-   --  Set_Stack_Info should do the following things in order:
-   --     1) Get the Stack_Access value for the current task
-   --     2) Set Stack.all to the value obtained in 1)
-   --     3) Optionally Poll to check for asynchronous abort
-
-   --  This order is important because if at any time a write to the stack
-   --  cache is pending, that write should be followed by a Poll to prevent
-   --  loosing signals.
-
-   --  Note: This function must be compiled with Polling turned off
-
-   --  Note: on systems like VxWorks and Linux with real thread-local storage,
-   --        Set_Stack_Info should return an access value for such local
-   --        storage. In those cases the cache will always be up-to-date.
-
-   --  The following constants should be imported from some system-specific
-   --  constants package. The constants must be static for performance reasons.
-
-   ----------------------------
-   -- Invalidate_Stack_Cache --
-   ----------------------------
-
-   procedure Invalidate_Stack_Cache (Any_Stack : Stack_Access) is
-      pragma Warnings (Off, Any_Stack);
-   begin
-      Cache := Null_Stack;
-   end Invalidate_Stack_Cache;
+   Stack_Limit : Address :=
+                   Boolean'Pos (Stack_Grows_Down) * Address'First
+                   + Boolean'Pos (not Stack_Grows_Down) * Address'Last;
+   pragma Export (C, Stack_Limit, "__gnat_stack_limit");
+   --  Stack_Limit contains the limit of the stack. This variable is later made
+   --  a task variable (by calling taskVarAdd) and then correctly set to the
+   --  stack limit of the task. Before being so initialized its value must be
+   --  valid so that any subprogram with stack checking enabled will run. We
+   --  use extreme values according to the direction of the stack.
+
+   type Set_Stack_Limit_Proc_Acc is access procedure;
+   pragma Convention (C, Set_Stack_Limit_Proc_Acc);
+
+   Set_Stack_Limit_Hook : Set_Stack_Limit_Proc_Acc;
+   pragma Import (C, Set_Stack_Limit_Hook, "__gnat_set_stack_limit_hook");
+   --  Procedure to be called when a task is created to set stack
+   --  limit.
+
+   procedure Set_Stack_Limit_For_Current_Task;
+   pragma Convention (C, Set_Stack_Limit_For_Current_Task);
+   --  Register Initial_SP as the initial stack pointer value for the current
+   --  task when it starts and Size as the associated stack area size. This
+   --  should be called once, after the soft-links have been initialized?
 
    -----------------------------
-   -- Notify_Stack_Attributes --
+   --  Initialize_Stack_Limit --
    -----------------------------
 
-   procedure Notify_Stack_Attributes
-     (Initial_SP : System.Address;
-      Size       : System.Storage_Elements.Storage_Offset)
-   is
-      --  We retrieve the attributes directly from Set_Stack_Info below, so
-      --  this implementation has nothing to do.
+   procedure Initialize_Stack_Limit is
+   begin
+      --  For the environment task.
+      Set_Stack_Limit_For_Current_Task;
 
-      pragma Unreferenced (Initial_SP);
-      pragma Unreferenced (Size);
+      --  Will be called by every created task.
+      Set_Stack_Limit_Hook := Set_Stack_Limit_For_Current_Task'Access;
+   end Initialize_Stack_Limit;
 
-   begin
-      null;
-   end Notify_Stack_Attributes;
+   --------------------------------------
+   -- Set_Stack_Limit_For_Current_Task --
+   --------------------------------------
+
+   procedure Set_Stack_Limit_For_Current_Task is
+      use Interfaces.C;
 
-   --------------------
-   -- Set_Stack_Info --
-   --------------------
+      --  Import from VxWorks.
+      function Task_Var_Add (Tid : Interfaces.C.int; Var : Address)
+                            return Interfaces.C.int;
+      pragma Import (C, Task_Var_Add, "taskVarAdd");
 
-   function Set_Stack_Info
-     (Stack : not null access Stack_Access) return Stack_Access
-   is
       type OS_Stack_Info is record
          Size  : Interfaces.C.int;
          Base  : System.Address;
@@ -134,114 +120,23 @@ package body System.Stack_Checking.Operations is
       --  Procedure that fills the stack information associated to the
       --  currently executing task.
 
-      My_Stack  : Stack_Access;
-      Task_Info : aliased OS_Stack_Info;
+      Stack_Info : aliased OS_Stack_Info;
 
+      Limit      : System.Address;
    begin
-      --  The order of steps 1 .. 3 is important, see specification
-
-      --  1) Get the Stack_Access value for the current task
-
-      My_Stack := Soft_Links.Get_Stack_Info.all;
-
-      if My_Stack.Base = Null_Address then
-
-         --  First invocation. Ask the VxWorks kernel about stack values
-
-         Get_Stack_Info (Task_Info'Access);
-
-         My_Stack.Size  := Storage_Elements.Storage_Offset (Task_Info.Size);
-         My_Stack.Base  := Task_Info.Base;
-         My_Stack.Limit := Task_Info.Limit;
+      --  Get stack bounds from VxWorks.
+      Get_Stack_Info (Stack_Info'Access);
 
+      if Stack_Grows_Down then
+         Limit := Stack_Info.Base - Storage_Offset (Stack_Info.Size);
+      else
+         Limit := Stack_Info.Base + Storage_Offset (Stack_Info.Size);
       end if;
 
-      --  2) Set Stack.all to the value obtained in 1)
-
-      Stack.all := My_Stack;
-
-      --  3) Optionally Poll to check for asynchronous abort
-
-      if Soft_Links.Check_Abort_Status.all /= 0 then
-         raise Standard'Abort_Signal;
-      end if;
-
-      --  Never trust the cached value, return local copy!
-
-      return My_Stack;
-   end Set_Stack_Info;
-
-   -----------------
-   -- Stack_Check --
-   -----------------
-
-   function Stack_Check
-     (Stack_Address : System.Address) return Stack_Access
-   is
-      type Frame_Marker is null record;
-
-      Marker        : Frame_Marker;
-      Cached_Stack  : constant Stack_Access := Cache;
-      Frame_Address : constant System.Address := Marker'Address;
-
-   begin
-      --  The parameter may have wrapped around in System.Address arithmetics.
-      --  In that case, we have no other choices than raising the exception.
-
-      if (Stack_Grows_Down and then Stack_Address > Frame_Address)
-        or else (not Stack_Grows_Down and then Stack_Address < Frame_Address)
-      then
-         Ada.Exceptions.Raise_Exception
-           (E       => Storage_Error'Identity,
-            Message => "stack overflow detected");
-      end if;
-
-      --  This function first does a "cheap" check which is correct if it
-      --  succeeds. In case of failure, the full check is done. Ideally the
-      --  cheap check should be done in an optimized manner, or be inlined.
-
-      if (Stack_Grows_Down
-          and then Frame_Address <= Cached_Stack.Base
-          and then Stack_Address > Cached_Stack.Limit)
-        or else (not Stack_Grows_Down
-                   and then Frame_Address >= Cached_Stack.Base
-                   and then Stack_Address < Cached_Stack.Limit)
-      then
-         --  Cached_Stack is valid as it passed the stack check
-
-         return Cached_Stack;
-      end if;
-
-      Full_Check :
-      declare
-         My_Stack : constant Stack_Access := Set_Stack_Info (Cache'Access);
-         --  At this point Stack.all might already be invalid, so it is
-         --  essential to use our local copy of Stack!
-
-      begin
-         if (Stack_Grows_Down
-               and then Stack_Address < My_Stack.Limit)
-           or else (not Stack_Grows_Down
-                      and then Stack_Address > My_Stack.Limit)
-         then
-            Ada.Exceptions.Raise_Exception
-              (E       => Storage_Error'Identity,
-               Message => "stack overflow detected");
-         end if;
-
-         return My_Stack;
-      end Full_Check;
-   end Stack_Check;
-
-   ------------------------
-   -- Update_Stack_Cache --
-   ------------------------
-
-   procedure Update_Stack_Cache (Stack : Stack_Access) is
-   begin
-      if not Multi_Processor then
-         Cache := Stack;
+      --  Note: taskVarAdd implicitly calls taskVarInit if required.
+      if Task_Var_Add (0, Stack_Limit'Address) = 0 then
+         Stack_Limit := Limit;
       end if;
-   end Update_Stack_Cache;
+   end Set_Stack_Limit_For_Current_Task;
 
 end System.Stack_Checking.Operations;
index 9c38fc98cd8b079c3e9e3774c1af1f3c4ae27420..48bb1a9ab132e66284443de60719fa0200d57a68 100644 (file)
@@ -51,6 +51,12 @@ package System.Stack_Checking.Operations is
    --  Set the stack cache for the current task. Note that this is only for
    --  optimization purposes, nothing can be assumed about the contents of the
    --  cache at any time, see Set_Stack_Info.
+   --
+   --  The stack cache should contain the bounds of the current task.  But
+   --  because the RTS is not aware of task switches, the stack cache may be
+   --  incorrect.  So when the stack pointer is not within the bounds of the
+   --  stack cache, Stack_Check first update the cache (which is a costly
+   --  operation hence the need of a cache).
 
    procedure Invalidate_Stack_Cache (Any_Stack : Stack_Access);
    --  Invalidate cache entries for the task T that owns Any_Stack. This causes
index 54c4f82c6923e9fe3c57ca2c7ab8a97acfaeed2a..5eb4bc99a6842066c503e0149e9a5c53105898ee 100644 (file)
@@ -114,6 +114,14 @@ package body System.Task_Primitives.Operations is
    Foreign_Task_Elaborated : aliased Boolean := True;
    --  Used to identified fake tasks (i.e., non-Ada Threads)
 
+   type Set_Stack_Limit_Proc_Acc is access procedure;
+   pragma Convention (C, Set_Stack_Limit_Proc_Acc);
+
+   Set_Stack_Limit_Hook : Set_Stack_Limit_Proc_Acc;
+   pragma Import (C, Set_Stack_Limit_Hook, "__gnat_set_stack_limit_hook");
+   --  Procedure to be called when a task is created to set stack
+   --  limit.
+
    --------------------
    -- Local Packages --
    --------------------
@@ -843,6 +851,11 @@ package body System.Task_Primitives.Operations is
       end loop;
 
       Unlock_RTS;
+
+      --  If stack checking is enabled set the stack limit for this task.
+      if Set_Stack_Limit_Hook /= null then
+         Set_Stack_Limit_Hook.all;
+      end if;
    end Enter_Task;
 
    --------------
index 4d299895caf660597cdd18a8e3018852af8157ed..95debf1ceffedb67b343be46e3490e3de373e451 100644 (file)
@@ -142,11 +142,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := True;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := False;
index c164b4de2f2d108073eb4d9d00ea7802e3bd0e2f..4d515e2c7c7d343897fb22eacfc6ca081279ae7b 100644 (file)
@@ -158,11 +158,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := False;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := True;
index a6f6cf1a2bc30dd63b179c7d84ab98119f5f71f8..e79fd97ee33720f3ade86c3ab6ff35c3d19dc7b8 100644 (file)
@@ -158,11 +158,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := False;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := True;
index 7e652b849030f8401eb8dbe51128f0666503870e..6112abe67bcdcf2440c6fd2e9091a0969fe259a5 100644 (file)
@@ -132,11 +132,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := True;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := True;
index 0463aff3301e261bfe148aaa625c1d6d563df5d3..e6190d3c58c74902636c0aad5b72eb81e9c7854f 100644 (file)
@@ -132,11 +132,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := True;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := False;
index 65d25a6201cd8ef5747f260212f645f653bf42e5..e7d7a4cc38f74039c73b6936fe9b7ecdb32fb224 100644 (file)
@@ -132,11 +132,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := True;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := True;
index 44a99070d2f9e566755ef29f5ef109692eb35bbd..b76ef1573210aac4cd370c444e7137c9fd9b7f20 100644 (file)
@@ -144,11 +144,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := True;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := True;
index 51c1784d256b74da9551f19350feb6eb9b5ed307..4925b320a9f5891365a840f6a3946b874fae2da8 100644 (file)
@@ -132,11 +132,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := True;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := True;
index b5bca4c6603ff6ea679c26122e38e107a7546049..0142e12bfc02ce082c77766b73791a6611082508 100644 (file)
@@ -132,11 +132,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := False;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := True;
index 15fcdb2c2504487816b661194f823925d06602b6..d8f8d86c83660c311976a3ea1f6bb7ce69435171 100644 (file)
@@ -140,11 +140,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := True;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := True;
index d75a45e36f8fc1cdbe775bb7a7178b0433fcbb3d..489268d89acf2bef99597ab4e1436b139eadbe3c 100644 (file)
@@ -140,11 +140,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := False;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := True;
index 5ed1927c8afbea4421e4b4f204207a6de4eb6689..10f0bc8e1bb15e5547f8a3508f53ac1311fd5d73 100644 (file)
@@ -140,11 +140,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := False;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := True;
index 4ad79889f0c09dc83dee939cd0a60a57703aa4cc..9128fc9476202e0da05ecccc88b30118f311054a 100644 (file)
@@ -140,11 +140,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := False;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := True;
index 0364a2b44aac5e4b923f8121e8428fbfa9406a08..34f2411a3dc1636b6019b18264760598c0e1918f 100644 (file)
@@ -146,11 +146,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := False;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := False;
index 733c27d8213fb01c5b259d6e63f4b65ccd627814..5b87d818ccc8d41584a3ba5027d6d7cfeda82fbe 100644 (file)
@@ -146,11 +146,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := False;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := False;
index 6b3c19d0134f0fccc96f86e4795d15397447ddd2..f311b8b0da70d3eba8fa2f5383e7f5bdd5257ec6 100644 (file)
@@ -132,11 +132,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := True;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := False;
index 211fff739eafbf3271c104253816c2fdd264a333..4b11b5668c481d142580ba2fa5d6e1677d15a0f5 100644 (file)
@@ -132,11 +132,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := True;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := True;
index e4819c6b80d311bc9e51659348655ee86d3e919f..366563fe7c708a7cd9c699f5b19b34993729c16d 100644 (file)
@@ -132,11 +132,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := True;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := True;
index 763141f66e282f986c8fe020b9911b6a4b9fa341..6e25e6f381aa24a1460733b3cc726a22c9beaa92 100644 (file)
@@ -132,11 +132,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := True;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := True;
index 97b40b37f3bd8a8734e5ffb1ad8579d7bcd01d12..85a4c031f6fe00870dbfd3b4cf64f5fedebe8760 100644 (file)
@@ -132,11 +132,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := True;
    Stack_Check_Probes        : constant Boolean := True;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := True;
index 175fb8d287298b6757f3643f07e2a046186644e1..fb9dbbc0eac37ec07658e9450752f130884070a3 100644 (file)
@@ -150,11 +150,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := True;
    Stack_Check_Probes        : constant Boolean := True;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := True;
index 4afd2e79faf95b6865d60c37f95e6ce98424bb34..0737776413e788c3a469f08dc673703aac6401b0 100644 (file)
@@ -133,11 +133,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := True;
    Stack_Check_Probes        : constant Boolean := True;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := True;
index 0072c4e9dc310866fe0d70a8002d674607395038..9ba583b8e716c5b06b094e71a19bfd11c6d3c711 100644 (file)
@@ -133,11 +133,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := True;
    Stack_Check_Probes        : constant Boolean := True;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := True;
index bf066ebe91fb332e944068ef5c10637c38462c8f..389ae0adccf8c5718f5f8cd2321597f8b4787285 100644 (file)
@@ -150,11 +150,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := True;
    Stack_Check_Probes        : constant Boolean := True;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := True;
index 2da5a18bb3dfd41d07b285df8a5c0370b39e427c..4e1fbf6108caba6567f4a7ddfba0d542839922c1 100644 (file)
@@ -145,11 +145,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := False;
+   Stack_Check_Limits        : constant Boolean := True;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := True;
    ZCX_By_Default            : constant Boolean := False;
index 166ee1c9f9f79986ce70f28f9954ac1b2420f5d8..b5086f7c494f27bab04bb825b61e5a3dde5ac16c 100644 (file)
@@ -145,11 +145,14 @@ private
    Signed_Zeros              : constant Boolean := False;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := False;
+   Stack_Check_Limits        : constant Boolean := True;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := True;
    ZCX_By_Default            : constant Boolean := False;
index d834bd2736a17f3d580ea26512d109859df88eb3..692a73aefdea4b375edbf9d8c2be48cad3396604 100644 (file)
@@ -145,11 +145,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := False;
+   Stack_Check_Limits        : constant Boolean := True;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := True;
    ZCX_By_Default            : constant Boolean := False;
index dabf489265e989aa65753e47ceadb300dd0a98bb..4b4d26a791b2353f35b54966757163add3b49901 100644 (file)
@@ -145,11 +145,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := False;
+   Stack_Check_Limits        : constant Boolean := True;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := True;
    ZCX_By_Default            : constant Boolean := False;
index 0486ec49cd373ee048bc50ca63c60e4e25edef51..dc1be11e1f1085d5f6deb4c21fabb6f7b4327630 100644 (file)
@@ -147,11 +147,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := False;
+   Stack_Check_Limits        : constant Boolean := True;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := True;
    ZCX_By_Default            : constant Boolean := False;
index 0eb6d5de5ff2f68edffcf7f20b27fc7a8d726094..c24f6a1574b2e6cad7d831508e3e823bbeb84cf9 100644 (file)
@@ -145,11 +145,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := False;
+   Stack_Check_Limits        : constant Boolean := True;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := True;
    ZCX_By_Default            : constant Boolean := False;
index 2c78916d718451a28daad44116573431d67f63cf..95fff31af72d6a7f480e63da0fa09aa33b2c50f1 100644 (file)
 --                                                                          --
 ------------------------------------------------------------------------------
 
---  This version of System is a generic version that is used in building
---  the compiler. Right now, we have a host/target problem if we try to
---  use the "proper" System, and since the compiler itself does not care
---  about most System parameters, this generic version works fine.
+--  This version of System is a generic version that is used in building the
+--  compiler. Right now, we have a host/target problem if we try to use the
+--  "proper" System, and since the compiler itself does not care about most
+--  System parameters, this generic version works fine.
+
+pragma Restrictions (No_Implicit_Dynamic_Code);
+--  We want to avoid trampolines in the compiler, so it can be used in systems
+--  which prevent execution of code on the stack, e.g. in windows environments
+--  with DEP (Data Execution Protection) enabled.
 
 package System is
    pragma Pure;
@@ -150,11 +155,14 @@ private
    Signed_Zeros              : constant Boolean := True;
    Stack_Check_Default       : constant Boolean := False;
    Stack_Check_Probes        : constant Boolean := False;
+   Stack_Check_Limits        : constant Boolean := False;
    Support_64_Bit_Divides    : constant Boolean := True;
    Support_Aggregates        : constant Boolean := True;
    Support_Composite_Assign  : constant Boolean := True;
    Support_Composite_Compare : constant Boolean := True;
    Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := True;
+   Dynamic_Trampolines_Used  : constant Boolean := True;
    Suppress_Standard_Library : constant Boolean := False;
    Use_Ada_Main_Program_Name : constant Boolean := False;
    ZCX_By_Default            : constant Boolean := False;
index b9fac0bb126bd75389fc9618760e6042605444c7..7dd1d611567c8ee0700566f29475aa2c564b0eea 100644 (file)
@@ -39,6 +39,7 @@ package body Targparm is
 
    type Targparm_Tags is
      (AAM,  --   AAMP
+      ACR,  --   Always_Compatible_Rep
       BDC,  --   Backend_Divide_Checks
       BOC,  --   Backend_Overflow_Checks
       CLA,  --   Command_Line_Args
@@ -46,6 +47,7 @@ package body Targparm is
       CRT,  --   Configurable_Run_Times
       D32,  --   Duration_32_Bits
       DEN,  --   Denorm
+      DTU,  --   Dynamic_Trampolines_Used
       EXS,  --   Exit_Status_Supported
       FEL,  --   Frontend_Layout
       FFO,  --   Fractional_Fixed_Ops
@@ -58,6 +60,7 @@ package body Targparm is
       SCA,  --   Support_Composite_Assign
       SCC,  --   Support_Composite_Compare
       SCD,  --   Stack_Check_Default
+      SCL,  --   Stack_Check_Limits
       SCP,  --   Stack_Check_Probes
       SLS,  --   Support_Long_Shifts
       SNZ,  --   Signed_Zeros
@@ -73,6 +76,7 @@ package body Targparm is
    --  The following list of string constants gives the parameter names
 
    AAM_Str : aliased constant Source_Buffer := "AAMP";
+   ACR_Str : aliased constant Source_Buffer := "Always_Compatible_Rep";
    BDC_Str : aliased constant Source_Buffer := "Backend_Divide_Checks";
    BOC_Str : aliased constant Source_Buffer := "Backend_Overflow_Checks";
    CLA_Str : aliased constant Source_Buffer := "Command_Line_Args";
@@ -80,6 +84,7 @@ package body Targparm is
    CRT_Str : aliased constant Source_Buffer := "Configurable_Run_Time";
    D32_Str : aliased constant Source_Buffer := "Duration_32_Bits";
    DEN_Str : aliased constant Source_Buffer := "Denorm";
+   DTU_Str : aliased constant Source_Buffer := "Dynamic_Trampolines_Used";
    EXS_Str : aliased constant Source_Buffer := "Exit_Status_Supported";
    FEL_Str : aliased constant Source_Buffer := "Frontend_Layout";
    FFO_Str : aliased constant Source_Buffer := "Fractional_Fixed_Ops";
@@ -92,6 +97,7 @@ package body Targparm is
    SCA_Str : aliased constant Source_Buffer := "Support_Composite_Assign";
    SCC_Str : aliased constant Source_Buffer := "Support_Composite_Compare";
    SCD_Str : aliased constant Source_Buffer := "Stack_Check_Default";
+   SCL_Str : aliased constant Source_Buffer := "Stack_Check_Limits";
    SCP_Str : aliased constant Source_Buffer := "Stack_Check_Probes";
    SLS_Str : aliased constant Source_Buffer := "Support_Long_Shifts";
    SNZ_Str : aliased constant Source_Buffer := "Signed_Zeros";
@@ -107,6 +113,7 @@ package body Targparm is
    type Buffer_Ptr is access constant Source_Buffer;
    Targparm_Str : constant array (Targparm_Tags) of Buffer_Ptr :=
      (AAM_Str'Access,
+      ACR_Str'Access,
       BDC_Str'Access,
       BOC_Str'Access,
       CLA_Str'Access,
@@ -114,6 +121,7 @@ package body Targparm is
       CRT_Str'Access,
       D32_Str'Access,
       DEN_Str'Access,
+      DTU_Str'Access,
       EXS_Str'Access,
       FEL_Str'Access,
       FFO_Str'Access,
@@ -126,6 +134,7 @@ package body Targparm is
       SCA_Str'Access,
       SCC_Str'Access,
       SCD_Str'Access,
+      SCL_Str'Access,
       SCP_Str'Access,
       SLS_Str'Access,
       SNZ_Str'Access,
@@ -168,7 +177,7 @@ package body Targparm is
          raise Unrecoverable_Error;
       end if;
 
-      Targparm.Get_Target_Parameters
+      Get_Target_Parameters
         (System_Text  => Text,
          Source_First => 0,
          Source_Last  => Hi);
@@ -544,6 +553,7 @@ package body Targparm is
 
                   case K is
                      when AAM => AAMP_On_Target                      := Result;
+                     when ACR => Always_Compatible_Rep_On_Target     := Result;
                      when BDC => Backend_Divide_Checks_On_Target     := Result;
                      when BOC => Backend_Overflow_Checks_On_Target   := Result;
                      when CLA => Command_Line_Args_On_Target         := Result;
@@ -555,6 +565,7 @@ package body Targparm is
                      when CRT => Configurable_Run_Time_On_Target     := Result;
                      when D32 => Duration_32_Bits_On_Target          := Result;
                      when DEN => Denorm_On_Target                    := Result;
+                     when DTU => Dynamic_Trampolines_Used_On_Target  := Result;
                      when EXS => Exit_Status_Supported_On_Target     := Result;
                      when FEL => Frontend_Layout_On_Target           := Result;
                      when FFO => Fractional_Fixed_Ops_On_Target      := Result;
@@ -571,6 +582,7 @@ package body Targparm is
                      when SCA => Support_Composite_Assign_On_Target  := Result;
                      when SCC => Support_Composite_Compare_On_Target := Result;
                      when SCD => Stack_Check_Default_On_Target       := Result;
+                     when SCL => Stack_Check_Limits_On_Target        := Result;
                      when SCP => Stack_Check_Probes_On_Target        := Result;
                      when SLS => Support_Long_Shifts_On_Target       := Result;
                      when SSL => Suppress_Standard_Library_On_Target := Result;
@@ -586,7 +598,7 @@ package body Targparm is
                   --  Here we are seeing a parameter we do not understand. We
                   --  simply ignore this (will happen when an old compiler is
                   --  used to compile a newer version of GNAT which does not
-                  --  support the
+                  --  support the parameter).
                end if;
             end loop Config_Param_Loop;
          end if;
index 7f17dd5681852b84ca865e74f35ceb30a249f753..74e65ea625b748399de0acc9744dc16886a9d525 100644 (file)
 --                                                                          --
 ------------------------------------------------------------------------------
 
---  This package obtains parameters from the target runtime version of
---  System, to indicate parameters relevant to the target environment.
+--  This package obtains parameters from the target runtime version of System,
+--  to indicate parameters relevant to the target environment.
+
+--  Is it right for this to be modified GPL???
 
 --  Conceptually, these parameters could be obtained using rtsfind, but
 --  we do not do this for four reasons:
@@ -180,12 +182,10 @@ package Targparm is
    --  The following parameters correspond to the variables defined in the
    --  private part of System (without the terminating _On_Target). Note
    --  that it is required that all parameters defined here be specified
-   --  in the target specific version of system.ads (there are no defaults).
-
-   --  All these parameters should be regarded as read only by all clients
-   --  of the package. The only way they get modified is by calling the
-   --  Get_Target_Parameters routine which reads the values from a provided
-   --  text buffer containing the source of the system package.
+   --  in the target specific version of system.ads. Thus, to add a new
+   --  parameter, add it to all system*.ads files. (There is a defaulting
+   --  mechanism, but we don't normally take advantage of it, as explained
+   --  below.)
 
    --  The default values here are used if no value is found in system.ads.
    --  This should normally happen if the special version of system.ads used
@@ -197,6 +197,11 @@ package Targparm is
    --  sources, as well as avoiding duplicating values in all system-*.ads
    --  files for flags that are used on a few platforms only.
 
+   --  All these parameters should be regarded as read only by all clients
+   --  of the package. The only way they get modified is by calling the
+   --  Get_Target_Parameters routine which reads the values from a provided
+   --  text buffer containing the source of the system package.
+
    ----------------------------
    -- Special Target Control --
    ----------------------------
@@ -425,6 +430,23 @@ package Targparm is
    --  the source program may not contain explicit 64-bit shifts. In addition,
    --  the code generated for packed arrays will avoid the use of long shifts.
 
+   --------------------
+   -- Indirect Calls --
+   --------------------
+
+   Always_Compatible_Rep_On_Target : Boolean := True;
+   --  If True, the Can_Use_Internal_Rep flag (see Einfo) is set to False in
+   --  all cases. This corresponds to the traditional code generation
+   --  strategy. False allows the front end to choose a policy that partly or
+   --  entirely eliminates dynamically generated trampolines.
+
+   Dynamic_Trampolines_Used_On_Target : Boolean := True;
+   --  True if the back end uses dynamically generated trampolines to implement
+   --  '[Unrestricted_]Access of nested subprograms when Can_Use_Internal_Rep
+   --  is False for the access type. (Can_Use_Internal_Rep = True forbids the
+   --  use of such trampolines.) Used in the implementation of pragma
+   --  Restrictions (No_Implicit_Dynamic_Code).
+
    -------------------------------
    -- Control of Stack Checking --
    -------------------------------
@@ -444,6 +466,18 @@ package Targparm is
    --      size for the environment task depends on the operating
    --      system and cannot be set in a system-independent way.
 
+   --   GCC Stack-limit Mechanism
+
+   --      This approach uses the GCC stack limits mechanism.
+   --      It relies on comparing the stack pointer with the
+   --      values of a global symbol. If the check fails, a
+   --      trap is explicitly generated. The advantage is
+   --      that the mechanism requires no memory protection,
+   --      but operating system and run-time support are
+   --      needed to manage the per-task values of the symbol.
+   --      This is the default method after probing where it
+   --      is available.
+
    --   GNAT Stack-limit Checking
 
    --      This method relies on comparing the stack pointer
@@ -452,13 +486,17 @@ package Targparm is
    --      that the method requires no extra system dependent
    --      runtime support and can be used on systems without
    --      memory protection as well, but at the cost of more
-   --      overhead for doing the check. This method is the
-   --      default on systems that lack complete support for
-   --      probing.
+   --      overhead for doing the check. This is the fallback
+   --      method if the above two are not supported.
 
    Stack_Check_Probes_On_Target : Boolean := False;
-   --  Indicates if stack check probes are used, as opposed to the standard
-   --  target independent comparison method.
+   --  Indicates if the GCC probing mechanism is used
+
+   Stack_Check_Limits_On_Target : Boolean := False;
+   --  Indicates if the GCC stack-limit mechanism is used
+
+   --  Both flags cannot be simultaneously set to True. If neither
+   --  is, the target independent fallback method is used.
 
    Stack_Check_Default_On_Target : Boolean := False;
    --  Indicates if stack checking is on by default