1------------------------------------------------------------------------------ 2-- -- 3-- GNAT COMPILER COMPONENTS -- 4-- -- 5-- S E T _ T A R G -- 6-- -- 7-- S p e c -- 8-- -- 9-- Copyright (C) 2013-2019, Free Software Foundation, Inc. -- 10-- -- 11-- GNAT is free software; you can redistribute it and/or modify it under -- 12-- terms of the GNU General Public License as published by the Free Soft- -- 13-- ware Foundation; either version 3, or (at your option) any later ver- -- 14-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- 15-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- 16-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- 17-- for more details. You should have received a copy of the GNU General -- 18-- Public License distributed with GNAT; see file COPYING3. If not, go to -- 19-- http://www.gnu.org/licenses for a complete copy of the license. -- 20-- -- 21-- GNAT was originally developed by the GNAT team at New York University. -- 22-- Extensive contributions were provided by Ada Core Technologies Inc. -- 23-- -- 24------------------------------------------------------------------------------ 25 26-- This package handles setting target dependent parameters. If the -gnatet 27-- switch is not set, then these values are taken from the back end (via the 28-- routines in Get_Targ, and the enumerate_modes routine in misc.c). If the 29-- switch is set, then the values are read from the target.atp file in the 30-- current directory (usually written with the Write_Target_Dependent_Values 31-- procedure defined in this package). 32 33-- Note that all these values return sizes of C types with corresponding 34-- names. This allows GNAT to define the corresponding Ada types to have 35-- the same representation. There is one exception: the representation 36-- of Wide_Character_Type uses twice the size of a C char, instead of the 37-- size of wchar_t, since this corresponds to expected Ada usage. 38 39with Einfo; use Einfo; 40with Stand; use Stand; 41with Types; use Types; 42 43package Set_Targ is 44 45 ----------------------------- 46 -- Target-Dependent Values -- 47 ----------------------------- 48 49 -- The following is a table of target dependent values. In normal operation 50 -- these values are set by calling the appropriate C backend routines that 51 -- interface to back end routines that determine target characteristics. 52 53 -- If the -gnateT switch is used, then any values that are read from the 54 -- file target.atp in the current directory overwrite values set from the 55 -- back end. This is used by tools other than the compiler, e.g. to do 56 -- semantic analysis of programs that will run on some other target than 57 -- the machine on which the tool is run. 58 59 -- Note: fields marked with a question mark are boolean fields, where a 60 -- value of 0 is False, and a value of 1 is True. 61 62 Bits_BE : Nat; -- Bits stored big-endian? 63 Bits_Per_Unit : Pos; -- Bits in a storage unit 64 Bits_Per_Word : Pos; -- Bits in a word 65 Bytes_BE : Nat; -- Bytes stored big-endian? 66 Char_Size : Pos; -- Standard.Character'Size 67 Double_Float_Alignment : Nat; -- Alignment of double float 68 Double_Scalar_Alignment : Nat; -- Alignment of double length scalar 69 Double_Size : Pos; -- Standard.Long_Float'Size 70 Float_Size : Pos; -- Standard.Float'Size 71 Float_Words_BE : Nat; -- Float words stored big-endian? 72 Int_Size : Pos; -- Standard.Integer'Size 73 Long_Double_Size : Pos; -- Standard.Long_Long_Float'Size 74 Long_Long_Size : Pos; -- Standard.Long_Long_Integer'Size 75 Long_Size : Pos; -- Standard.Long_Integer'Size 76 Maximum_Alignment : Pos; -- Maximum permitted alignment 77 Max_Unaligned_Field : Pos; -- Maximum size for unaligned bit field 78 Pointer_Size : Pos; -- System.Address'Size 79 Short_Enums : Nat; -- Foreign enums use short size? 80 Short_Size : Pos; -- Standard.Short_Integer'Size 81 Strict_Alignment : Nat; -- Strict alignment? 82 System_Allocator_Alignment : Nat; -- Alignment for malloc calls 83 Wchar_T_Size : Pos; -- Interfaces.C.wchar_t'Size 84 Words_BE : Nat; -- Words stored big-endian? 85 86 ------------------------------------- 87 -- Registered Floating-Point Types -- 88 ------------------------------------- 89 90 -- This table contains the list of modes supported by the back-end as 91 -- provided by the back end routine enumerate_modes in misc.c. Note that 92 -- we only store floating-point modes (see Register_Float_Type). 93 94 type FPT_Mode_Entry is record 95 NAME : String_Ptr; -- Name of mode (no null character at end) 96 DIGS : Natural; -- Digits for floating-point type 97 FLOAT_REP : Float_Rep_Kind; -- Float representation 98 PRECISION : Natural; -- Precision in bits 99 SIZE : Natural; -- Size in bits 100 ALIGNMENT : Natural; -- Alignment in bits 101 end record; 102 103 FPT_Mode_Table : array (1 .. 1000) of FPT_Mode_Entry; 104 Num_FPT_Modes : Natural := 0; 105 -- Table containing the supported modes and number of entries 106 107 ----------------- 108 -- Subprograms -- 109 ----------------- 110 111 subtype S_Float_Types is 112 Standard_Entity_Type range S_Short_Float .. S_Long_Long_Float; 113 114 function C_Type_For (T : S_Float_Types) return String; 115 -- Return the name of a C type supported by the back-end and suitable as 116 -- a basis to construct the standard Ada floating point type identified by 117 -- T. This is used as a common ground to feed both ttypes values and the 118 -- GNAT tree nodes for the standard floating point types. 119 120 procedure Write_Target_Dependent_Values; 121 -- This routine writes the file target.atp in the current directory with 122 -- the values of the global target parameters as listed above, and as set 123 -- by prior calls to Initialize/Read_Target_Dependent_Values. The format 124 -- of the target.atp file is as follows 125 -- 126 -- First come the values of the variables defined in this spec: 127 -- 128 -- One line per value 129 -- 130 -- name value 131 -- 132 -- where name is the name of the parameter, spelled out in full, 133 -- and cased as in the above list, and value is an unsigned decimal 134 -- integer. Two or more blanks separates the name from the value. 135 -- 136 -- All the variables must be present, in alphabetical order (i.e. the 137 -- same order as the declarations in this spec). 138 -- 139 -- Then there is a blank line to separate the two parts of the file. Then 140 -- come the lines showing the floating-point types to be registered. 141 -- 142 -- One line per registered mode 143 -- 144 -- name digs float_rep precision alignment 145 -- 146 -- where name is the string name of the type (which can have single 147 -- spaces embedded in the name (e.g. long double). The name is followed 148 -- by at least two blanks. The following fields are as described above 149 -- for a Mode_Entry (where float_rep is I/V/A for IEEE-754-Binary, 150 -- Vax_Native, AAMP), fields are separated by at least one blank, and 151 -- a LF character immediately follows the alignment field. 152 -- 153 -- ??? We do not write the size for backward compatibility reasons, 154 -- which means that target.atp will not be a complete description for 155 -- the very peculiar cases where the size cannot be computed from the 156 -- precision and the alignment by the formula: 157 -- 158 -- size := (precision + alignment - 1) / alignment * alignment 159 160end Set_Targ; 161