Branch data Line data Source code
1 : : /* do not edit automatically generated by mc from M2System. */
2 : : /* M2System.mod defines the SYSTEM builtin types.
3 : :
4 : : Copyright (C) 2001-2025 Free Software Foundation, Inc.
5 : : Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
6 : :
7 : : This file is part of GNU Modula-2.
8 : :
9 : : GNU Modula-2 is free software; you can redistribute it and/or modify
10 : : it under the terms of the GNU General Public License as published by
11 : : the Free Software Foundation; either version 3, or (at your option)
12 : : any later version.
13 : :
14 : : GNU Modula-2 is distributed in the hope that it will be useful, but
15 : : WITHOUT ANY WARRANTY; without even the implied warranty of
16 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 : : General Public License for more details.
18 : :
19 : : You should have received a copy of the GNU General Public License
20 : : along with GNU Modula-2; see the file COPYING3. If not see
21 : : <http://www.gnu.org/licenses/>. */
22 : :
23 : : #define INCLUDE_MEMORY
24 : : #include "config.h"
25 : : #include "system.h"
26 : : #include "gcc-consolidation.h"
27 : :
28 : : #include <stdbool.h>
29 : : # if !defined (PROC_D)
30 : : # define PROC_D
31 : : typedef void (*PROC_t) (void);
32 : : typedef struct { PROC_t proc; } PROC;
33 : : # endif
34 : :
35 : : # if !defined (TRUE)
36 : : # define TRUE (1==1)
37 : : # endif
38 : :
39 : : # if !defined (FALSE)
40 : : # define FALSE (1==0)
41 : : # endif
42 : :
43 : : # include "Gmcrts.h"
44 : : #if defined(__cplusplus)
45 : : # undef NULL
46 : : # define NULL 0
47 : : #endif
48 : : #define _M2System_C
49 : :
50 : : #include "GM2System.h"
51 : : # include "GSymbolTable.h"
52 : : # include "GAssertion.h"
53 : : # include "GM2LexBuf.h"
54 : : # include "GM2Options.h"
55 : : # include "GNameKey.h"
56 : : # include "GM2Batch.h"
57 : : # include "GM2Base.h"
58 : : # include "GM2Size.h"
59 : : # include "GM2ALU.h"
60 : : # include "GM2Error.h"
61 : : # include "GLists.h"
62 : : # include "GSymbolKey.h"
63 : : # include "GStrLib.h"
64 : : # include "GM2Printf.h"
65 : : # include "GSymbolConversion.h"
66 : : # include "Ggcctypes.h"
67 : : # include "Gm2linemap.h"
68 : : # include "Gm2decl.h"
69 : : # include "Gm2type.h"
70 : : # include "Gm2expr.h"
71 : :
72 : : typedef struct M2System_IsP_p M2System_IsP;
73 : :
74 : : typedef bool (*M2System_IsP_t) (unsigned int);
75 : : struct M2System_IsP_p { M2System_IsP_t proc; };
76 : :
77 : : static SymbolKey_SymbolTree MinValues;
78 : : static SymbolKey_SymbolTree MaxValues;
79 : : static Lists_List SystemTypes;
80 : :
81 : : /*
82 : : InitSystem - creates the system dependant types and procedures.
83 : : Note that they are not exported here, but they are
84 : : exported in the textual module: SYSTEM.def.
85 : : We build our system types from those given in the gcc
86 : : backend. Essentially we perform double book keeping.
87 : : */
88 : :
89 : : extern "C" void M2System_InitSystem (void);
90 : :
91 : : /*
92 : : GetSystemTypeMinMax - returns the minimum and maximum values for a given system type.
93 : : */
94 : :
95 : : extern "C" void M2System_GetSystemTypeMinMax (unsigned int type, unsigned int *min, unsigned int *max);
96 : :
97 : : /*
98 : : IsPseudoSystemFunction - returns true if sym is a SYSTEM pseudo function.
99 : : */
100 : :
101 : : extern "C" bool M2System_IsPseudoSystemFunction (unsigned int sym);
102 : :
103 : : /*
104 : : IsPseudoSystemProcedure - returns true if sym is a SYSTEM pseudo procedure.
105 : : */
106 : :
107 : : extern "C" bool M2System_IsPseudoSystemProcedure (unsigned int sym);
108 : :
109 : : /*
110 : : IsPseudoSystemFunctionConstExpression - returns TRUE if this procedure
111 : : is legal in a constant expression.
112 : : */
113 : :
114 : : extern "C" bool M2System_IsPseudoSystemFunctionConstExpression (unsigned int sym);
115 : :
116 : : /*
117 : : IsSystemType - returns TRUE if sym is a SYSTEM (inbuilt) type.
118 : : It does not search your SYSTEM implementation module.
119 : : */
120 : :
121 : : extern "C" bool M2System_IsSystemType (unsigned int sym);
122 : :
123 : : /*
124 : : IntegerN - returns the symbol associated with INTEGER[N].
125 : : NulSym is returned if the type does not exist.
126 : : */
127 : :
128 : : extern "C" unsigned int M2System_IntegerN (unsigned int bitlength);
129 : :
130 : : /*
131 : : CardinalN - returns the symbol associated with CARDINAL[N].
132 : : NulSym is returned if the type does not exist.
133 : : */
134 : :
135 : : extern "C" unsigned int M2System_CardinalN (unsigned int bitlength);
136 : :
137 : : /*
138 : : WordN - returns the symbol associated with WORD[N].
139 : : NulSym is returned if the type does not exist.
140 : : */
141 : :
142 : : extern "C" unsigned int M2System_WordN (unsigned int bitlength);
143 : :
144 : : /*
145 : : SetN - returns the symbol associated with SET[N].
146 : : NulSym is returned if the type does not exist.
147 : : */
148 : :
149 : : extern "C" unsigned int M2System_SetN (unsigned int bitlength);
150 : :
151 : : /*
152 : : RealN - returns the symbol associated with REAL[N].
153 : : NulSym is returned if the type does not exist.
154 : : */
155 : :
156 : : extern "C" unsigned int M2System_RealN (unsigned int bitlength);
157 : :
158 : : /*
159 : : ComplexN - returns the symbol associated with COMPLEX[N].
160 : : NulSym is returned if the type does not exist.
161 : : */
162 : :
163 : : extern "C" unsigned int M2System_ComplexN (unsigned int bitlength);
164 : :
165 : : /*
166 : : IsIntegerN - returns the TRUE if, sym, is one of the SYSTEM
167 : : INTEGER types (not the base INTEGER type).
168 : : */
169 : :
170 : : extern "C" bool M2System_IsIntegerN (unsigned int sym);
171 : :
172 : : /*
173 : : IsCardinalN - returns the TRUE if, sym, is one of the SYSTEM
174 : : CARDINAL types (not the base CARDINAL type).
175 : : */
176 : :
177 : : extern "C" bool M2System_IsCardinalN (unsigned int sym);
178 : :
179 : : /*
180 : : IsWordN - returns the TRUE if, sym, is one of the SYSTEM
181 : : WORD[n] types (not the default SYSTEM WORD type).
182 : : */
183 : :
184 : : extern "C" bool M2System_IsWordN (unsigned int sym);
185 : :
186 : : /*
187 : : IsSetN - returns the TRUE if, sym, is one of the SYSTEM
188 : : SET[n] types (not the default SYSTEM BITSET type).
189 : : */
190 : :
191 : : extern "C" bool M2System_IsSetN (unsigned int sym);
192 : :
193 : : /*
194 : : IsRealN - returns the TRUE if, sym, is one of the SYSTEM
195 : : REAL[n] types (not the default base REAL type).
196 : : */
197 : :
198 : : extern "C" bool M2System_IsRealN (unsigned int sym);
199 : :
200 : : /*
201 : : IsComplexN - returns the TRUE if, sym, is one of the SYSTEM
202 : : COMPLEX[n] types (not the default base COMPLEX,
203 : : LONGCOMPLEX or SHORTCOMPLEX types).
204 : : */
205 : :
206 : : extern "C" bool M2System_IsComplexN (unsigned int sym);
207 : :
208 : : /*
209 : : IsGenericSystemType - returns TRUE if, sym, is of type
210 : : BYTE, WORD or any other length.
211 : : */
212 : :
213 : : extern "C" bool M2System_IsGenericSystemType (unsigned int sym);
214 : :
215 : : /*
216 : : IsSameSizePervasiveType - returns TRUE if a or b are CARDINAL, INTEGER, REAL,
217 : : LONGREAL, SHORTREAL and the other type is the same
218 : : size and of the same type.
219 : : */
220 : :
221 : : extern "C" bool M2System_IsSameSizePervasiveType (unsigned int a, unsigned int b);
222 : :
223 : : /*
224 : : IsSameSize - return TRUE if SIZE(a)=SIZE(b)
225 : : */
226 : :
227 : : extern "C" bool M2System_IsSameSize (unsigned int a, unsigned int b);
228 : :
229 : : /*
230 : : Init -
231 : : */
232 : :
233 : : static void Init (void);
234 : :
235 : : /*
236 : : CreateMinMaxFor - creates the min and max values for, type, given gccType.
237 : : */
238 : :
239 : : static void CreateMinMaxFor (unsigned int type, const char *min_, unsigned int _min_high, const char *max_, unsigned int _max_high, tree gccType);
240 : :
241 : : /*
242 : : MapType -
243 : : */
244 : :
245 : : static void MapType (unsigned int type, const char *name_, unsigned int _name_high, const char *min_, unsigned int _min_high, const char *max_, unsigned int _max_high, bool needsExporting, tree t);
246 : :
247 : : /*
248 : : CreateType - create and return a frontend type which matches the GCC tree type.
249 : : */
250 : :
251 : : static unsigned int CreateType (const char *name_, unsigned int _name_high, const char *min_, unsigned int _min_high, const char *max_, unsigned int _max_high, bool needsExporting, tree gccType);
252 : :
253 : : /*
254 : : AttemptToCreateType - attempts to create a frontend type which matches the
255 : : GCC tree type.
256 : : */
257 : :
258 : : static void AttemptToCreateType (const char *name_, unsigned int _name_high, const char *min_, unsigned int _min_high, const char *max_, unsigned int _max_high, bool needsExporting, tree gccType);
259 : :
260 : : /*
261 : : CreateSetType - creates and returns a, SET OF [0..highBit], type.
262 : : It maps this type onto the GCC type.
263 : : */
264 : :
265 : : static unsigned int CreateSetType (const char *name_, unsigned int _name_high, const char *highBit_, unsigned int _highBit_high, bool needsExporting, tree gccType);
266 : :
267 : : /*
268 : : AttemptToCreateSetType - creates and returns a, SET OF [0..highBit], type.
269 : : It maps this type onto the GCC type.
270 : : */
271 : :
272 : : static void AttemptToCreateSetType (const char *name_, unsigned int _name_high, const char *highBit_, unsigned int _highBit_high, bool needsExporting, tree gccType);
273 : :
274 : : /*
275 : : MakeFixedSizedTypes - creates the SYSTEM fixed sized types providing the
276 : : gcc backend supports them.
277 : : */
278 : :
279 : : static void MakeFixedSizedTypes (void);
280 : :
281 : : /*
282 : : InitPIMTypes -
283 : : */
284 : :
285 : : static void InitPIMTypes (void);
286 : :
287 : : /*
288 : : InitISOTypes -
289 : : */
290 : :
291 : : static void InitISOTypes (void);
292 : :
293 : : /*
294 : : MakeExtraSystemTypes - create any extra system types required
295 : : for portability.
296 : : */
297 : :
298 : : static void MakeExtraSystemTypes (void);
299 : :
300 : : /*
301 : : IsISOPseudoSystemFunction -
302 : : */
303 : :
304 : : static bool IsISOPseudoSystemFunction (unsigned int sym);
305 : :
306 : : /*
307 : : IsPIMPseudoSystemFunction - returns TRUE if sym is specifically a PIM
308 : : system function.
309 : : */
310 : :
311 : : static bool IsPIMPseudoSystemFunction (unsigned int sym);
312 : :
313 : : /*
314 : : GetSafeSystem -
315 : : */
316 : :
317 : : static unsigned int GetSafeSystem (NameKey_Name name);
318 : :
319 : : /*
320 : : IsSameType - returns TRUE if, t, is the same type as a or b
321 : : and a or b are a type, p.
322 : : */
323 : :
324 : : static bool IsSameType (unsigned int t, M2System_IsP p, unsigned int a, unsigned int b);
325 : :
326 : :
327 : : /*
328 : : Init -
329 : : */
330 : :
331 : 15392 : static void Init (void)
332 : : {
333 : 15392 : Lists_InitList (&SystemTypes);
334 : 15392 : SymbolKey_InitTree (&MinValues);
335 : 15392 : SymbolKey_InitTree (&MaxValues);
336 : 15392 : }
337 : :
338 : :
339 : : /*
340 : : CreateMinMaxFor - creates the min and max values for, type, given gccType.
341 : : */
342 : :
343 : 173277 : static void CreateMinMaxFor (unsigned int type, const char *min_, unsigned int _min_high, const char *max_, unsigned int _max_high, tree gccType)
344 : : {
345 : 173277 : unsigned int maxval;
346 : 173277 : unsigned int minval;
347 : 173277 : char min[_min_high+1];
348 : 173277 : char max[_max_high+1];
349 : :
350 : : /* make a local copy of each unbounded array. */
351 : 173277 : memcpy (min, min_, _min_high+1);
352 : 173277 : memcpy (max, max_, _max_high+1);
353 : :
354 : 173277 : maxval = SymbolTable_MakeConstVar (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) max, _max_high));
355 : 173277 : M2ALU_PushIntegerTree (m2type_GetMaxFrom (m2linemap_BuiltinsLocation (), gccType));
356 : 173277 : SymbolTable_PopValue (maxval);
357 : 173277 : SymbolTable_PutVar (maxval, type);
358 : 173277 : SymbolKey_PutSymKey (MaxValues, SymbolTable_GetSymName (type), maxval);
359 : 173277 : minval = SymbolTable_MakeConstVar (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) min, _min_high));
360 : 173277 : M2ALU_PushIntegerTree (m2type_GetMinFrom (m2linemap_BuiltinsLocation (), gccType));
361 : 173277 : SymbolTable_PopValue (minval);
362 : 173277 : SymbolTable_PutVar (minval, type);
363 : 173277 : SymbolKey_PutSymKey (MinValues, SymbolTable_GetSymName (type), minval);
364 : 173277 : }
365 : :
366 : :
367 : : /*
368 : : MapType -
369 : : */
370 : :
371 : 415584 : static void MapType (unsigned int type, const char *name_, unsigned int _name_high, const char *min_, unsigned int _min_high, const char *max_, unsigned int _max_high, bool needsExporting, tree t)
372 : : {
373 : 415584 : NameKey_Name n;
374 : 415584 : char name[_name_high+1];
375 : 415584 : char min[_min_high+1];
376 : 415584 : char max[_max_high+1];
377 : :
378 : : /* make a local copy of each unbounded array. */
379 : 415584 : memcpy (name, name_, _name_high+1);
380 : 415584 : memcpy (min, min_, _min_high+1);
381 : 415584 : memcpy (max, max_, _max_high+1);
382 : :
383 : 415584 : M2ALU_PushIntegerTree (m2expr_BuildSize (m2linemap_BuiltinsLocation (), t, false));
384 : 415584 : SymbolTable_PopSize (type);
385 : 415584 : if (Lists_IsItemInList (SystemTypes, type))
386 : : {
387 : 0 : M2Error_InternalError ((const char *) "not expecting system type to already be declared", 48);
388 : : }
389 : 415584 : Lists_PutItemIntoList (SystemTypes, type);
390 : : /* create min, max constants if type is ordinal */
391 : 415584 : if ((! (StrLib_StrEqual ((const char *) min, _min_high, (const char *) "", 0))) && (! (StrLib_StrEqual ((const char *) max, _max_high, (const char *) "", 0))))
392 : : {
393 : 127101 : CreateMinMaxFor (type, (const char *) min, _min_high, (const char *) max, _max_high, t);
394 : : }
395 : 415584 : if (needsExporting && M2Options_DumpSystemExports)
396 : : {
397 : 594 : n = SymbolTable_GetSymName (type);
398 : 594 : M2Printf_printf1 ((const char *) "SYSTEM module creates type: %a\\n", 32, (const unsigned char *) &n, (sizeof (n)-1));
399 : : }
400 : 415584 : }
401 : :
402 : :
403 : : /*
404 : : CreateType - create and return a frontend type which matches the GCC tree type.
405 : : */
406 : :
407 : 384800 : static unsigned int CreateType (const char *name_, unsigned int _name_high, const char *min_, unsigned int _min_high, const char *max_, unsigned int _max_high, bool needsExporting, tree gccType)
408 : : {
409 : 384800 : unsigned int type;
410 : 384800 : char name[_name_high+1];
411 : 384800 : char min[_min_high+1];
412 : 384800 : char max[_max_high+1];
413 : :
414 : : /* make a local copy of each unbounded array. */
415 : 384800 : memcpy (name, name_, _name_high+1);
416 : 384800 : memcpy (min, min_, _min_high+1);
417 : 384800 : memcpy (max, max_, _max_high+1);
418 : :
419 : 384800 : if (gccType == NULL)
420 : : {
421 : : /* GCC backend does not support this type. */
422 : : return SymbolTable_NulSym;
423 : : }
424 : : else
425 : : {
426 : : /* Create base type. */
427 : 354016 : type = SymbolTable_MakeType (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) name, _name_high));
428 : 354016 : SymbolTable_PutType (type, SymbolTable_NulSym); /* a Base Type */
429 : 354016 : MapType (type, (const char *) name, _name_high, (const char *) min, _min_high, (const char *) max, _max_high, needsExporting, gccType); /* a Base Type */
430 : 354016 : return type;
431 : : }
432 : : /* static analysis guarentees a RETURN statement will be used before here. */
433 : : __builtin_unreachable ();
434 : 384800 : }
435 : :
436 : :
437 : : /*
438 : : AttemptToCreateType - attempts to create a frontend type which matches the
439 : : GCC tree type.
440 : : */
441 : :
442 : 292448 : static void AttemptToCreateType (const char *name_, unsigned int _name_high, const char *min_, unsigned int _min_high, const char *max_, unsigned int _max_high, bool needsExporting, tree gccType)
443 : : {
444 : 292448 : char name[_name_high+1];
445 : 292448 : char min[_min_high+1];
446 : 292448 : char max[_max_high+1];
447 : :
448 : : /* make a local copy of each unbounded array. */
449 : 292448 : memcpy (name, name_, _name_high+1);
450 : 292448 : memcpy (min, min_, _min_high+1);
451 : 292448 : memcpy (max, max_, _max_high+1);
452 : :
453 : 292448 : Assertion_Assert (SymbolTable_IsLegal (CreateType ((const char *) name, _name_high, (const char *) min, _min_high, (const char *) max, _max_high, needsExporting, gccType)));
454 : 292448 : }
455 : :
456 : :
457 : : /*
458 : : CreateSetType - creates and returns a, SET OF [0..highBit], type.
459 : : It maps this type onto the GCC type.
460 : : */
461 : :
462 : 46176 : static unsigned int CreateSetType (const char *name_, unsigned int _name_high, const char *highBit_, unsigned int _highBit_high, bool needsExporting, tree gccType)
463 : : {
464 : 46176 : unsigned int low;
465 : 46176 : unsigned int high;
466 : 46176 : unsigned int subrange;
467 : 46176 : unsigned int type;
468 : 46176 : char name[_name_high+1];
469 : 46176 : char highBit[_highBit_high+1];
470 : :
471 : : /* make a local copy of each unbounded array. */
472 : 46176 : memcpy (name, name_, _name_high+1);
473 : 46176 : memcpy (highBit, highBit_, _highBit_high+1);
474 : :
475 : 46176 : if (gccType == NULL)
476 : : {
477 : : /* GCC backend does not support this type */
478 : : return SymbolTable_NulSym;
479 : : }
480 : : else
481 : : {
482 : : /* create base type */
483 : 46176 : type = SymbolTable_MakeSet (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) name, _name_high));
484 : 46176 : low = SymbolTable_MakeConstLit (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) "0", 1), M2Base_Cardinal);
485 : 46176 : high = SymbolTable_MakeConstLit (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) highBit, _highBit_high), M2Base_Cardinal);
486 : 46176 : subrange = SymbolTable_MakeSubrange (M2LexBuf_BuiltinTokenNo, NameKey_NulName);
487 : 46176 : SymbolTable_PutSubrange (subrange, low, high, M2Base_Cardinal);
488 : 46176 : SymbolTable_PutSet (type, subrange, false);
489 : 46176 : MapType (type, (const char *) name, _name_high, (const char *) "", 0, (const char *) "", 0, needsExporting, gccType);
490 : 46176 : return type;
491 : : }
492 : : /* static analysis guarentees a RETURN statement will be used before here. */
493 : : __builtin_unreachable ();
494 : 46176 : }
495 : :
496 : :
497 : : /*
498 : : AttemptToCreateSetType - creates and returns a, SET OF [0..highBit], type.
499 : : It maps this type onto the GCC type.
500 : : */
501 : :
502 : 46176 : static void AttemptToCreateSetType (const char *name_, unsigned int _name_high, const char *highBit_, unsigned int _highBit_high, bool needsExporting, tree gccType)
503 : : {
504 : 46176 : char name[_name_high+1];
505 : 46176 : char highBit[_highBit_high+1];
506 : :
507 : : /* make a local copy of each unbounded array. */
508 : 46176 : memcpy (name, name_, _name_high+1);
509 : 46176 : memcpy (highBit, highBit_, _highBit_high+1);
510 : :
511 : 46176 : Assertion_Assert (SymbolTable_IsLegal (CreateSetType ((const char *) name, _name_high, (const char *) highBit, _highBit_high, needsExporting, gccType)));
512 : 46176 : }
513 : :
514 : :
515 : : /*
516 : : MakeFixedSizedTypes - creates the SYSTEM fixed sized types providing the
517 : : gcc backend supports them.
518 : : */
519 : :
520 : 15392 : static void MakeFixedSizedTypes (void)
521 : : {
522 : 15392 : AttemptToCreateType ((const char *) "INTEGER8", 8, (const char *) "MinInteger8", 11, (const char *) "MaxInteger8", 11, true, m2type_GetM2Integer8 ());
523 : 15392 : AttemptToCreateType ((const char *) "INTEGER16", 9, (const char *) "MinInteger16", 12, (const char *) "MaxInteger16", 12, true, m2type_GetM2Integer16 ());
524 : 15392 : AttemptToCreateType ((const char *) "INTEGER32", 9, (const char *) "MinInteger32", 12, (const char *) "MaxInteger32", 12, true, m2type_GetM2Integer32 ());
525 : 15392 : AttemptToCreateType ((const char *) "INTEGER64", 9, (const char *) "MinInteger64", 12, (const char *) "MaxInteger64", 12, true, m2type_GetM2Integer64 ());
526 : 15392 : AttemptToCreateType ((const char *) "CARDINAL8", 9, (const char *) "MinCardinal8", 12, (const char *) "MaxCardinal8", 12, true, m2type_GetM2Cardinal8 ());
527 : 15392 : AttemptToCreateType ((const char *) "CARDINAL16", 10, (const char *) "MinCardinal16", 13, (const char *) "MaxCardinal16", 13, true, m2type_GetM2Cardinal16 ());
528 : 15392 : AttemptToCreateType ((const char *) "CARDINAL32", 10, (const char *) "MinCardinal32", 13, (const char *) "MaxCardinal32", 13, true, m2type_GetM2Cardinal32 ());
529 : 15392 : AttemptToCreateType ((const char *) "CARDINAL64", 10, (const char *) "MinCardinal64", 13, (const char *) "MaxCardinal64", 13, true, m2type_GetM2Cardinal64 ());
530 : 15392 : AttemptToCreateType ((const char *) "WORD16", 6, (const char *) "", 0, (const char *) "", 0, true, m2type_GetM2Word16 ());
531 : 15392 : AttemptToCreateType ((const char *) "WORD32", 6, (const char *) "", 0, (const char *) "", 0, true, m2type_GetM2Word32 ());
532 : 15392 : AttemptToCreateType ((const char *) "WORD64", 6, (const char *) "", 0, (const char *) "", 0, true, m2type_GetM2Word64 ());
533 : 15392 : AttemptToCreateSetType ((const char *) "BITSET8", 7, (const char *) "7", 1, true, m2type_GetM2Bitset8 ());
534 : 15392 : AttemptToCreateSetType ((const char *) "BITSET16", 8, (const char *) "15", 2, true, m2type_GetM2Bitset16 ());
535 : 15392 : AttemptToCreateSetType ((const char *) "BITSET32", 8, (const char *) "31", 2, true, m2type_GetM2Bitset32 ());
536 : 15392 : AttemptToCreateType ((const char *) "REAL32", 6, (const char *) "", 0, (const char *) "", 0, true, m2type_GetM2Real32 ());
537 : 15392 : AttemptToCreateType ((const char *) "REAL64", 6, (const char *) "", 0, (const char *) "", 0, true, m2type_GetM2Real64 ());
538 : 15392 : AttemptToCreateType ((const char *) "REAL96", 6, (const char *) "", 0, (const char *) "", 0, true, m2type_GetM2Real96 ());
539 : 15392 : AttemptToCreateType ((const char *) "REAL128", 7, (const char *) "", 0, (const char *) "", 0, true, m2type_GetM2Real128 ());
540 : 15392 : AttemptToCreateType ((const char *) "COMPLEX32", 9, (const char *) "", 0, (const char *) "", 0, true, m2type_GetM2Complex32 ());
541 : 15392 : AttemptToCreateType ((const char *) "COMPLEX64", 9, (const char *) "", 0, (const char *) "", 0, true, m2type_GetM2Complex64 ());
542 : 15392 : AttemptToCreateType ((const char *) "COMPLEX96", 9, (const char *) "", 0, (const char *) "", 0, true, m2type_GetM2Complex96 ());
543 : 15392 : AttemptToCreateType ((const char *) "COMPLEX128", 10, (const char *) "", 0, (const char *) "", 0, true, m2type_GetM2Complex128 ());
544 : 15392 : }
545 : :
546 : :
547 : : /*
548 : : InitPIMTypes -
549 : : */
550 : :
551 : 11427 : static void InitPIMTypes (void)
552 : : {
553 : 11427 : M2System_Loc = CreateType ((const char *) "LOC", 3, (const char *) "", 0, (const char *) "", 0, true, m2type_GetISOLocType ());
554 : 11427 : m2type_InitSystemTypes (m2linemap_BuiltinsLocation (), static_cast<int> (M2System_Loc));
555 : 11427 : M2System_Word = CreateType ((const char *) "WORD", 4, (const char *) "", 0, (const char *) "", 0, true, m2type_GetWordType ());
556 : 11427 : M2System_Byte = CreateType ((const char *) "BYTE", 4, (const char *) "", 0, (const char *) "", 0, true, m2type_GetByteType ());
557 : : /* ADDRESS = POINTER TO BYTE */
558 : 11427 : M2System_Address = SymbolTable_MakePointer (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) "ADDRESS", 7));
559 : 11427 : SymbolTable_PutPointer (M2System_Address, M2System_Byte); /* Base Type */
560 : 11427 : MapType (M2System_Address, (const char *) "ADDRESS", 7, (const char *) "", 0, (const char *) "", 0, true, m2type_GetPointerType ()); /* Base Type */
561 : 11427 : }
562 : :
563 : :
564 : : /*
565 : : InitISOTypes -
566 : : */
567 : :
568 : 3965 : static void InitISOTypes (void)
569 : : {
570 : 3965 : M2System_Loc = CreateType ((const char *) "LOC", 3, (const char *) "MinLoc", 6, (const char *) "MaxLoc", 6, true, m2type_GetISOLocType ());
571 : 3965 : m2type_InitSystemTypes (m2linemap_BuiltinsLocation (), static_cast<int> (M2System_Loc));
572 : 3965 : M2System_Address = SymbolTable_MakePointer (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) "ADDRESS", 7));
573 : 3965 : SymbolTable_PutPointer (M2System_Address, M2System_Loc); /* Base Type */
574 : 3965 : MapType (M2System_Address, (const char *) "ADDRESS", 7, (const char *) "", 0, (const char *) "", 0, true, m2type_GetPointerType ()); /* Base Type */
575 : 3965 : M2System_Byte = CreateType ((const char *) "BYTE", 4, (const char *) "", 0, (const char *) "", 0, true, m2type_GetISOByteType ());
576 : 3965 : M2System_Word = CreateType ((const char *) "WORD", 4, (const char *) "", 0, (const char *) "", 0, true, m2type_GetISOWordType ());
577 : 3965 : }
578 : :
579 : :
580 : : /*
581 : : MakeExtraSystemTypes - create any extra system types required
582 : : for portability.
583 : : */
584 : :
585 : 15392 : static void MakeExtraSystemTypes (void)
586 : : {
587 : 15392 : M2System_CSizeT = CreateType ((const char *) "CSIZE_T", 7, (const char *) "", 0, (const char *) "", 0, true, m2type_GetCSizeTType ());
588 : 15392 : M2System_CSSizeT = CreateType ((const char *) "CSSIZE_T", 8, (const char *) "", 0, (const char *) "", 0, true, m2type_GetCSSizeTType ());
589 : 15392 : M2System_COffT = CreateType ((const char *) "COFF_T", 6, (const char *) "", 0, (const char *) "", 0, true, m2type_GetCOffTType ());
590 : 15392 : }
591 : :
592 : :
593 : : /*
594 : : IsISOPseudoSystemFunction -
595 : : */
596 : :
597 : 3032625 : static bool IsISOPseudoSystemFunction (unsigned int sym)
598 : : {
599 : 3032625 : return M2Options_Iso && (((((((sym == M2System_AddAdr) || (sym == M2System_SubAdr)) || (sym == M2System_DifAdr)) || (sym == M2System_MakeAdr)) || (sym == M2System_Rotate)) || (sym == M2System_Shift)) || (sym == M2System_Cast));
600 : : /* static analysis guarentees a RETURN statement will be used before here. */
601 : : __builtin_unreachable ();
602 : : }
603 : :
604 : :
605 : : /*
606 : : IsPIMPseudoSystemFunction - returns TRUE if sym is specifically a PIM
607 : : system function.
608 : : */
609 : :
610 : 3057353 : static bool IsPIMPseudoSystemFunction (unsigned int sym)
611 : : {
612 : 3057353 : return ! M2Options_Iso && (((sym == M2Size_Size) || (sym == M2System_Shift)) || (sym == M2System_Rotate));
613 : : /* static analysis guarentees a RETURN statement will be used before here. */
614 : : __builtin_unreachable ();
615 : : }
616 : :
617 : :
618 : : /*
619 : : GetSafeSystem -
620 : : */
621 : :
622 : 42526085 : static unsigned int GetSafeSystem (NameKey_Name name)
623 : : {
624 : 42526085 : unsigned int sym;
625 : 42526085 : unsigned int i;
626 : 42526085 : unsigned int n;
627 : :
628 : 42526085 : n = Lists_NoOfItemsInList (SystemTypes);
629 : 42526085 : i = 1;
630 : 791893543 : while (i <= n)
631 : : {
632 : 744395561 : sym = static_cast<unsigned int> (Lists_GetItemFromList (SystemTypes, i));
633 : 744395561 : if ((SymbolTable_GetSymName (sym)) == name)
634 : : {
635 : : return sym;
636 : : }
637 : 706841373 : i += 1;
638 : : }
639 : : return SymbolTable_NulSym;
640 : : /* static analysis guarentees a RETURN statement will be used before here. */
641 : : __builtin_unreachable ();
642 : : }
643 : :
644 : :
645 : : /*
646 : : IsSameType - returns TRUE if, t, is the same type as a or b
647 : : and a or b are a type, p.
648 : : */
649 : :
650 : 0 : static bool IsSameType (unsigned int t, M2System_IsP p, unsigned int a, unsigned int b)
651 : : {
652 : 0 : if (t == a)
653 : : {
654 : 0 : return ((*p.proc) (b)) && (M2System_IsSameSize (a, b));
655 : : }
656 : 0 : else if (t == b)
657 : : {
658 : : /* avoid dangling else. */
659 : 0 : return ((*p.proc) (a)) && (M2System_IsSameSize (a, b));
660 : : }
661 : : else
662 : : {
663 : : /* avoid dangling else. */
664 : : return false;
665 : : }
666 : : /* static analysis guarentees a RETURN statement will be used before here. */
667 : : __builtin_unreachable ();
668 : : }
669 : :
670 : :
671 : : /*
672 : : InitSystem - creates the system dependant types and procedures.
673 : : Note that they are not exported here, but they are
674 : : exported in the textual module: SYSTEM.def.
675 : : We build our system types from those given in the gcc
676 : : backend. Essentially we perform double book keeping.
677 : : */
678 : :
679 : 15392 : extern "C" void M2System_InitSystem (void)
680 : : {
681 : 15392 : unsigned int Previous;
682 : :
683 : 15392 : Init ();
684 : : /* create SYSTEM module */
685 : 15392 : M2System_System = M2Batch_MakeDefinitionSource (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) "SYSTEM", 6));
686 : 15392 : SymbolTable_StartScope (M2System_System);
687 : 15392 : Previous = SymbolTable_GetCurrentModule ();
688 : 15392 : SymbolTable_SetCurrentModule (M2System_System);
689 : 15392 : if (M2Options_Iso)
690 : : {
691 : 3965 : InitISOTypes ();
692 : 3965 : M2Size_MakeSize ();
693 : 3965 : SymbolTable_PutExportQualified (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) "SIZE", 4));
694 : : }
695 : : else
696 : : {
697 : 11427 : InitPIMTypes ();
698 : : /* SIZE is declared in SYSTEM.def in PIM-2 but not PIM-[34] */
699 : 11427 : if (M2Options_Pedantic)
700 : : {
701 : : /* avoid dangling else. */
702 : 0 : if (M2Options_Pim2)
703 : : {
704 : 0 : M2Size_MakeSize ();
705 : 0 : SymbolTable_PutExportQualified (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) "SIZE", 4));
706 : : }
707 : : }
708 : : else
709 : : {
710 : 11427 : M2Size_MakeSize ();
711 : 11427 : SymbolTable_PutExportQualified (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) "SIZE", 4));
712 : : }
713 : : }
714 : : /* The predefined pseudo functions. */
715 : 15392 : M2System_Adr = SymbolTable_MakeProcedure (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) "ADR", 3)); /* Function */
716 : 15392 : SymbolTable_PutFunction (M2LexBuf_BuiltinTokenNo, M2System_Adr, SymbolTable_DefProcedure, M2System_Address);
717 : : /* Address */
718 : 15392 : M2System_TSize = SymbolTable_MakeProcedure (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) "TSIZE", 5)); /* Function */
719 : 15392 : SymbolTable_PutFunction (M2LexBuf_BuiltinTokenNo, M2System_TSize, SymbolTable_DefProcedure, M2Base_ZType);
720 : : /* ZType */
721 : 15392 : M2System_TBitSize = SymbolTable_MakeProcedure (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) "TBITSIZE", 8)); /* GNU extension */
722 : : /* Function */
723 : 15392 : SymbolTable_PutFunction (M2LexBuf_BuiltinTokenNo, M2System_TBitSize, SymbolTable_DefProcedure, M2Base_ZType);
724 : : /* The ISO specific predefined pseudo functions. */
725 : 15392 : M2System_AddAdr = SymbolTable_MakeProcedure (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) "ADDADR", 6)); /* Function */
726 : 15392 : SymbolTable_PutFunction (M2LexBuf_BuiltinTokenNo, M2System_AddAdr, SymbolTable_DefProcedure, M2System_Address);
727 : : /* Return Type */
728 : 15392 : M2System_SubAdr = SymbolTable_MakeProcedure (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) "SUBADR", 6)); /* Function */
729 : 15392 : SymbolTable_PutFunction (M2LexBuf_BuiltinTokenNo, M2System_SubAdr, SymbolTable_DefProcedure, M2System_Address);
730 : : /* Return Type */
731 : 15392 : M2System_DifAdr = SymbolTable_MakeProcedure (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) "DIFADR", 6)); /* Function */
732 : 15392 : SymbolTable_PutFunction (M2LexBuf_BuiltinTokenNo, M2System_DifAdr, SymbolTable_DefProcedure, M2System_Address);
733 : : /* Return Type */
734 : 15392 : M2System_MakeAdr = SymbolTable_MakeProcedure (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) "MAKEADR", 7)); /* Function */
735 : 15392 : SymbolTable_PutFunction (M2LexBuf_BuiltinTokenNo, M2System_MakeAdr, SymbolTable_DefProcedure, M2System_Address);
736 : : /* The return value for ROTATE, SHIFT and CAST is the
737 : : same as the first parameter and is faked in M2Quads. */
738 : 15392 : M2System_Rotate = SymbolTable_MakeProcedure (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) "ROTATE", 6)); /* Function */
739 : 15392 : M2System_Shift = SymbolTable_MakeProcedure (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) "SHIFT", 5)); /* Function */
740 : 15392 : M2System_Cast = SymbolTable_MakeProcedure (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) "CAST", 4)); /* Function */
741 : 15392 : M2System_Throw = SymbolTable_MakeProcedure (M2LexBuf_BuiltinTokenNo, NameKey_MakeKey ((const char *) "THROW", 5)); /* Procedure */
742 : 15392 : SymbolTable_PutProcedureNoReturn (M2System_Throw, SymbolTable_DefProcedure, true); /* Procedure */
743 : 15392 : CreateMinMaxFor (M2System_Word, (const char *) "MinWord", 7, (const char *) "MaxWord", 7, m2type_GetWordType ());
744 : 15392 : CreateMinMaxFor (M2System_Address, (const char *) "MinAddress", 10, (const char *) "MaxAddress", 10, m2type_GetPointerType ());
745 : 15392 : CreateMinMaxFor (M2System_Byte, (const char *) "MinByte", 7, (const char *) "MaxByte", 7, m2type_GetByteType ());
746 : 15392 : MakeFixedSizedTypes ();
747 : 15392 : MakeExtraSystemTypes ();
748 : 15392 : SymbolTable_EndScope ();
749 : 15392 : SymbolTable_SetCurrentModule (Previous);
750 : 15392 : }
751 : :
752 : :
753 : : /*
754 : : GetSystemTypeMinMax - returns the minimum and maximum values for a given system type.
755 : : */
756 : :
757 : 376 : extern "C" void M2System_GetSystemTypeMinMax (unsigned int type, unsigned int *min, unsigned int *max)
758 : : {
759 : 376 : if (Lists_IsItemInList (SystemTypes, type))
760 : : {
761 : 376 : (*min) = static_cast<unsigned int> (SymbolKey_GetSymKey (MinValues, SymbolTable_GetSymName (type)));
762 : 376 : (*max) = static_cast<unsigned int> (SymbolKey_GetSymKey (MaxValues, SymbolTable_GetSymName (type)));
763 : : }
764 : : else
765 : : {
766 : 0 : M2Error_InternalError ((const char *) "system does not know about this type", 36);
767 : : }
768 : 376 : }
769 : :
770 : :
771 : : /*
772 : : IsPseudoSystemFunction - returns true if sym is a SYSTEM pseudo function.
773 : : */
774 : :
775 : 3115378 : extern "C" bool M2System_IsPseudoSystemFunction (unsigned int sym)
776 : : {
777 : 3115378 : return ((((sym == M2System_Adr) || (sym == M2System_TSize)) || (sym == M2System_TBitSize)) || (IsPIMPseudoSystemFunction (sym))) || (IsISOPseudoSystemFunction (sym));
778 : : /* static analysis guarentees a RETURN statement will be used before here. */
779 : : __builtin_unreachable ();
780 : : }
781 : :
782 : :
783 : : /*
784 : : IsPseudoSystemProcedure - returns true if sym is a SYSTEM pseudo procedure.
785 : : */
786 : :
787 : 148527 : extern "C" bool M2System_IsPseudoSystemProcedure (unsigned int sym)
788 : : {
789 : 148527 : return sym == M2System_Throw;
790 : : /* static analysis guarentees a RETURN statement will be used before here. */
791 : : __builtin_unreachable ();
792 : : }
793 : :
794 : :
795 : : /*
796 : : IsPseudoSystemFunctionConstExpression - returns TRUE if this procedure
797 : : is legal in a constant expression.
798 : : */
799 : :
800 : 324 : extern "C" bool M2System_IsPseudoSystemFunctionConstExpression (unsigned int sym)
801 : : {
802 : 324 : return ((((sym == M2Size_Size) || (sym == M2System_TSize)) || (sym == M2System_Rotate)) || (sym == M2System_Shift)) || (M2Options_Iso && ((sym == M2System_Cast) || (sym == M2System_MakeAdr)));
803 : : /* static analysis guarentees a RETURN statement will be used before here. */
804 : : __builtin_unreachable ();
805 : : }
806 : :
807 : :
808 : : /*
809 : : IsSystemType - returns TRUE if sym is a SYSTEM (inbuilt) type.
810 : : It does not search your SYSTEM implementation module.
811 : : */
812 : :
813 : 1021981 : extern "C" bool M2System_IsSystemType (unsigned int sym)
814 : : {
815 : 1021981 : return Lists_IsItemInList (SystemTypes, sym);
816 : : /* static analysis guarentees a RETURN statement will be used before here. */
817 : : __builtin_unreachable ();
818 : : }
819 : :
820 : :
821 : : /*
822 : : IntegerN - returns the symbol associated with INTEGER[N].
823 : : NulSym is returned if the type does not exist.
824 : : */
825 : :
826 : 3994264 : extern "C" unsigned int M2System_IntegerN (unsigned int bitlength)
827 : : {
828 : 3994264 : switch (bitlength)
829 : : {
830 : 1042576 : case 8:
831 : 1042576 : return GetSafeSystem (NameKey_MakeKey ((const char *) "INTEGER8", 8));
832 : 1011838 : break;
833 : :
834 : 1011838 : case 16:
835 : 1011838 : return GetSafeSystem (NameKey_MakeKey ((const char *) "INTEGER16", 9));
836 : 983326 : break;
837 : :
838 : 983326 : case 32:
839 : 983326 : return GetSafeSystem (NameKey_MakeKey ((const char *) "INTEGER32", 9));
840 : 956524 : break;
841 : :
842 : 956524 : case 64:
843 : 956524 : return GetSafeSystem (NameKey_MakeKey ((const char *) "INTEGER64", 9));
844 : 0 : break;
845 : :
846 : :
847 : 0 : default:
848 : 0 : M2Error_InternalError ((const char *) "system does not know about this type", 36);
849 : : break;
850 : : }
851 : : ReturnException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/M2System.def", 20, 1);
852 : : __builtin_unreachable ();
853 : : }
854 : :
855 : :
856 : : /*
857 : : CardinalN - returns the symbol associated with CARDINAL[N].
858 : : NulSym is returned if the type does not exist.
859 : : */
860 : :
861 : 3555076 : extern "C" unsigned int M2System_CardinalN (unsigned int bitlength)
862 : : {
863 : 3555076 : switch (bitlength)
864 : : {
865 : 932080 : case 8:
866 : 932080 : return GetSafeSystem (NameKey_MakeKey ((const char *) "CARDINAL8", 9));
867 : 901142 : break;
868 : :
869 : 901142 : case 16:
870 : 901142 : return GetSafeSystem (NameKey_MakeKey ((const char *) "CARDINAL16", 10));
871 : 874910 : break;
872 : :
873 : 874910 : case 32:
874 : 874910 : return GetSafeSystem (NameKey_MakeKey ((const char *) "CARDINAL32", 10));
875 : 846944 : break;
876 : :
877 : 846944 : case 64:
878 : 846944 : return GetSafeSystem (NameKey_MakeKey ((const char *) "CARDINAL64", 10));
879 : 0 : break;
880 : :
881 : :
882 : 0 : default:
883 : 0 : M2Error_InternalError ((const char *) "system does not know about this type", 36);
884 : : break;
885 : : }
886 : : ReturnException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/M2System.def", 20, 1);
887 : : __builtin_unreachable ();
888 : : }
889 : :
890 : :
891 : : /*
892 : : WordN - returns the symbol associated with WORD[N].
893 : : NulSym is returned if the type does not exist.
894 : : */
895 : :
896 : 13768716 : extern "C" unsigned int M2System_WordN (unsigned int bitlength)
897 : : {
898 : 13768716 : switch (bitlength)
899 : : {
900 : 4591680 : case 16:
901 : 4591680 : return GetSafeSystem (NameKey_MakeKey ((const char *) "WORD16", 6));
902 : 4591680 : break;
903 : :
904 : 4591680 : case 32:
905 : 4591680 : return GetSafeSystem (NameKey_MakeKey ((const char *) "WORD32", 6));
906 : 4585356 : break;
907 : :
908 : 4585356 : case 64:
909 : 4585356 : return GetSafeSystem (NameKey_MakeKey ((const char *) "WORD64", 6));
910 : 0 : break;
911 : :
912 : :
913 : 0 : default:
914 : 0 : M2Error_InternalError ((const char *) "system does not know about this type", 36);
915 : : break;
916 : : }
917 : : ReturnException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/M2System.def", 20, 1);
918 : : __builtin_unreachable ();
919 : : }
920 : :
921 : :
922 : : /*
923 : : SetN - returns the symbol associated with SET[N].
924 : : NulSym is returned if the type does not exist.
925 : : */
926 : :
927 : 1307259 : extern "C" unsigned int M2System_SetN (unsigned int bitlength)
928 : : {
929 : 1307259 : switch (bitlength)
930 : : {
931 : 435753 : case 8:
932 : 435753 : return GetSafeSystem (NameKey_MakeKey ((const char *) "BITSET8", 7));
933 : 435753 : break;
934 : :
935 : 435753 : case 16:
936 : 435753 : return GetSafeSystem (NameKey_MakeKey ((const char *) "BITSET16", 8));
937 : 435753 : break;
938 : :
939 : 435753 : case 32:
940 : 435753 : return GetSafeSystem (NameKey_MakeKey ((const char *) "BITSET32", 8));
941 : 0 : break;
942 : :
943 : :
944 : 0 : default:
945 : 0 : M2Error_InternalError ((const char *) "system does not know about this type", 36);
946 : : break;
947 : : }
948 : : ReturnException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/M2System.def", 20, 1);
949 : : __builtin_unreachable ();
950 : : }
951 : :
952 : :
953 : : /*
954 : : RealN - returns the symbol associated with REAL[N].
955 : : NulSym is returned if the type does not exist.
956 : : */
957 : :
958 : 4965626 : extern "C" unsigned int M2System_RealN (unsigned int bitlength)
959 : : {
960 : 4965626 : switch (bitlength)
961 : : {
962 : 1251266 : case 32:
963 : 1251266 : return GetSafeSystem (NameKey_MakeKey ((const char *) "REAL32", 6));
964 : 1238120 : break;
965 : :
966 : 1238120 : case 64:
967 : 1238120 : return GetSafeSystem (NameKey_MakeKey ((const char *) "REAL64", 6));
968 : 1238120 : break;
969 : :
970 : 1238120 : case 96:
971 : 1238120 : return GetSafeSystem (NameKey_MakeKey ((const char *) "REAL96", 6));
972 : 1238120 : break;
973 : :
974 : 1238120 : case 128:
975 : 1238120 : return GetSafeSystem (NameKey_MakeKey ((const char *) "REAL128", 7));
976 : 0 : break;
977 : :
978 : :
979 : 0 : default:
980 : 0 : M2Error_InternalError ((const char *) "system does not know about this type", 36);
981 : : break;
982 : : }
983 : : ReturnException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/M2System.def", 20, 1);
984 : : __builtin_unreachable ();
985 : : }
986 : :
987 : :
988 : : /*
989 : : ComplexN - returns the symbol associated with COMPLEX[N].
990 : : NulSym is returned if the type does not exist.
991 : : */
992 : :
993 : 14935144 : extern "C" unsigned int M2System_ComplexN (unsigned int bitlength)
994 : : {
995 : 14935144 : switch (bitlength)
996 : : {
997 : 3733813 : case 32:
998 : 3733813 : return GetSafeSystem (NameKey_MakeKey ((const char *) "COMPLEX32", 9));
999 : 3733777 : break;
1000 : :
1001 : 3733777 : case 64:
1002 : 3733777 : return GetSafeSystem (NameKey_MakeKey ((const char *) "COMPLEX64", 9));
1003 : 3733777 : break;
1004 : :
1005 : 3733777 : case 96:
1006 : 3733777 : return GetSafeSystem (NameKey_MakeKey ((const char *) "COMPLEX96", 9));
1007 : 3733777 : break;
1008 : :
1009 : 3733777 : case 128:
1010 : 3733777 : return GetSafeSystem (NameKey_MakeKey ((const char *) "COMPLEX128", 10));
1011 : 0 : break;
1012 : :
1013 : :
1014 : 0 : default:
1015 : 0 : M2Error_InternalError ((const char *) "system does not know about this type", 36);
1016 : : break;
1017 : : }
1018 : : ReturnException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/M2System.def", 20, 1);
1019 : : __builtin_unreachable ();
1020 : : }
1021 : :
1022 : :
1023 : : /*
1024 : : IsIntegerN - returns the TRUE if, sym, is one of the SYSTEM
1025 : : INTEGER types (not the base INTEGER type).
1026 : : */
1027 : :
1028 : 655631 : extern "C" bool M2System_IsIntegerN (unsigned int sym)
1029 : : {
1030 : 655631 : return (sym != SymbolTable_NulSym) && ((((sym == (M2System_IntegerN (8))) || (sym == (M2System_IntegerN (16)))) || (sym == (M2System_IntegerN (32)))) || (sym == (M2System_IntegerN (64))));
1031 : : /* static analysis guarentees a RETURN statement will be used before here. */
1032 : : __builtin_unreachable ();
1033 : : }
1034 : :
1035 : :
1036 : : /*
1037 : : IsCardinalN - returns the TRUE if, sym, is one of the SYSTEM
1038 : : CARDINAL types (not the base CARDINAL type).
1039 : : */
1040 : :
1041 : 655283 : extern "C" bool M2System_IsCardinalN (unsigned int sym)
1042 : : {
1043 : 655283 : return (sym != SymbolTable_NulSym) && ((((sym == (M2System_CardinalN (8))) || (sym == (M2System_CardinalN (16)))) || (sym == (M2System_CardinalN (32)))) || (sym == (M2System_CardinalN (64))));
1044 : : /* static analysis guarentees a RETURN statement will be used before here. */
1045 : : __builtin_unreachable ();
1046 : : }
1047 : :
1048 : :
1049 : : /*
1050 : : IsWordN - returns the TRUE if, sym, is one of the SYSTEM
1051 : : WORD[n] types (not the default SYSTEM WORD type).
1052 : : */
1053 : :
1054 : 4429525 : extern "C" bool M2System_IsWordN (unsigned int sym)
1055 : : {
1056 : 4429525 : return (sym != SymbolTable_NulSym) && (((sym == (M2System_WordN (16))) || (sym == (M2System_WordN (32)))) || (sym == (M2System_WordN (64))));
1057 : : /* static analysis guarentees a RETURN statement will be used before here. */
1058 : : __builtin_unreachable ();
1059 : : }
1060 : :
1061 : :
1062 : : /*
1063 : : IsSetN - returns the TRUE if, sym, is one of the SYSTEM
1064 : : SET[n] types (not the default SYSTEM BITSET type).
1065 : : */
1066 : :
1067 : 275090 : extern "C" bool M2System_IsSetN (unsigned int sym)
1068 : : {
1069 : 275090 : return (sym != SymbolTable_NulSym) && (((sym == (M2System_SetN (8))) || (sym == (M2System_SetN (16)))) || (sym == (M2System_SetN (32))));
1070 : : /* static analysis guarentees a RETURN statement will be used before here. */
1071 : : __builtin_unreachable ();
1072 : : }
1073 : :
1074 : :
1075 : : /*
1076 : : IsRealN - returns the TRUE if, sym, is one of the SYSTEM
1077 : : REAL[n] types (not the default base REAL type).
1078 : : */
1079 : :
1080 : 1090585 : extern "C" bool M2System_IsRealN (unsigned int sym)
1081 : : {
1082 : 1090585 : return (sym != SymbolTable_NulSym) && ((((sym == (M2System_RealN (32))) || (sym == (M2System_RealN (64)))) || (sym == (M2System_RealN (96)))) || (sym == (M2System_RealN (128))));
1083 : : /* static analysis guarentees a RETURN statement will be used before here. */
1084 : : __builtin_unreachable ();
1085 : : }
1086 : :
1087 : :
1088 : : /*
1089 : : IsComplexN - returns the TRUE if, sym, is one of the SYSTEM
1090 : : COMPLEX[n] types (not the default base COMPLEX,
1091 : : LONGCOMPLEX or SHORTCOMPLEX types).
1092 : : */
1093 : :
1094 : 3642087 : extern "C" bool M2System_IsComplexN (unsigned int sym)
1095 : : {
1096 : 3642087 : return (sym != SymbolTable_NulSym) && ((((sym == (M2System_ComplexN (32))) || (sym == (M2System_ComplexN (64)))) || (sym == (M2System_ComplexN (96)))) || (sym == (M2System_ComplexN (128))));
1097 : : /* static analysis guarentees a RETURN statement will be used before here. */
1098 : : __builtin_unreachable ();
1099 : : }
1100 : :
1101 : :
1102 : : /*
1103 : : IsGenericSystemType - returns TRUE if, sym, is of type
1104 : : BYTE, WORD or any other length.
1105 : : */
1106 : :
1107 : 2417586 : extern "C" bool M2System_IsGenericSystemType (unsigned int sym)
1108 : : {
1109 : 2417586 : return (sym != SymbolTable_NulSym) && ((((M2System_IsWordN (sym)) || (sym == M2System_Word)) || (sym == M2System_Byte)) || (sym == M2System_Loc));
1110 : : /* static analysis guarentees a RETURN statement will be used before here. */
1111 : : __builtin_unreachable ();
1112 : : }
1113 : :
1114 : :
1115 : : /*
1116 : : IsSameSizePervasiveType - returns TRUE if a or b are CARDINAL, INTEGER, REAL,
1117 : : LONGREAL, SHORTREAL and the other type is the same
1118 : : size and of the same type.
1119 : : */
1120 : :
1121 : 0 : extern "C" bool M2System_IsSameSizePervasiveType (unsigned int a, unsigned int b)
1122 : : {
1123 : 0 : return ((((((((((((IsSameType (M2Base_Integer, (M2System_IsP) {(M2System_IsP_t) M2System_IsIntegerN}, a, b)) || (IsSameType (M2Base_Cardinal, (M2System_IsP) {(M2System_IsP_t) M2System_IsCardinalN}, a, b))) || (IsSameType (M2System_Word, (M2System_IsP) {(M2System_IsP_t) M2System_IsWordN}, a, b))) || (IsSameType (M2Base_Real, (M2System_IsP) {(M2System_IsP_t) M2System_IsRealN}, a, b))) || (IsSameType (M2Base_Complex, (M2System_IsP) {(M2System_IsP_t) M2System_IsComplexN}, a, b))) || (IsSameType (M2Base_LongInt, (M2System_IsP) {(M2System_IsP_t) M2System_IsIntegerN}, a, b))) || (IsSameType (M2Base_LongCard, (M2System_IsP) {(M2System_IsP_t) M2System_IsCardinalN}, a, b))) || (IsSameType (M2Base_LongComplex, (M2System_IsP) {(M2System_IsP_t) M2System_IsComplexN}, a, b))) || (IsSameType (M2Base_LongReal, (M2System_IsP) {(M2System_IsP_t) M2System_IsRealN}, a, b))) || (IsSameType (M2Base_ShortInt, (M2System_IsP) {(M2System_IsP_t) M2System_IsIntegerN}, a, b))) || (IsSameType (M2Base_ShortCard, (M2System_IsP) {(M2System_IsP_t) M2System_IsCardinalN}, a, b))) || (IsSameType (M2Base_ShortComplex, (M2System_IsP) {(M2System_IsP_t) M2System_IsComplexN}, a, b))) || (IsSameType (M2Base_ShortReal, (M2System_IsP) {(M2System_IsP_t) M2System_IsRealN}, a, b));
1124 : : /* static analysis guarentees a RETURN statement will be used before here. */
1125 : : __builtin_unreachable ();
1126 : : }
1127 : :
1128 : :
1129 : : /*
1130 : : IsSameSize - return TRUE if SIZE(a)=SIZE(b)
1131 : : */
1132 : :
1133 : 5026 : extern "C" bool M2System_IsSameSize (unsigned int a, unsigned int b)
1134 : : {
1135 : 5026 : return m2expr_AreConstantsEqual (m2expr_BuildSize (m2linemap_BuiltinsLocation (), SymbolConversion_Mod2Gcc (a), false), m2expr_BuildSize (m2linemap_BuiltinsLocation (), SymbolConversion_Mod2Gcc (b), false));
1136 : : /* static analysis guarentees a RETURN statement will be used before here. */
1137 : : __builtin_unreachable ();
1138 : : }
1139 : :
1140 : 15392 : extern "C" void _M2_M2System_init (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
1141 : : {
1142 : 15392 : }
1143 : :
1144 : 0 : extern "C" void _M2_M2System_fini (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
1145 : : {
1146 : 0 : }
|