diff options
Diffstat (limited to 'gcc/ada/targparm.ads')
-rw-r--r-- | gcc/ada/targparm.ads | 288 |
1 files changed, 288 insertions, 0 deletions
diff --git a/gcc/ada/targparm.ads b/gcc/ada/targparm.ads new file mode 100644 index 00000000000..2346fd209e7 --- /dev/null +++ b/gcc/ada/targparm.ads @@ -0,0 +1,288 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT RUN-TIME COMPONENTS -- +-- -- +-- T A R G P A R M -- +-- -- +-- S p e c -- +-- -- +-- $Revision: 1.13 $ +-- -- +-- Copyright (C) 1999-2001 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 2, 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. See the GNU General Public License -- +-- for more details. You should have received a copy of the GNU General -- +-- Public License distributed with GNAT; see file COPYING. If not, write -- +-- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, -- +-- MA 02111-1307, USA. -- +-- -- +-- GNAT was originally developed by the GNAT team at New York University. -- +-- It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). -- +-- -- +------------------------------------------------------------------------------ + +-- This package obtains parameters from the target runtime version of +-- System, to indicate parameters relevant to the target environment. + +-- Conceptually, these parameters could be obtained using rtsfind, but +-- we do not do this for three reasons: + +-- 1. Compiling System for every compilation wastes time +-- 2. This compilation impedes debugging by adding extra compile steps +-- 3. There are recursion problems coming from compiling System itself +-- or any of its children. + +-- For all these reasons, we read in the source of System, and then scan +-- it at the text level to extract the parameter values. + +-- Note however, that later on, when the ali file is written, we make sure +-- that the System file is at least parsed, so that the checksum is properly +-- computed and set in the ali file. This partially negates points 1 and 2 +-- above although just parsing is quick and does not impact debugging much. + +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 be specified in system.ads. + + ----------------------------------- + -- Control of Exception Handling -- + ----------------------------------- + + -- GNAT provides two methods of implementing exceptions: + + -- Longjmp/Setjmp (-gnatL) + + -- This approach uses longjmp/setjmp to handle exceptions. It + -- uses less storage, and can often propagate exceptions faster, + -- at the expense of (sometimes considerable) overhead in setting + -- up an exception handler. This approach is available on all + -- targets, and is the default where it is the only approach. + + -- Zero Cost (-gnatZ) + + -- This approach uses separate exception tables. These use extra + -- storage, and exception propagation can be quite slow, but there + -- is no overhead in setting up an exception handler (it is to this + -- latter operation that the phrase zero-cost refers). This approach + -- is only available on some targets, and is the default where it is + -- available. + + ZCX_By_Default_On_Target : Boolean; + -- Indicates if zero cost exceptions are active by default. Can be modified + -- by the use of -gnatZ and -gnatL switches. + + GCC_ZCX_Support_On_Target : Boolean; + -- Indicates that when ZCX is active the mechanism to be used is the + -- standard GCC ZCX mechanism (introduced in GCC 3.1) + + Front_End_ZCX_Support_On_Target : Boolean; + -- Indicates that when ZCX is active (and GCC_ZCX_Support is not set) + -- the mechanism to be used is the GNAT front end specific ZCX mechanism + + --------------------------------------- + -- High_Integrity (No Run Time) Mode -- + --------------------------------------- + + -- In High_Integrity mode, there is no system run-time, and the flag + -- Opt.No_Run_Time is set so that the language is appropriately + -- restricted to forbid construct that would generate run-time calls. + + High_Integrity_Mode_On_Target : Boolean; + -- Indicates that this build is for a high integrity mode version of + -- GNAT, so that no run time is permitted. + + ------------------------------- + -- Control of Stack Checking -- + ------------------------------- + + -- GNAT provides two methods of implementing exceptions: + + -- GCC Probing Mechanism + + -- This approach uses the standard GCC mechanism for + -- stack checking. The method assumes that accessing + -- storage immediately beyond the end of the stack + -- will result in a trap that is converted to a storage + -- error by the runtime system. This mechanism has + -- minimal overhead, but requires complex hardware, + -- operating system and run-time support. Probing is + -- the default method where it is available. The stack + -- size for the environment task depends on the operating + -- system and cannot be set in a system-independent way. + + -- GNAT Stack-limit Checking + + -- This method relies on comparing the stack pointer + -- with per-task stack limits. If the check fails, an + -- exception is explicitly raised. The advantage 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. + + Stack_Check_Probes_On_Target : Boolean; + -- Indicates if stack check probes are used, as opposed to the standard + -- target independent comparison method. + + Stack_Check_Default_On_Target : Boolean; + -- Indicates if stack checking is on by default + + ---------------------------- + -- Command Line Arguments -- + ---------------------------- + + -- For most ports of GNAT, command line arguments are supported. The + -- following flag is set to False for targets that do not support + -- command line arguments (notably VxWorks). + + Command_Line_Args_On_Target : Boolean; + -- Set False if no command line arguments on target + + -- Note: this is prepared for future use, but not yet used, since we + -- do not yet have a way of propagating Targparm params to the binder + + ----------------------- + -- Main Program Name -- + ----------------------- + + -- When the binder generates the main program to be used to create the + -- executable, the main program name is main by default (to match the + -- usual Unix practice). If this parameter is set to True, then the + -- name is instead by default taken from the actual Ada main program + -- name (just the name of the child if the main program is a child unit). + -- In either case, this value can be overridden using -M name. + + Use_Ada_Main_Program_Name_On_Target : Boolean; + -- Set True to use the Ada main program name as the main name + + -- Note: this is prepared for future use, but not yet used, since we + -- do not yet have a way of propagating Targparm params to the binder + + ---------------------------- + -- Support of Long Shifts -- + ---------------------------- + + -- In GNORT mode, we cannot call library routines, and in particular + -- we cannot call routines for long (64-bit) shifts if such routines + -- are required on the target. This comes up in the context of support + -- of packed arrays. We can only represent packed arrays whose length + -- is in the range 33- to 64-bits as modular types if long shifts are + -- done with inline code. + + -- For the default version, for now we set long shifts inlined as True + -- This may not be quite accurate, but until we get proper separate + -- System's for each target, it is a safer choice. + + Long_Shifts_Inlined_On_Target : Boolean; + -- Indicates if long (double word) shifts are generated using inlined + -- code (and thus are permissible in No_Run_Time mode). + + ---------------------------------------------- + -- Boolean-Valued Floating-Point Attributes -- + ---------------------------------------------- + + -- The constants below give the values for representation oriented + -- floating-point attributes that are the same for all float types + -- on the target. These are all boolean values. + + -- A value is only True if the target reliably supports the corresponding + -- feature. Reliably here means that support is guaranteed for all + -- possible settings of the relevant compiler switches (like -mieee), + -- since we cannot control the user setting of those switches. + + -- The attributes cannot dependent on the current setting of compiler + -- switches, since the values must be static and consistent throughout + -- the partition. We probably should add such consistency checks in future, + -- but for now we don't do this. + + AAMP_On_Target : Boolean; + -- Set to True if target is AAMP. + + Denorm_On_Target : Boolean; + -- Set to False on targets that do not reliably support denormals. + -- Reliably here means for all settings of the relevant -m flag, so + -- for example, this is False on the Alpha where denormals are not + -- supported unless -mieee is used. + + Machine_Rounds_On_Target : Boolean; + -- Set to False for targets where S'Machine_Rounds is False + + Machine_Overflows_On_Target : Boolean; + -- Set to True for targets where S'Machine_Overflows is True + + Signed_Zeros_On_Target : Boolean; + -- Set to False on targets that do not reliably support signed zeros. + + OpenVMS_On_Target : Boolean; + -- Set to True if target is OpenVMS. + + -------------------------------------------------------------- + -- Handling of Unconstrained Values Returned from Functions -- + -------------------------------------------------------------- + + -- Functions that return variable length objects, notably unconstrained + -- arrays are a special case, because there is no simple obvious way of + -- implementing this feature. Furthermore, this capability is not present + -- in C++ or C, so typically the system ABI does not handle this case. + + -- GNAT uses two different approaches + + -- The Secondary Stack + + -- The secondary stack is a special storage pool that is used for + -- this purpose. The called function places the result on the + -- secondary stack, and the caller uses or copies the value from + -- the secondary stack, and pops the secondary stack after the + -- value is consumed. The secondary stack is outside the system + -- ABI, and the important point is that although generally it is + -- handled in a stack like manner corresponding to the subprogram + -- call structure, a return from a function does NOT pop the stack. + + -- DSP (Depressed Stack Pointer) + + -- Some targets permit the implementation of a function call/return + -- protocol in which the function does not pop the main stack pointer + -- on return, but rather returns with the stack pointer depressed. + -- This is not generally permitted by any ABI, but for at least some + -- targets, the implementation of alloca provides a model for this + -- approach. If return-with-DSP is implemented, then functions that + -- return variable length objects do it by returning with the stack + -- pointer depressed, and the returned object is a pointer to the + -- area within the stack frame of the called procedure that contains + -- the returned value. The caller must then pop the main stack when + -- this value is consumed. + + Functions_Return_By_DSP_On_Target : Boolean; + -- Set to True if target permits functions to return with using the + -- DSP (depressed stack pointer) approach. + + ----------------- + -- Data Layout -- + ----------------- + + -- Normally when using the GCC backend, Gigi and GCC perform much of the + -- data layout using the standard layout capabilities of GCC. If the + -- parameter Backend_Layout is set to False, then the front end must + -- perform all data layout. For further details see the package Layout. + + Frontend_Layout_On_Target : Boolean; + -- Set True if front end does layout + + ----------------- + -- Subprograms -- + ----------------- + + procedure Get_Target_Parameters; + -- Called at the start of execution to read the source of System and + -- obtain and set the values of the above parameters. + +end Targparm; |