1------------------------------------------------------------------------------
2--                                                                          --
3--                         GNAT COMPILER COMPONENTS                         --
4--                                                                          --
5--                             G E T _ T A R G                              --
6--                                                                          --
7--                                 B o d y                                  --
8--                                                                          --
9--          Copyright (C) 1992-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--  Version for use with GCC
27
28package body Get_Targ is
29
30   --  Functions returning individual run-time values. For the standard (GCC)
31   --  back end, these come from C interface functions (one for each value).
32
33   -----------------------
34   -- Get_Bits_Per_Unit --
35   -----------------------
36
37   function Get_Bits_Per_Unit return Pos is
38      function C_Get_Bits_Per_Unit return Pos;
39      pragma Import (C, C_Get_Bits_Per_Unit,
40                        "get_target_bits_per_unit");
41   begin
42      return C_Get_Bits_Per_Unit;
43   end Get_Bits_Per_Unit;
44
45   -----------------------
46   -- Get_Bits_Per_Word --
47   -----------------------
48
49   function Get_Bits_Per_Word return Pos is
50      function C_Get_Bits_Per_Word return Pos;
51      pragma Import (C, C_Get_Bits_Per_Word,
52                        "get_target_bits_per_word");
53   begin
54      return C_Get_Bits_Per_Word;
55   end Get_Bits_Per_Word;
56
57   -------------------
58   -- Get_Char_Size --
59   -------------------
60
61   function Get_Char_Size return Pos is
62      function C_Get_Char_Size return Pos;
63      pragma Import (C, C_Get_Char_Size,
64                        "get_target_char_size");
65   begin
66      return C_Get_Char_Size;
67   end Get_Char_Size;
68
69   ----------------------
70   -- Get_Wchar_T_Size --
71   ----------------------
72
73   function Get_Wchar_T_Size return Pos is
74      function C_Get_Wchar_T_Size return Pos;
75      pragma Import (C, C_Get_Wchar_T_Size,
76                        "get_target_wchar_t_size");
77   begin
78      return C_Get_Wchar_T_Size;
79   end Get_Wchar_T_Size;
80
81   --------------------
82   -- Get_Short_Size --
83   --------------------
84
85   function Get_Short_Size return Pos is
86      function C_Get_Short_Size return Pos;
87      pragma Import (C, C_Get_Short_Size,
88                        "get_target_short_size");
89   begin
90      return C_Get_Short_Size;
91   end Get_Short_Size;
92
93   ------------------
94   -- Get_Int_Size --
95   ------------------
96
97   function Get_Int_Size return Pos is
98      function C_Get_Int_Size return Pos;
99      pragma Import (C, C_Get_Int_Size,
100                        "get_target_int_size");
101   begin
102      return C_Get_Int_Size;
103   end Get_Int_Size;
104
105   -------------------
106   -- Get_Long_Size --
107   -------------------
108
109   function Get_Long_Size return Pos is
110      function C_Get_Long_Size return Pos;
111      pragma Import (C, C_Get_Long_Size,
112                        "get_target_long_size");
113   begin
114      return C_Get_Long_Size;
115   end Get_Long_Size;
116
117   ------------------------
118   -- Get_Long_Long_Size --
119   ------------------------
120
121   function Get_Long_Long_Size return Pos is
122      function C_Get_Long_Long_Size return Pos;
123      pragma Import (C, C_Get_Long_Long_Size,
124                        "get_target_long_long_size");
125   begin
126      return C_Get_Long_Long_Size;
127   end Get_Long_Long_Size;
128
129   ----------------------
130   -- Get_Pointer_Size --
131   ----------------------
132
133   function Get_Pointer_Size return Pos is
134      function C_Get_Pointer_Size return Pos;
135      pragma Import (C, C_Get_Pointer_Size,
136                        "get_target_pointer_size");
137   begin
138      return C_Get_Pointer_Size;
139   end Get_Pointer_Size;
140
141   ---------------------------
142   -- Get_Maximum_Alignment --
143   ---------------------------
144
145   function Get_Maximum_Alignment return Pos is
146      function C_Get_Maximum_Alignment return Pos;
147      pragma Import (C, C_Get_Maximum_Alignment,
148                        "get_target_maximum_alignment");
149   begin
150      return C_Get_Maximum_Alignment;
151   end Get_Maximum_Alignment;
152
153   ------------------------
154   -- Get_Float_Words_BE --
155   ------------------------
156
157   function Get_Float_Words_BE return Nat is
158      function C_Get_Float_Words_BE return Nat;
159      pragma Import (C, C_Get_Float_Words_BE,
160                        "get_target_float_words_be");
161   begin
162      return C_Get_Float_Words_BE;
163   end Get_Float_Words_BE;
164
165   ------------------
166   -- Get_Words_BE --
167   ------------------
168
169   function Get_Words_BE return Nat is
170      function C_Get_Words_BE return Nat;
171      pragma Import (C, C_Get_Words_BE,
172                        "get_target_words_be");
173   begin
174      return C_Get_Words_BE;
175   end Get_Words_BE;
176
177   ------------------
178   -- Get_Bytes_BE --
179   ------------------
180
181   function Get_Bytes_BE return Nat is
182      function C_Get_Bytes_BE return Nat;
183      pragma Import (C, C_Get_Bytes_BE,
184                        "get_target_bytes_be");
185   begin
186      return C_Get_Bytes_BE;
187   end Get_Bytes_BE;
188
189   -----------------
190   -- Get_Bits_BE --
191   -----------------
192
193   function Get_Bits_BE return Nat is
194      function C_Get_Bits_BE return Nat;
195      pragma Import (C, C_Get_Bits_BE,
196                        "get_target_bits_be");
197   begin
198      return C_Get_Bits_BE;
199   end Get_Bits_BE;
200
201   ---------------------
202   -- Get_Short_Enums --
203   ---------------------
204
205   function Get_Short_Enums return Int is
206      flag_short_enums : Int;
207      pragma Import (C, flag_short_enums);
208   begin
209      return flag_short_enums;
210   end Get_Short_Enums;
211
212   --------------------------
213   -- Get_Strict_Alignment --
214   --------------------------
215
216   function Get_Strict_Alignment return Nat is
217      function C_Get_Strict_Alignment return Nat;
218      pragma Import (C, C_Get_Strict_Alignment,
219                        "get_target_strict_alignment");
220   begin
221      return C_Get_Strict_Alignment;
222   end Get_Strict_Alignment;
223
224   ------------------------------------
225   -- Get_System_Allocator_Alignment --
226   ------------------------------------
227
228   function Get_System_Allocator_Alignment return Nat is
229      function C_Get_System_Allocator_Alignment return Nat;
230      pragma Import (C, C_Get_System_Allocator_Alignment,
231                        "get_target_system_allocator_alignment");
232   begin
233      return C_Get_System_Allocator_Alignment;
234   end Get_System_Allocator_Alignment;
235
236   --------------------------------
237   -- Get_Double_Float_Alignment --
238   --------------------------------
239
240   function Get_Double_Float_Alignment return Nat is
241      function C_Get_Double_Float_Alignment return Nat;
242      pragma Import (C, C_Get_Double_Float_Alignment,
243                        "get_target_double_float_alignment");
244   begin
245      return C_Get_Double_Float_Alignment;
246   end Get_Double_Float_Alignment;
247
248   ---------------------------------
249   -- Get_Double_Scalar_Alignment --
250   ---------------------------------
251
252   function Get_Double_Scalar_Alignment return Nat is
253      function C_Get_Double_Scalar_Alignment return Nat;
254      pragma Import (C, C_Get_Double_Scalar_Alignment,
255                        "get_target_double_scalar_alignment");
256   begin
257      return C_Get_Double_Scalar_Alignment;
258   end Get_Double_Scalar_Alignment;
259
260   ------------------------------
261   -- Get_Back_End_Config_File --
262   ------------------------------
263
264   function Get_Back_End_Config_File return String_Ptr is
265   begin
266      return null;
267   end Get_Back_End_Config_File;
268
269   ----------------------
270   -- Digits_From_Size --
271   ----------------------
272
273   function Digits_From_Size (Size : Pos) return Pos is
274   begin
275      case Size is
276         when  32    => return  6;
277         when  48    => return  9;
278         when  64    => return 15;
279         when  96    => return 18;
280         when 128    => return 18;
281         when others => raise Program_Error;
282      end case;
283   end Digits_From_Size;
284
285   -----------------------------
286   -- Get_Max_Unaligned_Field --
287   -----------------------------
288
289   function Get_Max_Unaligned_Field return Pos is
290   begin
291      return 64;  -- Can be different on some targets (e.g., AAMP)
292   end Get_Max_Unaligned_Field;
293
294   -----------------------------
295   -- Register_Back_End_Types --
296   -----------------------------
297
298   procedure Register_Back_End_Types (Call_Back : Register_Type_Proc) is
299      procedure Enumerate_Modes (Call_Back : Register_Type_Proc);
300      pragma Import (C, Enumerate_Modes, "enumerate_modes");
301   begin
302      Enumerate_Modes (Call_Back);
303   end Register_Back_End_Types;
304
305   ---------------------
306   -- Width_From_Size --
307   ---------------------
308
309   function Width_From_Size (Size : Pos) return Pos is
310   begin
311      case Size is
312         when  8     => return  4;
313         when 16     => return  6;
314         when 32     => return 11;
315         when 64     => return 21;
316         when others => raise Program_Error;
317      end case;
318   end Width_From_Size;
319
320end Get_Targ;
321