------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                             S E T _ T A R G                              --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
--          Copyright (C) 2013-2018, 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_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;
