162 lines
8.4 KiB
Ada
162 lines
8.4 KiB
Ada
------------------------------------------------------------------------------
|
|
-- --
|
|
-- GNAT COMPILER COMPONENTS --
|
|
-- --
|
|
-- S E T _ T A R G --
|
|
-- --
|
|
-- S p e c --
|
|
-- --
|
|
-- Copyright (C) 2013-2020, 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. 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 COPYING3. If not, go to --
|
|
-- http://www.gnu.org/licenses for a complete copy of the license. --
|
|
-- --
|
|
-- GNAT was originally developed by the GNAT team at New York University. --
|
|
-- Extensive contributions were provided by Ada Core Technologies Inc. --
|
|
-- --
|
|
------------------------------------------------------------------------------
|
|
|
|
-- This package handles setting target dependent parameters. If the -gnatet
|
|
-- switch is not set, then these values are taken from the back end (via the
|
|
-- routines in Get_Targ, and the enumerate_modes routine in misc.c). If the
|
|
-- switch is set, then the values are read from the target.atp file in the
|
|
-- current directory (usually written with the Write_Target_Dependent_Values
|
|
-- procedure defined in this package).
|
|
|
|
-- Note that all these values return sizes of C types with corresponding
|
|
-- names. This allows GNAT to define the corresponding Ada types to have
|
|
-- the same representation. There is one exception: the representation
|
|
-- of Wide_Character_Type uses twice the size of a C char, instead of the
|
|
-- size of wchar_t, since this corresponds to expected Ada usage.
|
|
|
|
with Einfo; use Einfo;
|
|
with Stand; use Stand;
|
|
with Types; use Types;
|
|
|
|
package Set_Targ is
|
|
|
|
-----------------------------
|
|
-- Target-Dependent Values --
|
|
-----------------------------
|
|
|
|
-- The following is a table of target dependent values. In normal operation
|
|
-- these values are set by calling the appropriate C backend routines that
|
|
-- interface to back end routines that determine target characteristics.
|
|
|
|
-- If the -gnateT switch is used, then any values that are read from the
|
|
-- file target.atp in the current directory overwrite values set from the
|
|
-- back end. This is used by tools other than the compiler, e.g. to do
|
|
-- semantic analysis of programs that will run on some other target than
|
|
-- the machine on which the tool is run.
|
|
|
|
-- Note: fields marked with a question mark are boolean fields, where a
|
|
-- value of 0 is False, and a value of 1 is True.
|
|
|
|
Bits_BE : Nat; -- Bits stored big-endian?
|
|
Bits_Per_Unit : Pos; -- Bits in a storage unit
|
|
Bits_Per_Word : Pos; -- Bits in a word
|
|
Bytes_BE : Nat; -- Bytes stored big-endian?
|
|
Char_Size : Pos; -- Standard.Character'Size
|
|
Double_Float_Alignment : Nat; -- Alignment of double float
|
|
Double_Scalar_Alignment : Nat; -- Alignment of double length scalar
|
|
Double_Size : Pos; -- Standard.Long_Float'Size
|
|
Float_Size : Pos; -- Standard.Float'Size
|
|
Float_Words_BE : Nat; -- Float words stored big-endian?
|
|
Int_Size : Pos; -- Standard.Integer'Size
|
|
Long_Double_Size : Pos; -- Standard.Long_Long_Float'Size
|
|
Long_Long_Long_Size : Pos; -- Standard.Long_Long_Long_Integer'Size
|
|
Long_Long_Size : Pos; -- Standard.Long_Long_Integer'Size
|
|
Long_Size : Pos; -- Standard.Long_Integer'Size
|
|
Maximum_Alignment : Pos; -- Maximum permitted alignment
|
|
Max_Unaligned_Field : Pos; -- Maximum size for unaligned bit field
|
|
Pointer_Size : Pos; -- System.Address'Size
|
|
Short_Enums : Nat; -- Foreign enums use short size?
|
|
Short_Size : Pos; -- Standard.Short_Integer'Size
|
|
Strict_Alignment : Nat; -- Strict alignment?
|
|
System_Allocator_Alignment : Nat; -- Alignment for malloc calls
|
|
Wchar_T_Size : Pos; -- Interfaces.C.wchar_t'Size
|
|
Words_BE : Nat; -- Words stored big-endian?
|
|
|
|
-------------------------------------
|
|
-- Registered Floating-Point Types --
|
|
-------------------------------------
|
|
|
|
-- This table contains the list of modes supported by the back-end as
|
|
-- provided by the back end routine enumerate_modes in misc.c. Note that
|
|
-- we only store floating-point modes (see Register_Float_Type).
|
|
|
|
type FPT_Mode_Entry is record
|
|
NAME : String_Ptr; -- Name of mode (no null character at end)
|
|
DIGS : Natural; -- Digits for floating-point type
|
|
FLOAT_REP : Float_Rep_Kind; -- Float representation
|
|
PRECISION : Natural; -- Precision in bits
|
|
SIZE : Natural; -- Size in bits
|
|
ALIGNMENT : Natural; -- Alignment in bits
|
|
end record;
|
|
|
|
FPT_Mode_Table : array (1 .. 1000) of FPT_Mode_Entry;
|
|
Num_FPT_Modes : Natural := 0;
|
|
-- Table containing the supported modes and number of entries
|
|
|
|
-----------------
|
|
-- Subprograms --
|
|
-----------------
|
|
|
|
subtype S_Float_Types is
|
|
Standard_Entity_Type range S_Short_Float .. S_Long_Long_Float;
|
|
|
|
function C_Type_For (T : S_Float_Types) return String;
|
|
-- Return the name of a C type supported by the back-end and suitable as
|
|
-- a basis to construct the standard Ada floating point type identified by
|
|
-- T. This is used as a common ground to feed both ttypes values and the
|
|
-- GNAT tree nodes for the standard floating point types.
|
|
|
|
procedure Write_Target_Dependent_Values;
|
|
-- This routine writes the file target.atp in the current directory with
|
|
-- the values of the global target parameters as listed above, and as set
|
|
-- by prior calls to Initialize/Read_Target_Dependent_Values. The format
|
|
-- of the target.atp file is as follows
|
|
--
|
|
-- First come the values of the variables defined in this spec:
|
|
--
|
|
-- One line per value
|
|
--
|
|
-- name value
|
|
--
|
|
-- where name is the name of the parameter, spelled out in full,
|
|
-- and cased as in the above list, and value is an unsigned decimal
|
|
-- integer. Two or more blanks separates the name from the value.
|
|
--
|
|
-- All the variables must be present, in alphabetical order (i.e. the
|
|
-- same order as the declarations in this spec).
|
|
--
|
|
-- Then there is a blank line to separate the two parts of the file. Then
|
|
-- come the lines showing the floating-point types to be registered.
|
|
--
|
|
-- One line per registered mode
|
|
--
|
|
-- name digs float_rep precision alignment
|
|
--
|
|
-- where name is the string name of the type (which can have single
|
|
-- spaces embedded in the name (e.g. long double). The name is followed
|
|
-- by at least two blanks. The following fields are as described above
|
|
-- for a Mode_Entry (where float_rep is I/V/A for IEEE-754-Binary,
|
|
-- Vax_Native, AAMP), fields are separated by at least one blank, and
|
|
-- a LF character immediately follows the alignment field.
|
|
--
|
|
-- ??? We do not write the size for backward compatibility reasons,
|
|
-- which means that target.atp will not be a complete description for
|
|
-- the very peculiar cases where the size cannot be computed from the
|
|
-- precision and the alignment by the formula:
|
|
--
|
|
-- size := (precision + alignment - 1) / alignment * alignment
|
|
|
|
end Set_Targ;
|