Branch data Line data Source code
1 : : /* do not edit automatically generated by mc from M2GCCDeclare. */
2 : : /* M2GCCDeclare.mod declares Modula-2 types to GCC.
3 : :
4 : : Copyright (C) 2001-2024 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 : : #include "config.h"
24 : : #include "system.h"
25 : : #include "gcc-consolidation.h"
26 : :
27 : : #include <stdbool.h>
28 : : # if !defined (PROC_D)
29 : : # define PROC_D
30 : : typedef void (*PROC_t) (void);
31 : : typedef struct { PROC_t proc; } PROC;
32 : : # endif
33 : :
34 : : # if !defined (TRUE)
35 : : # define TRUE (1==1)
36 : : # endif
37 : :
38 : : # if !defined (FALSE)
39 : : # define FALSE (1==0)
40 : : # endif
41 : :
42 : : # include "GStorage.h"
43 : : # include "Gmcrts.h"
44 : : #if defined(__cplusplus)
45 : : # undef NULL
46 : : # define NULL 0
47 : : #endif
48 : : #define _M2GCCDeclare_C
49 : :
50 : : #include "GM2GCCDeclare.h"
51 : : # include "GSYSTEM.h"
52 : : # include "GASCII.h"
53 : : # include "GStorage.h"
54 : : # include "GM2Debug.h"
55 : : # include "GM2Quads.h"
56 : : # include "Gm2pp.h"
57 : : # include "GFIO.h"
58 : : # include "GM2Options.h"
59 : : # include "GM2AsmUtil.h"
60 : : # include "GM2Batch.h"
61 : : # include "GNameKey.h"
62 : : # include "GM2FileName.h"
63 : : # include "GDynamicStrings.h"
64 : : # include "GM2LexBuf.h"
65 : : # include "GM2MetaError.h"
66 : : # include "GM2Error.h"
67 : : # include "GM2LangDump.h"
68 : : # include "GM2Printf.h"
69 : : # include "GIndexing.h"
70 : : # include "GLists.h"
71 : : # include "GSets.h"
72 : : # include "GM2BasicBlock.h"
73 : : # include "GSymbolTable.h"
74 : : # include "GM2Base.h"
75 : : # include "GM2System.h"
76 : : # include "GM2Bitset.h"
77 : : # include "GSymbolConversion.h"
78 : : # include "GM2GenGCC.h"
79 : : # include "GM2Scope.h"
80 : : # include "GM2ALU.h"
81 : : # include "Ggcctypes.h"
82 : : # include "Gm2linemap.h"
83 : : # include "Gm2decl.h"
84 : : # include "Gm2type.h"
85 : : # include "Gm2convert.h"
86 : : # include "Gm2expr.h"
87 : : # include "Gm2block.h"
88 : :
89 : : # define Debugging false
90 : : # define Progress false
91 : : # define EnableSSA false
92 : : # define EnableWatch true
93 : : # define TraceQuadruples false
94 : : typedef struct M2GCCDeclare_StartProcedure_p M2GCCDeclare_StartProcedure;
95 : :
96 : : typedef struct M2GCCDeclare_doDeclareProcedure_p M2GCCDeclare_doDeclareProcedure;
97 : :
98 : : typedef struct M2GCCDeclare__T1_r M2GCCDeclare__T1;
99 : :
100 : : typedef M2GCCDeclare__T1 *M2GCCDeclare_Group;
101 : :
102 : : typedef enum {M2GCCDeclare_fullydeclared, M2GCCDeclare_partiallydeclared, M2GCCDeclare_niltypedarrays, M2GCCDeclare_heldbyalignment, M2GCCDeclare_finishedalignment, M2GCCDeclare_todolist, M2GCCDeclare_tobesolvedbyquads, M2GCCDeclare_finishedsetarray} M2GCCDeclare_ListType;
103 : :
104 : : typedef enum {M2GCCDeclare_norule, M2GCCDeclare_partialtype, M2GCCDeclare_arraynil, M2GCCDeclare_pointernilarray, M2GCCDeclare_arraypartial, M2GCCDeclare_pointerfully, M2GCCDeclare_recordkind, M2GCCDeclare_recordfully, M2GCCDeclare_typeconstfully, M2GCCDeclare_pointerfrompartial, M2GCCDeclare_typefrompartial, M2GCCDeclare_partialfrompartial, M2GCCDeclare_partialtofully, M2GCCDeclare_circulartodo, M2GCCDeclare_circularpartial, M2GCCDeclare_circularniltyped} M2GCCDeclare_Rule;
105 : :
106 : : # define DebugLoop 1000
107 : : typedef tree (*M2GCCDeclare_StartProcedure_t) (location_t, void *);
108 : : struct M2GCCDeclare_StartProcedure_p { M2GCCDeclare_StartProcedure_t proc; };
109 : :
110 : : typedef void (*M2GCCDeclare_doDeclareProcedure_t) (unsigned int, unsigned int);
111 : : struct M2GCCDeclare_doDeclareProcedure_p { M2GCCDeclare_doDeclareProcedure_t proc; };
112 : :
113 : : struct M2GCCDeclare__T1_r {
114 : : Sets_Set ToBeSolvedByQuads;
115 : : Sets_Set FinishedSetArray;
116 : : Sets_Set NilTypedArrays;
117 : : Sets_Set FullyDeclared;
118 : : Sets_Set PartiallyDeclared;
119 : : Sets_Set HeldByAlignment;
120 : : Sets_Set FinishedAlignment;
121 : : Sets_Set ToDoList;
122 : : M2GCCDeclare_Group Next;
123 : : };
124 : :
125 : : static M2GCCDeclare_Group FreeGroup;
126 : : static M2GCCDeclare_Group GlobalGroup;
127 : : static Sets_Set VisitedList;
128 : : static Sets_Set ChainedList;
129 : : static bool HaveInitDefaultTypes;
130 : : static Sets_Set WatchList;
131 : : static Indexing_Index EnumerationIndex;
132 : : static M2GCCDeclare_IsAction action;
133 : : static bool ConstantResolved;
134 : : static bool enumDeps;
135 : : static M2GCCDeclare_WalkAction bodyp;
136 : : static M2GCCDeclare_IsAction bodyq;
137 : : static M2GCCDeclare_ListType bodyt;
138 : : static M2GCCDeclare_Rule bodyr;
139 : : static bool recursionCaught;
140 : : static bool oneResolved;
141 : : static bool noMoreWritten;
142 : : static M2GCCDeclare_WalkAction unboundedp;
143 : : static unsigned int MaxEnumerationField;
144 : : static unsigned int MinEnumerationField;
145 : :
146 : : /*
147 : : FoldConstants - a wrapper for ResolveConstantExpressions.
148 : : */
149 : :
150 : : extern "C" void M2GCCDeclare_FoldConstants (M2BasicBlock_BasicBlock bb);
151 : :
152 : : /*
153 : : StartDeclareScope - declares types, variables associated with this scope.
154 : : */
155 : :
156 : : extern "C" void M2GCCDeclare_StartDeclareScope (unsigned int scope);
157 : :
158 : : /*
159 : : EndDeclareScope -
160 : : */
161 : :
162 : : extern "C" void M2GCCDeclare_EndDeclareScope (void);
163 : :
164 : : /*
165 : : DeclareParameters -
166 : : */
167 : :
168 : : extern "C" void M2GCCDeclare_DeclareParameters (unsigned int sym);
169 : :
170 : : /*
171 : : DeclareConstant - checks to see whether, sym, is a constant and
172 : : declares the constant to gcc.
173 : : */
174 : :
175 : : extern "C" void M2GCCDeclare_DeclareConstant (unsigned int tokenno, unsigned int sym);
176 : :
177 : : /*
178 : : DeclareConstructor - declares a constructor.
179 : : */
180 : :
181 : : extern "C" void M2GCCDeclare_DeclareConstructor (unsigned int tokenno, unsigned int quad, unsigned int sym);
182 : :
183 : : /*
184 : : TryDeclareConstant - try and declare a constant. If, sym, is a
185 : : constant try and declare it, if we cannot
186 : : then enter it into the to do list.
187 : : */
188 : :
189 : : extern "C" void M2GCCDeclare_TryDeclareConstant (unsigned int tokenno, unsigned int sym);
190 : :
191 : : /*
192 : : TryDeclareConstructor - try and declare a constructor. If, sym, is a
193 : : constructor try and declare it, if we cannot
194 : : then enter it into the to do list.
195 : : */
196 : :
197 : : extern "C" void M2GCCDeclare_TryDeclareConstructor (unsigned int tokenno, unsigned int sym);
198 : :
199 : : /*
200 : : DeclareLocalVariables - declares Local variables for procedure.
201 : : */
202 : :
203 : : extern "C" void M2GCCDeclare_DeclareLocalVariables (unsigned int procedure);
204 : :
205 : : /*
206 : : DeclareLocalVariable - declare a local variable var.
207 : : */
208 : :
209 : : extern "C" void M2GCCDeclare_DeclareLocalVariable (unsigned int var);
210 : :
211 : : /*
212 : : DeclareProcedure - declares procedure, sym, or all procedures inside
213 : : module sym.
214 : : */
215 : :
216 : : extern "C" void M2GCCDeclare_DeclareProcedure (unsigned int sym);
217 : :
218 : : /*
219 : : DeclareModuleVariables - declares Module variables for a module
220 : : which was declared inside a procedure.
221 : : */
222 : :
223 : : extern "C" void M2GCCDeclare_DeclareModuleVariables (unsigned int sym);
224 : :
225 : : /*
226 : : IsProcedureGccNested - returns TRUE if procedure, sym, will be considered
227 : : as nested by GCC.
228 : : This will occur if either its outer defining scope
229 : : is a procedure or is a module which is inside a
230 : : procedure.
231 : : */
232 : :
233 : : extern "C" bool M2GCCDeclare_IsProcedureGccNested (unsigned int sym);
234 : :
235 : : /*
236 : : PoisonSymbols - poisons all gcc symbols from procedure, sym.
237 : : A debugging aid.
238 : : */
239 : :
240 : : extern "C" void M2GCCDeclare_PoisonSymbols (unsigned int sym);
241 : :
242 : : /*
243 : : PromoteToString - declare, sym, and then promote it to a string.
244 : : Note that if sym is a single character we do
245 : : *not* record it as a string
246 : : but as a char however we always
247 : : return a string constant.
248 : : */
249 : :
250 : : extern "C" tree M2GCCDeclare_PromoteToString (unsigned int tokenno, unsigned int sym);
251 : :
252 : : /*
253 : : PromoteToCString - declare, sym, and then promote it to a string.
254 : : Note that if sym is a single character we do
255 : : *not* record it as a string
256 : : but as a char however we always
257 : : return a string constant.
258 : : */
259 : :
260 : : extern "C" tree M2GCCDeclare_PromoteToCString (unsigned int tokenno, unsigned int sym);
261 : :
262 : : /*
263 : : CompletelyResolved - returns TRUE if a symbols has been completely resolved
264 : : and is not partically declared (such as a record).
265 : : */
266 : :
267 : : extern "C" bool M2GCCDeclare_CompletelyResolved (unsigned int sym);
268 : :
269 : : /*
270 : : ConstantKnownAndUsed -
271 : : */
272 : :
273 : : extern "C" void M2GCCDeclare_ConstantKnownAndUsed (unsigned int sym, tree t);
274 : :
275 : : /*
276 : : PutToBeSolvedByQuads - places, sym, to this list and returns,
277 : : sym.
278 : : */
279 : :
280 : : extern "C" void M2GCCDeclare_PutToBeSolvedByQuads (unsigned int sym);
281 : :
282 : : /*
283 : : MarkExported - tell GCC to mark all exported procedures in module sym.
284 : : */
285 : :
286 : : extern "C" void M2GCCDeclare_MarkExported (unsigned int sym);
287 : :
288 : : /*
289 : : GetTypeMin -
290 : : */
291 : :
292 : : extern "C" unsigned int M2GCCDeclare_GetTypeMin (unsigned int type);
293 : :
294 : : /*
295 : : GetTypeMax -
296 : : */
297 : :
298 : : extern "C" unsigned int M2GCCDeclare_GetTypeMax (unsigned int type);
299 : :
300 : : /*
301 : : PrintSym - prints limited information about a symbol.
302 : : This procedure is externally visible.
303 : : */
304 : :
305 : : extern "C" void M2GCCDeclare_PrintSym (unsigned int sym);
306 : :
307 : : /*
308 : : IncludeDumpSymbol - include sym into the watch list and all syms dependants.
309 : : */
310 : :
311 : : extern "C" void M2GCCDeclare_IncludeDumpSymbol (unsigned int sym);
312 : :
313 : : /*
314 : : DumpFilteredResolver - dumps the gimple or tree representation of all watched symbols.
315 : : */
316 : :
317 : : extern "C" void M2GCCDeclare_DumpFilteredResolver (void);
318 : :
319 : : /*
320 : : DumpFilteredDefinitive - dumps the gimple or tree representation of all watched symbols.
321 : : */
322 : :
323 : : extern "C" void M2GCCDeclare_DumpFilteredDefinitive (void);
324 : :
325 : : /*
326 : : InitDeclarations - initializes default types and the source filename.
327 : : */
328 : :
329 : : extern "C" void M2GCCDeclare_InitDeclarations (void);
330 : : static void mystop (void);
331 : :
332 : : /*
333 : : PrintNum -
334 : : */
335 : :
336 : : static void PrintNum (unsigned int sym);
337 : :
338 : : /*
339 : : DebugSet -
340 : : */
341 : :
342 : : static void DebugSet (const char *a_, unsigned int _a_high, Sets_Set l);
343 : :
344 : : /*
345 : : DebugSets -
346 : : */
347 : :
348 : : static void DebugSets (void);
349 : :
350 : : /*
351 : : DebugNumber -
352 : : */
353 : :
354 : : static void DebugNumber (const char *a_, unsigned int _a_high, Sets_Set s);
355 : : static void DebugSetNumbers (void);
356 : :
357 : : /*
358 : : AddSymToWatch - adds symbol, sym, to the list of symbols
359 : : to watch and annotate their movement between
360 : : lists.
361 : : */
362 : :
363 : : static void AddSymToWatch (unsigned int sym);
364 : :
365 : : /*
366 : : doInclude -
367 : : */
368 : :
369 : : static void doInclude (Sets_Set l, const char *a_, unsigned int _a_high, unsigned int sym);
370 : :
371 : : /*
372 : : WatchIncludeList - include a symbol onto the set first checking
373 : : whether it is already on the set and
374 : : displaying a debug message if the set is
375 : : changed.
376 : : */
377 : :
378 : : static void WatchIncludeList (unsigned int sym, M2GCCDeclare_ListType lt);
379 : :
380 : : /*
381 : : doExclude -
382 : : */
383 : :
384 : : static void doExclude (Sets_Set l, const char *a_, unsigned int _a_high, unsigned int sym);
385 : :
386 : : /*
387 : : WatchRemoveList - remove a symbol onto the list first checking
388 : : whether it is already on the list and
389 : : displaying a debug message if the list is
390 : : changed.
391 : : */
392 : :
393 : : static void WatchRemoveList (unsigned int sym, M2GCCDeclare_ListType lt);
394 : :
395 : : /*
396 : : NewGroup -
397 : : */
398 : :
399 : : static void NewGroup (M2GCCDeclare_Group *g);
400 : :
401 : : /*
402 : : DisposeGroup -
403 : : */
404 : :
405 : : static void DisposeGroup (M2GCCDeclare_Group *g);
406 : :
407 : : /*
408 : : InitGroup - initialize all sets in group and return the group.
409 : : */
410 : :
411 : : static M2GCCDeclare_Group InitGroup (void);
412 : :
413 : : /*
414 : : KillGroup - delete all sets in group and deallocate g.
415 : : */
416 : :
417 : : static void KillGroup (M2GCCDeclare_Group *g);
418 : :
419 : : /*
420 : : DupGroup - If g is not NIL then destroy g.
421 : : Return a duplicate of GlobalGroup.
422 : : */
423 : :
424 : : static M2GCCDeclare_Group DupGroup (M2GCCDeclare_Group g);
425 : :
426 : : /*
427 : : EqualGroup - return TRUE if group left = right.
428 : : */
429 : :
430 : : static bool EqualGroup (M2GCCDeclare_Group left, M2GCCDeclare_Group right);
431 : :
432 : : /*
433 : : LookupSet -
434 : : */
435 : :
436 : : static Sets_Set LookupSet (M2GCCDeclare_ListType listtype);
437 : :
438 : : /*
439 : : GetEnumList -
440 : : */
441 : :
442 : : static tree GetEnumList (unsigned int sym);
443 : :
444 : : /*
445 : : PutEnumList -
446 : : */
447 : :
448 : : static void PutEnumList (unsigned int sym, tree enumlist);
449 : :
450 : : /*
451 : : Chained - checks to see that, sym, has not already been placed on a chain.
452 : : It returns the symbol, sym.
453 : : */
454 : :
455 : : static unsigned int Chained (unsigned int sym);
456 : :
457 : : /*
458 : : DoStartDeclaration - returns a tree representing a symbol which has
459 : : not yet been finished. Used when declaring
460 : : recursive types.
461 : : */
462 : :
463 : : static tree DoStartDeclaration (unsigned int sym, M2GCCDeclare_StartProcedure p);
464 : :
465 : : /*
466 : : ArrayComponentsDeclared - returns TRUE if array, sym,
467 : : subscripts and type are known.
468 : : */
469 : :
470 : : static bool ArrayComponentsDeclared (unsigned int sym);
471 : :
472 : : /*
473 : : GetRecordOfVarient -
474 : : */
475 : :
476 : : static unsigned int GetRecordOfVarient (unsigned int sym);
477 : :
478 : : /*
479 : : CanDeclareRecordKind -
480 : : */
481 : :
482 : : static bool CanDeclareRecordKind (unsigned int sym);
483 : :
484 : : /*
485 : : DeclareRecordKind - works out whether record, sym, is packed or not.
486 : : */
487 : :
488 : : static void DeclareRecordKind (unsigned int sym);
489 : :
490 : : /*
491 : : CanDeclareRecord -
492 : : */
493 : :
494 : : static bool CanDeclareRecord (unsigned int sym);
495 : :
496 : : /*
497 : : FinishDeclareRecord -
498 : : */
499 : :
500 : : static void FinishDeclareRecord (unsigned int sym);
501 : :
502 : : /*
503 : : CanDeclareTypePartially - return TRUE if we are able to make a
504 : : gcc partially created type.
505 : : */
506 : :
507 : : static bool CanDeclareTypePartially (unsigned int sym);
508 : :
509 : : /*
510 : : DeclareTypePartially - create the gcc partial type symbol from, sym.
511 : : */
512 : :
513 : : static void DeclareTypePartially (unsigned int sym);
514 : :
515 : : /*
516 : : CanDeclareArrayAsNil -
517 : : */
518 : :
519 : : static bool CanDeclareArrayAsNil (unsigned int sym);
520 : :
521 : : /*
522 : : DeclareArrayAsNil -
523 : : */
524 : :
525 : : static void DeclareArrayAsNil (unsigned int sym);
526 : :
527 : : /*
528 : : CanDeclareArrayPartially -
529 : : */
530 : :
531 : : static bool CanDeclareArrayPartially (unsigned int sym);
532 : :
533 : : /*
534 : : DeclareArrayPartially -
535 : : */
536 : :
537 : : static void DeclareArrayPartially (unsigned int sym);
538 : :
539 : : /*
540 : : CanDeclarePointerToNilArray -
541 : : */
542 : :
543 : : static bool CanDeclarePointerToNilArray (unsigned int sym);
544 : :
545 : : /*
546 : : DeclarePointerToNilArray -
547 : : */
548 : :
549 : : static void DeclarePointerToNilArray (unsigned int sym);
550 : :
551 : : /*
552 : : CanPromotePointerFully -
553 : : */
554 : :
555 : : static bool CanPromotePointerFully (unsigned int sym);
556 : :
557 : : /*
558 : : PromotePointerFully -
559 : : */
560 : :
561 : : static void PromotePointerFully (unsigned int sym);
562 : :
563 : : /*
564 : : IsTypeQ - returns TRUE if all q(dependants) of, sym,
565 : : return TRUE.
566 : : */
567 : :
568 : : static bool IsTypeQ (unsigned int sym, M2GCCDeclare_IsAction q);
569 : :
570 : : /*
571 : : IsNilTypedArrays - returns TRUE if, sym, is dependant upon a NIL typed array
572 : : */
573 : :
574 : : static bool IsNilTypedArrays (unsigned int sym);
575 : :
576 : : /*
577 : : IsFullyDeclared - returns TRUE if, sym, is fully declared.
578 : : */
579 : :
580 : : static bool IsFullyDeclared (unsigned int sym);
581 : :
582 : : /*
583 : : AllDependantsFullyDeclared - returns TRUE if all dependants of,
584 : : sym, are declared.
585 : : */
586 : :
587 : : static bool AllDependantsFullyDeclared (unsigned int sym);
588 : :
589 : : /*
590 : : NotAllDependantsFullyDeclared - returns TRUE if any dependants of,
591 : : sym, are not declared.
592 : : */
593 : :
594 : : static bool NotAllDependantsFullyDeclared (unsigned int sym);
595 : :
596 : : /*
597 : : IsPartiallyDeclared - returns TRUE if, sym, is partially declared.
598 : : */
599 : :
600 : : static bool IsPartiallyDeclared (unsigned int sym);
601 : :
602 : : /*
603 : : AllDependantsPartiallyDeclared - returns TRUE if all dependants of,
604 : : sym, are partially declared.
605 : : */
606 : :
607 : : static bool AllDependantsPartiallyDeclared (unsigned int sym);
608 : :
609 : : /*
610 : : NotAllDependantsPartiallyDeclared - returns TRUE if any dependants of,
611 : : sym, are not partially declared.
612 : : */
613 : :
614 : : static bool NotAllDependantsPartiallyDeclared (unsigned int sym);
615 : :
616 : : /*
617 : : IsPartiallyOrFullyDeclared - returns TRUE if, sym, is partially or fully declared.
618 : : */
619 : :
620 : : static bool IsPartiallyOrFullyDeclared (unsigned int sym);
621 : :
622 : : /*
623 : : AllDependantsPartiallyOrFullyDeclared - returns TRUE if all dependants of,
624 : : sym, are partially or fully declared.
625 : : */
626 : :
627 : : static bool AllDependantsPartiallyOrFullyDeclared (unsigned int sym);
628 : :
629 : : /*
630 : : TypeConstDependantsFullyDeclared - returns TRUE if sym is a constant or
631 : : type and its dependants are fully
632 : : declared.
633 : : */
634 : :
635 : : static bool TypeConstDependantsFullyDeclared (unsigned int sym);
636 : :
637 : : /*
638 : : CanBeDeclaredViaPartialDependants - returns TRUE if this symbol
639 : : can be declared by partial
640 : : dependants. Such a symbol must
641 : : be a record, proctype or
642 : : an array.
643 : : */
644 : :
645 : : static bool CanBeDeclaredViaPartialDependants (unsigned int sym);
646 : :
647 : : /*
648 : : DeclareConstFully - will add, sym, to the fully declared list and
649 : : also remove it from the to do list. This is
650 : : called indirectly from M2GenGCC as it calculates
651 : : constants during quadruple processing.
652 : : */
653 : :
654 : : static void DeclareConstFully (unsigned int sym);
655 : :
656 : : /*
657 : : DeclareTypeConstFully - declare the GCC type and add the double
658 : : book keeping entry.
659 : : */
660 : :
661 : : static void DeclareTypeConstFully (unsigned int sym);
662 : :
663 : : /*
664 : : DeclareTypeFromPartial - declare the full GCC type from a partial type
665 : : and add the double book keeping entry.
666 : : */
667 : :
668 : : static void DeclareTypeFromPartial (unsigned int sym);
669 : :
670 : : /*
671 : : CanBeDeclaredPartiallyViaPartialDependants - returns TRUE if, sym,
672 : : can be partially declared via
673 : : another partially declared type.
674 : : */
675 : :
676 : : static bool CanBeDeclaredPartiallyViaPartialDependants (unsigned int sym);
677 : :
678 : : /*
679 : : EmitCircularDependancyError - issue a dependancy error.
680 : : */
681 : :
682 : : static void EmitCircularDependancyError (unsigned int sym);
683 : :
684 : : /*
685 : : WriteRule - writes out the name of the rule.
686 : : */
687 : :
688 : : static void WriteRule (void);
689 : :
690 : : /*
691 : : Body -
692 : : */
693 : :
694 : : static void Body (unsigned int sym);
695 : :
696 : : /*
697 : : ForeachTryDeclare - while q (of one sym in set t) is true
698 : : for each symbol in set t,
699 : : if q (sym)
700 : : then
701 : : p (sym)
702 : : end
703 : : end
704 : : end
705 : : */
706 : :
707 : : static bool ForeachTryDeclare (M2GCCDeclare_ListType t, M2GCCDeclare_Rule r, M2GCCDeclare_IsAction q, M2GCCDeclare_WalkAction p);
708 : : static bool DeclaredOutstandingTypes (bool ForceComplete);
709 : :
710 : : /*
711 : : CompleteDeclarationOf - returns the GCC Tree for, sym, if it can
712 : : be created from partially or fully declared
713 : : dependents.
714 : : */
715 : :
716 : : static tree CompleteDeclarationOf (unsigned int sym);
717 : :
718 : : /*
719 : : DeclareType - here a type has been created via TYPE foo = bar,
720 : : we must tell GCC about it.
721 : : */
722 : :
723 : : static tree DeclareType (unsigned int sym);
724 : : static void DeclareConstantFromTree (unsigned int sym, tree value);
725 : :
726 : : /*
727 : : DeclareCharConstant - declares a character constant.
728 : : */
729 : :
730 : : static void DeclareCharConstant (unsigned int tokenno, unsigned int sym);
731 : :
732 : : /*
733 : : DeclareStringConstant - declares a string constant the sym will be known.
734 : : */
735 : :
736 : : static void DeclareStringConstant (unsigned int tokenno, unsigned int sym);
737 : :
738 : : /*
739 : : WalkConstructor - walks all dependants of, sym.
740 : : */
741 : :
742 : : static void WalkConstructor (unsigned int sym, M2GCCDeclare_WalkAction p);
743 : :
744 : : /*
745 : : WalkConst - walks all dependants of, sym.
746 : : */
747 : :
748 : : static void WalkConst (unsigned int sym, M2GCCDeclare_WalkAction p);
749 : :
750 : : /*
751 : : IsConstDependants - returns TRUE if the symbol, sym,
752 : : q(dependants) all return TRUE.
753 : : */
754 : :
755 : : static bool IsConstDependants (unsigned int sym, M2GCCDeclare_IsAction q);
756 : :
757 : : /*
758 : : DeclareConstString -
759 : : */
760 : :
761 : : static bool DeclareConstString (unsigned int tokenno, unsigned int sym);
762 : :
763 : : /*
764 : : TryDeclareConst - try to declare a const to gcc. If it cannot
765 : : declare the symbol it places it into the
766 : : todolist.
767 : : */
768 : :
769 : : static void TryDeclareConst (unsigned int tokenno, unsigned int sym);
770 : :
771 : : /*
772 : : DeclareConst - declares a const to gcc and returns a Tree.
773 : : */
774 : :
775 : : static tree DeclareConst (unsigned int tokenno, unsigned int sym);
776 : :
777 : : /*
778 : : WalkFamilyOfUnbounded -
779 : : */
780 : :
781 : : static void WalkFamilyOfUnbounded (unsigned int oaf __attribute__((unused)), unsigned int dim __attribute__((unused)), unsigned int unbounded);
782 : :
783 : : /*
784 : : WalkAssociatedUnbounded -
785 : : */
786 : :
787 : : static void WalkAssociatedUnbounded (unsigned int sym, M2GCCDeclare_WalkAction p);
788 : :
789 : : /*
790 : : WalkDependants - walks through all dependants of, Sym,
791 : : calling, p, for each dependant.
792 : : */
793 : :
794 : : static void WalkDependants (unsigned int sym, M2GCCDeclare_WalkAction p);
795 : :
796 : : /*
797 : : TraverseDependantsInner -
798 : : */
799 : :
800 : : static void TraverseDependantsInner (unsigned int sym);
801 : :
802 : : /*
803 : : TraverseDependants - walks, sym, dependants. But it checks
804 : : to see that, sym, is not on the
805 : : FullyDeclared and not on the ToDoList.
806 : : */
807 : :
808 : : static void TraverseDependants (unsigned int sym);
809 : :
810 : : /*
811 : : WalkTypeInfo - walks type, sym, and its dependants.
812 : : */
813 : :
814 : : static void WalkTypeInfo (unsigned int sym);
815 : :
816 : : /*
817 : : DeclareUnboundedProcedureParameters -
818 : : */
819 : :
820 : : static void DeclareUnboundedProcedureParameters (unsigned int sym);
821 : :
822 : : /*
823 : : WalkUnboundedProcedureParameters -
824 : : */
825 : :
826 : : static void WalkUnboundedProcedureParameters (unsigned int sym);
827 : :
828 : : /*
829 : : WalkTypesInProcedure - walk all types in procedure, Sym.
830 : : */
831 : :
832 : : static void WalkTypesInProcedure (unsigned int sym);
833 : :
834 : : /*
835 : : WalkTypesInModule - declare all types in module, Sym, to GCC.
836 : : */
837 : :
838 : : static void WalkTypesInModule (unsigned int sym);
839 : :
840 : : /*
841 : : IsRecordFieldDependants - returns TRUE if the record field
842 : : symbol, sym, p(dependants) all return TRUE.
843 : : */
844 : :
845 : : static bool IsRecordFieldDependants (unsigned int sym, M2GCCDeclare_IsAction q);
846 : :
847 : : /*
848 : : GetModuleWhereDeclared - returns the module where, Sym, was created.
849 : : */
850 : :
851 : : static unsigned int GetModuleWhereDeclared (unsigned int sym);
852 : :
853 : : /*
854 : : IsPseudoProcFunc - returns TRUE if Sym is a pseudo function or procedure.
855 : : */
856 : :
857 : : static bool IsPseudoProcFunc (unsigned int Sym);
858 : :
859 : : /*
860 : : IsExternal -
861 : : */
862 : :
863 : : static bool IsExternal (unsigned int sym);
864 : :
865 : : /*
866 : : IsExternalToWholeProgram - return TRUE if the symbol, sym, is external to the
867 : : sources that we have parsed.
868 : : */
869 : :
870 : : static bool IsExternalToWholeProgram (unsigned int sym);
871 : :
872 : : /*
873 : : DeclareProcedureToGccWholeProgram -
874 : : */
875 : :
876 : : static void DeclareProcedureToGccWholeProgram (unsigned int Sym);
877 : :
878 : : /*
879 : : DeclareProcedureToGccSeparateProgram -
880 : : */
881 : :
882 : : static void DeclareProcedureToGccSeparateProgram (unsigned int Sym);
883 : :
884 : : /*
885 : : DeclareProcedureToGcc - traverses all parameters and interfaces to gm2gcc.
886 : : */
887 : :
888 : : static void DeclareProcedureToGcc (unsigned int sym);
889 : :
890 : : /*
891 : : ActivateWatch - activate a watch for any symbol (lista xor listb).
892 : : */
893 : :
894 : : static void ActivateWatch (Sets_Set lista, Sets_Set listb);
895 : :
896 : : /*
897 : : DeclareTypesConstantsProceduresInRange -
898 : : */
899 : :
900 : : static void DeclareTypesConstantsProceduresInRange (unsigned int scope, unsigned int start, unsigned int end);
901 : :
902 : : /*
903 : : SkipModuleScope - skips all module scopes for, scope.
904 : : It returns either NulSym or a procedure sym.
905 : : */
906 : :
907 : : static unsigned int SkipModuleScope (unsigned int scope);
908 : :
909 : : /*
910 : : PushBinding -
911 : : */
912 : :
913 : : static void PushBinding (unsigned int scope);
914 : :
915 : : /*
916 : : PopBinding -
917 : : */
918 : :
919 : : static void PopBinding (unsigned int scope);
920 : :
921 : : /*
922 : : DeclareTypesConstantsProcedures -
923 : : */
924 : :
925 : : static void DeclareTypesConstantsProcedures (unsigned int scope);
926 : :
927 : : /*
928 : : AssertAllTypesDeclared - asserts that all types for variables are declared in, scope.
929 : : */
930 : :
931 : : static void AssertAllTypesDeclared (unsigned int scope);
932 : :
933 : : /*
934 : : DeclareModuleInit - declare all the ctor related functions within
935 : : a module.
936 : : */
937 : :
938 : : static void DeclareModuleInit (unsigned int moduleSym);
939 : :
940 : : /*
941 : : StartDeclareProcedureScope -
942 : : */
943 : :
944 : : static void StartDeclareProcedureScope (unsigned int scope);
945 : :
946 : : /*
947 : : StartDeclareModuleScopeSeparate -
948 : : */
949 : :
950 : : static void StartDeclareModuleScopeSeparate (unsigned int scope);
951 : :
952 : : /*
953 : : StartDeclareModuleScopeWholeProgram -
954 : : */
955 : :
956 : : static void StartDeclareModuleScopeWholeProgram (unsigned int scope);
957 : :
958 : : /*
959 : : StartDeclareModuleScope -
960 : : */
961 : :
962 : : static void StartDeclareModuleScope (unsigned int scope);
963 : :
964 : : /*
965 : : DumpResolver - dumps the m2 representation of sym.
966 : : */
967 : :
968 : : static void DumpResolver (unsigned int sym);
969 : :
970 : : /*
971 : : DumpDefinitive - dumps the m2 and m2 gimple representation of sym.
972 : : */
973 : :
974 : : static void DumpDefinitive (unsigned int sym);
975 : :
976 : : /*
977 : : PreAddModGcc - adds a relationship between sym and tree.
978 : : */
979 : :
980 : : static void PreAddModGcc (unsigned int sym, tree tree);
981 : :
982 : : /*
983 : : DeclareDefaultType - declares a default type, sym, with, name.
984 : : */
985 : :
986 : : static void DeclareDefaultType (unsigned int sym, const char *name_, unsigned int _name_high, tree gcctype);
987 : :
988 : : /*
989 : : DeclareBoolean - declares the Boolean type together with true and false.
990 : : */
991 : :
992 : : static void DeclareBoolean (void);
993 : :
994 : : /*
995 : : DeclareFixedSizedType - declares the GNU Modula-2 fixed types
996 : : (if the back end support such a type).
997 : : */
998 : :
999 : : static void DeclareFixedSizedType (const char *name_, unsigned int _name_high, unsigned int type, tree t);
1000 : :
1001 : : /*
1002 : : DeclareDefaultSimpleTypes - declares the simple types.
1003 : : */
1004 : :
1005 : : static void DeclareDefaultSimpleTypes (void);
1006 : :
1007 : : /*
1008 : : DeclarePackedBoolean -
1009 : : */
1010 : :
1011 : : static void DeclarePackedBoolean (void);
1012 : :
1013 : : /*
1014 : : DeclarePackedDefaultSimpleTypes -
1015 : : */
1016 : :
1017 : : static void DeclarePackedDefaultSimpleTypes (void);
1018 : :
1019 : : /*
1020 : : DeclareDefaultTypes - makes default types known to GCC
1021 : : */
1022 : :
1023 : : static void DeclareDefaultTypes (void);
1024 : :
1025 : : /*
1026 : : DeclareDefaultConstants - make default constants known to GCC
1027 : : */
1028 : :
1029 : : static void DeclareDefaultConstants (void);
1030 : :
1031 : : /*
1032 : : FindContext - returns the scope where the symbol
1033 : : should be created.
1034 : :
1035 : : Symbols created in a module will
1036 : : return the global context tree, but symbols created
1037 : : in a module which is declared inside
1038 : : a procedure will return the procedure Tree.
1039 : : */
1040 : :
1041 : : static tree FindContext (unsigned int sym);
1042 : :
1043 : : /*
1044 : : IsEffectivelyImported - returns TRUE if symbol, Sym, was
1045 : : effectively imported into ModSym.
1046 : : */
1047 : :
1048 : : static bool IsEffectivelyImported (unsigned int ModSym, unsigned int sym);
1049 : :
1050 : : /*
1051 : : FindOuterModule - returns the out most module where, sym,
1052 : : was declared. It returns NulSym if the
1053 : : symbol or the module was declared inside
1054 : : a procedure.
1055 : : */
1056 : :
1057 : : static unsigned int FindOuterModule (unsigned int sym);
1058 : :
1059 : : /*
1060 : : DoVariableDeclaration - create a corresponding gcc variable and add the association
1061 : : between the front end symbol var and the gcc tree.
1062 : : */
1063 : :
1064 : : static void DoVariableDeclaration (unsigned int var, void * name, bool isImported, bool isExported, bool isTemporary, bool isGlobal, tree scope);
1065 : :
1066 : : /*
1067 : : IsGlobal - is the variable not in a procedure scope.
1068 : : */
1069 : :
1070 : : static bool IsGlobal (unsigned int sym);
1071 : :
1072 : : /*
1073 : : DeclareVariable - declares a global variable to GCC.
1074 : : */
1075 : :
1076 : : static void DeclareVariable (unsigned int ModSym, unsigned int variable);
1077 : :
1078 : : /*
1079 : : DeclareVariableWholeProgram - declares a global variable to GCC when using -fm2-whole-program.
1080 : : */
1081 : :
1082 : : static void DeclareVariableWholeProgram (unsigned int mainModule, unsigned int variable);
1083 : :
1084 : : /*
1085 : : DeclareGlobalVariablesWholeProgram -
1086 : : */
1087 : :
1088 : : static void DeclareGlobalVariablesWholeProgram (unsigned int ModSym);
1089 : :
1090 : : /*
1091 : : DeclareGlobalVariables - lists the Global variables for
1092 : : Module ModSym together with their offset.
1093 : : */
1094 : :
1095 : : static void DeclareGlobalVariables (unsigned int ModSym);
1096 : :
1097 : : /*
1098 : : DeclareImportedVariables - declares all imported variables to GM2.
1099 : : */
1100 : :
1101 : : static void DeclareImportedVariables (unsigned int sym);
1102 : :
1103 : : /*
1104 : : DeclareImportedVariablesWholeProgram - declares all imported variables.
1105 : : */
1106 : :
1107 : : static void DeclareImportedVariablesWholeProgram (unsigned int sym);
1108 : :
1109 : : /*
1110 : : DeclareFieldValue -
1111 : : */
1112 : :
1113 : : static tree DeclareFieldValue (unsigned int sym, tree value, tree *list);
1114 : :
1115 : : /*
1116 : : DeclareFieldEnumeration - declares an enumerator within the current enumeration type.
1117 : : */
1118 : :
1119 : : static tree DeclareFieldEnumeration (unsigned int sym);
1120 : :
1121 : : /*
1122 : : DeclareEnumeration - declare an enumerated type.
1123 : : */
1124 : :
1125 : : static tree DeclareEnumeration (unsigned int sym);
1126 : :
1127 : : /*
1128 : : DeclareSubrangeNarrow - will return cardinal, integer, or type depending on whether
1129 : : low..high fits in the C data type.
1130 : : */
1131 : :
1132 : : static tree DeclareSubrangeNarrow (location_t location, unsigned int high, unsigned int low, tree type);
1133 : :
1134 : : /*
1135 : : DeclareSubrange - declare a subrange type.
1136 : : */
1137 : :
1138 : : static tree DeclareSubrange (unsigned int sym);
1139 : :
1140 : : /*
1141 : : IncludeGetNth -
1142 : : */
1143 : :
1144 : : static void IncludeGetNth (Lists_List l, unsigned int sym);
1145 : :
1146 : : /*
1147 : : IncludeType -
1148 : : */
1149 : :
1150 : : static void IncludeType (Lists_List l, unsigned int sym);
1151 : :
1152 : : /*
1153 : : IncludeSubscript -
1154 : : */
1155 : :
1156 : : static void IncludeSubscript (Lists_List l, unsigned int sym);
1157 : :
1158 : : /*
1159 : : PrintLocalSymbol -
1160 : : */
1161 : :
1162 : : static void PrintLocalSymbol (unsigned int sym);
1163 : :
1164 : : /*
1165 : : PrintLocalSymbols -
1166 : : */
1167 : :
1168 : : static void PrintLocalSymbols (unsigned int sym);
1169 : :
1170 : : /*
1171 : : IncludeGetVarient -
1172 : : */
1173 : :
1174 : : static void IncludeGetVarient (Lists_List l, unsigned int sym);
1175 : :
1176 : : /*
1177 : : IncludeUnbounded - includes the record component of an unbounded type.
1178 : : */
1179 : :
1180 : : static void IncludeUnbounded (Lists_List l, unsigned int sym);
1181 : :
1182 : : /*
1183 : : IncludePartialUnbounded - includes the type component of a partial unbounded symbol.
1184 : : */
1185 : :
1186 : : static void IncludePartialUnbounded (Lists_List l, unsigned int sym);
1187 : :
1188 : : /*
1189 : : PrintDeclared - prints out where, sym, was declared.
1190 : : */
1191 : :
1192 : : static void PrintDeclared (unsigned int sym);
1193 : :
1194 : : /*
1195 : : PrintAlignment -
1196 : : */
1197 : :
1198 : : static void PrintAlignment (unsigned int sym);
1199 : :
1200 : : /*
1201 : : IncludeGetParent -
1202 : : */
1203 : :
1204 : : static void IncludeGetParent (Lists_List l, unsigned int sym);
1205 : :
1206 : : /*
1207 : : PrintDecl -
1208 : : */
1209 : :
1210 : : static void PrintDecl (unsigned int sym);
1211 : :
1212 : : /*
1213 : : PrintScope - displays the scope and line number of declaration of symbol, sym.
1214 : : */
1215 : :
1216 : : static void PrintScope (unsigned int sym);
1217 : :
1218 : : /*
1219 : : PrintKind -
1220 : : */
1221 : :
1222 : : static void PrintKind (SymbolTable_ProcedureKind kind);
1223 : :
1224 : : /*
1225 : : PrintProcedureParameters -
1226 : : */
1227 : :
1228 : : static void PrintProcedureParameters (unsigned int sym, SymbolTable_ProcedureKind kind);
1229 : :
1230 : : /*
1231 : : PrintProcedureReturnType -
1232 : : */
1233 : :
1234 : : static void PrintProcedureReturnType (unsigned int sym);
1235 : :
1236 : : /*
1237 : : PrintProcedure -
1238 : : */
1239 : :
1240 : : static void PrintProcedure (unsigned int sym);
1241 : :
1242 : : /*
1243 : : PrintProcTypeParameters -
1244 : : */
1245 : :
1246 : : static void PrintProcTypeParameters (unsigned int sym);
1247 : :
1248 : : /*
1249 : : PrintProcType -
1250 : : */
1251 : :
1252 : : static void PrintProcType (unsigned int sym);
1253 : :
1254 : : /*
1255 : : PrintString -
1256 : : */
1257 : :
1258 : : static void PrintString (unsigned int sym);
1259 : :
1260 : : /*
1261 : : PrintVerboseFromList - prints the, i, th element in the list, l.
1262 : : */
1263 : :
1264 : : static void PrintVerboseFromList (Lists_List l, unsigned int i);
1265 : :
1266 : : /*
1267 : : PrintVerbose - prints limited information about a symbol.
1268 : : */
1269 : :
1270 : : static void PrintVerbose (unsigned int sym);
1271 : :
1272 : : /*
1273 : : PrintTerse -
1274 : : */
1275 : :
1276 : : static void PrintTerse (unsigned int sym);
1277 : :
1278 : : /*
1279 : : CheckAlignment -
1280 : : */
1281 : :
1282 : : static tree CheckAlignment (tree type, unsigned int sym);
1283 : :
1284 : : /*
1285 : : CheckPragma -
1286 : : */
1287 : :
1288 : : static tree CheckPragma (tree type, unsigned int sym);
1289 : :
1290 : : /*
1291 : : IsZero - returns TRUE if symbol, sym, is zero.
1292 : : */
1293 : :
1294 : : static bool IsZero (unsigned int sym);
1295 : :
1296 : : /*
1297 : : SetFieldPacked - sets Varient, VarientField and RecordField symbols
1298 : : as packed.
1299 : : */
1300 : :
1301 : : static void SetFieldPacked (unsigned int field);
1302 : :
1303 : : /*
1304 : : RecordPacked - indicates that record, sym, and its fields
1305 : : are all packed.
1306 : : */
1307 : :
1308 : : static void RecordPacked (unsigned int sym);
1309 : :
1310 : : /*
1311 : : SetFieldNotPacked - sets Varient, VarientField and RecordField symbols
1312 : : as not packed.
1313 : : */
1314 : :
1315 : : static void SetFieldNotPacked (unsigned int field);
1316 : :
1317 : : /*
1318 : : RecordNotPacked - indicates that record, sym, and its fields
1319 : : are all not packed.
1320 : : */
1321 : :
1322 : : static void RecordNotPacked (unsigned int sym);
1323 : :
1324 : : /*
1325 : : DetermineIfRecordPacked -
1326 : : */
1327 : :
1328 : : static void DetermineIfRecordPacked (unsigned int sym);
1329 : :
1330 : : /*
1331 : : DeclarePackedSubrange -
1332 : : */
1333 : :
1334 : : static void DeclarePackedSubrange (unsigned int equiv, unsigned int sym);
1335 : :
1336 : : /*
1337 : : DeclarePackedSet -
1338 : : */
1339 : :
1340 : : static void DeclarePackedSet (unsigned int equiv, unsigned int sym);
1341 : : static void DeclarePackedFieldEnumeration (unsigned int sym);
1342 : :
1343 : : /*
1344 : : DeclarePackedEnumeration -
1345 : : */
1346 : :
1347 : : static void DeclarePackedEnumeration (unsigned int equiv, unsigned int sym);
1348 : :
1349 : : /*
1350 : : DeclarePackedType -
1351 : : */
1352 : :
1353 : : static void DeclarePackedType (unsigned int equiv, unsigned int sym);
1354 : :
1355 : : /*
1356 : : doDeclareEquivalent -
1357 : : */
1358 : :
1359 : : static tree doDeclareEquivalent (unsigned int sym, M2GCCDeclare_doDeclareProcedure p);
1360 : :
1361 : : /*
1362 : : PossiblyPacked -
1363 : : */
1364 : :
1365 : : static tree PossiblyPacked (unsigned int sym, bool isPacked);
1366 : :
1367 : : /*
1368 : : GetPackedType - returns a possibly packed type for field.
1369 : : */
1370 : :
1371 : : static tree GetPackedType (unsigned int sym);
1372 : :
1373 : : /*
1374 : : MaybeAlignField - checks to see whether, field, is packed or aligned and it updates
1375 : : the offsets if appropriate.
1376 : : */
1377 : :
1378 : : static tree MaybeAlignField (unsigned int field, tree *byteOffset, tree *bitOffset);
1379 : :
1380 : : /*
1381 : : DeclareRecord - declares a record and its fields to gcc.
1382 : : The final gcc record type is returned.
1383 : : */
1384 : :
1385 : : static tree DeclareRecord (unsigned int Sym);
1386 : :
1387 : : /*
1388 : : DeclareRecordField -
1389 : : */
1390 : :
1391 : : static tree DeclareRecordField (unsigned int sym);
1392 : :
1393 : : /*
1394 : : DeclareVarient - declares a record and its fields to gcc.
1395 : : The final gcc record type is returned.
1396 : : */
1397 : :
1398 : : static tree DeclareVarient (unsigned int sym);
1399 : :
1400 : : /*
1401 : : DeclareFieldVarient -
1402 : : */
1403 : :
1404 : : static tree DeclareFieldVarient (unsigned int sym);
1405 : :
1406 : : /*
1407 : : DeclarePointer - declares a pointer type to gcc and returns the Tree.
1408 : : */
1409 : :
1410 : : static tree DeclarePointer (unsigned int sym);
1411 : :
1412 : : /*
1413 : : DeclareUnbounded - builds an unbounded type and returns the gcc tree.
1414 : : */
1415 : :
1416 : : static tree DeclareUnbounded (unsigned int sym);
1417 : :
1418 : : /*
1419 : : BuildIndex -
1420 : : */
1421 : :
1422 : : static tree BuildIndex (unsigned int tokenno, unsigned int array);
1423 : :
1424 : : /*
1425 : : DeclareArray - declares an array to gcc and returns the gcc tree.
1426 : : */
1427 : :
1428 : : static tree DeclareArray (unsigned int Sym);
1429 : :
1430 : : /*
1431 : : DeclareProcType - declares a procedure type to gcc and returns the gcc type tree.
1432 : : */
1433 : :
1434 : : static tree DeclareProcType (unsigned int Sym);
1435 : :
1436 : : /*
1437 : : FindMinMaxEnum - finds the minimum and maximum enumeration fields.
1438 : : */
1439 : :
1440 : : static void FindMinMaxEnum (unsigned int field);
1441 : :
1442 : : /*
1443 : : PushNoOfBits - pushes the integer value of the number of bits required
1444 : : to maintain a set of type.
1445 : : */
1446 : :
1447 : : static void PushNoOfBits (unsigned int type, unsigned int low, unsigned int high);
1448 : :
1449 : : /*
1450 : : DeclareLargeSet - n is the name of the set.
1451 : : type is the subrange type (or simple type)
1452 : : low and high are the limits of the subrange.
1453 : : */
1454 : :
1455 : : static tree DeclareLargeSet (NameKey_Name n, unsigned int type, unsigned int low, unsigned int high);
1456 : :
1457 : : /*
1458 : : DeclareLargeOrSmallSet - works out whether the set will exceed TSIZE(WORD). If it does
1459 : : we manufacture a set using:
1460 : :
1461 : : settype = RECORD
1462 : : w1: SET OF [...]
1463 : : w2: SET OF [...]
1464 : : END
1465 : :
1466 : : We do this as GCC and GDB (stabs) only knows about WORD sized sets.
1467 : : If the set will fit into a WORD then we call gccgm2 directly.
1468 : : */
1469 : :
1470 : : static tree DeclareLargeOrSmallSet (unsigned int sym, NameKey_Name n, unsigned int type, unsigned int low, unsigned int high);
1471 : :
1472 : : /*
1473 : : DeclareSet - declares a set type to gcc and returns a Tree.
1474 : : */
1475 : :
1476 : : static tree DeclareSet (unsigned int sym);
1477 : :
1478 : : /*
1479 : : CheckResolveSubrange - checks to see whether we can determine
1480 : : the subrange type. We are able to do
1481 : : this once low, high and the type are known.
1482 : : */
1483 : :
1484 : : static void CheckResolveSubrange (unsigned int sym);
1485 : :
1486 : : /*
1487 : : TypeConstFullyDeclared - all, sym, dependents are declared, so create and
1488 : : return the GCC Tree equivalent.
1489 : : */
1490 : :
1491 : : static tree TypeConstFullyDeclared (unsigned int sym);
1492 : :
1493 : : /*
1494 : : IsBaseType - returns true if a type, Sym, is a base type and
1495 : : we use predefined GDB information to represent this
1496 : : type.
1497 : : */
1498 : :
1499 : : static bool IsBaseType (unsigned int Sym);
1500 : :
1501 : : /*
1502 : : IsFieldEnumerationDependants - sets enumDeps to FALSE if action(Sym)
1503 : : is also FALSE.
1504 : : */
1505 : :
1506 : : static void IsFieldEnumerationDependants (unsigned int Sym);
1507 : :
1508 : : /*
1509 : : IsEnumerationDependants - returns true if the enumeration
1510 : : p(dependants) all return true.
1511 : : */
1512 : :
1513 : : static bool IsEnumerationDependants (unsigned int sym, M2GCCDeclare_IsAction q);
1514 : :
1515 : : /*
1516 : : WalkEnumerationDependants - returns walks all dependants of Sym.
1517 : : */
1518 : :
1519 : : static void WalkEnumerationDependants (unsigned int sym, M2GCCDeclare_WalkAction p);
1520 : :
1521 : : /*
1522 : : WalkSubrangeDependants - calls p(dependants) for each dependant of, sym.
1523 : : */
1524 : :
1525 : : static void WalkSubrangeDependants (unsigned int sym, M2GCCDeclare_WalkAction p);
1526 : :
1527 : : /*
1528 : : IsSubrangeDependants - returns TRUE if the subrange
1529 : : q(dependants) all return TRUE.
1530 : : */
1531 : :
1532 : : static bool IsSubrangeDependants (unsigned int sym, M2GCCDeclare_IsAction q);
1533 : :
1534 : : /*
1535 : : WalkComponentDependants -
1536 : : */
1537 : :
1538 : : static void WalkComponentDependants (unsigned int sym, M2GCCDeclare_WalkAction p);
1539 : :
1540 : : /*
1541 : : IsComponentDependants -
1542 : : */
1543 : :
1544 : : static bool IsComponentDependants (unsigned int sym, M2GCCDeclare_IsAction q);
1545 : :
1546 : : /*
1547 : : WalkVarDependants - walks all dependants of sym.
1548 : : */
1549 : :
1550 : : static void WalkVarDependants (unsigned int sym, M2GCCDeclare_WalkAction p);
1551 : :
1552 : : /*
1553 : : IsVarDependants - returns TRUE if the pointer symbol, sym,
1554 : : p(dependants) all return TRUE.
1555 : : */
1556 : :
1557 : : static bool IsVarDependants (unsigned int sym, M2GCCDeclare_IsAction q);
1558 : :
1559 : : /*
1560 : : WalkPointerDependants - walks all dependants of sym.
1561 : : */
1562 : :
1563 : : static void WalkPointerDependants (unsigned int sym, M2GCCDeclare_WalkAction p);
1564 : :
1565 : : /*
1566 : : IsPointerDependants - returns TRUE if the pointer symbol, sym,
1567 : : p(dependants) all return TRUE.
1568 : : */
1569 : :
1570 : : static bool IsPointerDependants (unsigned int sym, M2GCCDeclare_IsAction q);
1571 : :
1572 : : /*
1573 : : IsRecordAlignment -
1574 : : */
1575 : :
1576 : : static bool IsRecordAlignment (unsigned int sym, M2GCCDeclare_IsAction q);
1577 : :
1578 : : /*
1579 : : IsRecordDependants - returns TRUE if the symbol, sym,
1580 : : q(dependants) all return TRUE.
1581 : : */
1582 : :
1583 : : static bool IsRecordDependants (unsigned int sym, M2GCCDeclare_IsAction q);
1584 : :
1585 : : /*
1586 : : WalkRecordAlignment - walks the alignment constant associated with
1587 : : record, sym.
1588 : : */
1589 : :
1590 : : static void WalkRecordAlignment (unsigned int sym, M2GCCDeclare_WalkAction p);
1591 : :
1592 : : /*
1593 : : WalkRecordDependants - walks symbol, sym, dependants. It only
1594 : : walks the fields if the alignment is
1595 : : unused or fully declared.
1596 : : */
1597 : :
1598 : : static void WalkRecordDependants (unsigned int sym, M2GCCDeclare_WalkAction p);
1599 : :
1600 : : /*
1601 : : WalkRecordFieldDependants -
1602 : : */
1603 : :
1604 : : static void WalkRecordFieldDependants (unsigned int sym, M2GCCDeclare_WalkAction p);
1605 : :
1606 : : /*
1607 : : WalkRecordDependants2 - walks the fields of record, sym, calling
1608 : : p on every dependant.
1609 : : */
1610 : :
1611 : : static void WalkRecordDependants2 (unsigned int sym, M2GCCDeclare_WalkAction p);
1612 : :
1613 : : /*
1614 : : IsVarientAlignment -
1615 : : */
1616 : :
1617 : : static bool IsVarientAlignment (unsigned int sym, M2GCCDeclare_IsAction q);
1618 : :
1619 : : /*
1620 : : IsVarientDependants - returns TRUE if the symbol, sym,
1621 : : q(dependants) all return TRUE.
1622 : : */
1623 : :
1624 : : static bool IsVarientDependants (unsigned int sym, M2GCCDeclare_IsAction q);
1625 : :
1626 : : /*
1627 : : WalkVarientAlignment -
1628 : : */
1629 : :
1630 : : static void WalkVarientAlignment (unsigned int sym, M2GCCDeclare_WalkAction p);
1631 : :
1632 : : /*
1633 : : WalkVarientDependants - walks symbol, sym, dependants.
1634 : : */
1635 : :
1636 : : static void WalkVarientDependants (unsigned int sym, M2GCCDeclare_WalkAction p);
1637 : :
1638 : : /*
1639 : : IsVarientFieldDependants - returns TRUE if the symbol, sym,
1640 : : q(dependants) all return TRUE.
1641 : : */
1642 : :
1643 : : static bool IsVarientFieldDependants (unsigned int sym, M2GCCDeclare_IsAction q);
1644 : :
1645 : : /*
1646 : : WalkVarientFieldDependants -
1647 : : */
1648 : :
1649 : : static void WalkVarientFieldDependants (unsigned int sym, M2GCCDeclare_WalkAction p);
1650 : :
1651 : : /*
1652 : : IsArrayDependants - returns TRUE if the symbol, sym,
1653 : : q(dependants) all return TRUE.
1654 : :
1655 : : */
1656 : :
1657 : : static bool IsArrayDependants (unsigned int sym, M2GCCDeclare_IsAction q);
1658 : :
1659 : : /*
1660 : : WalkArrayDependants - walks symbol, sym, dependants.
1661 : : */
1662 : :
1663 : : static void WalkArrayDependants (unsigned int sym, M2GCCDeclare_WalkAction p);
1664 : :
1665 : : /*
1666 : : IsSetDependants - returns TRUE if the symbol, sym,
1667 : : q(dependants) all return TRUE.
1668 : : */
1669 : :
1670 : : static bool IsSetDependants (unsigned int sym, M2GCCDeclare_IsAction q);
1671 : :
1672 : : /*
1673 : : WalkSetDependants - walks dependants, sym.
1674 : : */
1675 : :
1676 : : static void WalkSetDependants (unsigned int sym, M2GCCDeclare_WalkAction p);
1677 : :
1678 : : /*
1679 : : IsProcTypeDependants -
1680 : : */
1681 : :
1682 : : static bool IsProcTypeDependants (unsigned int sym, M2GCCDeclare_IsAction q);
1683 : :
1684 : : /*
1685 : : WalkProcTypeDependants - walks dependants, sym.
1686 : : */
1687 : :
1688 : : static void WalkProcTypeDependants (unsigned int sym, M2GCCDeclare_WalkAction p);
1689 : :
1690 : : /*
1691 : : IsProcedureDependants -
1692 : : */
1693 : :
1694 : : static bool IsProcedureDependants (unsigned int sym, M2GCCDeclare_IsAction q);
1695 : :
1696 : : /*
1697 : : WalkProcedureDependants - walks dependants, sym.
1698 : : */
1699 : :
1700 : : static void WalkProcedureDependants (unsigned int sym, M2GCCDeclare_WalkAction p);
1701 : :
1702 : : /*
1703 : : IsUnboundedDependants - returns TRUE if the symbol, sym,
1704 : : q(dependants) all return TRUE.
1705 : : */
1706 : :
1707 : : static bool IsUnboundedDependants (unsigned int sym, M2GCCDeclare_IsAction q);
1708 : :
1709 : : /*
1710 : : WalkUnboundedDependants - walks the dependants of, sym.
1711 : : */
1712 : :
1713 : : static void WalkUnboundedDependants (unsigned int sym, M2GCCDeclare_WalkAction p);
1714 : :
1715 : : /*
1716 : : IsTypeDependants - returns TRUE if all q(dependants) return
1717 : : TRUE.
1718 : : */
1719 : :
1720 : : static bool IsTypeDependants (unsigned int sym, M2GCCDeclare_IsAction q);
1721 : :
1722 : : /*
1723 : : WalkTypeDependants - walks all dependants of, sym.
1724 : : */
1725 : :
1726 : : static void WalkTypeDependants (unsigned int sym, M2GCCDeclare_WalkAction p);
1727 : :
1728 : 0 : static void mystop (void)
1729 : : {
1730 : 0 : }
1731 : :
1732 : :
1733 : : /*
1734 : : PrintNum -
1735 : : */
1736 : :
1737 : 0 : static void PrintNum (unsigned int sym)
1738 : : {
1739 : 0 : M2Printf_printf1 ((const char *) "%d, ", 4, (const unsigned char *) &sym, (sizeof (sym)-1));
1740 : 0 : }
1741 : :
1742 : :
1743 : : /*
1744 : : DebugSet -
1745 : : */
1746 : :
1747 : 0 : static void DebugSet (const char *a_, unsigned int _a_high, Sets_Set l)
1748 : : {
1749 : 0 : char a[_a_high+1];
1750 : :
1751 : : /* make a local copy of each unbounded array. */
1752 : 0 : memcpy (a, a_, _a_high+1);
1753 : :
1754 : 0 : M2Printf_printf0 ((const char *) a, _a_high);
1755 : 0 : M2Printf_printf0 ((const char *) " {", 2);
1756 : 0 : Sets_ForeachElementInSetDo (l, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) PrintNum});
1757 : 0 : M2Printf_printf0 ((const char *) "}\\n", 3);
1758 : 0 : }
1759 : :
1760 : :
1761 : : /*
1762 : : DebugSets -
1763 : : */
1764 : :
1765 : 0 : static void DebugSets (void)
1766 : : {
1767 : 0 : DebugSet ((const char *) "ToDoList", 8, GlobalGroup->ToDoList);
1768 : 0 : DebugSet ((const char *) "HeldByAlignment", 15, GlobalGroup->HeldByAlignment);
1769 : 0 : DebugSet ((const char *) "FinishedAlignment", 17, GlobalGroup->FinishedAlignment);
1770 : 0 : DebugSet ((const char *) "PartiallyDeclared", 17, GlobalGroup->PartiallyDeclared);
1771 : 0 : DebugSet ((const char *) "FullyDeclared", 13, GlobalGroup->FullyDeclared);
1772 : 0 : DebugSet ((const char *) "NilTypedArrays", 14, GlobalGroup->NilTypedArrays);
1773 : 0 : DebugSet ((const char *) "ToBeSolvedByQuads", 17, GlobalGroup->ToBeSolvedByQuads);
1774 : 0 : DebugSet ((const char *) "FinishedSetArray", 16, GlobalGroup->FinishedSetArray);
1775 : 0 : }
1776 : :
1777 : :
1778 : : /*
1779 : : DebugNumber -
1780 : : */
1781 : :
1782 : 0 : static void DebugNumber (const char *a_, unsigned int _a_high, Sets_Set s)
1783 : : {
1784 : 0 : unsigned int n;
1785 : 0 : char a[_a_high+1];
1786 : :
1787 : : /* make a local copy of each unbounded array. */
1788 : 0 : memcpy (a, a_, _a_high+1);
1789 : :
1790 : 0 : n = Sets_NoOfElementsInSet (s);
1791 : 0 : M2Printf_printf1 ((const char *) a, _a_high, (const unsigned char *) &n, (sizeof (n)-1));
1792 : 0 : FIO_FlushBuffer (FIO_StdOut);
1793 : 0 : }
1794 : :
1795 : 0 : static void DebugSetNumbers (void)
1796 : : {
1797 : : /*
1798 : : DebugSets -
1799 : : */
1800 : 0 : DebugNumber ((const char *) "ToDoList : %d\\n", 15, GlobalGroup->ToDoList);
1801 : 0 : DebugNumber ((const char *) "HeldByAlignment : %d\\n", 22, GlobalGroup->HeldByAlignment);
1802 : 0 : DebugNumber ((const char *) "PartiallyDeclared : %d\\n", 24, GlobalGroup->PartiallyDeclared);
1803 : 0 : DebugNumber ((const char *) "FullyDeclared : %d\\n", 20, GlobalGroup->FullyDeclared);
1804 : 0 : DebugNumber ((const char *) "NilTypedArrays : %d\\n", 21, GlobalGroup->NilTypedArrays);
1805 : 0 : DebugNumber ((const char *) "ToBeSolvedByQuads : %d\\n", 24, GlobalGroup->ToBeSolvedByQuads);
1806 : 0 : DebugNumber ((const char *) "FinishedSetArray : %d\\n", 23, GlobalGroup->FinishedSetArray);
1807 : 0 : }
1808 : :
1809 : :
1810 : : /*
1811 : : AddSymToWatch - adds symbol, sym, to the list of symbols
1812 : : to watch and annotate their movement between
1813 : : lists.
1814 : : */
1815 : :
1816 : 0 : static void AddSymToWatch (unsigned int sym)
1817 : : {
1818 : 0 : if ((sym != SymbolTable_NulSym) && (! (Sets_IsElementInSet (WatchList, sym))))
1819 : : {
1820 : 0 : Sets_IncludeElementIntoSet (WatchList, sym);
1821 : 0 : WalkDependants (sym, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) AddSymToWatch});
1822 : 0 : M2Printf_fprintf1 (M2LangDump_GetDumpFile (), (const char *) "%d, ", 4, (const unsigned char *) &sym, (sizeof (sym)-1));
1823 : : }
1824 : 0 : }
1825 : :
1826 : :
1827 : : /*
1828 : : doInclude -
1829 : : */
1830 : :
1831 : 0 : static void doInclude (Sets_Set l, const char *a_, unsigned int _a_high, unsigned int sym)
1832 : : {
1833 : 0 : char a[_a_high+1];
1834 : :
1835 : : /* make a local copy of each unbounded array. */
1836 : 0 : memcpy (a, a_, _a_high+1);
1837 : :
1838 : 0 : if (! (Sets_IsElementInSet (l, sym)))
1839 : : {
1840 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "rule: ", 6);
1841 : 0 : WriteRule ();
1842 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " ", 2);
1843 : 0 : M2Printf_fprintf1 (M2LangDump_GetDumpFile (), (const char *) a, _a_high, (const unsigned char *) &sym, (sizeof (sym)-1));
1844 : 0 : Sets_IncludeElementIntoSet (l, sym);
1845 : : }
1846 : 0 : }
1847 : :
1848 : :
1849 : : /*
1850 : : WatchIncludeList - include a symbol onto the set first checking
1851 : : whether it is already on the set and
1852 : : displaying a debug message if the set is
1853 : : changed.
1854 : : */
1855 : :
1856 : 13093083 : static void WatchIncludeList (unsigned int sym, M2GCCDeclare_ListType lt)
1857 : : {
1858 : 13093083 : if (Sets_IsElementInSet (WatchList, sym))
1859 : : {
1860 : 0 : switch (lt)
1861 : : {
1862 : 0 : case M2GCCDeclare_tobesolvedbyquads:
1863 : 0 : doInclude (GlobalGroup->ToBeSolvedByQuads, (const char *) "symbol %d -> ToBeSolvedByQuads\\n", 32, sym);
1864 : 0 : break;
1865 : :
1866 : 0 : case M2GCCDeclare_fullydeclared:
1867 : 0 : doInclude (GlobalGroup->FullyDeclared, (const char *) "symbol %d -> FullyDeclared\\n", 28, sym);
1868 : 0 : break;
1869 : :
1870 : 0 : case M2GCCDeclare_partiallydeclared:
1871 : 0 : doInclude (GlobalGroup->PartiallyDeclared, (const char *) "symbol %d -> PartiallyDeclared\\n", 32, sym);
1872 : 0 : break;
1873 : :
1874 : 0 : case M2GCCDeclare_heldbyalignment:
1875 : 0 : doInclude (GlobalGroup->HeldByAlignment, (const char *) "symbol %d -> HeldByAlignment\\n", 30, sym);
1876 : 0 : break;
1877 : :
1878 : 0 : case M2GCCDeclare_finishedalignment:
1879 : 0 : doInclude (GlobalGroup->FinishedAlignment, (const char *) "symbol %d -> FinishedAlignment\\n", 32, sym);
1880 : 0 : break;
1881 : :
1882 : 0 : case M2GCCDeclare_todolist:
1883 : 0 : doInclude (GlobalGroup->ToDoList, (const char *) "symbol %d -> ToDoList\\n", 23, sym);
1884 : 0 : break;
1885 : :
1886 : 0 : case M2GCCDeclare_niltypedarrays:
1887 : 0 : doInclude (GlobalGroup->NilTypedArrays, (const char *) "symbol %d -> NilTypedArrays\\n", 29, sym);
1888 : 0 : break;
1889 : :
1890 : 0 : case M2GCCDeclare_finishedsetarray:
1891 : 0 : doInclude (GlobalGroup->FinishedSetArray, (const char *) "symbol %d -> FinishedSetArray\\n", 31, sym);
1892 : 0 : break;
1893 : :
1894 : :
1895 : 0 : default:
1896 : 0 : M2Error_InternalError ((const char *) "unknown list", 12);
1897 : : break;
1898 : : }
1899 : : }
1900 : : else
1901 : : {
1902 : 13093083 : switch (lt)
1903 : : {
1904 : 288405 : case M2GCCDeclare_tobesolvedbyquads:
1905 : 288405 : Sets_IncludeElementIntoSet (GlobalGroup->ToBeSolvedByQuads, sym);
1906 : 288405 : break;
1907 : :
1908 : 9693401 : case M2GCCDeclare_fullydeclared:
1909 : 9693401 : Sets_IncludeElementIntoSet (GlobalGroup->FullyDeclared, sym);
1910 : 9693401 : break;
1911 : :
1912 : 137994 : case M2GCCDeclare_partiallydeclared:
1913 : 137994 : Sets_IncludeElementIntoSet (GlobalGroup->PartiallyDeclared, sym);
1914 : 137994 : break;
1915 : :
1916 : 79144 : case M2GCCDeclare_heldbyalignment:
1917 : 79144 : Sets_IncludeElementIntoSet (GlobalGroup->HeldByAlignment, sym);
1918 : 79144 : break;
1919 : :
1920 : 324012 : case M2GCCDeclare_finishedalignment:
1921 : 324012 : Sets_IncludeElementIntoSet (GlobalGroup->FinishedAlignment, sym);
1922 : 324012 : break;
1923 : :
1924 : 2562985 : case M2GCCDeclare_todolist:
1925 : 2562985 : Sets_IncludeElementIntoSet (GlobalGroup->ToDoList, sym);
1926 : 2562985 : break;
1927 : :
1928 : 7142 : case M2GCCDeclare_niltypedarrays:
1929 : 7142 : Sets_IncludeElementIntoSet (GlobalGroup->NilTypedArrays, sym);
1930 : 7142 : break;
1931 : :
1932 : 0 : case M2GCCDeclare_finishedsetarray:
1933 : 0 : Sets_IncludeElementIntoSet (GlobalGroup->FinishedSetArray, sym);
1934 : 0 : break;
1935 : :
1936 : :
1937 : 0 : default:
1938 : 0 : M2Error_InternalError ((const char *) "unknown list", 12);
1939 : 13093083 : break;
1940 : : }
1941 : : }
1942 : 13093083 : }
1943 : :
1944 : :
1945 : : /*
1946 : : doExclude -
1947 : : */
1948 : :
1949 : 0 : static void doExclude (Sets_Set l, const char *a_, unsigned int _a_high, unsigned int sym)
1950 : : {
1951 : 0 : char a[_a_high+1];
1952 : :
1953 : : /* make a local copy of each unbounded array. */
1954 : 0 : memcpy (a, a_, _a_high+1);
1955 : :
1956 : 0 : if (Sets_IsElementInSet (l, sym))
1957 : : {
1958 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "rule: ", 6);
1959 : 0 : WriteRule ();
1960 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " ", 2);
1961 : 0 : M2Printf_fprintf1 (M2LangDump_GetDumpFile (), (const char *) a, _a_high, (const unsigned char *) &sym, (sizeof (sym)-1));
1962 : 0 : Sets_ExcludeElementFromSet (l, sym);
1963 : : }
1964 : 0 : }
1965 : :
1966 : :
1967 : : /*
1968 : : WatchRemoveList - remove a symbol onto the list first checking
1969 : : whether it is already on the list and
1970 : : displaying a debug message if the list is
1971 : : changed.
1972 : : */
1973 : :
1974 : 15715211 : static void WatchRemoveList (unsigned int sym, M2GCCDeclare_ListType lt)
1975 : : {
1976 : 15715211 : if (Sets_IsElementInSet (WatchList, sym))
1977 : : {
1978 : 0 : switch (lt)
1979 : : {
1980 : 0 : case M2GCCDeclare_tobesolvedbyquads:
1981 : 0 : doExclude (GlobalGroup->ToBeSolvedByQuads, (const char *) "symbol %d off ToBeSolvedByQuads\\n", 33, sym);
1982 : 0 : break;
1983 : :
1984 : 0 : case M2GCCDeclare_fullydeclared:
1985 : 0 : doExclude (GlobalGroup->FullyDeclared, (const char *) "symbol %d off FullyDeclared\\n", 29, sym);
1986 : 0 : break;
1987 : :
1988 : 0 : case M2GCCDeclare_partiallydeclared:
1989 : 0 : doExclude (GlobalGroup->PartiallyDeclared, (const char *) "symbol %d off PartiallyDeclared\\n", 33, sym);
1990 : 0 : break;
1991 : :
1992 : 0 : case M2GCCDeclare_heldbyalignment:
1993 : 0 : doExclude (GlobalGroup->HeldByAlignment, (const char *) "symbol %d -> HeldByAlignment\\n", 30, sym);
1994 : 0 : break;
1995 : :
1996 : 0 : case M2GCCDeclare_finishedalignment:
1997 : 0 : doExclude (GlobalGroup->FinishedAlignment, (const char *) "symbol %d -> FinishedAlignment\\n", 32, sym);
1998 : 0 : break;
1999 : :
2000 : 0 : case M2GCCDeclare_todolist:
2001 : 0 : doExclude (GlobalGroup->ToDoList, (const char *) "symbol %d off ToDoList\\n", 24, sym);
2002 : 0 : break;
2003 : :
2004 : 0 : case M2GCCDeclare_niltypedarrays:
2005 : 0 : doExclude (GlobalGroup->NilTypedArrays, (const char *) "symbol %d off NilTypedArrays\\n", 30, sym);
2006 : 0 : break;
2007 : :
2008 : 0 : case M2GCCDeclare_finishedsetarray:
2009 : 0 : doExclude (GlobalGroup->FinishedSetArray, (const char *) "symbol %d off FinishedSetArray\\n", 32, sym);
2010 : 0 : break;
2011 : :
2012 : :
2013 : 0 : default:
2014 : 0 : M2Error_InternalError ((const char *) "unknown list", 12);
2015 : : break;
2016 : : }
2017 : : }
2018 : : else
2019 : : {
2020 : 15715211 : switch (lt)
2021 : : {
2022 : 363017 : case M2GCCDeclare_tobesolvedbyquads:
2023 : 363017 : Sets_ExcludeElementFromSet (GlobalGroup->ToBeSolvedByQuads, sym);
2024 : 363017 : break;
2025 : :
2026 : 0 : case M2GCCDeclare_fullydeclared:
2027 : 0 : Sets_ExcludeElementFromSet (GlobalGroup->FullyDeclared, sym);
2028 : 0 : break;
2029 : :
2030 : 1615366 : case M2GCCDeclare_partiallydeclared:
2031 : 1615366 : Sets_ExcludeElementFromSet (GlobalGroup->PartiallyDeclared, sym);
2032 : 1615366 : break;
2033 : :
2034 : 1459091 : case M2GCCDeclare_heldbyalignment:
2035 : 1459091 : Sets_ExcludeElementFromSet (GlobalGroup->HeldByAlignment, sym);
2036 : 1459091 : break;
2037 : :
2038 : 1379131 : case M2GCCDeclare_finishedalignment:
2039 : 1379131 : Sets_ExcludeElementFromSet (GlobalGroup->FinishedAlignment, sym);
2040 : 1379131 : break;
2041 : :
2042 : 10891512 : case M2GCCDeclare_todolist:
2043 : 10891512 : Sets_ExcludeElementFromSet (GlobalGroup->ToDoList, sym);
2044 : 10891512 : break;
2045 : :
2046 : 7094 : case M2GCCDeclare_niltypedarrays:
2047 : 7094 : Sets_ExcludeElementFromSet (GlobalGroup->NilTypedArrays, sym);
2048 : 7094 : break;
2049 : :
2050 : 0 : case M2GCCDeclare_finishedsetarray:
2051 : 0 : Sets_ExcludeElementFromSet (GlobalGroup->FinishedSetArray, sym);
2052 : 0 : break;
2053 : :
2054 : :
2055 : 0 : default:
2056 : 0 : M2Error_InternalError ((const char *) "unknown list", 12);
2057 : 15715211 : break;
2058 : : }
2059 : : }
2060 : 15715211 : }
2061 : :
2062 : :
2063 : : /*
2064 : : NewGroup -
2065 : : */
2066 : :
2067 : 1447247 : static void NewGroup (M2GCCDeclare_Group *g)
2068 : : {
2069 : 1447247 : if (FreeGroup == NULL)
2070 : : {
2071 : 54225 : Storage_ALLOCATE ((void **) &(*g), sizeof (M2GCCDeclare__T1));
2072 : : }
2073 : : else
2074 : : {
2075 : 1393022 : (*g) = FreeGroup;
2076 : 1393022 : FreeGroup = FreeGroup->Next;
2077 : : }
2078 : 1447247 : }
2079 : :
2080 : :
2081 : : /*
2082 : : DisposeGroup -
2083 : : */
2084 : :
2085 : 1432931 : static void DisposeGroup (M2GCCDeclare_Group *g)
2086 : : {
2087 : 1432931 : (*g)->Next = FreeGroup;
2088 : 1432931 : FreeGroup = (*g);
2089 : 1432931 : (*g) = NULL;
2090 : 1432931 : }
2091 : :
2092 : :
2093 : : /*
2094 : : InitGroup - initialize all sets in group and return the group.
2095 : : */
2096 : :
2097 : 14232 : static M2GCCDeclare_Group InitGroup (void)
2098 : : {
2099 : 14232 : M2GCCDeclare_Group g;
2100 : :
2101 : 14232 : NewGroup (&g);
2102 : : /* Initialize all sets in group. */
2103 : 14232 : g->FinishedSetArray = Sets_InitSet (1);
2104 : 14232 : g->ToDoList = Sets_InitSet (1);
2105 : 14232 : g->FullyDeclared = Sets_InitSet (1);
2106 : 14232 : g->PartiallyDeclared = Sets_InitSet (1);
2107 : 14232 : g->NilTypedArrays = Sets_InitSet (1);
2108 : 14232 : g->HeldByAlignment = Sets_InitSet (1);
2109 : 14232 : g->FinishedAlignment = Sets_InitSet (1);
2110 : 14232 : g->ToBeSolvedByQuads = Sets_InitSet (1);
2111 : 14232 : g->Next = NULL;
2112 : 14232 : return g;
2113 : : /* static analysis guarentees a RETURN statement will be used before here. */
2114 : : __builtin_unreachable ();
2115 : : }
2116 : :
2117 : :
2118 : : /*
2119 : : KillGroup - delete all sets in group and deallocate g.
2120 : : */
2121 : :
2122 : 1432931 : static void KillGroup (M2GCCDeclare_Group *g)
2123 : : {
2124 : : /* Delete all sets in group. */
2125 : 1432931 : if ((*g) != NULL)
2126 : : {
2127 : 1432931 : (*g)->FinishedSetArray = Sets_KillSet ((*g)->FinishedSetArray);
2128 : 1432931 : (*g)->ToDoList = Sets_KillSet ((*g)->ToDoList);
2129 : 1432931 : (*g)->FullyDeclared = Sets_KillSet ((*g)->FullyDeclared);
2130 : 1432931 : (*g)->PartiallyDeclared = Sets_KillSet ((*g)->PartiallyDeclared);
2131 : 1432931 : (*g)->NilTypedArrays = Sets_KillSet ((*g)->NilTypedArrays);
2132 : 1432931 : (*g)->HeldByAlignment = Sets_KillSet ((*g)->HeldByAlignment);
2133 : 1432931 : (*g)->FinishedAlignment = Sets_KillSet ((*g)->FinishedAlignment);
2134 : 1432931 : (*g)->ToBeSolvedByQuads = Sets_KillSet ((*g)->ToBeSolvedByQuads);
2135 : 1432931 : (*g)->Next = NULL;
2136 : 1432931 : DisposeGroup (g);
2137 : : }
2138 : 1432931 : }
2139 : :
2140 : :
2141 : : /*
2142 : : DupGroup - If g is not NIL then destroy g.
2143 : : Return a duplicate of GlobalGroup.
2144 : : */
2145 : :
2146 : 1433015 : static M2GCCDeclare_Group DupGroup (M2GCCDeclare_Group g)
2147 : : {
2148 : 1433015 : if (g != NULL)
2149 : : {
2150 : : /* Kill old group. */
2151 : 144472 : KillGroup (&g);
2152 : : }
2153 : 1433015 : NewGroup (&g);
2154 : : /* Copy all sets. */
2155 : 1433015 : g->FinishedSetArray = Sets_DuplicateSet (GlobalGroup->FinishedSetArray);
2156 : 1433015 : g->ToDoList = Sets_DuplicateSet (GlobalGroup->ToDoList);
2157 : 1433015 : g->FullyDeclared = Sets_DuplicateSet (GlobalGroup->FullyDeclared);
2158 : 1433015 : g->PartiallyDeclared = Sets_DuplicateSet (GlobalGroup->PartiallyDeclared);
2159 : 1433015 : g->NilTypedArrays = Sets_DuplicateSet (GlobalGroup->NilTypedArrays);
2160 : 1433015 : g->HeldByAlignment = Sets_DuplicateSet (GlobalGroup->HeldByAlignment);
2161 : 1433015 : g->FinishedAlignment = Sets_DuplicateSet (GlobalGroup->FinishedAlignment);
2162 : 1433015 : g->ToBeSolvedByQuads = Sets_DuplicateSet (GlobalGroup->ToBeSolvedByQuads);
2163 : 1433015 : g->Next = NULL;
2164 : 1433015 : return g;
2165 : : /* static analysis guarentees a RETURN statement will be used before here. */
2166 : : __builtin_unreachable ();
2167 : : }
2168 : :
2169 : :
2170 : : /*
2171 : : EqualGroup - return TRUE if group left = right.
2172 : : */
2173 : :
2174 : 706854 : static bool EqualGroup (M2GCCDeclare_Group left, M2GCCDeclare_Group right)
2175 : : {
2176 : 706854 : return (left == right) || ((((((((Sets_EqualSet (left->FullyDeclared, right->FullyDeclared)) && (Sets_EqualSet (left->PartiallyDeclared, right->PartiallyDeclared))) && (Sets_EqualSet (left->NilTypedArrays, right->NilTypedArrays))) && (Sets_EqualSet (left->HeldByAlignment, right->HeldByAlignment))) && (Sets_EqualSet (left->FinishedAlignment, right->FinishedAlignment))) && (Sets_EqualSet (left->ToDoList, right->ToDoList))) && (Sets_EqualSet (left->ToBeSolvedByQuads, right->ToBeSolvedByQuads))) && (Sets_EqualSet (left->FinishedSetArray, right->FinishedSetArray)));
2177 : : /* static analysis guarentees a RETURN statement will be used before here. */
2178 : : __builtin_unreachable ();
2179 : : }
2180 : :
2181 : :
2182 : : /*
2183 : : LookupSet -
2184 : : */
2185 : :
2186 : 8959086 : static Sets_Set LookupSet (M2GCCDeclare_ListType listtype)
2187 : : {
2188 : 8959086 : switch (listtype)
2189 : : {
2190 : 0 : case M2GCCDeclare_fullydeclared:
2191 : 0 : return GlobalGroup->FullyDeclared;
2192 : 1251716 : break;
2193 : :
2194 : 1251716 : case M2GCCDeclare_partiallydeclared:
2195 : 1251716 : return GlobalGroup->PartiallyDeclared;
2196 : 1421572 : break;
2197 : :
2198 : 1421572 : case M2GCCDeclare_niltypedarrays:
2199 : 1421572 : return GlobalGroup->NilTypedArrays;
2200 : 793463 : break;
2201 : :
2202 : 793463 : case M2GCCDeclare_heldbyalignment:
2203 : 793463 : return GlobalGroup->HeldByAlignment;
2204 : 785900 : break;
2205 : :
2206 : 785900 : case M2GCCDeclare_finishedalignment:
2207 : 785900 : return GlobalGroup->FinishedAlignment;
2208 : 4706435 : break;
2209 : :
2210 : 4706435 : case M2GCCDeclare_todolist:
2211 : 4706435 : return GlobalGroup->ToDoList;
2212 : 0 : break;
2213 : :
2214 : 0 : case M2GCCDeclare_tobesolvedbyquads:
2215 : 0 : return GlobalGroup->ToBeSolvedByQuads;
2216 : 0 : break;
2217 : :
2218 : 0 : case M2GCCDeclare_finishedsetarray:
2219 : 0 : return GlobalGroup->FinishedSetArray;
2220 : 0 : break;
2221 : :
2222 : :
2223 : 0 : default:
2224 : 0 : M2Error_InternalError ((const char *) "unknown ListType", 16);
2225 : : break;
2226 : : }
2227 : : return static_cast<Sets_Set> (NULL);
2228 : : /* static analysis guarentees a RETURN statement will be used before here. */
2229 : : __builtin_unreachable ();
2230 : : }
2231 : :
2232 : :
2233 : : /*
2234 : : GetEnumList -
2235 : : */
2236 : :
2237 : 434714 : static tree GetEnumList (unsigned int sym)
2238 : : {
2239 : 434714 : if (Indexing_InBounds (EnumerationIndex, sym))
2240 : : {
2241 : 415636 : return (tree) (Indexing_GetIndice (EnumerationIndex, sym));
2242 : : }
2243 : : else
2244 : : {
2245 : : return NULL;
2246 : : }
2247 : : /* static analysis guarentees a RETURN statement will be used before here. */
2248 : : __builtin_unreachable ();
2249 : : }
2250 : :
2251 : :
2252 : : /*
2253 : : PutEnumList -
2254 : : */
2255 : :
2256 : 412058 : static void PutEnumList (unsigned int sym, tree enumlist)
2257 : : {
2258 : 0 : Indexing_PutIndice (EnumerationIndex, sym, enumlist);
2259 : 0 : }
2260 : :
2261 : :
2262 : : /*
2263 : : Chained - checks to see that, sym, has not already been placed on a chain.
2264 : : It returns the symbol, sym.
2265 : : */
2266 : :
2267 : 313832 : static unsigned int Chained (unsigned int sym)
2268 : : {
2269 : 313832 : if (Sets_IsElementInSet (ChainedList, sym))
2270 : : {
2271 : 0 : M2Error_InternalError ((const char *) "symbol has already been chained onto a previous list", 52);
2272 : : }
2273 : 313832 : Sets_IncludeElementIntoSet (ChainedList, sym);
2274 : 313832 : return sym;
2275 : : /* static analysis guarentees a RETURN statement will be used before here. */
2276 : : __builtin_unreachable ();
2277 : : }
2278 : :
2279 : :
2280 : : /*
2281 : : DoStartDeclaration - returns a tree representing a symbol which has
2282 : : not yet been finished. Used when declaring
2283 : : recursive types.
2284 : : */
2285 : :
2286 : 261968 : static tree DoStartDeclaration (unsigned int sym, M2GCCDeclare_StartProcedure p)
2287 : : {
2288 : 261968 : location_t location;
2289 : :
2290 : 261968 : if (! (SymbolConversion_GccKnowsAbout (sym)))
2291 : : {
2292 : 130984 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (sym));
2293 : 130984 : PreAddModGcc (sym, (tree) ((*p.proc) (location, NameKey_KeyToCharStar (M2AsmUtil_GetFullSymName (sym)))));
2294 : : }
2295 : 261968 : return SymbolConversion_Mod2Gcc (sym);
2296 : : /* static analysis guarentees a RETURN statement will be used before here. */
2297 : : __builtin_unreachable ();
2298 : : }
2299 : :
2300 : :
2301 : : /*
2302 : : ArrayComponentsDeclared - returns TRUE if array, sym,
2303 : : subscripts and type are known.
2304 : : */
2305 : :
2306 : 56454 : static bool ArrayComponentsDeclared (unsigned int sym)
2307 : : {
2308 : 56454 : unsigned int Subscript;
2309 : 56454 : unsigned int Type;
2310 : 56454 : unsigned int High;
2311 : 56454 : unsigned int Low;
2312 : :
2313 : 56454 : Subscript = SymbolTable_GetArraySubscript (sym);
2314 : 56454 : M2Debug_Assert (SymbolTable_IsSubscript (Subscript));
2315 : 56454 : Type = SymbolTable_GetDType (Subscript);
2316 : 56454 : Low = M2GCCDeclare_GetTypeMin (Type);
2317 : 56454 : High = M2GCCDeclare_GetTypeMax (Type);
2318 : 70576 : return ((IsFullyDeclared (Type)) && (IsFullyDeclared (Low))) && (IsFullyDeclared (High));
2319 : : /* static analysis guarentees a RETURN statement will be used before here. */
2320 : : __builtin_unreachable ();
2321 : : }
2322 : :
2323 : :
2324 : : /*
2325 : : GetRecordOfVarient -
2326 : : */
2327 : :
2328 : 144394 : static unsigned int GetRecordOfVarient (unsigned int sym)
2329 : : {
2330 : 144394 : if ((SymbolTable_IsVarient (sym)) || (SymbolTable_IsFieldVarient (sym)))
2331 : : {
2332 : 67572 : do {
2333 : 67572 : sym = SymbolTable_GetParent (sym);
2334 : 67572 : } while (! (SymbolTable_IsRecord (sym)));
2335 : : }
2336 : 144394 : return sym;
2337 : : /* static analysis guarentees a RETURN statement will be used before here. */
2338 : : __builtin_unreachable ();
2339 : : }
2340 : :
2341 : :
2342 : : /*
2343 : : CanDeclareRecordKind -
2344 : : */
2345 : :
2346 : 79144 : static bool CanDeclareRecordKind (unsigned int sym)
2347 : : {
2348 : 79144 : sym = GetRecordOfVarient (sym);
2349 : 79180 : return (SymbolTable_IsRecord (sym)) && (((SymbolTable_GetDefaultRecordFieldAlignment (sym)) == SymbolTable_NulSym) || (IsFullyDeclared (SymbolTable_GetDefaultRecordFieldAlignment (sym))));
2350 : : /* static analysis guarentees a RETURN statement will be used before here. */
2351 : : __builtin_unreachable ();
2352 : : }
2353 : :
2354 : :
2355 : : /*
2356 : : DeclareRecordKind - works out whether record, sym, is packed or not.
2357 : : */
2358 : :
2359 : 79144 : static void DeclareRecordKind (unsigned int sym)
2360 : : {
2361 : 79144 : if (SymbolTable_IsRecord (sym))
2362 : : {
2363 : 78202 : DetermineIfRecordPacked (sym);
2364 : : }
2365 : 79144 : WatchIncludeList (sym, M2GCCDeclare_todolist);
2366 : 79144 : WatchRemoveList (sym, M2GCCDeclare_heldbyalignment);
2367 : 79144 : WatchIncludeList (sym, M2GCCDeclare_finishedalignment);
2368 : 158288 : if (AllDependantsFullyDeclared (sym))
2369 : : {} /* empty. */
2370 : : /* All good and ready to be solved. */
2371 : 79144 : }
2372 : :
2373 : :
2374 : : /*
2375 : : CanDeclareRecord -
2376 : : */
2377 : :
2378 : 323196 : static bool CanDeclareRecord (unsigned int sym)
2379 : : {
2380 : 323196 : TraverseDependants (sym);
2381 : 323196 : if (AllDependantsFullyDeclared (sym))
2382 : : {
2383 : : return true;
2384 : : }
2385 : : else
2386 : : {
2387 : 244868 : WatchIncludeList (sym, M2GCCDeclare_finishedalignment);
2388 : 244868 : return false;
2389 : : }
2390 : : /* static analysis guarentees a RETURN statement will be used before here. */
2391 : : __builtin_unreachable ();
2392 : : }
2393 : :
2394 : :
2395 : : /*
2396 : : FinishDeclareRecord -
2397 : : */
2398 : :
2399 : 78328 : static void FinishDeclareRecord (unsigned int sym)
2400 : : {
2401 : 78328 : DeclareTypeConstFully (sym);
2402 : 78328 : WatchRemoveList (sym, M2GCCDeclare_heldbyalignment);
2403 : 78328 : WatchRemoveList (sym, M2GCCDeclare_finishedalignment);
2404 : 78328 : WatchRemoveList (sym, M2GCCDeclare_todolist);
2405 : 78328 : WatchIncludeList (sym, M2GCCDeclare_fullydeclared);
2406 : 78328 : }
2407 : :
2408 : :
2409 : : /*
2410 : : CanDeclareTypePartially - return TRUE if we are able to make a
2411 : : gcc partially created type.
2412 : : */
2413 : :
2414 : 12752509 : static bool CanDeclareTypePartially (unsigned int sym)
2415 : : {
2416 : 12752509 : unsigned int type;
2417 : :
2418 : 12752509 : if (Sets_IsElementInSet (GlobalGroup->PartiallyDeclared, sym))
2419 : : {
2420 : : return false;
2421 : : }
2422 : 12267859 : else if ((((SymbolTable_IsProcType (sym)) || (SymbolTable_IsRecord (sym))) || (SymbolTable_IsVarient (sym))) || (SymbolTable_IsFieldVarient (sym)))
2423 : : {
2424 : : /* avoid dangling else. */
2425 : 130984 : return true;
2426 : : }
2427 : 12136875 : else if (SymbolTable_IsType (sym))
2428 : : {
2429 : : /* avoid dangling else. */
2430 : 59476 : type = SymbolTable_GetSType (sym);
2431 : 118952 : if ((type != SymbolTable_NulSym) && (IsNilTypedArrays (type)))
2432 : : {
2433 : : return true;
2434 : : }
2435 : : }
2436 : : return false;
2437 : : /* static analysis guarentees a RETURN statement will be used before here. */
2438 : : __builtin_unreachable ();
2439 : : }
2440 : :
2441 : :
2442 : : /*
2443 : : DeclareTypePartially - create the gcc partial type symbol from, sym.
2444 : : */
2445 : :
2446 : 130990 : static void DeclareTypePartially (unsigned int sym)
2447 : : {
2448 : 130990 : location_t location;
2449 : :
2450 : : /* check to see if we have already partially declared the symbol */
2451 : 130990 : if (! (Sets_IsElementInSet (GlobalGroup->PartiallyDeclared, sym)))
2452 : : {
2453 : 130990 : if (SymbolTable_IsRecord (sym))
2454 : : {
2455 : 78202 : M2Debug_Assert (! (Sets_IsElementInSet (GlobalGroup->HeldByAlignment, sym)));
2456 : 78202 : M2Debug_Assert ((DoStartDeclaration (sym, (M2GCCDeclare_StartProcedure) {(M2GCCDeclare_StartProcedure_t) m2type_BuildStartRecord})) != NULL);
2457 : 78202 : WatchIncludeList (sym, M2GCCDeclare_heldbyalignment);
2458 : : }
2459 : 52788 : else if (SymbolTable_IsVarient (sym))
2460 : : {
2461 : : /* avoid dangling else. */
2462 : 276 : M2Debug_Assert (! (Sets_IsElementInSet (GlobalGroup->HeldByAlignment, sym)));
2463 : 276 : M2Debug_Assert ((DoStartDeclaration (sym, (M2GCCDeclare_StartProcedure) {(M2GCCDeclare_StartProcedure_t) m2type_BuildStartVarient})) != NULL);
2464 : 276 : WatchIncludeList (sym, M2GCCDeclare_heldbyalignment);
2465 : : }
2466 : 52512 : else if (SymbolTable_IsFieldVarient (sym))
2467 : : {
2468 : : /* avoid dangling else. */
2469 : 666 : M2Debug_Assert (! (Sets_IsElementInSet (GlobalGroup->HeldByAlignment, sym)));
2470 : 666 : M2Debug_Assert ((DoStartDeclaration (sym, (M2GCCDeclare_StartProcedure) {(M2GCCDeclare_StartProcedure_t) m2type_BuildStartFieldVarient})) != NULL);
2471 : 666 : WatchIncludeList (sym, M2GCCDeclare_heldbyalignment);
2472 : : }
2473 : 51846 : else if (SymbolTable_IsProcType (sym))
2474 : : {
2475 : : /* avoid dangling else. */
2476 : 51840 : M2Debug_Assert ((DoStartDeclaration (sym, (M2GCCDeclare_StartProcedure) {(M2GCCDeclare_StartProcedure_t) m2type_BuildStartFunctionType})) != NULL);
2477 : : }
2478 : 6 : else if (SymbolTable_IsType (sym))
2479 : : {
2480 : : /* avoid dangling else. */
2481 : 6 : if (! (SymbolConversion_GccKnowsAbout (sym)))
2482 : : {
2483 : 6 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (sym));
2484 : 6 : PreAddModGcc (sym, m2type_BuildStartType (location, reinterpret_cast <char * > (NameKey_KeyToCharStar (M2AsmUtil_GetFullSymName (sym))), SymbolConversion_Mod2Gcc (SymbolTable_GetSType (sym))));
2485 : : }
2486 : : }
2487 : : else
2488 : : {
2489 : : /* avoid dangling else. */
2490 : 0 : M2Error_InternalError ((const char *) "do not know how to create a partial type from this symbol", 57);
2491 : : }
2492 : 130990 : WatchIncludeList (sym, M2GCCDeclare_partiallydeclared);
2493 : 130990 : TraverseDependants (sym);
2494 : : }
2495 : 130990 : }
2496 : :
2497 : :
2498 : : /*
2499 : : CanDeclareArrayAsNil -
2500 : : */
2501 : :
2502 : 12902325 : static bool CanDeclareArrayAsNil (unsigned int sym)
2503 : : {
2504 : 12902325 : return (SymbolTable_IsArray (sym)) && (ArrayComponentsDeclared (sym));
2505 : : /* static analysis guarentees a RETURN statement will be used before here. */
2506 : : __builtin_unreachable ();
2507 : : }
2508 : :
2509 : :
2510 : : /*
2511 : : DeclareArrayAsNil -
2512 : : */
2513 : :
2514 : 7046 : static void DeclareArrayAsNil (unsigned int sym)
2515 : : {
2516 : 7046 : PreAddModGcc (sym, m2type_BuildStartArrayType (BuildIndex (SymbolTable_GetDeclaredMod (sym), sym), NULL, static_cast<int> (SymbolTable_GetDType (sym))));
2517 : 7046 : WatchIncludeList (sym, M2GCCDeclare_niltypedarrays);
2518 : 7046 : }
2519 : :
2520 : :
2521 : : /*
2522 : : CanDeclareArrayPartially -
2523 : : */
2524 : :
2525 : 25726 : static bool CanDeclareArrayPartially (unsigned int sym)
2526 : : {
2527 : 25726 : unsigned int type;
2528 : :
2529 : 25726 : if (SymbolTable_IsArray (sym))
2530 : : {
2531 : 25414 : type = SymbolTable_GetSType (sym);
2532 : 43758 : if ((IsPartiallyOrFullyDeclared (type)) || ((SymbolTable_IsPointer (type)) && (IsNilTypedArrays (type))))
2533 : : {
2534 : 7004 : return true;
2535 : : }
2536 : : }
2537 : : return false;
2538 : : /* static analysis guarentees a RETURN statement will be used before here. */
2539 : : __builtin_unreachable ();
2540 : : }
2541 : :
2542 : :
2543 : : /*
2544 : : DeclareArrayPartially -
2545 : : */
2546 : :
2547 : 7004 : static void DeclareArrayPartially (unsigned int sym)
2548 : : {
2549 : 7004 : M2Debug_Assert ((SymbolTable_IsArray (sym)) && (SymbolConversion_GccKnowsAbout (sym)));
2550 : 7004 : m2type_PutArrayType (SymbolConversion_Mod2Gcc (sym), SymbolConversion_Mod2Gcc (SymbolTable_GetSType (sym)));
2551 : 7004 : WatchIncludeList (sym, M2GCCDeclare_partiallydeclared);
2552 : 7004 : }
2553 : :
2554 : :
2555 : : /*
2556 : : CanDeclarePointerToNilArray -
2557 : : */
2558 : :
2559 : 12596205 : static bool CanDeclarePointerToNilArray (unsigned int sym)
2560 : : {
2561 : 12942985 : return (SymbolTable_IsPointer (sym)) && (IsNilTypedArrays (SymbolTable_GetSType (sym)));
2562 : : /* static analysis guarentees a RETURN statement will be used before here. */
2563 : : __builtin_unreachable ();
2564 : : }
2565 : :
2566 : :
2567 : : /*
2568 : : DeclarePointerToNilArray -
2569 : : */
2570 : :
2571 : 96 : static void DeclarePointerToNilArray (unsigned int sym)
2572 : : {
2573 : 96 : PreAddModGcc (sym, m2type_BuildPointerType (SymbolConversion_Mod2Gcc (SymbolTable_GetSType (sym))));
2574 : 96 : WatchIncludeList (sym, M2GCCDeclare_niltypedarrays);
2575 : 96 : }
2576 : :
2577 : :
2578 : : /*
2579 : : CanPromotePointerFully -
2580 : : */
2581 : :
2582 : 13216 : static bool CanPromotePointerFully (unsigned int sym)
2583 : : {
2584 : 13216 : return (SymbolTable_IsPointer (sym)) && (IsPartiallyOrFullyDeclared (SymbolTable_GetSType (sym)));
2585 : : /* static analysis guarentees a RETURN statement will be used before here. */
2586 : : __builtin_unreachable ();
2587 : : }
2588 : :
2589 : :
2590 : : /*
2591 : : PromotePointerFully -
2592 : : */
2593 : :
2594 : 90 : static void PromotePointerFully (unsigned int sym)
2595 : : {
2596 : 90 : WatchIncludeList (sym, M2GCCDeclare_fullydeclared);
2597 : 90 : }
2598 : :
2599 : :
2600 : : /*
2601 : : IsTypeQ - returns TRUE if all q(dependants) of, sym,
2602 : : return TRUE.
2603 : : */
2604 : :
2605 : 4670416 : static bool IsTypeQ (unsigned int sym, M2GCCDeclare_IsAction q)
2606 : : {
2607 : 4670416 : if (SymbolTable_IsVar (sym))
2608 : : {
2609 : 541055 : return IsVarDependants (sym, q);
2610 : : }
2611 : 4129361 : else if (SymbolTable_IsEnumeration (sym))
2612 : : {
2613 : : /* avoid dangling else. */
2614 : 115774 : return IsEnumerationDependants (sym, q);
2615 : : }
2616 : 4013587 : else if (SymbolTable_IsFieldEnumeration (sym))
2617 : : {
2618 : : /* avoid dangling else. */
2619 : : return true;
2620 : : }
2621 : 3601649 : else if (SymbolTable_IsSubrange (sym))
2622 : : {
2623 : : /* avoid dangling else. */
2624 : 53124 : return IsSubrangeDependants (sym, q);
2625 : : }
2626 : 3548525 : else if (SymbolTable_IsPointer (sym))
2627 : : {
2628 : : /* avoid dangling else. */
2629 : 950398 : return IsPointerDependants (sym, q);
2630 : : }
2631 : 2598127 : else if (SymbolTable_IsRecord (sym))
2632 : : {
2633 : : /* avoid dangling else. */
2634 : 504744 : return IsRecordDependants (sym, q);
2635 : : }
2636 : 2093383 : else if (SymbolTable_IsRecordField (sym))
2637 : : {
2638 : : /* avoid dangling else. */
2639 : 777012 : return IsRecordFieldDependants (sym, q);
2640 : : }
2641 : 1316371 : else if (SymbolTable_IsVarient (sym))
2642 : : {
2643 : : /* avoid dangling else. */
2644 : 2190 : return IsVarientDependants (sym, q);
2645 : : }
2646 : 1314181 : else if (SymbolTable_IsFieldVarient (sym))
2647 : : {
2648 : : /* avoid dangling else. */
2649 : 3654 : return IsVarientFieldDependants (sym, q);
2650 : : }
2651 : 1310527 : else if (SymbolTable_IsArray (sym))
2652 : : {
2653 : : /* avoid dangling else. */
2654 : 120242 : return IsArrayDependants (sym, q);
2655 : : }
2656 : 1190285 : else if (SymbolTable_IsProcType (sym))
2657 : : {
2658 : : /* avoid dangling else. */
2659 : 208204 : return IsProcTypeDependants (sym, q);
2660 : : }
2661 : 982081 : else if (SymbolTable_IsUnbounded (sym))
2662 : : {
2663 : : /* avoid dangling else. */
2664 : 212218 : return IsUnboundedDependants (sym, q);
2665 : : }
2666 : 769863 : else if (SymbolTable_IsPartialUnbounded (sym))
2667 : : {
2668 : : /* avoid dangling else. */
2669 : 0 : M2Error_InternalError ((const char *) "should not be declaring a partial unbounded symbol", 50);
2670 : : }
2671 : 769863 : else if (SymbolTable_IsSet (sym))
2672 : : {
2673 : : /* avoid dangling else. */
2674 : 25242 : return IsSetDependants (sym, q);
2675 : : }
2676 : 744621 : else if (SymbolTable_IsType (sym))
2677 : : {
2678 : : /* avoid dangling else. */
2679 : 619713 : return IsTypeDependants (sym, q);
2680 : : }
2681 : 124908 : else if (SymbolTable_IsConst (sym))
2682 : : {
2683 : : /* avoid dangling else. */
2684 : 124338 : return IsConstDependants (sym, q);
2685 : : }
2686 : 570 : else if ((SymbolTable_IsConstructor (sym)) || (SymbolTable_IsConstSet (sym)))
2687 : : {
2688 : : /* avoid dangling else. */
2689 : : /* sym can be a constructor, but at present we have not resolved whether
2690 : : all dependants are constants.
2691 : : */
2692 : 0 : return M2ALU_IsConstructorDependants (sym, q);
2693 : : }
2694 : 570 : else if (SymbolTable_IsProcedure (sym))
2695 : : {
2696 : : /* avoid dangling else. */
2697 : 426 : return IsProcedureDependants (sym, q);
2698 : : }
2699 : : else
2700 : : {
2701 : : /* avoid dangling else. */
2702 : : return true;
2703 : : }
2704 : : ReturnException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/M2GCCDeclare.def", 20, 1);
2705 : : __builtin_unreachable ();
2706 : : }
2707 : :
2708 : :
2709 : : /*
2710 : : IsNilTypedArrays - returns TRUE if, sym, is dependant upon a NIL typed array
2711 : : */
2712 : :
2713 : 424600 : static bool IsNilTypedArrays (unsigned int sym)
2714 : : {
2715 : 424600 : return Sets_IsElementInSet (GlobalGroup->NilTypedArrays, sym);
2716 : : /* static analysis guarentees a RETURN statement will be used before here. */
2717 : : __builtin_unreachable ();
2718 : : }
2719 : :
2720 : :
2721 : : /*
2722 : : IsFullyDeclared - returns TRUE if, sym, is fully declared.
2723 : : */
2724 : :
2725 : 7697611 : static bool IsFullyDeclared (unsigned int sym)
2726 : : {
2727 : 7662779 : return Sets_IsElementInSet (GlobalGroup->FullyDeclared, sym);
2728 : : /* static analysis guarentees a RETURN statement will be used before here. */
2729 : : __builtin_unreachable ();
2730 : : }
2731 : :
2732 : :
2733 : : /*
2734 : : AllDependantsFullyDeclared - returns TRUE if all dependants of,
2735 : : sym, are declared.
2736 : : */
2737 : :
2738 : 4647912 : static bool AllDependantsFullyDeclared (unsigned int sym)
2739 : : {
2740 : 2472671 : return IsTypeQ (sym, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) IsFullyDeclared});
2741 : : /* static analysis guarentees a RETURN statement will be used before here. */
2742 : : __builtin_unreachable ();
2743 : : }
2744 : :
2745 : :
2746 : : /*
2747 : : NotAllDependantsFullyDeclared - returns TRUE if any dependants of,
2748 : : sym, are not declared.
2749 : : */
2750 : :
2751 : 0 : static bool NotAllDependantsFullyDeclared (unsigned int sym)
2752 : : {
2753 : 0 : return ! (IsTypeQ (sym, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) IsFullyDeclared}));
2754 : : /* static analysis guarentees a RETURN statement will be used before here. */
2755 : : __builtin_unreachable ();
2756 : : }
2757 : :
2758 : :
2759 : : /*
2760 : : IsPartiallyDeclared - returns TRUE if, sym, is partially declared.
2761 : : */
2762 : :
2763 : 0 : static bool IsPartiallyDeclared (unsigned int sym)
2764 : : {
2765 : 0 : return Sets_IsElementInSet (GlobalGroup->PartiallyDeclared, sym);
2766 : : /* static analysis guarentees a RETURN statement will be used before here. */
2767 : : __builtin_unreachable ();
2768 : : }
2769 : :
2770 : :
2771 : : /*
2772 : : AllDependantsPartiallyDeclared - returns TRUE if all dependants of,
2773 : : sym, are partially declared.
2774 : : */
2775 : :
2776 : 0 : static bool AllDependantsPartiallyDeclared (unsigned int sym)
2777 : : {
2778 : 0 : return IsTypeQ (sym, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) IsPartiallyDeclared});
2779 : : /* static analysis guarentees a RETURN statement will be used before here. */
2780 : : __builtin_unreachable ();
2781 : : }
2782 : :
2783 : :
2784 : : /*
2785 : : NotAllDependantsPartiallyDeclared - returns TRUE if any dependants of,
2786 : : sym, are not partially declared.
2787 : : */
2788 : :
2789 : 0 : static bool NotAllDependantsPartiallyDeclared (unsigned int sym)
2790 : : {
2791 : 0 : return ! (IsTypeQ (sym, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) IsPartiallyDeclared}));
2792 : : /* static analysis guarentees a RETURN statement will be used before here. */
2793 : : __builtin_unreachable ();
2794 : : }
2795 : :
2796 : :
2797 : : /*
2798 : : IsPartiallyOrFullyDeclared - returns TRUE if, sym, is partially or fully declared.
2799 : : */
2800 : :
2801 : 58552 : static bool IsPartiallyOrFullyDeclared (unsigned int sym)
2802 : : {
2803 : 58552 : return (Sets_IsElementInSet (GlobalGroup->PartiallyDeclared, sym)) || (Sets_IsElementInSet (GlobalGroup->FullyDeclared, sym));
2804 : : /* static analysis guarentees a RETURN statement will be used before here. */
2805 : : __builtin_unreachable ();
2806 : : }
2807 : :
2808 : :
2809 : : /*
2810 : : AllDependantsPartiallyOrFullyDeclared - returns TRUE if all dependants of,
2811 : : sym, are partially or fully declared.
2812 : : */
2813 : :
2814 : 22504 : static bool AllDependantsPartiallyOrFullyDeclared (unsigned int sym)
2815 : : {
2816 : 22504 : return IsTypeQ (sym, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) IsPartiallyOrFullyDeclared});
2817 : : /* static analysis guarentees a RETURN statement will be used before here. */
2818 : : __builtin_unreachable ();
2819 : : }
2820 : :
2821 : :
2822 : : /*
2823 : : TypeConstDependantsFullyDeclared - returns TRUE if sym is a constant or
2824 : : type and its dependants are fully
2825 : : declared.
2826 : : */
2827 : :
2828 : 13838060 : static bool TypeConstDependantsFullyDeclared (unsigned int sym)
2829 : : {
2830 : 15908391 : return (((! (SymbolTable_IsVar (sym))) && (! (SymbolTable_IsRecord (sym)))) && (! (SymbolTable_IsParameter (sym)))) && (AllDependantsFullyDeclared (sym));
2831 : : /* static analysis guarentees a RETURN statement will be used before here. */
2832 : : __builtin_unreachable ();
2833 : : }
2834 : :
2835 : :
2836 : : /*
2837 : : CanBeDeclaredViaPartialDependants - returns TRUE if this symbol
2838 : : can be declared by partial
2839 : : dependants. Such a symbol must
2840 : : be a record, proctype or
2841 : : an array.
2842 : : */
2843 : :
2844 : 8080721 : static bool CanBeDeclaredViaPartialDependants (unsigned int sym)
2845 : : {
2846 : 8103225 : return ((SymbolTable_IsPointer (sym)) || (SymbolTable_IsProcType (sym))) && (AllDependantsPartiallyOrFullyDeclared (sym));
2847 : : /* static analysis guarentees a RETURN statement will be used before here. */
2848 : : __builtin_unreachable ();
2849 : : }
2850 : :
2851 : :
2852 : : /*
2853 : : DeclareConstFully - will add, sym, to the fully declared list and
2854 : : also remove it from the to do list. This is
2855 : : called indirectly from M2GenGCC as it calculates
2856 : : constants during quadruple processing.
2857 : : */
2858 : :
2859 : 363017 : static void DeclareConstFully (unsigned int sym)
2860 : : {
2861 : 363017 : WatchIncludeList (sym, M2GCCDeclare_fullydeclared);
2862 : 363017 : WatchRemoveList (sym, M2GCCDeclare_todolist);
2863 : 363017 : WatchRemoveList (sym, M2GCCDeclare_partiallydeclared);
2864 : 363017 : WatchRemoveList (sym, M2GCCDeclare_tobesolvedbyquads);
2865 : 363017 : }
2866 : :
2867 : :
2868 : : /*
2869 : : DeclareTypeConstFully - declare the GCC type and add the double
2870 : : book keeping entry.
2871 : : */
2872 : :
2873 : 1144549 : static void DeclareTypeConstFully (unsigned int sym)
2874 : : {
2875 : 1144549 : tree t;
2876 : :
2877 : 1144549 : if (! (Sets_IsElementInSet (GlobalGroup->ToBeSolvedByQuads, sym)))
2878 : : {
2879 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
2880 : 1144549 : if ((SymbolTable_IsModule (sym)) || (SymbolTable_IsDefImp (sym)))
2881 : : {
2882 : 144 : WatchIncludeList (sym, M2GCCDeclare_fullydeclared);
2883 : 144 : WatchRemoveList (sym, M2GCCDeclare_partiallydeclared);
2884 : 144 : WatchRemoveList (sym, M2GCCDeclare_todolist);
2885 : : }
2886 : 1144405 : else if (SymbolTable_IsProcedure (sym))
2887 : : {
2888 : : /* avoid dangling else. */
2889 : 408 : DeclareProcedureToGcc (sym);
2890 : 408 : WatchIncludeList (sym, M2GCCDeclare_fullydeclared);
2891 : 408 : WatchRemoveList (sym, M2GCCDeclare_partiallydeclared);
2892 : 408 : WatchRemoveList (sym, M2GCCDeclare_todolist);
2893 : : }
2894 : : else
2895 : : {
2896 : : /* avoid dangling else. */
2897 : 1143997 : t = TypeConstFullyDeclared (sym);
2898 : 1143997 : if (t != NULL)
2899 : : {
2900 : : /* add relationship between gccsym and sym */
2901 : 2287994 : PreAddModGcc (sym, t);
2902 : 1143997 : WatchIncludeList (sym, M2GCCDeclare_fullydeclared);
2903 : 1143997 : WatchRemoveList (sym, M2GCCDeclare_partiallydeclared);
2904 : 1143997 : WatchRemoveList (sym, M2GCCDeclare_heldbyalignment);
2905 : 1143997 : WatchRemoveList (sym, M2GCCDeclare_finishedalignment);
2906 : 1143997 : WatchRemoveList (sym, M2GCCDeclare_todolist);
2907 : : }
2908 : : }
2909 : : }
2910 : 1144549 : }
2911 : :
2912 : :
2913 : : /*
2914 : : DeclareTypeFromPartial - declare the full GCC type from a partial type
2915 : : and add the double book keeping entry.
2916 : : */
2917 : :
2918 : 22504 : static void DeclareTypeFromPartial (unsigned int sym)
2919 : : {
2920 : 22504 : tree t;
2921 : :
2922 : 22504 : t = CompleteDeclarationOf (sym);
2923 : 22504 : if (t == NULL)
2924 : : {
2925 : 0 : M2Error_InternalError ((const char *) "expecting to be able to create a gcc type", 41);
2926 : : }
2927 : : else
2928 : : {
2929 : 22504 : SymbolConversion_AddModGcc (sym, t);
2930 : 22504 : WatchIncludeList (sym, M2GCCDeclare_fullydeclared);
2931 : 22504 : WatchRemoveList (sym, M2GCCDeclare_partiallydeclared);
2932 : : }
2933 : 22504 : }
2934 : :
2935 : :
2936 : : /*
2937 : : CanBeDeclaredPartiallyViaPartialDependants - returns TRUE if, sym,
2938 : : can be partially declared via
2939 : : another partially declared type.
2940 : : */
2941 : :
2942 : 6178 : static bool CanBeDeclaredPartiallyViaPartialDependants (unsigned int sym)
2943 : : {
2944 : 6178 : return (SymbolTable_IsType (sym)) && (AllDependantsPartiallyDeclared (sym));
2945 : : /* static analysis guarentees a RETURN statement will be used before here. */
2946 : : __builtin_unreachable ();
2947 : : }
2948 : :
2949 : :
2950 : : /*
2951 : : EmitCircularDependancyError - issue a dependancy error.
2952 : : */
2953 : :
2954 : 6 : static void EmitCircularDependancyError (unsigned int sym)
2955 : : {
2956 : 0 : M2MetaError_MetaError1 ((const char *) "circular dependancy error found when trying to resolve {%1Uad}", 62, sym);
2957 : 0 : }
2958 : :
2959 : :
2960 : : /*
2961 : : WriteRule - writes out the name of the rule.
2962 : : */
2963 : :
2964 : 0 : static void WriteRule (void)
2965 : : {
2966 : 0 : if (Debugging)
2967 : : {
2968 : : switch (bodyr)
2969 : : {
2970 : : case M2GCCDeclare_norule:
2971 : : M2Printf_printf0 ((const char *) "norule", 6);
2972 : : break;
2973 : :
2974 : : case M2GCCDeclare_partialtype:
2975 : : M2Printf_printf0 ((const char *) "partialtype", 11);
2976 : : break;
2977 : :
2978 : : case M2GCCDeclare_arraynil:
2979 : : M2Printf_printf0 ((const char *) "arraynil", 8);
2980 : : break;
2981 : :
2982 : : case M2GCCDeclare_pointernilarray:
2983 : : M2Printf_printf0 ((const char *) "pointernilarray", 15);
2984 : : break;
2985 : :
2986 : : case M2GCCDeclare_arraypartial:
2987 : : M2Printf_printf0 ((const char *) "arraypartial", 12);
2988 : : break;
2989 : :
2990 : : case M2GCCDeclare_pointerfully:
2991 : : M2Printf_printf0 ((const char *) "pointerfully", 12);
2992 : : break;
2993 : :
2994 : : case M2GCCDeclare_recordkind:
2995 : : M2Printf_printf0 ((const char *) "recordkind", 10);
2996 : : break;
2997 : :
2998 : : case M2GCCDeclare_recordfully:
2999 : : M2Printf_printf0 ((const char *) "recordfully", 11);
3000 : : break;
3001 : :
3002 : : case M2GCCDeclare_typeconstfully:
3003 : : M2Printf_printf0 ((const char *) "typeconstfully", 14);
3004 : : break;
3005 : :
3006 : : case M2GCCDeclare_pointerfrompartial:
3007 : : M2Printf_printf0 ((const char *) "pointerfrompartial", 18);
3008 : : break;
3009 : :
3010 : : case M2GCCDeclare_typefrompartial:
3011 : : M2Printf_printf0 ((const char *) "typefrompartial", 15);
3012 : : break;
3013 : :
3014 : : case M2GCCDeclare_partialfrompartial:
3015 : : M2Printf_printf0 ((const char *) "partialfrompartial", 18);
3016 : : break;
3017 : :
3018 : : case M2GCCDeclare_partialtofully:
3019 : : M2Printf_printf0 ((const char *) "partialtofully", 14);
3020 : : break;
3021 : :
3022 : : case M2GCCDeclare_circulartodo:
3023 : : M2Printf_printf0 ((const char *) "circulartodo", 12);
3024 : : break;
3025 : :
3026 : : case M2GCCDeclare_circularpartial:
3027 : : M2Printf_printf0 ((const char *) "circularpartial", 15);
3028 : : break;
3029 : :
3030 : : case M2GCCDeclare_circularniltyped:
3031 : : M2Printf_printf0 ((const char *) "circularniltyped", 16);
3032 : : break;
3033 : :
3034 : :
3035 : : default:
3036 : : M2Error_InternalError ((const char *) "unknown rule", 12);
3037 : : break;
3038 : : }
3039 : : }
3040 : 0 : }
3041 : :
3042 : :
3043 : : /*
3044 : : Body -
3045 : : */
3046 : :
3047 : 60617280 : static void Body (unsigned int sym)
3048 : : {
3049 : 60617280 : if ((*bodyq.proc) (sym))
3050 : : {
3051 : 1391423 : WatchRemoveList (sym, bodyt);
3052 : 1391423 : (*bodyp.proc) (sym);
3053 : : /* The bodyp (sym) procedure function might have replaced sym into the set. */
3054 : 1391423 : if (! (Sets_IsElementInSet (LookupSet (bodyt), sym)))
3055 : : {
3056 : 1260433 : noMoreWritten = false;
3057 : 1260433 : oneResolved = true;
3058 : : }
3059 : : }
3060 : 60617280 : }
3061 : :
3062 : :
3063 : : /*
3064 : : ForeachTryDeclare - while q (of one sym in set t) is true
3065 : : for each symbol in set t,
3066 : : if q (sym)
3067 : : then
3068 : : p (sym)
3069 : : end
3070 : : end
3071 : : end
3072 : : */
3073 : :
3074 : 7460571 : static bool ForeachTryDeclare (M2GCCDeclare_ListType t, M2GCCDeclare_Rule r, M2GCCDeclare_IsAction q, M2GCCDeclare_WalkAction p)
3075 : : {
3076 : 7460571 : if (recursionCaught)
3077 : : {
3078 : 0 : M2Error_InternalError ((const char *) "caught recursive cycle in ForeachTryDeclare", 43);
3079 : : }
3080 : 7460571 : bodyt = t;
3081 : 7460571 : bodyq = q;
3082 : 7460571 : bodyp = p;
3083 : 7460571 : bodyr = r;
3084 : 7460571 : recursionCaught = true;
3085 : 7460571 : oneResolved = false;
3086 : 7567663 : do {
3087 : 7567663 : noMoreWritten = true;
3088 : 7567663 : Sets_ForeachElementInSetDo (LookupSet (t), (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) Body});
3089 : 7567663 : } while (! (noMoreWritten));
3090 : 7460571 : bodyr = M2GCCDeclare_norule;
3091 : 7460571 : recursionCaught = false;
3092 : 7460571 : return oneResolved;
3093 : : /* static analysis guarentees a RETURN statement will be used before here. */
3094 : : __builtin_unreachable ();
3095 : : }
3096 : :
3097 : 618150 : static bool DeclaredOutstandingTypes (bool ForceComplete)
3098 : : {
3099 : 618150 : bool finished;
3100 : 618150 : M2GCCDeclare_Group copy;
3101 : :
3102 : : /*
3103 : : DeclaredOutandingTypes - writes out any types that have their
3104 : : dependants solved. It returns TRUE if
3105 : : all outstanding types have been written.
3106 : : */
3107 : 618150 : copy = NULL;
3108 : 618150 : finished = false;
3109 : 710824 : do {
3110 : 710824 : if (Progress && (copy != NULL))
3111 : : {
3112 : : if (! (EqualGroup (copy, GlobalGroup)))
3113 : : {
3114 : : DebugSetNumbers ();
3115 : : DebugSets ();
3116 : : }
3117 : : }
3118 : 710824 : copy = DupGroup (copy);
3119 : 710824 : if (ForeachTryDeclare (M2GCCDeclare_todolist, M2GCCDeclare_partialtype, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) CanDeclareTypePartially}, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) DeclareTypePartially}))
3120 : : {} /* empty. */
3121 : : /* Continue looping. */
3122 : 710824 : else if (ForeachTryDeclare (M2GCCDeclare_todolist, M2GCCDeclare_arraynil, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) CanDeclareArrayAsNil}, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) DeclareArrayAsNil}))
3123 : : {
3124 : : /* avoid dangling else. */
3125 : : }
3126 : 707248 : else if (ForeachTryDeclare (M2GCCDeclare_todolist, M2GCCDeclare_pointernilarray, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) CanDeclarePointerToNilArray}, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) DeclarePointerToNilArray}))
3127 : : {
3128 : : /* avoid dangling else. */
3129 : : }
3130 : 707170 : else if (ForeachTryDeclare (M2GCCDeclare_niltypedarrays, M2GCCDeclare_arraypartial, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) CanDeclareArrayPartially}, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) DeclareArrayPartially}))
3131 : : {
3132 : : /* avoid dangling else. */
3133 : : }
3134 : 701090 : else if (ForeachTryDeclare (M2GCCDeclare_niltypedarrays, M2GCCDeclare_pointerfully, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) CanPromotePointerFully}, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) PromotePointerFully}))
3135 : : {
3136 : : /* avoid dangling else. */
3137 : : }
3138 : 701018 : else if (ForeachTryDeclare (M2GCCDeclare_heldbyalignment, M2GCCDeclare_recordkind, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) CanDeclareRecordKind}, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) DeclareRecordKind}))
3139 : : {
3140 : : /* avoid dangling else. */
3141 : : }
3142 : 687717 : else if (ForeachTryDeclare (M2GCCDeclare_finishedalignment, M2GCCDeclare_recordfully, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) CanDeclareRecord}, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) FinishDeclareRecord}))
3143 : : {
3144 : : /* avoid dangling else. */
3145 : : }
3146 : 667862 : else if (ForeachTryDeclare (M2GCCDeclare_todolist, M2GCCDeclare_typeconstfully, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) TypeConstDependantsFullyDeclared}, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) DeclareTypeConstFully}))
3147 : : {
3148 : : /* avoid dangling else. */
3149 : : }
3150 : 624386 : else if (ForeachTryDeclare (M2GCCDeclare_todolist, M2GCCDeclare_typefrompartial, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) CanBeDeclaredViaPartialDependants}, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) DeclareTypeFromPartial}))
3151 : : {
3152 : : /* avoid dangling else. */
3153 : : }
3154 : 621216 : else if (ForeachTryDeclare (M2GCCDeclare_partiallydeclared, M2GCCDeclare_partialfrompartial, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) CanBeDeclaredPartiallyViaPartialDependants}, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) DeclareTypePartially}))
3155 : : {
3156 : : /* avoid dangling else. */
3157 : : }
3158 : 621216 : else if (ForeachTryDeclare (M2GCCDeclare_partiallydeclared, M2GCCDeclare_partialtofully, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) TypeConstDependantsFullyDeclared}, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) DeclareTypeConstFully}))
3159 : : {
3160 : : /* avoid dangling else. */
3161 : : }
3162 : : else
3163 : : {
3164 : : /* avoid dangling else. */
3165 : : /* Nothing left to do (and constants are resolved elsewhere). */
3166 : 710824 : finished = true;
3167 : : }
3168 : 710824 : } while (! (finished));
3169 : 618150 : KillGroup (©);
3170 : 618150 : if (ForceComplete)
3171 : : {
3172 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
3173 : 0 : if (ForeachTryDeclare (M2GCCDeclare_todolist, M2GCCDeclare_circulartodo, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) NotAllDependantsFullyDeclared}, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) EmitCircularDependancyError}))
3174 : : {} /* empty. */
3175 : 0 : else if (ForeachTryDeclare (M2GCCDeclare_partiallydeclared, M2GCCDeclare_circularpartial, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) NotAllDependantsPartiallyDeclared}, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) EmitCircularDependancyError}))
3176 : : {
3177 : : /* avoid dangling else. */
3178 : : }
3179 : 0 : else if (ForeachTryDeclare (M2GCCDeclare_niltypedarrays, M2GCCDeclare_circularniltyped, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) NotAllDependantsPartiallyDeclared}, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) EmitCircularDependancyError}))
3180 : : {
3181 : : /* avoid dangling else. */
3182 : : }
3183 : : }
3184 : 618150 : return (Sets_NoOfElementsInSet (GlobalGroup->ToDoList)) == 0;
3185 : : /* static analysis guarentees a RETURN statement will be used before here. */
3186 : : __builtin_unreachable ();
3187 : : }
3188 : :
3189 : :
3190 : : /*
3191 : : CompleteDeclarationOf - returns the GCC Tree for, sym, if it can
3192 : : be created from partially or fully declared
3193 : : dependents.
3194 : : */
3195 : :
3196 : 22504 : static tree CompleteDeclarationOf (unsigned int sym)
3197 : : {
3198 : 22504 : if (SymbolTable_IsArray (sym))
3199 : : {
3200 : 0 : return DeclareArray (sym);
3201 : : }
3202 : 22504 : else if (SymbolTable_IsProcType (sym))
3203 : : {
3204 : : /* avoid dangling else. */
3205 : 5958 : return DeclareProcType (sym);
3206 : : }
3207 : 16546 : else if (SymbolTable_IsRecordField (sym))
3208 : : {
3209 : : /* avoid dangling else. */
3210 : 0 : return DeclareRecordField (sym);
3211 : : }
3212 : 16546 : else if (SymbolTable_IsPointer (sym))
3213 : : {
3214 : : /* avoid dangling else. */
3215 : 16546 : return DeclarePointer (sym);
3216 : : }
3217 : : else
3218 : : {
3219 : : /* avoid dangling else. */
3220 : : return NULL;
3221 : : }
3222 : : /* static analysis guarentees a RETURN statement will be used before here. */
3223 : : __builtin_unreachable ();
3224 : : }
3225 : :
3226 : :
3227 : : /*
3228 : : DeclareType - here a type has been created via TYPE foo = bar,
3229 : : we must tell GCC about it.
3230 : : */
3231 : :
3232 : 27067 : static tree DeclareType (unsigned int sym)
3233 : : {
3234 : 27067 : tree t;
3235 : 27067 : location_t location;
3236 : :
3237 : 27067 : if ((SymbolTable_GetSType (sym)) == SymbolTable_NulSym)
3238 : : {
3239 : 0 : M2MetaError_MetaError1 ((const char *) "base type {%1Ua} not understood", 31, sym);
3240 : 0 : M2Error_InternalError ((const char *) "base type should have been declared", 35);
3241 : : }
3242 : : else
3243 : : {
3244 : 27067 : if ((SymbolTable_GetSymName (sym)) == NameKey_NulName)
3245 : : {
3246 : 0 : return (tree) (SymbolConversion_Mod2Gcc (SymbolTable_GetSType (sym)));
3247 : : }
3248 : : else
3249 : : {
3250 : 27067 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (sym));
3251 : 27067 : if (SymbolConversion_GccKnowsAbout (sym))
3252 : : {
3253 : 6 : t = SymbolConversion_Mod2Gcc (sym);
3254 : : }
3255 : : else
3256 : : {
3257 : : /* not partially declared therefore start it */
3258 : 27061 : t = m2type_BuildStartType (location, reinterpret_cast <char * > (NameKey_KeyToCharStar (M2AsmUtil_GetFullSymName (sym))), SymbolConversion_Mod2Gcc (SymbolTable_GetSType (sym)));
3259 : : }
3260 : 27067 : t = m2type_BuildEndType (location, t); /* now finish it */
3261 : 27067 : return t; /* now finish it */
3262 : : }
3263 : : }
3264 : : ReturnException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/M2GCCDeclare.def", 20, 1);
3265 : : __builtin_unreachable ();
3266 : : }
3267 : :
3268 : 464143 : static void DeclareConstantFromTree (unsigned int sym, tree value)
3269 : : {
3270 : : /*
3271 : : DeclareIntegerFromTree - declares an integer constant from a Tree, value.
3272 : : */
3273 : 928286 : PreAddModGcc (sym, value);
3274 : 464143 : WatchRemoveList (sym, M2GCCDeclare_todolist);
3275 : 464143 : WatchIncludeList (sym, M2GCCDeclare_fullydeclared);
3276 : 464143 : }
3277 : :
3278 : :
3279 : : /*
3280 : : DeclareCharConstant - declares a character constant.
3281 : : */
3282 : :
3283 : 12374 : static void DeclareCharConstant (unsigned int tokenno, unsigned int sym)
3284 : : {
3285 : 12374 : location_t location;
3286 : :
3287 : 12374 : M2Debug_Assert (SymbolTable_IsConstStringKnown (sym));
3288 : 12374 : location = M2LexBuf_TokenToLocation (tokenno);
3289 : 12374 : PreAddModGcc (sym, m2type_BuildCharConstant (location, const_cast <const char * > (static_cast <char * > (NameKey_KeyToCharStar (SymbolTable_GetString (sym))))));
3290 : 12374 : WatchRemoveList (sym, M2GCCDeclare_todolist);
3291 : 12374 : WatchIncludeList (sym, M2GCCDeclare_fullydeclared);
3292 : 12374 : }
3293 : :
3294 : :
3295 : : /*
3296 : : DeclareStringConstant - declares a string constant the sym will be known.
3297 : : */
3298 : :
3299 : 211034 : static void DeclareStringConstant (unsigned int tokenno, unsigned int sym)
3300 : : {
3301 : 211034 : tree symtree;
3302 : :
3303 : 211034 : M2Debug_Assert (SymbolTable_IsConstStringKnown (sym));
3304 : 211034 : if ((SymbolTable_IsConstStringM2nul (sym)) || (SymbolTable_IsConstStringCnul (sym)))
3305 : : {
3306 : : /* in either case the string needs a nul terminator. If the string
3307 : : is a C variant it will already have had any escape characters applied.
3308 : : The BuildCStringConstant only adds the nul terminator. */
3309 : 211022 : symtree = m2decl_BuildCStringConstant (const_cast <const char * > (static_cast <char * > (NameKey_KeyToCharStar (SymbolTable_GetString (sym)))), static_cast<int> (SymbolTable_GetStringLength (tokenno, sym)));
3310 : : }
3311 : : else
3312 : : {
3313 : 12 : symtree = m2decl_BuildStringConstant (const_cast <const char * > (static_cast <char * > (NameKey_KeyToCharStar (SymbolTable_GetString (sym)))), static_cast<int> (SymbolTable_GetStringLength (tokenno, sym)));
3314 : : }
3315 : 422068 : PreAddModGcc (sym, symtree);
3316 : 211034 : WatchRemoveList (sym, M2GCCDeclare_todolist);
3317 : 211034 : WatchIncludeList (sym, M2GCCDeclare_fullydeclared);
3318 : 211034 : }
3319 : :
3320 : :
3321 : : /*
3322 : : WalkConstructor - walks all dependants of, sym.
3323 : : */
3324 : :
3325 : 724168 : static void WalkConstructor (unsigned int sym, M2GCCDeclare_WalkAction p)
3326 : : {
3327 : 724168 : unsigned int type;
3328 : :
3329 : 724168 : type = SymbolTable_GetSType (sym);
3330 : 724168 : if (type != SymbolTable_NulSym)
3331 : : {
3332 : 723298 : WalkDependants (type, p);
3333 : 723298 : M2ALU_WalkConstructorDependants (sym, p);
3334 : : }
3335 : 724168 : }
3336 : :
3337 : :
3338 : : /*
3339 : : WalkConst - walks all dependants of, sym.
3340 : : */
3341 : :
3342 : 23463882 : static void WalkConst (unsigned int sym, M2GCCDeclare_WalkAction p)
3343 : : {
3344 : 23463882 : unsigned int type;
3345 : :
3346 : 23463882 : M2Debug_Assert (SymbolTable_IsConst (sym));
3347 : 23463882 : type = SymbolTable_GetSType (sym);
3348 : 23463882 : if (type != SymbolTable_NulSym)
3349 : : {
3350 : 21274050 : (*p.proc) (type);
3351 : : }
3352 : 23463882 : if ((SymbolTable_IsConstSet (sym)) || (SymbolTable_IsConstructor (sym)))
3353 : : {
3354 : 692824 : WalkConstructor (sym, p);
3355 : : }
3356 : 23463882 : }
3357 : :
3358 : :
3359 : : /*
3360 : : IsConstDependants - returns TRUE if the symbol, sym,
3361 : : q(dependants) all return TRUE.
3362 : : */
3363 : :
3364 : 124338 : static bool IsConstDependants (unsigned int sym, M2GCCDeclare_IsAction q)
3365 : : {
3366 : 124338 : unsigned int type;
3367 : :
3368 : 124338 : M2Debug_Assert (SymbolTable_IsConst (sym));
3369 : 124338 : type = SymbolTable_GetSType (sym);
3370 : 124338 : if (type != SymbolTable_NulSym)
3371 : : {
3372 : 116442 : if (! ((*q.proc) (type)))
3373 : : {
3374 : : return false;
3375 : : }
3376 : : }
3377 : 105432 : if ((SymbolTable_IsConstSet (sym)) || (SymbolTable_IsConstructor (sym)))
3378 : : {
3379 : 12738 : return M2ALU_IsConstructorDependants (sym, q);
3380 : : }
3381 : 92694 : return SymbolTable_IsValueSolved (sym);
3382 : : /* static analysis guarentees a RETURN statement will be used before here. */
3383 : : __builtin_unreachable ();
3384 : : }
3385 : :
3386 : :
3387 : : /*
3388 : : DeclareConstString -
3389 : : */
3390 : :
3391 : 223408 : static bool DeclareConstString (unsigned int tokenno, unsigned int sym)
3392 : : {
3393 : 223408 : unsigned int size;
3394 : :
3395 : 223408 : if (SymbolTable_IsConstStringKnown (sym))
3396 : : {
3397 : 223408 : size = SymbolTable_GetStringLength (tokenno, sym);
3398 : 223408 : if (size == 1)
3399 : : {
3400 : 12374 : DeclareCharConstant (tokenno, sym);
3401 : : }
3402 : : else
3403 : : {
3404 : 211034 : DeclareStringConstant (tokenno, sym);
3405 : : }
3406 : 223408 : return true;
3407 : : }
3408 : : return false;
3409 : : /* static analysis guarentees a RETURN statement will be used before here. */
3410 : : __builtin_unreachable ();
3411 : : }
3412 : :
3413 : :
3414 : : /*
3415 : : TryDeclareConst - try to declare a const to gcc. If it cannot
3416 : : declare the symbol it places it into the
3417 : : todolist.
3418 : : */
3419 : :
3420 : 6155422 : static void TryDeclareConst (unsigned int tokenno, unsigned int sym)
3421 : : {
3422 : 6155422 : unsigned int type;
3423 : :
3424 : 6155422 : if (! (SymbolConversion_GccKnowsAbout (sym)))
3425 : : {
3426 : 427878 : if ((SymbolTable_IsConstructor (sym)) || (SymbolTable_IsConstSet (sym)))
3427 : : {
3428 : 12 : M2ALU_WalkConstructorDependants (sym, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) TraverseDependants});
3429 : 12 : M2ALU_TryEvaluateValue (sym);
3430 : 12 : if (! (M2ALU_IsConstructorDependants (sym, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) IsFullyDeclared})))
3431 : : {
3432 : 0 : TraverseDependants (sym);
3433 : 0 : return;
3434 : : }
3435 : 12 : if (! (SymbolTable_IsConstructorConstant (sym)))
3436 : : {
3437 : : return;
3438 : : }
3439 : : }
3440 : 427878 : if ((SymbolTable_IsConstString (sym)) && (SymbolTable_IsConstStringKnown (sym)))
3441 : : {
3442 : : /* avoid dangling else. */
3443 : 75816 : if (DeclareConstString (tokenno, sym))
3444 : : {} /* empty. */
3445 : : }
3446 : 352062 : else if (SymbolTable_IsValueSolved (sym))
3447 : : {
3448 : : /* avoid dangling else. */
3449 : 342384 : SymbolTable_PushValue (sym);
3450 : 342384 : if (SymbolTable_IsConstSet (sym))
3451 : : {
3452 : 12 : DeclareConstantFromTree (sym, M2ALU_PopSetTree (tokenno));
3453 : : }
3454 : 342372 : else if (SymbolTable_IsConstructor (sym))
3455 : : {
3456 : : /* avoid dangling else. */
3457 : 0 : DeclareConstantFromTree (sym, M2ALU_PopConstructorTree (tokenno));
3458 : : }
3459 : 342372 : else if (M2Base_IsRealType (SymbolTable_GetDType (sym)))
3460 : : {
3461 : : /* avoid dangling else. */
3462 : 4816 : type = SymbolTable_GetDType (sym);
3463 : 4816 : DeclareConstantFromTree (sym, m2convert_BuildConvert (M2LexBuf_TokenToLocation (tokenno), SymbolConversion_Mod2Gcc (type), M2ALU_PopRealTree (), true));
3464 : : }
3465 : 337556 : else if (M2Base_IsComplexType (SymbolTable_GetDType (sym)))
3466 : : {
3467 : : /* avoid dangling else. */
3468 : 330 : type = SymbolTable_GetDType (sym);
3469 : 330 : DeclareConstantFromTree (sym, m2convert_BuildConvert (M2LexBuf_TokenToLocation (tokenno), SymbolConversion_Mod2Gcc (type), M2ALU_PopComplexTree (), true));
3470 : : }
3471 : : else
3472 : : {
3473 : : /* avoid dangling else. */
3474 : 337226 : if ((SymbolTable_GetSType (sym)) == SymbolTable_NulSym)
3475 : : {
3476 : 0 : type = M2Base_ZType;
3477 : : }
3478 : : else
3479 : : {
3480 : 337226 : type = SymbolTable_GetDType (sym);
3481 : : }
3482 : 337226 : DeclareConstantFromTree (sym, m2convert_BuildConvert (M2LexBuf_TokenToLocation (tokenno), SymbolConversion_Mod2Gcc (type), M2ALU_PopIntegerTree (), true));
3483 : : }
3484 : : }
3485 : : else
3486 : : {
3487 : : /* avoid dangling else. */
3488 : 9678 : TraverseDependants (sym);
3489 : : }
3490 : : }
3491 : : }
3492 : :
3493 : :
3494 : : /*
3495 : : DeclareConst - declares a const to gcc and returns a Tree.
3496 : : */
3497 : :
3498 : 767453 : static tree DeclareConst (unsigned int tokenno, unsigned int sym)
3499 : : {
3500 : 767453 : unsigned int type;
3501 : :
3502 : 767453 : if (SymbolConversion_GccKnowsAbout (sym))
3503 : : {
3504 : 500570 : return SymbolConversion_Mod2Gcc (sym);
3505 : : }
3506 : 266883 : if ((SymbolTable_IsConstructor (sym)) || (SymbolTable_IsConstSet (sym)))
3507 : : {
3508 : 8202 : M2ALU_EvaluateValue (sym);
3509 : : }
3510 : 266883 : if (SymbolTable_IsConstString (sym))
3511 : : {
3512 : : /* avoid dangling else. */
3513 : 147592 : if (DeclareConstString (tokenno, sym))
3514 : : {} /* empty. */
3515 : : }
3516 : 119291 : else if (SymbolTable_IsValueSolved (sym))
3517 : : {
3518 : : /* avoid dangling else. */
3519 : 119291 : SymbolTable_PushValue (sym);
3520 : 119291 : if (SymbolTable_IsConstSet (sym))
3521 : : {
3522 : 5622 : DeclareConstantFromTree (sym, M2ALU_PopSetTree (tokenno));
3523 : : }
3524 : 113669 : else if (SymbolTable_IsConstructor (sym))
3525 : : {
3526 : : /* avoid dangling else. */
3527 : 2580 : DeclareConstantFromTree (sym, M2ALU_PopConstructorTree (tokenno));
3528 : : }
3529 : 111089 : else if (M2Base_IsRealType (SymbolTable_GetDType (sym)))
3530 : : {
3531 : : /* avoid dangling else. */
3532 : 1566 : type = SymbolTable_GetDType (sym);
3533 : 1566 : DeclareConstantFromTree (sym, m2convert_BuildConvert (M2LexBuf_TokenToLocation (tokenno), SymbolConversion_Mod2Gcc (type), M2ALU_PopRealTree (), true));
3534 : : }
3535 : 109523 : else if (M2Base_IsComplexType (SymbolTable_GetDType (sym)))
3536 : : {
3537 : : /* avoid dangling else. */
3538 : 0 : type = SymbolTable_GetDType (sym);
3539 : 0 : DeclareConstantFromTree (sym, m2convert_BuildConvert (M2LexBuf_TokenToLocation (tokenno), SymbolConversion_Mod2Gcc (type), M2ALU_PopComplexTree (), true));
3540 : : }
3541 : : else
3542 : : {
3543 : : /* avoid dangling else. */
3544 : 109523 : if ((SymbolTable_GetSType (sym)) == SymbolTable_NulSym)
3545 : : {
3546 : 13345 : type = M2Base_ZType;
3547 : : }
3548 : : else
3549 : : {
3550 : 96178 : type = SymbolTable_GetDType (sym);
3551 : : }
3552 : 109523 : DeclareConstantFromTree (sym, m2convert_BuildConvert (M2LexBuf_TokenToLocation (tokenno), SymbolConversion_Mod2Gcc (type), M2ALU_PopIntegerTree (), true));
3553 : : }
3554 : : }
3555 : 266883 : if (SymbolConversion_GccKnowsAbout (sym))
3556 : : {
3557 : 266883 : return SymbolConversion_Mod2Gcc (sym);
3558 : : }
3559 : : else
3560 : : {
3561 : : return NULL;
3562 : : }
3563 : : /* static analysis guarentees a RETURN statement will be used before here. */
3564 : : __builtin_unreachable ();
3565 : : }
3566 : :
3567 : :
3568 : : /*
3569 : : WalkFamilyOfUnbounded -
3570 : : */
3571 : :
3572 : 3820995 : static void WalkFamilyOfUnbounded (unsigned int oaf __attribute__((unused)), unsigned int dim __attribute__((unused)), unsigned int unbounded)
3573 : : {
3574 : 3820995 : if (unbounded != SymbolTable_NulSym)
3575 : : {
3576 : 3797631 : (*unboundedp.proc) (unbounded);
3577 : : }
3578 : 3820995 : }
3579 : :
3580 : :
3581 : : /*
3582 : : WalkAssociatedUnbounded -
3583 : : */
3584 : :
3585 : 87442925 : static void WalkAssociatedUnbounded (unsigned int sym, M2GCCDeclare_WalkAction p)
3586 : : {
3587 : 87442925 : unsigned int oaf;
3588 : 87442925 : M2GCCDeclare_WalkAction o;
3589 : :
3590 : 87442925 : oaf = SymbolTable_GetOAFamily (sym);
3591 : 87442925 : o = unboundedp;
3592 : 87442925 : unboundedp = p;
3593 : 87442925 : SymbolTable_ForeachOAFamily (oaf, (SymbolTable_FamilyOperation) {(SymbolTable_FamilyOperation_t) WalkFamilyOfUnbounded});
3594 : 87442925 : unboundedp = o;
3595 : 87442925 : }
3596 : :
3597 : :
3598 : : /*
3599 : : WalkDependants - walks through all dependants of, Sym,
3600 : : calling, p, for each dependant.
3601 : : */
3602 : :
3603 : 86829055 : static void WalkDependants (unsigned int sym, M2GCCDeclare_WalkAction p)
3604 : : {
3605 : 86829055 : WalkAssociatedUnbounded (sym, p);
3606 : 86829055 : if (SymbolTable_IsComponent (sym))
3607 : : {
3608 : 94172 : WalkComponentDependants (sym, p);
3609 : : }
3610 : 86734883 : else if (SymbolTable_IsEnumeration (sym))
3611 : : {
3612 : : /* avoid dangling else. */
3613 : 2546186 : WalkEnumerationDependants (sym, p);
3614 : : }
3615 : 84188697 : else if (SymbolTable_IsSubrange (sym))
3616 : : {
3617 : : /* avoid dangling else. */
3618 : 1083625 : WalkSubrangeDependants (sym, p);
3619 : : }
3620 : 83105072 : else if (SymbolTable_IsPointer (sym))
3621 : : {
3622 : : /* avoid dangling else. */
3623 : 9315928 : WalkPointerDependants (sym, p);
3624 : : }
3625 : 73789144 : else if (SymbolTable_IsRecord (sym))
3626 : : {
3627 : : /* avoid dangling else. */
3628 : 6020451 : WalkRecordDependants (sym, p);
3629 : : }
3630 : 67768693 : else if (SymbolTable_IsVarient (sym))
3631 : : {
3632 : : /* avoid dangling else. */
3633 : 7344 : WalkVarientDependants (sym, p);
3634 : : }
3635 : 67761349 : else if (SymbolTable_IsRecordField (sym))
3636 : : {
3637 : : /* avoid dangling else. */
3638 : 17061932 : WalkRecordFieldDependants (sym, p);
3639 : : }
3640 : 50699417 : else if (SymbolTable_IsFieldVarient (sym))
3641 : : {
3642 : : /* avoid dangling else. */
3643 : 18828 : WalkVarientFieldDependants (sym, p);
3644 : : }
3645 : 50680589 : else if (SymbolTable_IsArray (sym))
3646 : : {
3647 : : /* avoid dangling else. */
3648 : 562002 : WalkArrayDependants (sym, p);
3649 : : }
3650 : 50118587 : else if (SymbolTable_IsProcType (sym))
3651 : : {
3652 : : /* avoid dangling else. */
3653 : 2298926 : WalkProcTypeDependants (sym, p);
3654 : : }
3655 : 47819661 : else if (SymbolTable_IsUnbounded (sym))
3656 : : {
3657 : : /* avoid dangling else. */
3658 : 3697691 : WalkUnboundedDependants (sym, p);
3659 : : }
3660 : 44121970 : else if (SymbolTable_IsSet (sym))
3661 : : {
3662 : : /* avoid dangling else. */
3663 : 925364 : WalkSetDependants (sym, p);
3664 : : }
3665 : 43196606 : else if (SymbolTable_IsType (sym))
3666 : : {
3667 : : /* avoid dangling else. */
3668 : 19190209 : WalkTypeDependants (sym, p);
3669 : : }
3670 : 24006397 : else if (SymbolTable_IsConst (sym))
3671 : : {
3672 : : /* avoid dangling else. */
3673 : 23463882 : WalkConst (sym, p);
3674 : : }
3675 : 542515 : else if (SymbolTable_IsVar (sym))
3676 : : {
3677 : : /* avoid dangling else. */
3678 : 541951 : WalkVarDependants (sym, p);
3679 : : }
3680 : 564 : else if (SymbolTable_IsProcedure (sym))
3681 : : {
3682 : : /* avoid dangling else. */
3683 : 408 : WalkProcedureDependants (sym, p);
3684 : : }
3685 : 86829055 : }
3686 : :
3687 : :
3688 : : /*
3689 : : TraverseDependantsInner -
3690 : : */
3691 : :
3692 : 147776501 : static void TraverseDependantsInner (unsigned int sym)
3693 : : {
3694 : 147776501 : if ((! (Sets_IsElementInSet (GlobalGroup->FullyDeclared, sym))) && (! (Sets_IsElementInSet (GlobalGroup->ToDoList, sym))))
3695 : : {
3696 : 2483841 : WatchIncludeList (sym, M2GCCDeclare_todolist);
3697 : : }
3698 : 147776501 : if (! (Sets_IsElementInSet (VisitedList, sym)))
3699 : : {
3700 : 86105757 : Sets_IncludeElementIntoSet (VisitedList, sym);
3701 : 86105757 : WalkDependants (sym, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) TraverseDependantsInner});
3702 : : }
3703 : 147776501 : }
3704 : :
3705 : :
3706 : : /*
3707 : : TraverseDependants - walks, sym, dependants. But it checks
3708 : : to see that, sym, is not on the
3709 : : FullyDeclared and not on the ToDoList.
3710 : : */
3711 : :
3712 : 16910745 : static void TraverseDependants (unsigned int sym)
3713 : : {
3714 : 16910745 : if (VisitedList == NULL)
3715 : : {
3716 : 16910745 : VisitedList = Sets_InitSet (1);
3717 : 16910745 : TraverseDependantsInner (sym);
3718 : 16910745 : VisitedList = Sets_KillSet (VisitedList);
3719 : : }
3720 : : else
3721 : : {
3722 : 0 : M2Error_InternalError ((const char *) "recursive call to TraverseDependants caught", 43);
3723 : : }
3724 : 16910745 : }
3725 : :
3726 : :
3727 : : /*
3728 : : WalkTypeInfo - walks type, sym, and its dependants.
3729 : : */
3730 : :
3731 : 13262292 : static void WalkTypeInfo (unsigned int sym)
3732 : : {
3733 : 13265256 : if (SymbolTable_IsVarient (sym))
3734 : : {
3735 : 0 : M2Error_InternalError ((const char *) "why have we reached here?", 25);
3736 : : }
3737 : 13265256 : else if (SymbolTable_IsVar (sym))
3738 : : {
3739 : : /* avoid dangling else. */
3740 : 233758 : WalkTypeInfo (SymbolTable_GetSType (sym));
3741 : 233758 : if ((SymbolTable_GetVarBackEndType (sym)) != SymbolTable_NulSym)
3742 : : {
3743 : 2964 : WalkTypeInfo (SymbolTable_GetVarBackEndType (sym));
3744 : : }
3745 : : }
3746 : 13031498 : else if (SymbolTable_IsAModula2Type (sym))
3747 : : {
3748 : : /* avoid dangling else. */
3749 : 8094330 : TraverseDependants (sym);
3750 : : }
3751 : 13262292 : }
3752 : :
3753 : :
3754 : : /*
3755 : : DeclareUnboundedProcedureParameters -
3756 : : */
3757 : :
3758 : 172947 : static void DeclareUnboundedProcedureParameters (unsigned int sym)
3759 : : {
3760 : 172947 : unsigned int param;
3761 : 172947 : unsigned int type;
3762 : 172947 : unsigned int p;
3763 : 172947 : unsigned int i;
3764 : 172947 : location_t location;
3765 : :
3766 : 172947 : if (SymbolTable_IsProcedure (sym))
3767 : : {
3768 : 172227 : p = SymbolTable_NoOfParamAny (sym);
3769 : 172227 : i = p;
3770 : 788165 : while (i > 0)
3771 : : {
3772 : 443711 : if (SymbolTable_IsUnboundedParamAny (sym, i))
3773 : : {
3774 : : /* avoid dangling else. */
3775 : 40404 : param = SymbolTable_GetNthParamAny (sym, i);
3776 : 40404 : type = SymbolTable_GetSType (param);
3777 : 40404 : TraverseDependants (type);
3778 : 40404 : if (SymbolConversion_GccKnowsAbout (type))
3779 : : {
3780 : 40404 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (type));
3781 : 40404 : m2type_BuildTypeDeclaration (location, SymbolConversion_Mod2Gcc (type));
3782 : : }
3783 : : }
3784 : : else
3785 : : {
3786 : 403307 : param = SymbolTable_GetNth (sym, i);
3787 : 403307 : type = SymbolTable_GetSType (param);
3788 : 403307 : TraverseDependants (type);
3789 : : }
3790 : 443711 : i -= 1;
3791 : : }
3792 : : }
3793 : 172947 : }
3794 : :
3795 : :
3796 : : /*
3797 : : WalkUnboundedProcedureParameters -
3798 : : */
3799 : :
3800 : 6145423 : static void WalkUnboundedProcedureParameters (unsigned int sym)
3801 : : {
3802 : 6145423 : unsigned int param;
3803 : 6145423 : unsigned int type;
3804 : 6145423 : unsigned int p;
3805 : 6145423 : unsigned int i;
3806 : :
3807 : 6145423 : if (SymbolTable_IsProcedure (sym))
3808 : : {
3809 : 3865170 : p = SymbolTable_NoOfParamAny (sym);
3810 : 3865170 : i = p;
3811 : 14613451 : while (i > 0)
3812 : : {
3813 : 6883111 : if (SymbolTable_IsUnboundedParamAny (sym, i))
3814 : : {
3815 : 655461 : param = SymbolTable_GetNthParamAny (sym, i);
3816 : : }
3817 : : else
3818 : : {
3819 : 6227650 : param = SymbolTable_GetNth (sym, i);
3820 : : }
3821 : 6883111 : type = SymbolTable_GetSType (param);
3822 : 6883111 : WalkTypeInfo (type);
3823 : 6883111 : i -= 1;
3824 : : }
3825 : : }
3826 : 6145423 : }
3827 : :
3828 : :
3829 : : /*
3830 : : WalkTypesInProcedure - walk all types in procedure, Sym.
3831 : : */
3832 : :
3833 : 65719 : static void WalkTypesInProcedure (unsigned int sym)
3834 : : {
3835 : 0 : SymbolTable_ForeachLocalSymDo (sym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) TraverseDependants});
3836 : 0 : }
3837 : :
3838 : :
3839 : : /*
3840 : : WalkTypesInModule - declare all types in module, Sym, to GCC.
3841 : : */
3842 : :
3843 : 146139 : static void WalkTypesInModule (unsigned int sym)
3844 : : {
3845 : 146139 : NameKey_Name n;
3846 : :
3847 : 146139 : if (Debugging)
3848 : : {
3849 : : n = SymbolTable_GetSymName (sym);
3850 : : M2Printf_printf1 ((const char *) "Declaring types in MODULE %a\\n", 30, (const unsigned char *) &n, (sizeof (n)-1));
3851 : : }
3852 : 146139 : SymbolTable_ForeachLocalSymDo (sym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) WalkTypeInfo});
3853 : 146139 : SymbolTable_ForeachLocalSymDo (sym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) WalkUnboundedProcedureParameters});
3854 : 146139 : SymbolTable_ForeachInnerModuleDo (sym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) WalkTypesInModule});
3855 : 146139 : }
3856 : :
3857 : :
3858 : : /*
3859 : : IsRecordFieldDependants - returns TRUE if the record field
3860 : : symbol, sym, p(dependants) all return TRUE.
3861 : : */
3862 : :
3863 : 777012 : static bool IsRecordFieldDependants (unsigned int sym, M2GCCDeclare_IsAction q)
3864 : : {
3865 : 777012 : unsigned int align;
3866 : 777012 : bool final;
3867 : :
3868 : 777012 : final = true;
3869 : 777012 : if (! ((*q.proc) (SymbolTable_GetSType (sym))))
3870 : : {
3871 : : final = false;
3872 : : }
3873 : 777012 : align = SymbolTable_GetAlignment (sym);
3874 : 777012 : if ((align != SymbolTable_NulSym) && (! ((*q.proc) (align))))
3875 : : {
3876 : : final = false;
3877 : : }
3878 : 777012 : return final;
3879 : : /* static analysis guarentees a RETURN statement will be used before here. */
3880 : : __builtin_unreachable ();
3881 : : }
3882 : :
3883 : :
3884 : : /*
3885 : : GetModuleWhereDeclared - returns the module where, Sym, was created.
3886 : : */
3887 : :
3888 : 10286470 : static unsigned int GetModuleWhereDeclared (unsigned int sym)
3889 : : {
3890 : 10292776 : unsigned int s;
3891 : :
3892 : 10292776 : s = SymbolTable_GetScope (sym);
3893 : 10292776 : if (((s == SymbolTable_NulSym) || (SymbolTable_IsDefImp (s))) || ((SymbolTable_IsModule (s)) && ((SymbolTable_GetScope (s)) == SymbolTable_NulSym)))
3894 : : {
3895 : 10286470 : return s;
3896 : : }
3897 : : else
3898 : : {
3899 : 6306 : return GetModuleWhereDeclared (s);
3900 : : }
3901 : : /* static analysis guarentees a RETURN statement will be used before here. */
3902 : : __builtin_unreachable ();
3903 : : }
3904 : :
3905 : :
3906 : : /*
3907 : : IsPseudoProcFunc - returns TRUE if Sym is a pseudo function or procedure.
3908 : : */
3909 : :
3910 : 3165510 : static bool IsPseudoProcFunc (unsigned int Sym)
3911 : : {
3912 : 3165510 : return ((M2Base_IsPseudoBaseProcedure (Sym)) || (M2Base_IsPseudoBaseFunction (Sym))) || (M2System_IsPseudoSystemFunction (Sym));
3913 : : /* static analysis guarentees a RETURN statement will be used before here. */
3914 : : __builtin_unreachable ();
3915 : : }
3916 : :
3917 : :
3918 : : /*
3919 : : IsExternal -
3920 : : */
3921 : :
3922 : 2158315 : static bool IsExternal (unsigned int sym)
3923 : : {
3924 : 2158315 : unsigned int mod;
3925 : :
3926 : 2158315 : M2Debug_Assert (! (SymbolTable_IsDefImp (sym)));
3927 : 2158315 : if ((SymbolTable_IsProcedure (sym)) && (SymbolTable_IsExtern (sym)))
3928 : : {
3929 : : return true;
3930 : : }
3931 : 1925331 : mod = SymbolTable_GetScope (sym);
3932 : 1927335 : do {
3933 : 1927335 : if (mod == SymbolTable_NulSym)
3934 : : {
3935 : : return false;
3936 : : }
3937 : 1927335 : else if (SymbolTable_IsDefImp (mod))
3938 : : {
3939 : : /* avoid dangling else. */
3940 : 1841175 : return mod != (SymbolTable_GetMainModule ());
3941 : : }
3942 : 86160 : mod = SymbolTable_GetScope (mod);
3943 : 86160 : } while (! (mod == SymbolTable_NulSym));
3944 : : return false;
3945 : : /* static analysis guarentees a RETURN statement will be used before here. */
3946 : : __builtin_unreachable ();
3947 : : }
3948 : :
3949 : :
3950 : : /*
3951 : : IsExternalToWholeProgram - return TRUE if the symbol, sym, is external to the
3952 : : sources that we have parsed.
3953 : : */
3954 : :
3955 : 11424 : static bool IsExternalToWholeProgram (unsigned int sym)
3956 : : {
3957 : 11424 : unsigned int mod;
3958 : :
3959 : 11424 : mod = SymbolTable_GetScope (sym);
3960 : 11424 : do {
3961 : 11424 : if (mod == SymbolTable_NulSym)
3962 : : {
3963 : : return false;
3964 : : }
3965 : 11424 : else if (SymbolTable_IsDefImp (mod))
3966 : : {
3967 : : /* avoid dangling else. */
3968 : : /* return TRUE if we have no source file. */
3969 : 11160 : return (M2Batch_GetModuleFile (mod)) == NULL;
3970 : : }
3971 : 264 : mod = SymbolTable_GetScope (mod);
3972 : 264 : } while (! (mod == SymbolTable_NulSym));
3973 : : return false;
3974 : : /* static analysis guarentees a RETURN statement will be used before here. */
3975 : : __builtin_unreachable ();
3976 : : }
3977 : :
3978 : :
3979 : : /*
3980 : : DeclareProcedureToGccWholeProgram -
3981 : : */
3982 : :
3983 : 253272 : static void DeclareProcedureToGccWholeProgram (unsigned int Sym)
3984 : : {
3985 : 253272 : tree returnType;
3986 : 253272 : tree GccParam;
3987 : 253272 : unsigned int scope;
3988 : 253272 : unsigned int Variable;
3989 : 253272 : unsigned int p;
3990 : 253272 : unsigned int i;
3991 : 253272 : unsigned int b;
3992 : 253272 : unsigned int e;
3993 : 253272 : location_t begin;
3994 : 253272 : location_t end;
3995 : 253272 : location_t location;
3996 : :
3997 : 253272 : if ((! (SymbolConversion_GccKnowsAbout (Sym))) && (! (IsPseudoProcFunc (Sym))))
3998 : : {
3999 : 11424 : m2decl_BuildStartFunctionDeclaration (SymbolTable_UsesVarArgs (Sym));
4000 : 11424 : p = SymbolTable_NoOfParamAny (Sym);
4001 : 11424 : i = p;
4002 : : /* note we dont use GetNthParamAny as we want the parameter that is seen by the procedure block
4003 : : remember that this is treated exactly the same as a variable, just its position on
4004 : : the activation record is special (ie a parameter)
4005 : : */
4006 : 43848 : while (i > 0)
4007 : : {
4008 : 21000 : Variable = SymbolTable_GetNth (Sym, i);
4009 : 21000 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (Variable));
4010 : 21000 : if (SymbolTable_IsUnboundedParamAny (Sym, i))
4011 : : {
4012 : 2088 : GccParam = m2decl_BuildParameterDeclaration (location, const_cast <const char * > (static_cast <char * > (NameKey_KeyToCharStar (SymbolTable_GetSymName (Variable)))), SymbolConversion_Mod2Gcc (SymbolTable_GetLType (Variable)), false);
4013 : : }
4014 : : else
4015 : : {
4016 : 18912 : GccParam = m2decl_BuildParameterDeclaration (location, const_cast <const char * > (static_cast <char * > (NameKey_KeyToCharStar (SymbolTable_GetSymName (Variable)))), SymbolConversion_Mod2Gcc (SymbolTable_GetLType (Variable)), SymbolTable_IsVarParamAny (Sym, i));
4017 : : }
4018 : 42000 : PreAddModGcc (Variable, GccParam);
4019 : 21000 : WatchRemoveList (Variable, M2GCCDeclare_todolist);
4020 : 21000 : WatchIncludeList (Variable, M2GCCDeclare_fullydeclared);
4021 : 21000 : i -= 1;
4022 : : }
4023 : 11424 : SymbolTable_GetProcedureBeginEnd (Sym, &b, &e);
4024 : 11424 : begin = M2LexBuf_TokenToLocation (b);
4025 : 11424 : end = M2LexBuf_TokenToLocation (e);
4026 : 11424 : scope = SymbolTable_GetScope (Sym);
4027 : 11424 : PushBinding (scope);
4028 : 11424 : if ((SymbolTable_GetSType (Sym)) == SymbolTable_NulSym)
4029 : : {
4030 : : returnType = NULL;
4031 : : }
4032 : : else
4033 : : {
4034 : 4632 : returnType = SymbolConversion_Mod2Gcc (SymbolTable_GetSType (Sym));
4035 : : }
4036 : 11424 : PreAddModGcc (Sym, m2decl_BuildEndFunctionDeclaration (begin, end, const_cast <const char * > (static_cast <char * > (NameKey_KeyToCharStar (M2AsmUtil_GetFullSymName (Sym)))), returnType, IsExternalToWholeProgram (Sym), M2GCCDeclare_IsProcedureGccNested (Sym), SymbolTable_IsExported (GetModuleWhereDeclared (Sym), Sym), SymbolTable_IsProcedureAnyNoReturn (Sym)));
4037 : 11424 : PopBinding (scope);
4038 : 11424 : WatchRemoveList (Sym, M2GCCDeclare_todolist);
4039 : 11424 : WatchIncludeList (Sym, M2GCCDeclare_fullydeclared);
4040 : : }
4041 : 253272 : }
4042 : :
4043 : :
4044 : : /*
4045 : : DeclareProcedureToGccSeparateProgram -
4046 : : */
4047 : :
4048 : 3414293 : static void DeclareProcedureToGccSeparateProgram (unsigned int Sym)
4049 : : {
4050 : 3414293 : tree returnType;
4051 : 3414293 : tree GccParam;
4052 : 3414293 : unsigned int scope;
4053 : 3414293 : unsigned int Variable;
4054 : 3414293 : unsigned int p;
4055 : 3414293 : unsigned int i;
4056 : 3414293 : unsigned int b;
4057 : 3414293 : unsigned int e;
4058 : 3414293 : location_t begin;
4059 : 3414293 : location_t end;
4060 : 3414293 : location_t location;
4061 : 3414293 : unsigned int tok;
4062 : :
4063 : 3414293 : tok = SymbolTable_GetDeclaredMod (Sym);
4064 : 3414293 : if (((! (SymbolConversion_GccKnowsAbout (Sym))) && (! (IsPseudoProcFunc (Sym)))) && ((((((IsEffectivelyImported (SymbolTable_GetMainModule (), Sym)) || ((GetModuleWhereDeclared (Sym)) == (SymbolTable_GetMainModule ()))) || (M2Base_IsNeededAtRunTime (tok, Sym))) || (SymbolTable_IsImported (SymbolTable_GetBaseModule (), Sym))) || (SymbolTable_IsExported (GetModuleWhereDeclared (Sym), Sym))) || (SymbolTable_IsExtern (Sym))))
4065 : : {
4066 : 2158315 : m2decl_BuildStartFunctionDeclaration (SymbolTable_UsesVarArgs (Sym));
4067 : 2158315 : p = SymbolTable_NoOfParamAny (Sym);
4068 : 2158315 : i = p;
4069 : : /* Note we dont use GetNthParamAny as we want the parameter that is seen by
4070 : : the procedure block remember that this is treated exactly the same as
4071 : : a variable, just its position on the activation record is special (ie
4072 : : a parameter). */
4073 : 9002668 : while (i > 0)
4074 : : {
4075 : 4686038 : Variable = SymbolTable_GetNth (Sym, i);
4076 : 4686038 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (Variable));
4077 : 4686038 : if (SymbolTable_IsUnboundedParamAny (Sym, i))
4078 : : {
4079 : 298183 : GccParam = m2decl_BuildParameterDeclaration (location, const_cast <const char * > (static_cast <char * > (NameKey_KeyToCharStar (SymbolTable_GetSymName (Variable)))), SymbolConversion_Mod2Gcc (SymbolTable_GetLType (Variable)), false);
4080 : : }
4081 : : else
4082 : : {
4083 : 4387855 : GccParam = m2decl_BuildParameterDeclaration (location, const_cast <const char * > (static_cast <char * > (NameKey_KeyToCharStar (SymbolTable_GetSymName (Variable)))), SymbolConversion_Mod2Gcc (SymbolTable_GetLType (Variable)), SymbolTable_IsVarParamAny (Sym, i));
4084 : : }
4085 : 9372076 : PreAddModGcc (Variable, GccParam);
4086 : 4686038 : WatchRemoveList (Variable, M2GCCDeclare_todolist);
4087 : 4686038 : WatchIncludeList (Variable, M2GCCDeclare_fullydeclared);
4088 : 4686038 : i -= 1;
4089 : : }
4090 : 2158315 : SymbolTable_GetProcedureBeginEnd (Sym, &b, &e);
4091 : 2158315 : begin = M2LexBuf_TokenToLocation (b);
4092 : 2158315 : end = M2LexBuf_TokenToLocation (e);
4093 : 2158315 : scope = SymbolTable_GetScope (Sym);
4094 : 2158315 : PushBinding (scope);
4095 : 2158315 : if ((SymbolTable_GetSType (Sym)) == SymbolTable_NulSym)
4096 : : {
4097 : : returnType = NULL;
4098 : : }
4099 : : else
4100 : : {
4101 : 911346 : returnType = SymbolConversion_Mod2Gcc (SymbolTable_GetSType (Sym));
4102 : : }
4103 : : /* Exported from the module where it was declared. */
4104 : 4206771 : PreAddModGcc (Sym, m2decl_BuildEndFunctionDeclaration (begin, end, const_cast <const char * > (static_cast <char * > (NameKey_KeyToCharStar (M2AsmUtil_GetFullSymName (Sym)))), returnType, IsExternal (Sym), M2GCCDeclare_IsProcedureGccNested (Sym), (SymbolTable_IsExported (GetModuleWhereDeclared (Sym), Sym)) || (SymbolTable_IsExtern (Sym)), SymbolTable_IsProcedureAnyNoReturn (Sym)));
4105 : 2158315 : PopBinding (scope);
4106 : 2158315 : WatchRemoveList (Sym, M2GCCDeclare_todolist);
4107 : 2158315 : WatchIncludeList (Sym, M2GCCDeclare_fullydeclared);
4108 : : }
4109 : 3414293 : }
4110 : :
4111 : :
4112 : : /*
4113 : : DeclareProcedureToGcc - traverses all parameters and interfaces to gm2gcc.
4114 : : */
4115 : :
4116 : 3679889 : static void DeclareProcedureToGcc (unsigned int sym)
4117 : : {
4118 : 3679889 : if (sym != SymbolTable_NulSym)
4119 : : {
4120 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
4121 : 3667565 : if (M2Options_WholeProgram)
4122 : : {
4123 : 253272 : DeclareProcedureToGccWholeProgram (sym);
4124 : : }
4125 : : else
4126 : : {
4127 : 3414293 : DeclareProcedureToGccSeparateProgram (sym);
4128 : : }
4129 : : }
4130 : 3679889 : }
4131 : :
4132 : :
4133 : : /*
4134 : : ActivateWatch - activate a watch for any symbol (lista xor listb).
4135 : : */
4136 : :
4137 : 0 : static void ActivateWatch (Sets_Set lista, Sets_Set listb)
4138 : : {
4139 : 0 : Sets_Set smallest;
4140 : 0 : Sets_Set largest;
4141 : 0 : unsigned int n;
4142 : 0 : unsigned int sym;
4143 : :
4144 : 0 : if ((Sets_NoOfElementsInSet (lista)) != (Sets_NoOfElementsInSet (listb)))
4145 : : {
4146 : 0 : if ((Sets_NoOfElementsInSet (lista)) > (Sets_NoOfElementsInSet (listb)))
4147 : : {
4148 : : largest = lista;
4149 : : smallest = listb;
4150 : : }
4151 : : else
4152 : : {
4153 : 0 : largest = listb;
4154 : 0 : smallest = lista;
4155 : : }
4156 : 0 : M2Printf_printf0 ((const char *) "adding the following symbols to the watch list as the declarator has detected an internal bug: ", 95);
4157 : 0 : sym = 1;
4158 : 0 : n = SymbolTable_FinalSymbol ();
4159 : 0 : while (sym <= n)
4160 : : {
4161 : 0 : if (((Sets_IsElementInSet (largest, sym)) && (! (Sets_IsElementInSet (smallest, sym)))) || ((! (Sets_IsElementInSet (largest, sym))) && (Sets_IsElementInSet (smallest, sym))))
4162 : : {
4163 : 0 : AddSymToWatch (sym);
4164 : 0 : M2Printf_printf1 ((const char *) "%d ", 3, (const unsigned char *) &sym, (sizeof (sym)-1));
4165 : : }
4166 : 0 : sym += 1;
4167 : : }
4168 : 0 : M2Printf_printf0 ((const char *) "\\n", 2);
4169 : : }
4170 : 0 : }
4171 : :
4172 : :
4173 : : /*
4174 : : DeclareTypesConstantsProceduresInRange -
4175 : : */
4176 : :
4177 : 590171 : static void DeclareTypesConstantsProceduresInRange (unsigned int scope, unsigned int start, unsigned int end)
4178 : : {
4179 : 590171 : M2GCCDeclare_Group copy;
4180 : 590171 : unsigned int loop;
4181 : 590171 : M2Scope_ScopeBlock sb;
4182 : 590171 : M2BasicBlock_BasicBlock bb;
4183 : :
4184 : 590171 : if (TraceQuadruples)
4185 : : {
4186 : : M2Quads_DisplayQuadRange (scope, start, end);
4187 : : }
4188 : 590171 : loop = 0;
4189 : 590171 : copy = NULL;
4190 : 590171 : sb = M2Scope_InitScopeBlock (scope);
4191 : : /* Throw away any unreachable quad. */
4192 : 618192 : do {
4193 : 618192 : bb = M2BasicBlock_InitBasicBlocks (sb);
4194 : 618192 : M2BasicBlock_KillBasicBlocks (&bb);
4195 : : /* Now iterate over remaining quads in scope attempting to resolve constants. */
4196 : 618192 : copy = DupGroup (copy);
4197 : 618192 : bb = M2BasicBlock_InitBasicBlocks (sb);
4198 : 618192 : ConstantResolved = false;
4199 : 618192 : M2BasicBlock_ForeachBasicBlockDo (bb, (M2BasicBlock_BasicBlockProc) {(M2BasicBlock_BasicBlockProc_t) M2GCCDeclare_FoldConstants});
4200 : 618150 : M2BasicBlock_KillBasicBlocks (&bb);
4201 : : /* And now types. */
4202 : 618150 : if (DeclaredOutstandingTypes (false))
4203 : : {} /* empty. */
4204 : 618150 : if (loop == DebugLoop)
4205 : : {
4206 : 0 : if (TraceQuadruples)
4207 : : {
4208 : : M2Quads_DisplayQuadRange (scope, start, end);
4209 : : }
4210 : 0 : ActivateWatch (copy->ToDoList, GlobalGroup->ToDoList);
4211 : 0 : loop = 0;
4212 : : }
4213 : 618150 : loop += 1;
4214 : 646171 : } while (! (! ConstantResolved && (EqualGroup (copy, GlobalGroup))));
4215 : 590129 : KillGroup (©);
4216 : 590129 : bb = M2BasicBlock_InitBasicBlocks (sb);
4217 : 590129 : M2BasicBlock_KillBasicBlocks (&bb);
4218 : 590129 : M2Scope_KillScopeBlock (&sb);
4219 : 590129 : }
4220 : :
4221 : :
4222 : : /*
4223 : : SkipModuleScope - skips all module scopes for, scope.
4224 : : It returns either NulSym or a procedure sym.
4225 : : */
4226 : :
4227 : 4703108 : static unsigned int SkipModuleScope (unsigned int scope)
4228 : : {
4229 : 9276674 : if ((scope == SymbolTable_NulSym) || (SymbolTable_IsProcedure (scope)))
4230 : : {
4231 : 4703108 : return scope;
4232 : : }
4233 : : else
4234 : : {
4235 : 4573566 : return SkipModuleScope (SymbolTable_GetScope (scope));
4236 : : }
4237 : : /* static analysis guarentees a RETURN statement will be used before here. */
4238 : : __builtin_unreachable ();
4239 : : }
4240 : :
4241 : :
4242 : : /*
4243 : : PushBinding -
4244 : : */
4245 : :
4246 : 2351575 : static void PushBinding (unsigned int scope)
4247 : : {
4248 : 2351575 : scope = SkipModuleScope (scope);
4249 : 2351575 : if (scope == SymbolTable_NulSym)
4250 : : {
4251 : 2284812 : m2block_pushGlobalScope ();
4252 : : }
4253 : : else
4254 : : {
4255 : 66763 : m2block_pushFunctionScope (SymbolConversion_Mod2Gcc (scope));
4256 : : }
4257 : 2351575 : }
4258 : :
4259 : :
4260 : : /*
4261 : : PopBinding -
4262 : : */
4263 : :
4264 : 2351533 : static void PopBinding (unsigned int scope)
4265 : : {
4266 : 2351533 : scope = SkipModuleScope (scope);
4267 : 2351533 : if (scope == SymbolTable_NulSym)
4268 : : {
4269 : 2284770 : m2block_popGlobalScope ();
4270 : : }
4271 : : else
4272 : : {
4273 : 66763 : M2Debug_Assert (SymbolTable_IsProcedure (scope));
4274 : 66763 : m2block_finishFunctionDecl (M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (scope)), SymbolConversion_Mod2Gcc (scope));
4275 : 66763 : M2Debug_Assert ((m2block_popFunctionScope ()) != NULL);
4276 : : }
4277 : 2351533 : }
4278 : :
4279 : :
4280 : : /*
4281 : : DeclareTypesConstantsProcedures -
4282 : : */
4283 : :
4284 : 80222 : static void DeclareTypesConstantsProcedures (unsigned int scope)
4285 : : {
4286 : 80222 : M2GCCDeclare_Group copy;
4287 : 80222 : M2Scope_ScopeBlock sb;
4288 : :
4289 : 80222 : if (Debugging)
4290 : : {
4291 : : M2Printf_printf0 ((const char *) "declaring types constants in: ", 30);
4292 : : PrintTerse (scope);
4293 : : }
4294 : 80222 : copy = NULL;
4295 : 80222 : sb = M2Scope_InitScopeBlock (scope);
4296 : 80222 : PushBinding (scope);
4297 : 103999 : do {
4298 : 103999 : copy = DupGroup (copy);
4299 : 103999 : M2Scope_ForeachScopeBlockDo3 (sb, (M2Scope_ScopeProcedure3) {(M2Scope_ScopeProcedure3_t) DeclareTypesConstantsProceduresInRange});
4300 : 103957 : } while (! (EqualGroup (copy, GlobalGroup)));
4301 : 80180 : KillGroup (©);
4302 : 80180 : PopBinding (scope);
4303 : 80180 : M2Scope_KillScopeBlock (&sb);
4304 : 80180 : }
4305 : :
4306 : :
4307 : : /*
4308 : : AssertAllTypesDeclared - asserts that all types for variables are declared in, scope.
4309 : : */
4310 : :
4311 : 79814 : static void AssertAllTypesDeclared (unsigned int scope)
4312 : : {
4313 : 79814 : unsigned int n;
4314 : 79814 : unsigned int Var;
4315 : 79814 : bool failed;
4316 : :
4317 : 79814 : failed = false;
4318 : 79814 : n = 1;
4319 : 79814 : Var = SymbolTable_GetNth (scope, n);
4320 : 874053 : while (Var != SymbolTable_NulSym)
4321 : : {
4322 : 714425 : if (! (AllDependantsFullyDeclared (SymbolTable_GetSType (Var))))
4323 : : {
4324 : 714425 : mystop ();
4325 : : }
4326 : 714425 : if (! (AllDependantsFullyDeclared (SymbolTable_GetSType (Var))))
4327 : : {
4328 : 6 : EmitCircularDependancyError (SymbolTable_GetSType (Var));
4329 : 6 : failed = true;
4330 : : }
4331 : 714425 : n += 1;
4332 : 714425 : Var = SymbolTable_GetNth (scope, n);
4333 : : }
4334 : 79814 : if (failed)
4335 : : {
4336 : 6 : M2Error_FlushErrors ();
4337 : : }
4338 : 79808 : }
4339 : :
4340 : :
4341 : : /*
4342 : : DeclareModuleInit - declare all the ctor related functions within
4343 : : a module.
4344 : : */
4345 : :
4346 : 23881 : static void DeclareModuleInit (unsigned int moduleSym)
4347 : : {
4348 : 23881 : unsigned int ctor;
4349 : 23881 : unsigned int init;
4350 : 23881 : unsigned int fini;
4351 : 23881 : unsigned int dep;
4352 : :
4353 : 23881 : SymbolTable_GetModuleCtors (moduleSym, &ctor, &init, &fini, &dep);
4354 : 23881 : DeclareProcedureToGcc (ctor);
4355 : 23881 : DeclareProcedureToGcc (init);
4356 : 23881 : DeclareProcedureToGcc (fini);
4357 : 23881 : DeclareProcedureToGcc (dep);
4358 : 23881 : }
4359 : :
4360 : :
4361 : : /*
4362 : : StartDeclareProcedureScope -
4363 : : */
4364 : :
4365 : 65719 : static void StartDeclareProcedureScope (unsigned int scope)
4366 : : {
4367 : 65719 : WalkTypesInProcedure (scope);
4368 : 65719 : M2GCCDeclare_DeclareProcedure (scope);
4369 : 65719 : SymbolTable_ForeachInnerModuleDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) WalkTypesInModule});
4370 : 65719 : DeclareTypesConstantsProcedures (scope);
4371 : 65719 : SymbolTable_ForeachInnerModuleDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) DeclareTypesConstantsProcedures});
4372 : 65719 : M2GCCDeclare_DeclareLocalVariables (scope);
4373 : 65719 : SymbolTable_ForeachInnerModuleDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2GCCDeclare_DeclareModuleVariables});
4374 : 65719 : AssertAllTypesDeclared (scope);
4375 : 65719 : SymbolTable_ForeachProcedureDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2GCCDeclare_DeclareProcedure});
4376 : 65719 : SymbolTable_ForeachInnerModuleDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2GCCDeclare_StartDeclareScope});
4377 : 65719 : }
4378 : :
4379 : :
4380 : : /*
4381 : : StartDeclareModuleScopeSeparate -
4382 : : */
4383 : :
4384 : 13729 : static void StartDeclareModuleScopeSeparate (unsigned int scope)
4385 : : {
4386 : 13729 : if (scope == (SymbolTable_GetMainModule ()))
4387 : : {
4388 : 13321 : SymbolTable_ForeachModuleDo ((SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) WalkTypesInModule}); /* will populate the TYPE and CONST ToDo list */
4389 : 13321 : DeclareTypesConstantsProcedures (scope); /* will resolved TYPEs and CONSTs on the ToDo */
4390 : : /* lists. */
4391 : 13279 : SymbolTable_ForeachModuleDo ((SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2GCCDeclare_DeclareProcedure});
4392 : : /*
4393 : : now that all types have been resolved it is safe to declare
4394 : : variables
4395 : : */
4396 : 13279 : AssertAllTypesDeclared (scope);
4397 : 13273 : DeclareGlobalVariables (scope);
4398 : 13273 : SymbolTable_ForeachImportedDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) DeclareImportedVariables});
4399 : : /* now it is safe to declare all procedures */
4400 : 13273 : SymbolTable_ForeachProcedureDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2GCCDeclare_DeclareProcedure});
4401 : 13273 : SymbolTable_ForeachInnerModuleDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) WalkTypesInModule});
4402 : 13273 : SymbolTable_ForeachInnerModuleDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) DeclareTypesConstantsProcedures});
4403 : 13273 : SymbolTable_ForeachInnerModuleDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2GCCDeclare_StartDeclareScope});
4404 : 13273 : DeclareModuleInit (scope);
4405 : : }
4406 : : else
4407 : : {
4408 : 408 : DeclareTypesConstantsProcedures (scope);
4409 : 408 : AssertAllTypesDeclared (scope);
4410 : 408 : SymbolTable_ForeachProcedureDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2GCCDeclare_DeclareProcedure});
4411 : 408 : DeclareModuleInit (scope);
4412 : 408 : SymbolTable_ForeachInnerModuleDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2GCCDeclare_StartDeclareScope});
4413 : : }
4414 : 13681 : }
4415 : :
4416 : :
4417 : : /*
4418 : : StartDeclareModuleScopeWholeProgram -
4419 : : */
4420 : :
4421 : 408 : static void StartDeclareModuleScopeWholeProgram (unsigned int scope)
4422 : : {
4423 : 408 : if (M2Batch_IsSourceSeen (scope))
4424 : : {
4425 : 408 : SymbolTable_ForeachModuleDo ((SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) WalkTypesInModule}); /* will populate the TYPE and CONST ToDo list */
4426 : 408 : DeclareTypesConstantsProcedures (scope); /* will resolved TYPEs and CONSTs on the ToDo */
4427 : : /* lists. */
4428 : 408 : SymbolTable_ForeachModuleDo ((SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2GCCDeclare_DeclareProcedure});
4429 : 408 : SymbolTable_ForeachModuleDo ((SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) DeclareModuleInit});
4430 : : /*
4431 : : now that all types have been resolved it is safe to declare
4432 : : variables
4433 : : */
4434 : 408 : AssertAllTypesDeclared (scope);
4435 : 408 : DeclareGlobalVariablesWholeProgram (scope);
4436 : 408 : SymbolTable_ForeachImportedDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) DeclareImportedVariablesWholeProgram});
4437 : : /* now it is safe to declare all procedures */
4438 : 408 : SymbolTable_ForeachProcedureDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2GCCDeclare_DeclareProcedure});
4439 : 408 : SymbolTable_ForeachInnerModuleDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) WalkTypesInModule});
4440 : 408 : SymbolTable_ForeachInnerModuleDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) DeclareTypesConstantsProcedures});
4441 : 408 : SymbolTable_ForeachInnerModuleDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2GCCDeclare_StartDeclareScope});
4442 : 408 : DeclareModuleInit (scope);
4443 : : }
4444 : : else
4445 : : {
4446 : 0 : DeclareTypesConstantsProcedures (scope);
4447 : 0 : AssertAllTypesDeclared (scope);
4448 : 0 : SymbolTable_ForeachProcedureDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2GCCDeclare_DeclareProcedure});
4449 : 0 : DeclareModuleInit (scope);
4450 : 0 : SymbolTable_ForeachInnerModuleDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2GCCDeclare_StartDeclareScope});
4451 : : }
4452 : 408 : }
4453 : :
4454 : :
4455 : : /*
4456 : : StartDeclareModuleScope -
4457 : : */
4458 : :
4459 : 14137 : static void StartDeclareModuleScope (unsigned int scope)
4460 : : {
4461 : 14137 : if (M2Options_WholeProgram)
4462 : : {
4463 : 408 : StartDeclareModuleScopeWholeProgram (scope);
4464 : : }
4465 : : else
4466 : : {
4467 : 13729 : StartDeclareModuleScopeSeparate (scope);
4468 : : }
4469 : 14089 : }
4470 : :
4471 : :
4472 : : /*
4473 : : DumpResolver - dumps the m2 representation of sym.
4474 : : */
4475 : :
4476 : 0 : static void DumpResolver (unsigned int sym)
4477 : : {
4478 : 0 : M2Printf_fprintf1 (M2LangDump_GetDumpFile (), (const char *) "dump filtered symbol %d and dependants\\n", 40, (const unsigned char *) &sym, (sizeof (sym)-1));
4479 : 0 : PrintVerbose (sym);
4480 : 0 : }
4481 : :
4482 : :
4483 : : /*
4484 : : DumpDefinitive - dumps the m2 and m2 gimple representation of sym.
4485 : : */
4486 : :
4487 : 0 : static void DumpDefinitive (unsigned int sym)
4488 : : {
4489 : 0 : int fd;
4490 : :
4491 : 0 : M2Printf_fprintf1 (M2LangDump_GetDumpFile (), (const char *) "\\nm2 symbol synopsis: %d\\n", 26, (const unsigned char *) &sym, (sizeof (sym)-1));
4492 : 0 : PrintVerbose (sym);
4493 : 0 : if (SymbolConversion_GccKnowsAbout (sym))
4494 : : {
4495 : 0 : M2Printf_fprintf1 (M2LangDump_GetDumpFile (), (const char *) "\\nm2 gimple: %d", 15, (const unsigned char *) &sym, (sizeof (sym)-1));
4496 : 0 : FIO_FlushBuffer (M2LangDump_GetDumpFile ());
4497 : 0 : fd = FIO_GetUnixFileDescriptor (M2LangDump_GetDumpFile ());
4498 : 0 : m2pp_DumpGimpleFd (fd, SymbolConversion_Mod2Gcc (sym));
4499 : : }
4500 : : else
4501 : : {
4502 : 0 : M2Printf_fprintf1 (M2LangDump_GetDumpFile (), (const char *) "\\nno m2 gimple for %d\\n", 23, (const unsigned char *) &sym, (sizeof (sym)-1));
4503 : : }
4504 : 0 : }
4505 : :
4506 : :
4507 : : /*
4508 : : PreAddModGcc - adds a relationship between sym and tree.
4509 : : */
4510 : :
4511 : 9523600 : static void PreAddModGcc (unsigned int sym, tree tree)
4512 : : {
4513 : 8846457 : SymbolConversion_AddModGcc (sym, tree);
4514 : 149102 : }
4515 : :
4516 : :
4517 : : /*
4518 : : DeclareDefaultType - declares a default type, sym, with, name.
4519 : : */
4520 : :
4521 : 560490 : static void DeclareDefaultType (unsigned int sym, const char *name_, unsigned int _name_high, tree gcctype)
4522 : : {
4523 : 560490 : tree t;
4524 : 560490 : unsigned int high;
4525 : 560490 : unsigned int low;
4526 : 560490 : location_t location;
4527 : 560490 : char name[_name_high+1];
4528 : :
4529 : : /* make a local copy of each unbounded array. */
4530 : 560490 : memcpy (name, name_, _name_high+1);
4531 : :
4532 : : /* DeclareDefaultType will declare a new identifier as a type of, gcctype, if it has not already been
4533 : : declared by gccgm2.c */
4534 : 1120980 : location = m2linemap_BuiltinsLocation ();
4535 : 560490 : t = m2type_GetDefaultType (location, reinterpret_cast <char * > (NameKey_KeyToCharStar (NameKey_MakeKey ((const char *) name, _name_high))), gcctype);
4536 : 560490 : SymbolConversion_AddModGcc (sym, t);
4537 : 560490 : Sets_IncludeElementIntoSet (GlobalGroup->FullyDeclared, sym);
4538 : 560490 : WalkAssociatedUnbounded (sym, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) TraverseDependants});
4539 : : /*
4540 : : this is very simplistic and assumes that the caller only uses Subranges, Sets and GCC types.
4541 : : We need to declare any constants with the types so that AllDependantsFullyDeclared works.
4542 : : */
4543 : 560490 : if (SymbolTable_IsSubrange (sym))
4544 : : {
4545 : 13345 : SymbolTable_GetSubrange (sym, &high, &low);
4546 : 13345 : M2GCCDeclare_DeclareConstant (SymbolTable_GetDeclaredMod (sym), high);
4547 : 13345 : M2GCCDeclare_DeclareConstant (SymbolTable_GetDeclaredMod (sym), low);
4548 : : }
4549 : 547145 : else if (SymbolTable_IsSet (sym))
4550 : : {
4551 : : /* avoid dangling else. */
4552 : 53380 : if (SymbolTable_IsSubrange (SymbolTable_GetSType (sym)))
4553 : : {
4554 : 53380 : if (! (SymbolConversion_GccKnowsAbout (SymbolTable_GetSType (sym))))
4555 : : {
4556 : : /* only true for internal types of course */
4557 : 0 : M2Error_InternalError ((const char *) "subrange type within the set type must be declared before the set type", 70);
4558 : : }
4559 : 53380 : SymbolTable_GetSubrange (SymbolTable_GetSType (sym), &high, &low);
4560 : 53380 : M2GCCDeclare_DeclareConstant (SymbolTable_GetDeclaredMod (sym), high);
4561 : 53380 : M2GCCDeclare_DeclareConstant (SymbolTable_GetDeclaredMod (sym), low);
4562 : : }
4563 : 0 : else if (SymbolTable_IsEnumeration (SymbolTable_GetSType (sym)))
4564 : : {
4565 : : /* avoid dangling else. */
4566 : 0 : if (! (SymbolConversion_GccKnowsAbout (SymbolTable_GetSType (sym))))
4567 : : {
4568 : : /* only true for internal types of course */
4569 : 0 : M2Error_InternalError ((const char *) "enumeration type within the set type must be declared before the set type", 73);
4570 : : }
4571 : : }
4572 : : }
4573 : 560490 : }
4574 : :
4575 : :
4576 : : /*
4577 : : DeclareBoolean - declares the Boolean type together with true and false.
4578 : : */
4579 : :
4580 : 13345 : static void DeclareBoolean (void)
4581 : : {
4582 : 13345 : SymbolConversion_AddModGcc (M2Base_Boolean, m2type_GetBooleanType ());
4583 : 13345 : SymbolConversion_AddModGcc (M2Base_True, m2type_GetBooleanTrue ());
4584 : 13345 : SymbolConversion_AddModGcc (M2Base_False, m2type_GetBooleanFalse ());
4585 : 13345 : Sets_IncludeElementIntoSet (GlobalGroup->FullyDeclared, M2Base_Boolean);
4586 : 13345 : Sets_IncludeElementIntoSet (GlobalGroup->FullyDeclared, M2Base_True);
4587 : 13345 : Sets_IncludeElementIntoSet (GlobalGroup->FullyDeclared, M2Base_False);
4588 : 13345 : WalkAssociatedUnbounded (M2Base_Boolean, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) TraverseDependants});
4589 : 13345 : }
4590 : :
4591 : :
4592 : : /*
4593 : : DeclareFixedSizedType - declares the GNU Modula-2 fixed types
4594 : : (if the back end support such a type).
4595 : : */
4596 : :
4597 : 293590 : static void DeclareFixedSizedType (const char *name_, unsigned int _name_high, unsigned int type, tree t)
4598 : : {
4599 : 293590 : location_t location;
4600 : 293590 : unsigned int typetype;
4601 : 293590 : unsigned int low;
4602 : 293590 : unsigned int high;
4603 : 293590 : char name[_name_high+1];
4604 : :
4605 : : /* make a local copy of each unbounded array. */
4606 : 293590 : memcpy (name, name_, _name_high+1);
4607 : :
4608 : 293590 : if (type != SymbolTable_NulSym)
4609 : : {
4610 : 266900 : if ((SymbolTable_IsSet (type)) && (! (SymbolConversion_GccKnowsAbout (SymbolTable_GetSType (type)))))
4611 : : {
4612 : 40035 : typetype = SymbolTable_GetSType (type);
4613 : 40035 : SymbolTable_GetSubrange (typetype, &high, &low);
4614 : 40035 : M2GCCDeclare_DeclareConstant (SymbolTable_GetDeclaredMod (type), high);
4615 : 40035 : M2GCCDeclare_DeclareConstant (SymbolTable_GetDeclaredMod (type), low);
4616 : 40035 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (typetype));
4617 : 40035 : PreAddModGcc (typetype, m2type_BuildSubrangeType (location, reinterpret_cast <char * > (NameKey_KeyToCharStar (M2AsmUtil_GetFullSymName (typetype))), SymbolConversion_Mod2Gcc (SymbolTable_GetSType (typetype)), SymbolConversion_Mod2Gcc (low), SymbolConversion_Mod2Gcc (high)));
4618 : 40035 : Sets_IncludeElementIntoSet (GlobalGroup->FullyDeclared, typetype);
4619 : 40035 : WalkAssociatedUnbounded (typetype, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) TraverseDependants});
4620 : : }
4621 : : /* gcc back end supports, type */
4622 : 266900 : DeclareDefaultType (type, (const char *) name, _name_high, t);
4623 : : }
4624 : 293590 : }
4625 : :
4626 : :
4627 : : /*
4628 : : DeclareDefaultSimpleTypes - declares the simple types.
4629 : : */
4630 : :
4631 : 13345 : static void DeclareDefaultSimpleTypes (void)
4632 : : {
4633 : 13345 : SymbolConversion_AddModGcc (M2Base_ZType, m2type_GetM2ZType ());
4634 : 13345 : SymbolConversion_AddModGcc (M2Base_RType, m2type_GetM2RType ());
4635 : 13345 : SymbolConversion_AddModGcc (M2Base_CType, m2type_GetM2CType ());
4636 : 13345 : Sets_IncludeElementIntoSet (GlobalGroup->FullyDeclared, M2Base_ZType);
4637 : 13345 : Sets_IncludeElementIntoSet (GlobalGroup->FullyDeclared, M2Base_RType);
4638 : 13345 : Sets_IncludeElementIntoSet (GlobalGroup->FullyDeclared, M2Base_CType);
4639 : 13345 : DeclareDefaultType (M2Base_Cardinal, (const char *) "CARDINAL", 8, m2type_GetM2CardinalType ());
4640 : 13345 : DeclareDefaultType (M2Base_Integer, (const char *) "INTEGER", 7, m2type_GetM2IntegerType ());
4641 : 13345 : DeclareDefaultType (M2Base_Char, (const char *) "CHAR", 4, m2type_GetM2CharType ());
4642 : 13345 : DeclareDefaultType (M2System_Loc, (const char *) "LOC", 3, m2type_GetISOLocType ());
4643 : 13345 : if (M2Options_Iso)
4644 : : {
4645 : 3353 : DeclareDefaultType (M2System_Byte, (const char *) "BYTE", 4, m2type_GetISOByteType ());
4646 : 3353 : DeclareDefaultType (M2System_Word, (const char *) "WORD", 4, m2type_GetISOWordType ());
4647 : : }
4648 : : else
4649 : : {
4650 : 9992 : DeclareDefaultType (M2System_Byte, (const char *) "BYTE", 4, m2type_GetByteType ());
4651 : 9992 : DeclareDefaultType (M2System_Word, (const char *) "WORD", 4, m2type_GetWordType ());
4652 : : }
4653 : 13345 : DeclareDefaultType (M2Base_Proc, (const char *) "PROC", 4, m2type_GetProcType ());
4654 : 13345 : DeclareDefaultType (M2System_Address, (const char *) "ADDRESS", 7, m2type_GetPointerType ());
4655 : 13345 : DeclareDefaultType (M2Base_LongInt, (const char *) "LONGINT", 7, m2type_GetM2LongIntType ());
4656 : 13345 : DeclareDefaultType (M2Base_LongCard, (const char *) "LONGCARD", 8, m2type_GetM2LongCardType ());
4657 : 13345 : DeclareDefaultType (M2Base_ShortInt, (const char *) "SHORTINT", 8, m2type_GetM2ShortIntType ());
4658 : 13345 : DeclareDefaultType (M2Base_ShortCard, (const char *) "SHORTCARD", 9, m2type_GetM2ShortCardType ());
4659 : 13345 : DeclareDefaultType (M2Base_ShortReal, (const char *) "SHORTREAL", 9, m2type_GetM2ShortRealType ());
4660 : 13345 : DeclareDefaultType (M2Base_Real, (const char *) "REAL", 4, m2type_GetM2RealType ());
4661 : 13345 : DeclareDefaultType (M2Base_LongReal, (const char *) "LONGREAL", 8, m2type_GetM2LongRealType ());
4662 : 13345 : DeclareDefaultType (M2Bitset_Bitnum, (const char *) "BITNUM", 6, m2type_GetBitnumType ());
4663 : 13345 : DeclareDefaultType (M2Bitset_Bitset, (const char *) "BITSET", 6, m2type_GetBitsetType ());
4664 : 13345 : DeclareDefaultType (M2Base_Complex, (const char *) "COMPLEX", 7, m2type_GetM2ComplexType ());
4665 : 13345 : DeclareDefaultType (M2Base_LongComplex, (const char *) "LONGCOMPLEX", 11, m2type_GetM2LongComplexType ());
4666 : 13345 : DeclareDefaultType (M2Base_ShortComplex, (const char *) "SHORTCOMPLEX", 12, m2type_GetM2ShortComplexType ());
4667 : 13345 : DeclareDefaultType (M2System_CSizeT, (const char *) "CSIZE_T", 7, m2type_GetCSizeTType ());
4668 : 13345 : DeclareDefaultType (M2System_CSSizeT, (const char *) "CSSIZE_T", 8, m2type_GetCSSizeTType ());
4669 : 13345 : DeclareBoolean ();
4670 : 13345 : DeclareFixedSizedType ((const char *) "INTEGER8", 8, M2System_IntegerN (8), m2type_GetM2Integer8 ());
4671 : 13345 : DeclareFixedSizedType ((const char *) "INTEGER16", 9, M2System_IntegerN (16), m2type_GetM2Integer16 ());
4672 : 13345 : DeclareFixedSizedType ((const char *) "INTEGER32", 9, M2System_IntegerN (32), m2type_GetM2Integer32 ());
4673 : 13345 : DeclareFixedSizedType ((const char *) "INTEGER64", 9, M2System_IntegerN (64), m2type_GetM2Integer64 ());
4674 : 13345 : DeclareFixedSizedType ((const char *) "CARDINAL8", 9, M2System_CardinalN (8), m2type_GetM2Cardinal8 ());
4675 : 13345 : DeclareFixedSizedType ((const char *) "CARDINAL16", 10, M2System_CardinalN (16), m2type_GetM2Cardinal16 ());
4676 : 13345 : DeclareFixedSizedType ((const char *) "CARDINAL32", 10, M2System_CardinalN (32), m2type_GetM2Cardinal32 ());
4677 : 13345 : DeclareFixedSizedType ((const char *) "CARDINAL64", 10, M2System_CardinalN (64), m2type_GetM2Cardinal64 ());
4678 : 13345 : DeclareFixedSizedType ((const char *) "WORD16", 6, M2System_WordN (16), m2type_GetM2Word16 ());
4679 : 13345 : DeclareFixedSizedType ((const char *) "WORD32", 6, M2System_WordN (32), m2type_GetM2Word32 ());
4680 : 13345 : DeclareFixedSizedType ((const char *) "WORD64", 6, M2System_WordN (64), m2type_GetM2Word64 ());
4681 : 13345 : DeclareFixedSizedType ((const char *) "BITSET8", 7, M2System_SetN (8), m2type_GetM2Bitset8 ());
4682 : 13345 : DeclareFixedSizedType ((const char *) "BITSET16", 8, M2System_SetN (16), m2type_GetM2Bitset16 ());
4683 : 13345 : DeclareFixedSizedType ((const char *) "BITSET32", 8, M2System_SetN (32), m2type_GetM2Bitset32 ());
4684 : 13345 : DeclareFixedSizedType ((const char *) "REAL32", 6, M2System_RealN (32), m2type_GetM2Real32 ());
4685 : 13345 : DeclareFixedSizedType ((const char *) "REAL64", 6, M2System_RealN (64), m2type_GetM2Real64 ());
4686 : 13345 : DeclareFixedSizedType ((const char *) "REAL96", 6, M2System_RealN (96), m2type_GetM2Real96 ());
4687 : 13345 : DeclareFixedSizedType ((const char *) "REAL128", 7, M2System_RealN (128), m2type_GetM2Real128 ());
4688 : 13345 : DeclareFixedSizedType ((const char *) "COMPLEX32", 9, M2System_ComplexN (32), m2type_GetM2Complex32 ());
4689 : 13345 : DeclareFixedSizedType ((const char *) "COMPLEX64", 9, M2System_ComplexN (64), m2type_GetM2Complex64 ());
4690 : 13345 : DeclareFixedSizedType ((const char *) "COMPLEX96", 9, M2System_ComplexN (96), m2type_GetM2Complex96 ());
4691 : 13345 : DeclareFixedSizedType ((const char *) "COMPLEX128", 10, M2System_ComplexN (128), m2type_GetM2Complex128 ());
4692 : 13345 : }
4693 : :
4694 : :
4695 : : /*
4696 : : DeclarePackedBoolean -
4697 : : */
4698 : :
4699 : 13345 : static void DeclarePackedBoolean (void)
4700 : : {
4701 : 13345 : unsigned int e;
4702 : :
4703 : 13345 : e = SymbolTable_GetPackedEquivalent (M2Base_Boolean);
4704 : 13345 : SymbolConversion_AddModGcc (e, m2type_GetPackedBooleanType ());
4705 : 13345 : Sets_IncludeElementIntoSet (GlobalGroup->FullyDeclared, e);
4706 : 13345 : }
4707 : :
4708 : :
4709 : : /*
4710 : : DeclarePackedDefaultSimpleTypes -
4711 : : */
4712 : :
4713 : 13345 : static void DeclarePackedDefaultSimpleTypes (void)
4714 : : {
4715 : 0 : DeclarePackedBoolean ();
4716 : 0 : }
4717 : :
4718 : :
4719 : : /*
4720 : : DeclareDefaultTypes - makes default types known to GCC
4721 : : */
4722 : :
4723 : 13345 : static void DeclareDefaultTypes (void)
4724 : : {
4725 : 13345 : if (! HaveInitDefaultTypes)
4726 : : {
4727 : 13345 : HaveInitDefaultTypes = true;
4728 : 13345 : m2block_pushGlobalScope ();
4729 : 13345 : DeclareDefaultSimpleTypes ();
4730 : 13345 : DeclarePackedDefaultSimpleTypes ();
4731 : 13345 : m2block_popGlobalScope ();
4732 : : }
4733 : 13345 : }
4734 : :
4735 : :
4736 : : /*
4737 : : DeclareDefaultConstants - make default constants known to GCC
4738 : : */
4739 : :
4740 : 13345 : static void DeclareDefaultConstants (void)
4741 : : {
4742 : 13345 : SymbolConversion_AddModGcc (M2Base_Nil, m2expr_GetPointerZero (m2linemap_BuiltinsLocation ()));
4743 : 13345 : Sets_IncludeElementIntoSet (GlobalGroup->FullyDeclared, M2Base_Nil);
4744 : 13345 : }
4745 : :
4746 : :
4747 : : /*
4748 : : FindContext - returns the scope where the symbol
4749 : : should be created.
4750 : :
4751 : : Symbols created in a module will
4752 : : return the global context tree, but symbols created
4753 : : in a module which is declared inside
4754 : : a procedure will return the procedure Tree.
4755 : : */
4756 : :
4757 : 101614 : static tree FindContext (unsigned int sym)
4758 : : {
4759 : 101614 : sym = SymbolTable_GetProcedureScope (sym);
4760 : 101614 : if (sym == SymbolTable_NulSym)
4761 : : {
4762 : 101614 : return m2block_GetGlobalContext ();
4763 : : }
4764 : : else
4765 : : {
4766 : 0 : return SymbolConversion_Mod2Gcc (sym);
4767 : : }
4768 : : /* static analysis guarentees a RETURN statement will be used before here. */
4769 : : __builtin_unreachable ();
4770 : : }
4771 : :
4772 : :
4773 : : /*
4774 : : IsEffectivelyImported - returns TRUE if symbol, Sym, was
4775 : : effectively imported into ModSym.
4776 : : */
4777 : :
4778 : 2776062 : static bool IsEffectivelyImported (unsigned int ModSym, unsigned int sym)
4779 : : {
4780 : 2776062 : return (SymbolTable_IsImported (ModSym, sym)) || ((SymbolTable_IsImported (ModSym, GetModuleWhereDeclared (sym))) && (SymbolTable_IsExported (GetModuleWhereDeclared (sym), sym)));
4781 : : /* static analysis guarentees a RETURN statement will be used before here. */
4782 : : __builtin_unreachable ();
4783 : : }
4784 : :
4785 : :
4786 : : /*
4787 : : FindOuterModule - returns the out most module where, sym,
4788 : : was declared. It returns NulSym if the
4789 : : symbol or the module was declared inside
4790 : : a procedure.
4791 : : */
4792 : :
4793 : 101692 : static unsigned int FindOuterModule (unsigned int sym)
4794 : : {
4795 : 101692 : sym = SymbolTable_GetScope (sym);
4796 : 203486 : while (! (SymbolTable_IsDefImp (sym)))
4797 : : {
4798 : 97682 : if (SymbolTable_IsModule (sym))
4799 : : {
4800 : 97682 : if ((SymbolTable_GetScope (sym)) == SymbolTable_NulSym)
4801 : : {
4802 : : return sym;
4803 : : }
4804 : : else
4805 : : {
4806 : 102 : sym = SymbolTable_GetScope (sym);
4807 : : }
4808 : : }
4809 : 0 : else if (SymbolTable_IsProcedure (sym))
4810 : : {
4811 : : /* avoid dangling else. */
4812 : 0 : sym = SymbolTable_GetScope (sym);
4813 : : }
4814 : : }
4815 : : return sym;
4816 : : /* static analysis guarentees a RETURN statement will be used before here. */
4817 : : __builtin_unreachable ();
4818 : : }
4819 : :
4820 : :
4821 : : /*
4822 : : DoVariableDeclaration - create a corresponding gcc variable and add the association
4823 : : between the front end symbol var and the gcc tree.
4824 : : */
4825 : :
4826 : 642747 : static void DoVariableDeclaration (unsigned int var, void * name, bool isImported, bool isExported, bool isTemporary, bool isGlobal, tree scope)
4827 : : {
4828 : 642747 : tree type;
4829 : 642747 : unsigned int varType;
4830 : 642747 : location_t location;
4831 : :
4832 : 642747 : if ((SymbolTable_IsComponent (var)) || (SymbolTable_IsVarHeap (var)))
4833 : : {
4834 : 122162 : return;
4835 : : }
4836 : 520585 : if ((SymbolTable_GetMode (var)) == SymbolTable_LeftValue)
4837 : : {
4838 : : /*
4839 : : There are two issues to deal with:
4840 : :
4841 : : (i) LeftValue is really a pointer to GetSType (var), which is built
4842 : : here.
4843 : : (ii) Front end might have specified the back end use a particular
4844 : : data type, in which case we use the specified type.
4845 : : We do not add an extra pointer if this is the case.
4846 : : */
4847 : 73870 : varType = SymbolTable_SkipType (SymbolTable_GetVarBackEndType (var));
4848 : 73870 : if (varType == SymbolTable_NulSym)
4849 : : {
4850 : : /* We have not explicity told back end the type, so build it. */
4851 : 26774 : varType = SymbolTable_GetSType (var);
4852 : 26774 : if (SymbolTable_IsVariableAtAddress (var))
4853 : : {
4854 : 54 : type = m2type_BuildConstPointerType (SymbolConversion_Mod2Gcc (varType));
4855 : : }
4856 : : else
4857 : : {
4858 : 26720 : type = m2type_BuildPointerType (SymbolConversion_Mod2Gcc (varType));
4859 : : }
4860 : : }
4861 : : else
4862 : : {
4863 : : /* We have been requested to use varType. */
4864 : 47096 : type = SymbolConversion_Mod2Gcc (varType);
4865 : : }
4866 : 73870 : M2Debug_Assert (AllDependantsFullyDeclared (varType));
4867 : : }
4868 : : else
4869 : : {
4870 : 446715 : type = SymbolConversion_Mod2Gcc (SymbolTable_GetDType (var));
4871 : : }
4872 : 520585 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (var));
4873 : 520585 : PreAddModGcc (var, m2decl_DeclareKnownVariable (location, const_cast <const char * > (static_cast <char * > (name)), type, isExported, isImported, isTemporary, isGlobal, scope, NULL));
4874 : 520585 : WatchRemoveList (var, M2GCCDeclare_todolist);
4875 : 520585 : WatchIncludeList (var, M2GCCDeclare_fullydeclared);
4876 : : }
4877 : :
4878 : :
4879 : : /*
4880 : : IsGlobal - is the variable not in a procedure scope.
4881 : : */
4882 : :
4883 : 101614 : static bool IsGlobal (unsigned int sym)
4884 : : {
4885 : 101614 : unsigned int s;
4886 : :
4887 : 101614 : s = SymbolTable_GetScope (sym);
4888 : 203228 : while (((s != SymbolTable_NulSym) && (! (SymbolTable_IsDefImp (s)))) && (! (SymbolTable_IsModule (s))))
4889 : : {
4890 : 0 : if (SymbolTable_IsProcedure (s))
4891 : : {
4892 : : return false;
4893 : : }
4894 : 0 : s = SymbolTable_GetScope (s);
4895 : : }
4896 : : return true;
4897 : : /* static analysis guarentees a RETURN statement will be used before here. */
4898 : : __builtin_unreachable ();
4899 : : }
4900 : :
4901 : :
4902 : : /*
4903 : : DeclareVariable - declares a global variable to GCC.
4904 : : */
4905 : :
4906 : 100636 : static void DeclareVariable (unsigned int ModSym, unsigned int variable)
4907 : : {
4908 : 100636 : tree scope;
4909 : 100636 : unsigned int decl;
4910 : :
4911 : 100636 : if (! (SymbolConversion_GccKnowsAbout (variable)))
4912 : : {
4913 : 100618 : scope = FindContext (ModSym);
4914 : 100618 : decl = FindOuterModule (variable);
4915 : 100618 : M2Debug_Assert (AllDependantsFullyDeclared (SymbolTable_GetSType (variable)));
4916 : 100618 : PushBinding (ModSym);
4917 : : /* in Modula-2 we are allowed to import from ourselves, but we do not present this to GCC */
4918 : 200352 : DoVariableDeclaration (variable, NameKey_KeyToCharStar (M2AsmUtil_GetFullSymName (variable)), (IsEffectivelyImported (ModSym, variable)) && ((SymbolTable_GetMainModule ()) != decl), SymbolTable_IsExported (ModSym, variable), SymbolTable_IsTemporary (variable), IsGlobal (variable), scope);
4919 : 100618 : PopBinding (ModSym);
4920 : : }
4921 : 100636 : }
4922 : :
4923 : :
4924 : : /*
4925 : : DeclareVariableWholeProgram - declares a global variable to GCC when using -fm2-whole-program.
4926 : : */
4927 : :
4928 : 996 : static void DeclareVariableWholeProgram (unsigned int mainModule, unsigned int variable)
4929 : : {
4930 : 996 : tree scope;
4931 : 996 : unsigned int decl;
4932 : :
4933 : 996 : if (! (SymbolConversion_GccKnowsAbout (variable)))
4934 : : {
4935 : 996 : scope = FindContext (mainModule);
4936 : 996 : decl = FindOuterModule (variable);
4937 : 996 : M2Debug_Assert (AllDependantsFullyDeclared (SymbolTable_GetSType (variable)));
4938 : 996 : PushBinding (mainModule);
4939 : 1992 : DoVariableDeclaration (variable, NameKey_KeyToCharStar (M2AsmUtil_GetFullSymName (variable)), ((! (M2Batch_IsSourceSeen (decl))) && (IsEffectivelyImported (mainModule, variable))) && ((SymbolTable_GetMainModule ()) != decl), SymbolTable_IsExported (mainModule, variable), SymbolTable_IsTemporary (variable), IsGlobal (variable), scope);
4940 : 996 : PopBinding (mainModule);
4941 : : }
4942 : 996 : }
4943 : :
4944 : :
4945 : : /*
4946 : : DeclareGlobalVariablesWholeProgram -
4947 : : */
4948 : :
4949 : 408 : static void DeclareGlobalVariablesWholeProgram (unsigned int ModSym)
4950 : : {
4951 : 408 : unsigned int n;
4952 : 408 : unsigned int Variable;
4953 : :
4954 : 408 : n = 1;
4955 : 408 : Variable = SymbolTable_GetNth (ModSym, n);
4956 : 1812 : while (Variable != SymbolTable_NulSym)
4957 : : {
4958 : 996 : DeclareVariableWholeProgram (ModSym, Variable);
4959 : 996 : n += 1;
4960 : 996 : Variable = SymbolTable_GetNth (ModSym, n);
4961 : : }
4962 : 408 : SymbolTable_ForeachInnerModuleDo (ModSym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) DeclareGlobalVariablesWholeProgram});
4963 : 408 : }
4964 : :
4965 : :
4966 : : /*
4967 : : DeclareGlobalVariables - lists the Global variables for
4968 : : Module ModSym together with their offset.
4969 : : */
4970 : :
4971 : 13525 : static void DeclareGlobalVariables (unsigned int ModSym)
4972 : : {
4973 : 13525 : unsigned int n;
4974 : 13525 : unsigned int Variable;
4975 : :
4976 : 13525 : n = 1;
4977 : 13525 : Variable = SymbolTable_GetNth (ModSym, n);
4978 : 126790 : while (Variable != SymbolTable_NulSym)
4979 : : {
4980 : 99740 : DeclareVariable (ModSym, Variable);
4981 : 99740 : n += 1;
4982 : 99740 : Variable = SymbolTable_GetNth (ModSym, n);
4983 : : }
4984 : 13525 : SymbolTable_ForeachInnerModuleDo (ModSym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) DeclareGlobalVariables});
4985 : 13525 : }
4986 : :
4987 : :
4988 : : /*
4989 : : DeclareImportedVariables - declares all imported variables to GM2.
4990 : : */
4991 : :
4992 : 75382 : static void DeclareImportedVariables (unsigned int sym)
4993 : : {
4994 : 75382 : if (SymbolTable_IsVar (sym))
4995 : : {
4996 : 896 : DeclareVariable (SymbolTable_GetMainModule (), sym);
4997 : : }
4998 : 74486 : else if (SymbolTable_IsDefImp (sym))
4999 : : {
5000 : : /* avoid dangling else. */
5001 : 1800 : SymbolTable_ForeachExportedDo (sym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) DeclareImportedVariables});
5002 : : }
5003 : 75382 : }
5004 : :
5005 : :
5006 : : /*
5007 : : DeclareImportedVariablesWholeProgram - declares all imported variables.
5008 : : */
5009 : :
5010 : 6708 : static void DeclareImportedVariablesWholeProgram (unsigned int sym)
5011 : : {
5012 : 6708 : if (SymbolTable_IsVar (sym))
5013 : : {
5014 : : /* avoid dangling else. */
5015 : 78 : if (! (M2Batch_IsSourceSeen (FindOuterModule (sym))))
5016 : : {
5017 : : /* import is necessary, even for -fm2-whole-program as we
5018 : : cannot see the source. */
5019 : 0 : DeclareVariableWholeProgram (SymbolTable_GetMainModule (), sym);
5020 : : }
5021 : : }
5022 : 6630 : else if (SymbolTable_IsDefImp (sym))
5023 : : {
5024 : : /* avoid dangling else. */
5025 : 144 : SymbolTable_ForeachExportedDo (sym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) DeclareImportedVariablesWholeProgram});
5026 : : }
5027 : 6708 : }
5028 : :
5029 : :
5030 : : /*
5031 : : DeclareFieldValue -
5032 : : */
5033 : :
5034 : 412058 : static tree DeclareFieldValue (unsigned int sym, tree value, tree *list)
5035 : : {
5036 : 412058 : location_t location;
5037 : :
5038 : 412058 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (sym));
5039 : 412058 : if (((GetModuleWhereDeclared (sym)) == SymbolTable_NulSym) || ((GetModuleWhereDeclared (sym)) == (SymbolTable_GetMainModule ())))
5040 : : {
5041 : 9658 : return m2type_BuildEnumerator (location, reinterpret_cast <char * > (NameKey_KeyToCharStar (SymbolTable_GetSymName (sym))), value, list);
5042 : : }
5043 : : else
5044 : : {
5045 : 402400 : return m2type_BuildEnumerator (location, reinterpret_cast <char * > (NameKey_KeyToCharStar (M2AsmUtil_GetFullScopeAsmName (sym))), value, list);
5046 : : }
5047 : : /* static analysis guarentees a RETURN statement will be used before here. */
5048 : : __builtin_unreachable ();
5049 : : }
5050 : :
5051 : :
5052 : : /*
5053 : : DeclareFieldEnumeration - declares an enumerator within the current enumeration type.
5054 : : */
5055 : :
5056 : 411938 : static tree DeclareFieldEnumeration (unsigned int sym)
5057 : : {
5058 : 411938 : unsigned int type;
5059 : 411938 : tree field;
5060 : 411938 : tree enumlist;
5061 : :
5062 : : /* add relationship between gccSym and sym */
5063 : 411938 : type = SymbolTable_GetSType (sym);
5064 : 411938 : enumlist = GetEnumList (type);
5065 : 411938 : SymbolTable_PushValue (sym);
5066 : 411938 : field = DeclareFieldValue (sym, M2ALU_PopIntegerTree (), &enumlist);
5067 : 411938 : PutEnumList (type, enumlist);
5068 : 411938 : return field;
5069 : : /* static analysis guarentees a RETURN statement will be used before here. */
5070 : : __builtin_unreachable ();
5071 : : }
5072 : :
5073 : :
5074 : : /*
5075 : : DeclareEnumeration - declare an enumerated type.
5076 : : */
5077 : :
5078 : 22620 : static tree DeclareEnumeration (unsigned int sym)
5079 : : {
5080 : 22620 : tree enumlist;
5081 : 22620 : tree gccenum;
5082 : 22620 : location_t location;
5083 : :
5084 : 22620 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (sym));
5085 : 22620 : gccenum = m2type_BuildStartEnumeration (location, reinterpret_cast <char * > (NameKey_KeyToCharStar (M2AsmUtil_GetFullSymName (sym))), false);
5086 : 22620 : enumlist = GetEnumList (sym);
5087 : 22620 : return m2type_BuildEndEnumeration (location, gccenum, enumlist);
5088 : : /* static analysis guarentees a RETURN statement will be used before here. */
5089 : : __builtin_unreachable ();
5090 : : }
5091 : :
5092 : :
5093 : : /*
5094 : : DeclareSubrangeNarrow - will return cardinal, integer, or type depending on whether
5095 : : low..high fits in the C data type.
5096 : : */
5097 : :
5098 : 20272 : static tree DeclareSubrangeNarrow (location_t location, unsigned int high, unsigned int low, tree type)
5099 : : {
5100 : 20272 : tree m2low;
5101 : 20272 : tree m2high;
5102 : 20272 : tree lowtree;
5103 : 20272 : tree hightree;
5104 : :
5105 : : /* No zero alignment, therefore the front end will prioritize subranges to match
5106 : : unsigned int, int, or ZTYPE assuming the low..high range fits. */
5107 : 20272 : lowtree = SymbolConversion_Mod2Gcc (low);
5108 : 20272 : hightree = SymbolConversion_Mod2Gcc (high);
5109 : 20272 : if ((m2expr_CompareTrees (lowtree, m2expr_GetIntegerZero (location))) >= 0)
5110 : : {
5111 : : /* avoid dangling else. */
5112 : : /* low..high is always positive, can we use unsigned int? */
5113 : 20016 : m2high = m2type_GetMaxFrom (location, m2type_GetM2CardinalType ());
5114 : 20016 : if ((m2expr_CompareTrees (hightree, m2high)) <= 0)
5115 : : {
5116 : 20016 : return m2type_GetM2CardinalType ();
5117 : : }
5118 : : }
5119 : : else
5120 : : {
5121 : : /* Must be a signed subrange base, can we use int? */
5122 : 256 : m2high = m2type_GetMaxFrom (location, m2type_GetM2IntegerType ());
5123 : 256 : m2low = m2type_GetMinFrom (location, m2type_GetM2IntegerType ());
5124 : 256 : if (((m2expr_CompareTrees (lowtree, m2low)) >= 0) && ((m2expr_CompareTrees (hightree, m2high)) <= 0))
5125 : : {
5126 : 256 : return m2type_GetM2IntegerType ();
5127 : : }
5128 : : }
5129 : : /* Fall back to the ZType. */
5130 : : return type;
5131 : : /* static analysis guarentees a RETURN statement will be used before here. */
5132 : : __builtin_unreachable ();
5133 : : }
5134 : :
5135 : :
5136 : : /*
5137 : : DeclareSubrange - declare a subrange type.
5138 : : */
5139 : :
5140 : 23652 : static tree DeclareSubrange (unsigned int sym)
5141 : : {
5142 : 23652 : tree type;
5143 : 23652 : tree gccsym;
5144 : 23652 : unsigned int align;
5145 : 23652 : unsigned int high;
5146 : 23652 : unsigned int low;
5147 : 23652 : location_t location;
5148 : :
5149 : 23652 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (sym));
5150 : 23652 : SymbolTable_GetSubrange (sym, &high, &low);
5151 : 23652 : align = SymbolTable_GetAlignment (sym);
5152 : 23652 : type = SymbolConversion_Mod2Gcc (SymbolTable_GetSType (sym));
5153 : 23652 : if (align != SymbolTable_NulSym)
5154 : : {
5155 : 12 : if (m2expr_AreConstantsEqual (m2expr_GetIntegerZero (location), SymbolConversion_Mod2Gcc (align)))
5156 : : {
5157 : 12 : type = m2type_BuildSmallestTypeRange (location, SymbolConversion_Mod2Gcc (low), SymbolConversion_Mod2Gcc (high));
5158 : : }
5159 : : else
5160 : : {
5161 : 0 : M2MetaError_MetaError1 ((const char *) "a non-zero alignment in a subrange type {%1Wa} is currently not implemented and will be ignored", 95, sym);
5162 : : }
5163 : : }
5164 : 23640 : else if ((SymbolTable_GetSType (sym)) == M2Base_ZType)
5165 : : {
5166 : : /* avoid dangling else. */
5167 : : /* Can we narrow the ZType subrange to CARDINAL or INTEGER? */
5168 : 20272 : type = DeclareSubrangeNarrow (location, high, low, type);
5169 : : }
5170 : 23652 : gccsym = m2type_BuildSubrangeType (location, reinterpret_cast <char * > (NameKey_KeyToCharStar (M2AsmUtil_GetFullSymName (sym))), type, SymbolConversion_Mod2Gcc (low), SymbolConversion_Mod2Gcc (high));
5171 : 23652 : return gccsym;
5172 : : /* static analysis guarentees a RETURN statement will be used before here. */
5173 : : __builtin_unreachable ();
5174 : : }
5175 : :
5176 : :
5177 : : /*
5178 : : IncludeGetNth -
5179 : : */
5180 : :
5181 : 0 : static void IncludeGetNth (Lists_List l, unsigned int sym)
5182 : : {
5183 : 0 : unsigned int i;
5184 : :
5185 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " ListOfFields [", 15);
5186 : 0 : i = 1;
5187 : 0 : while ((SymbolTable_GetNth (sym, i)) != SymbolTable_NulSym)
5188 : : {
5189 : 0 : if (i > 1)
5190 : : {
5191 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) ", ", 2);
5192 : : }
5193 : 0 : Lists_IncludeItemIntoList (l, SymbolTable_GetNth (sym, i));
5194 : 0 : PrintTerse (SymbolTable_GetNth (sym, i));
5195 : 0 : i += 1;
5196 : : }
5197 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "]", 1);
5198 : 0 : }
5199 : :
5200 : :
5201 : : /*
5202 : : IncludeType -
5203 : : */
5204 : :
5205 : 0 : static void IncludeType (Lists_List l, unsigned int sym)
5206 : : {
5207 : 0 : unsigned int t;
5208 : :
5209 : 0 : t = SymbolTable_GetSType (sym);
5210 : 0 : if (t != SymbolTable_NulSym)
5211 : : {
5212 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " type [", 7);
5213 : 0 : PrintTerse (t);
5214 : 0 : Lists_IncludeItemIntoList (l, t);
5215 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "]", 1);
5216 : 0 : t = SymbolTable_GetVarBackEndType (sym);
5217 : 0 : if (t != SymbolTable_NulSym)
5218 : : {
5219 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " gcc type [", 11);
5220 : 0 : PrintTerse (t);
5221 : 0 : Lists_IncludeItemIntoList (l, t);
5222 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "]", 1);
5223 : : }
5224 : : }
5225 : 0 : }
5226 : :
5227 : :
5228 : : /*
5229 : : IncludeSubscript -
5230 : : */
5231 : :
5232 : 0 : static void IncludeSubscript (Lists_List l, unsigned int sym)
5233 : : {
5234 : 0 : unsigned int t;
5235 : :
5236 : 0 : t = SymbolTable_GetArraySubscript (sym);
5237 : 0 : if (t != SymbolTable_NulSym)
5238 : : {
5239 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " subrange [", 11);
5240 : 0 : PrintTerse (t);
5241 : 0 : Lists_IncludeItemIntoList (l, t);
5242 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "]", 1);
5243 : : }
5244 : 0 : }
5245 : :
5246 : :
5247 : : /*
5248 : : PrintLocalSymbol -
5249 : : */
5250 : :
5251 : 0 : static void PrintLocalSymbol (unsigned int sym)
5252 : : {
5253 : 0 : PrintTerse (sym);
5254 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) ", ", 2);
5255 : 0 : }
5256 : :
5257 : :
5258 : : /*
5259 : : PrintLocalSymbols -
5260 : : */
5261 : :
5262 : 0 : static void PrintLocalSymbols (unsigned int sym)
5263 : : {
5264 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "Local Symbols {", 15);
5265 : 0 : SymbolTable_ForeachLocalSymDo (sym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) PrintLocalSymbol});
5266 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "}", 1);
5267 : 0 : }
5268 : :
5269 : :
5270 : : /*
5271 : : IncludeGetVarient -
5272 : : */
5273 : :
5274 : 0 : static void IncludeGetVarient (Lists_List l, unsigned int sym)
5275 : : {
5276 : 0 : if ((SymbolTable_GetVarient (sym)) != SymbolTable_NulSym)
5277 : : {
5278 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " Varient [", 10);
5279 : 0 : PrintTerse (SymbolTable_GetVarient (sym));
5280 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "]", 1);
5281 : 0 : Lists_IncludeItemIntoList (l, SymbolTable_GetVarient (sym));
5282 : : }
5283 : 0 : }
5284 : :
5285 : :
5286 : : /*
5287 : : IncludeUnbounded - includes the record component of an unbounded type.
5288 : : */
5289 : :
5290 : 0 : static void IncludeUnbounded (Lists_List l, unsigned int sym)
5291 : : {
5292 : 0 : if ((SymbolTable_GetUnboundedRecordType (sym)) != SymbolTable_NulSym)
5293 : : {
5294 : 0 : Lists_IncludeItemIntoList (l, SymbolTable_GetUnboundedRecordType (sym));
5295 : : }
5296 : 0 : }
5297 : :
5298 : :
5299 : : /*
5300 : : IncludePartialUnbounded - includes the type component of a partial unbounded symbol.
5301 : : */
5302 : :
5303 : 0 : static void IncludePartialUnbounded (Lists_List l, unsigned int sym)
5304 : : {
5305 : 0 : if ((SymbolTable_GetSType (sym)) != SymbolTable_NulSym)
5306 : : {
5307 : 0 : Lists_IncludeItemIntoList (l, SymbolTable_GetSType (sym));
5308 : : }
5309 : 0 : }
5310 : :
5311 : :
5312 : : /*
5313 : : PrintDeclared - prints out where, sym, was declared.
5314 : : */
5315 : :
5316 : 0 : static void PrintDeclared (unsigned int sym)
5317 : : {
5318 : 0 : DynamicStrings_String filename;
5319 : 0 : unsigned int lineno;
5320 : 0 : unsigned int tokenno;
5321 : :
5322 : 0 : tokenno = SymbolTable_GetDeclaredMod (sym);
5323 : 0 : filename = M2LexBuf_FindFileNameFromToken (tokenno, 0);
5324 : 0 : lineno = M2LexBuf_TokenToLineNo (tokenno, 0);
5325 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) " declared in %s:%d", 18, (const unsigned char *) &filename, (sizeof (filename)-1), (const unsigned char *) &lineno, (sizeof (lineno)-1));
5326 : 0 : }
5327 : :
5328 : :
5329 : : /*
5330 : : PrintAlignment -
5331 : : */
5332 : :
5333 : 0 : static void PrintAlignment (unsigned int sym)
5334 : : {
5335 : 0 : unsigned int align;
5336 : :
5337 : 0 : if (((((SymbolTable_IsRecord (sym)) || (SymbolTable_IsType (sym))) || (SymbolTable_IsRecordField (sym))) || (SymbolTable_IsPointer (sym))) || (SymbolTable_IsArray (sym)))
5338 : : {
5339 : 0 : align = SymbolTable_GetAlignment (sym);
5340 : 0 : if (align != SymbolTable_NulSym)
5341 : : {
5342 : 0 : M2Printf_fprintf1 (M2LangDump_GetDumpFile (), (const char *) " aligned [%d]", 13, (const unsigned char *) &align, (sizeof (align)-1));
5343 : : }
5344 : : }
5345 : 0 : }
5346 : :
5347 : :
5348 : : /*
5349 : : IncludeGetParent -
5350 : : */
5351 : :
5352 : 0 : static void IncludeGetParent (Lists_List l, unsigned int sym)
5353 : : {
5354 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " Parent [", 9);
5355 : 0 : Lists_IncludeItemIntoList (l, SymbolTable_GetParent (sym));
5356 : 0 : PrintTerse (SymbolTable_GetParent (sym));
5357 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "]", 1);
5358 : 0 : }
5359 : :
5360 : :
5361 : : /*
5362 : : PrintDecl -
5363 : : */
5364 : :
5365 : 0 : static void PrintDecl (unsigned int sym)
5366 : : {
5367 : 0 : if (SymbolTable_IsDeclaredPackedResolved (sym))
5368 : : {
5369 : 0 : if (SymbolTable_IsDeclaredPacked (sym))
5370 : : {
5371 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " packed", 7);
5372 : : }
5373 : : else
5374 : : {
5375 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " unpacked", 9);
5376 : : }
5377 : : }
5378 : : else
5379 : : {
5380 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " unknown if packed", 18);
5381 : : }
5382 : 0 : }
5383 : :
5384 : :
5385 : : /*
5386 : : PrintScope - displays the scope and line number of declaration of symbol, sym.
5387 : : */
5388 : :
5389 : 0 : static void PrintScope (unsigned int sym)
5390 : : {
5391 : 0 : NameKey_Name name;
5392 : 0 : unsigned int scope;
5393 : 0 : unsigned int line;
5394 : :
5395 : 0 : line = M2LexBuf_TokenToLineNo (SymbolTable_GetDeclaredMod (sym), 0);
5396 : 0 : scope = SymbolTable_GetScope (sym);
5397 : 0 : name = SymbolTable_GetSymName (scope);
5398 : 0 : M2Printf_fprintf3 (M2LangDump_GetDumpFile (), (const char *) " scope %a:%d %d", 15, (const unsigned char *) &name, (sizeof (name)-1), (const unsigned char *) &line, (sizeof (line)-1), (const unsigned char *) &scope, (sizeof (scope)-1));
5399 : 0 : }
5400 : :
5401 : :
5402 : : /*
5403 : : PrintKind -
5404 : : */
5405 : :
5406 : 0 : static void PrintKind (SymbolTable_ProcedureKind kind)
5407 : : {
5408 : 0 : DynamicStrings_String s;
5409 : :
5410 : 0 : s = SymbolTable_GetProcedureKindDesc (kind);
5411 : 0 : M2Printf_fprintf1 (M2LangDump_GetDumpFile (), (const char *) "%s", 2, (const unsigned char *) &s, (sizeof (s)-1));
5412 : 0 : s = DynamicStrings_KillString (s);
5413 : 0 : }
5414 : :
5415 : :
5416 : : /*
5417 : : PrintProcedureParameters -
5418 : : */
5419 : :
5420 : 0 : static void PrintProcedureParameters (unsigned int sym, SymbolTable_ProcedureKind kind)
5421 : : {
5422 : 0 : NameKey_Name typeName;
5423 : 0 : NameKey_Name paramName;
5424 : 0 : unsigned int p;
5425 : 0 : unsigned int i;
5426 : 0 : unsigned int n;
5427 : 0 : unsigned int type;
5428 : :
5429 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " (", 2);
5430 : 0 : n = SymbolTable_NoOfParam (sym, kind);
5431 : 0 : i = 1;
5432 : 0 : while (i <= n)
5433 : : {
5434 : 0 : if (i > 1)
5435 : : {
5436 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "; ", 2);
5437 : : }
5438 : 0 : if (SymbolTable_IsVarParam (sym, kind, i))
5439 : : {
5440 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "VAR ", 4);
5441 : : }
5442 : 0 : p = SymbolTable_GetNthParam (sym, kind, i);
5443 : 0 : paramName = SymbolTable_GetSymName (p);
5444 : 0 : type = SymbolTable_GetType (p);
5445 : 0 : typeName = SymbolTable_GetSymName (type);
5446 : 0 : if (SymbolTable_IsUnboundedParam (sym, kind, i))
5447 : : {
5448 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "%a: ARRAY OF %a", 15, (const unsigned char *) ¶mName, (sizeof (paramName)-1), (const unsigned char *) &typeName, (sizeof (typeName)-1));
5449 : : }
5450 : : else
5451 : : {
5452 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "%a: %a", 6, (const unsigned char *) ¶mName, (sizeof (paramName)-1), (const unsigned char *) &typeName, (sizeof (typeName)-1));
5453 : : }
5454 : 0 : i += 1;
5455 : : }
5456 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) ")", 1);
5457 : 0 : }
5458 : :
5459 : :
5460 : : /*
5461 : : PrintProcedureReturnType -
5462 : : */
5463 : :
5464 : 0 : static void PrintProcedureReturnType (unsigned int sym)
5465 : : {
5466 : 0 : NameKey_Name typeName;
5467 : :
5468 : 0 : if ((SymbolTable_GetType (sym)) != SymbolTable_NulSym)
5469 : : {
5470 : 0 : typeName = SymbolTable_GetSymName (SymbolTable_GetType (sym));
5471 : 0 : M2Printf_fprintf1 (M2LangDump_GetDumpFile (), (const char *) " : %a", 5, (const unsigned char *) &typeName, (sizeof (typeName)-1));
5472 : : }
5473 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " ;", 2);
5474 : 0 : }
5475 : :
5476 : :
5477 : : /*
5478 : : PrintProcedure -
5479 : : */
5480 : :
5481 : 0 : static void PrintProcedure (unsigned int sym)
5482 : : {
5483 : 0 : NameKey_Name n;
5484 : 0 : SymbolTable_ProcedureKind kind;
5485 : :
5486 : 0 : n = SymbolTable_GetSymName (sym);
5487 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsProcedure (%a)", 23, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5488 : 0 : if (SymbolTable_IsProcedureReachable (sym))
5489 : : {
5490 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " IsProcedureReachable", 21);
5491 : : }
5492 : 0 : PrintScope (sym);
5493 : 0 : if (SymbolTable_IsExtern (sym))
5494 : : {
5495 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " extern", 7);
5496 : : }
5497 : 0 : if (SymbolTable_IsPublic (sym))
5498 : : {
5499 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " public", 7);
5500 : : }
5501 : 0 : if (SymbolTable_IsCtor (sym))
5502 : : {
5503 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " ctor", 5);
5504 : : }
5505 : 0 : PrintDeclared (sym);
5506 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "\\n", 2);
5507 : 0 : for (kind=SymbolTable_ProperProcedure; kind<=SymbolTable_DefProcedure; kind= static_cast<SymbolTable_ProcedureKind>(static_cast<int>(kind+1)))
5508 : : {
5509 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "parameters ", 11);
5510 : 0 : PrintKind (kind);
5511 : 0 : if (SymbolTable_GetProcedureParametersDefined (sym, kind))
5512 : : {
5513 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " defined", 8);
5514 : 0 : PrintProcedureParameters (sym, kind);
5515 : 0 : PrintProcedureReturnType (sym);
5516 : : }
5517 : : else
5518 : : {
5519 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " undefined", 10);
5520 : : }
5521 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "\\n", 2);
5522 : : }
5523 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " Associated proctype: ", 22);
5524 : 0 : PrintProcType (SymbolTable_GetProcedureProcType (sym));
5525 : 0 : }
5526 : :
5527 : :
5528 : : /*
5529 : : PrintProcTypeParameters -
5530 : : */
5531 : :
5532 : 0 : static void PrintProcTypeParameters (unsigned int sym)
5533 : : {
5534 : 0 : NameKey_Name typeName;
5535 : 0 : unsigned int p;
5536 : 0 : unsigned int i;
5537 : 0 : unsigned int n;
5538 : 0 : unsigned int type;
5539 : :
5540 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " (", 2);
5541 : 0 : n = SymbolTable_NoOfParam (sym, SymbolTable_ProperProcedure);
5542 : 0 : i = 1;
5543 : 0 : while (i <= n)
5544 : : {
5545 : 0 : if (i > 1)
5546 : : {
5547 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "; ", 2);
5548 : : }
5549 : 0 : if (SymbolTable_IsVarParam (sym, SymbolTable_ProperProcedure, i))
5550 : : {
5551 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "VAR ", 4);
5552 : : }
5553 : 0 : p = SymbolTable_GetNthParam (sym, SymbolTable_ProperProcedure, i);
5554 : 0 : type = SymbolTable_GetType (p);
5555 : 0 : typeName = SymbolTable_GetSymName (type);
5556 : 0 : if (SymbolTable_IsUnboundedParam (sym, SymbolTable_ProperProcedure, i))
5557 : : {
5558 : 0 : M2Printf_fprintf1 (M2LangDump_GetDumpFile (), (const char *) "ARRAY OF %a", 11, (const unsigned char *) &typeName, (sizeof (typeName)-1));
5559 : : }
5560 : : else
5561 : : {
5562 : 0 : M2Printf_fprintf1 (M2LangDump_GetDumpFile (), (const char *) "%a", 2, (const unsigned char *) &typeName, (sizeof (typeName)-1));
5563 : : }
5564 : 0 : i += 1;
5565 : : }
5566 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) ")", 1);
5567 : 0 : }
5568 : :
5569 : :
5570 : : /*
5571 : : PrintProcType -
5572 : : */
5573 : :
5574 : 0 : static void PrintProcType (unsigned int sym)
5575 : : {
5576 : 0 : NameKey_Name n;
5577 : :
5578 : 0 : n = SymbolTable_GetSymName (sym);
5579 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsProcType (%a)", 22, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5580 : 0 : PrintScope (sym);
5581 : 0 : PrintDeclared (sym);
5582 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "\\n", 2);
5583 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "parameters ", 11);
5584 : 0 : PrintProcTypeParameters (sym);
5585 : 0 : PrintProcedureReturnType (sym);
5586 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "\\n", 2);
5587 : 0 : }
5588 : :
5589 : :
5590 : : /*
5591 : : PrintString -
5592 : : */
5593 : :
5594 : 0 : static void PrintString (unsigned int sym)
5595 : : {
5596 : 0 : unsigned int len;
5597 : 0 : unsigned int tokenno;
5598 : :
5599 : 0 : if (SymbolTable_IsConstStringKnown (sym))
5600 : : {
5601 : 0 : if (SymbolTable_IsConstStringM2 (sym))
5602 : : {
5603 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "a Modula-2 string", 17);
5604 : : }
5605 : 0 : else if (SymbolTable_IsConstStringC (sym))
5606 : : {
5607 : : /* avoid dangling else. */
5608 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " a C string", 11);
5609 : : }
5610 : 0 : else if (SymbolTable_IsConstStringM2nul (sym))
5611 : : {
5612 : : /* avoid dangling else. */
5613 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " a nul terminated Modula-2 string", 33);
5614 : : }
5615 : 0 : else if (SymbolTable_IsConstStringCnul (sym))
5616 : : {
5617 : : /* avoid dangling else. */
5618 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " a nul terminated C string", 26);
5619 : : }
5620 : 0 : tokenno = SymbolTable_GetDeclaredMod (sym);
5621 : 0 : len = SymbolTable_GetStringLength (tokenno, sym);
5622 : 0 : M2Printf_fprintf1 (M2LangDump_GetDumpFile (), (const char *) " length %d", 10, (const unsigned char *) &len, (sizeof (len)-1));
5623 : : }
5624 : : else
5625 : : {
5626 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "is not currently known", 22);
5627 : : }
5628 : 0 : }
5629 : :
5630 : :
5631 : : /*
5632 : : PrintVerboseFromList - prints the, i, th element in the list, l.
5633 : : */
5634 : :
5635 : 0 : static void PrintVerboseFromList (Lists_List l, unsigned int i)
5636 : : {
5637 : 0 : unsigned int type;
5638 : 0 : unsigned int low;
5639 : 0 : unsigned int high;
5640 : 0 : unsigned int sym;
5641 : 0 : NameKey_Name n;
5642 : 0 : NameKey_Name n2;
5643 : :
5644 : 0 : sym = static_cast<unsigned int> (Lists_GetItemFromList (l, i));
5645 : 0 : n = SymbolTable_GetSymName (sym);
5646 : 0 : if (SymbolTable_IsError (sym))
5647 : : {
5648 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsError (%a)", 19, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5649 : : }
5650 : 0 : else if (SymbolTable_IsDefImp (sym))
5651 : : {
5652 : : /* avoid dangling else. */
5653 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsDefImp (%a)", 20, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5654 : 0 : if (SymbolTable_IsDefinitionForC (sym))
5655 : : {
5656 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "and IsDefinitionForC", 20);
5657 : : }
5658 : 0 : if (SymbolTable_IsHiddenTypeDeclared (sym))
5659 : : {
5660 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " IsHiddenTypeDeclared", 21);
5661 : : }
5662 : 0 : SymbolTable_ForeachProcedureDo (sym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) PrintProcedure});
5663 : : }
5664 : 0 : else if (SymbolTable_IsModule (sym))
5665 : : {
5666 : : /* avoid dangling else. */
5667 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsModule (%a)", 20, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5668 : 0 : if (SymbolTable_IsModuleWithinProcedure (sym))
5669 : : {
5670 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " and IsModuleWithinProcedure", 28);
5671 : : }
5672 : : }
5673 : 0 : else if (SymbolTable_IsInnerModule (sym))
5674 : : {
5675 : : /* avoid dangling else. */
5676 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsInnerModule (%a)", 25, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5677 : : }
5678 : 0 : else if (SymbolTable_IsUnknown (sym))
5679 : : {
5680 : : /* avoid dangling else. */
5681 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsUnknown (%a)", 21, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5682 : : }
5683 : 0 : else if (SymbolTable_IsType (sym))
5684 : : {
5685 : : /* avoid dangling else. */
5686 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsType (%a)", 18, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5687 : 0 : IncludeType (l, sym);
5688 : 0 : PrintAlignment (sym);
5689 : : }
5690 : 0 : else if (SymbolTable_IsProcedure (sym))
5691 : : {
5692 : : /* avoid dangling else. */
5693 : 0 : PrintProcedure (sym);
5694 : : }
5695 : 0 : else if (SymbolTable_IsParameter (sym))
5696 : : {
5697 : : /* avoid dangling else. */
5698 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsParameter (%a)", 23, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5699 : 0 : if ((SymbolTable_GetParameterShadowVar (sym)) == SymbolTable_NulSym)
5700 : : {
5701 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " no shadow local variable", 25);
5702 : : }
5703 : : else
5704 : : {
5705 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " shadow ", 8);
5706 : : /* PrintVerboseFromList(l, GetParameterShadowVar(sym)) */
5707 : 0 : IncludeType (l, SymbolTable_GetParameterShadowVar (sym));
5708 : : }
5709 : 0 : IncludeType (l, sym);
5710 : : }
5711 : 0 : else if (SymbolTable_IsPointer (sym))
5712 : : {
5713 : : /* avoid dangling else. */
5714 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsPointer (%a)", 21, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5715 : 0 : IncludeType (l, sym);
5716 : 0 : PrintAlignment (sym);
5717 : : }
5718 : 0 : else if (SymbolTable_IsRecord (sym))
5719 : : {
5720 : : /* avoid dangling else. */
5721 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsRecord (%a)", 20, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5722 : 0 : PrintLocalSymbols (sym);
5723 : 0 : IncludeGetNth (l, sym);
5724 : 0 : PrintAlignment (sym);
5725 : 0 : PrintDecl (sym);
5726 : : }
5727 : 0 : else if (SymbolTable_IsVarient (sym))
5728 : : {
5729 : : /* avoid dangling else. */
5730 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsVarient (%a)", 21, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5731 : 0 : PrintDecl (sym);
5732 : 0 : IncludeGetNth (l, sym);
5733 : 0 : IncludeGetVarient (l, sym);
5734 : 0 : IncludeGetParent (l, sym);
5735 : : }
5736 : 0 : else if (SymbolTable_IsFieldVarient (sym))
5737 : : {
5738 : : /* avoid dangling else. */
5739 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsFieldVarient (%a)", 26, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5740 : 0 : PrintDecl (sym);
5741 : 0 : IncludeGetNth (l, sym);
5742 : 0 : IncludeGetVarient (l, sym);
5743 : 0 : IncludeGetParent (l, sym);
5744 : : }
5745 : 0 : else if (SymbolTable_IsFieldEnumeration (sym))
5746 : : {
5747 : : /* avoid dangling else. */
5748 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsFieldEnumeration (%a)", 30, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5749 : : }
5750 : 0 : else if (SymbolTable_IsArray (sym))
5751 : : {
5752 : : /* avoid dangling else. */
5753 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsArray (%a)", 19, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5754 : 0 : IncludeSubscript (l, sym);
5755 : 0 : IncludeType (l, sym);
5756 : 0 : PrintAlignment (sym);
5757 : : }
5758 : 0 : else if (SymbolTable_IsEnumeration (sym))
5759 : : {
5760 : : /* avoid dangling else. */
5761 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsEnumeration (%a)", 25, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5762 : : }
5763 : 0 : else if (SymbolTable_IsSet (sym))
5764 : : {
5765 : : /* avoid dangling else. */
5766 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsSet (%a)", 17, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5767 : 0 : IncludeType (l, sym);
5768 : : }
5769 : 0 : else if (SymbolTable_IsUnbounded (sym))
5770 : : {
5771 : : /* avoid dangling else. */
5772 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsUnbounded (%a)", 23, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5773 : 0 : IncludeUnbounded (l, sym);
5774 : : }
5775 : 0 : else if (SymbolTable_IsPartialUnbounded (sym))
5776 : : {
5777 : : /* avoid dangling else. */
5778 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsPartialUnbounded (%a)", 30, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5779 : 0 : IncludePartialUnbounded (l, sym);
5780 : : }
5781 : 0 : else if (SymbolTable_IsRecordField (sym))
5782 : : {
5783 : : /* avoid dangling else. */
5784 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsRecordField (%a)", 25, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5785 : 0 : if (SymbolTable_IsRecordFieldAVarientTag (sym))
5786 : : {
5787 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " variant tag", 12);
5788 : : }
5789 : 0 : IncludeType (l, sym);
5790 : 0 : IncludeGetVarient (l, sym);
5791 : 0 : IncludeGetParent (l, sym);
5792 : 0 : PrintAlignment (sym);
5793 : 0 : PrintDecl (sym);
5794 : : }
5795 : 0 : else if (SymbolTable_IsProcType (sym))
5796 : : {
5797 : : /* avoid dangling else. */
5798 : 0 : PrintProcType (sym);
5799 : : }
5800 : 0 : else if (SymbolTable_IsVar (sym))
5801 : : {
5802 : : /* avoid dangling else. */
5803 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsVar (%a) declared in ", 30, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5804 : 0 : PrintScope (sym);
5805 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "mode ", 5);
5806 : 0 : switch (SymbolTable_GetMode (sym))
5807 : : {
5808 : 0 : case SymbolTable_LeftValue:
5809 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "l ", 2);
5810 : 0 : break;
5811 : :
5812 : 0 : case SymbolTable_RightValue:
5813 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "r ", 2);
5814 : 0 : break;
5815 : :
5816 : 0 : case SymbolTable_ImmediateValue:
5817 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "i ", 2);
5818 : 0 : break;
5819 : :
5820 : 0 : case SymbolTable_NoValue:
5821 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "n ", 2);
5822 : 0 : break;
5823 : :
5824 : :
5825 : 0 : default:
5826 : 0 : CaseException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/M2GCCDeclare.def", 20, 1);
5827 : 0 : __builtin_unreachable ();
5828 : : }
5829 : 0 : if (SymbolTable_IsTemporary (sym))
5830 : : {
5831 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "temporary ", 10);
5832 : : }
5833 : 0 : if (SymbolTable_IsComponent (sym))
5834 : : {
5835 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "component ", 10);
5836 : : }
5837 : 0 : if (SymbolTable_IsVarHeap (sym))
5838 : : {
5839 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "heap ", 5);
5840 : : }
5841 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "\\n", 2);
5842 : 0 : SymbolTable_PrintInitialized (sym);
5843 : 0 : IncludeType (l, sym);
5844 : : }
5845 : 0 : else if (SymbolTable_IsConst (sym))
5846 : : {
5847 : : /* avoid dangling else. */
5848 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsConst (%a)", 19, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5849 : 0 : if (SymbolTable_IsConstString (sym))
5850 : : {
5851 : 0 : M2Printf_fprintf1 (M2LangDump_GetDumpFile (), (const char *) " also IsConstString (%a)", 25, (const unsigned char *) &n, (sizeof (n)-1));
5852 : 0 : PrintString (sym);
5853 : : }
5854 : 0 : else if (SymbolTable_IsConstructor (sym))
5855 : : {
5856 : : /* avoid dangling else. */
5857 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " constant constructor ", 22);
5858 : 0 : IncludeType (l, sym);
5859 : : }
5860 : 0 : else if (SymbolTable_IsConstSet (sym))
5861 : : {
5862 : : /* avoid dangling else. */
5863 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " constant constructor set ", 26);
5864 : 0 : IncludeType (l, sym);
5865 : : }
5866 : : else
5867 : : {
5868 : : /* avoid dangling else. */
5869 : 0 : IncludeType (l, sym);
5870 : : }
5871 : : }
5872 : 0 : else if (SymbolTable_IsConstructor (sym))
5873 : : {
5874 : : /* avoid dangling else. */
5875 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsConstructor (non constant) (%a)", 40, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5876 : 0 : IncludeType (l, sym);
5877 : : }
5878 : 0 : else if (SymbolTable_IsConstLit (sym))
5879 : : {
5880 : : /* avoid dangling else. */
5881 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsConstLit (%a)", 22, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5882 : : }
5883 : 0 : else if (SymbolTable_IsDummy (sym))
5884 : : {
5885 : : /* avoid dangling else. */
5886 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsDummy (%a)", 19, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5887 : : }
5888 : 0 : else if (SymbolTable_IsTemporary (sym))
5889 : : {
5890 : : /* avoid dangling else. */
5891 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsTemporary (%a)", 23, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5892 : : }
5893 : 0 : else if (SymbolTable_IsVarAParam (sym))
5894 : : {
5895 : : /* avoid dangling else. */
5896 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsVarAParam (%a)", 23, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5897 : : }
5898 : 0 : else if (SymbolTable_IsSubscript (sym))
5899 : : {
5900 : : /* avoid dangling else. */
5901 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsSubscript (%a)", 23, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5902 : : }
5903 : 0 : else if (SymbolTable_IsSubrange (sym))
5904 : : {
5905 : : /* avoid dangling else. */
5906 : 0 : SymbolTable_GetSubrange (sym, &high, &low);
5907 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsSubrange (%a)", 22, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5908 : 0 : if ((low != SymbolTable_NulSym) && (high != SymbolTable_NulSym))
5909 : : {
5910 : 0 : type = SymbolTable_GetSType (sym);
5911 : 0 : if (type != SymbolTable_NulSym)
5912 : : {
5913 : 0 : IncludeType (l, sym);
5914 : 0 : n = SymbolTable_GetSymName (type);
5915 : 0 : M2Printf_fprintf1 (M2LangDump_GetDumpFile (), (const char *) " %a", 3, (const unsigned char *) &n, (sizeof (n)-1));
5916 : : }
5917 : 0 : n = SymbolTable_GetSymName (low);
5918 : 0 : n2 = SymbolTable_GetSymName (high);
5919 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "[%a..%a]", 8, (const unsigned char *) &n, (sizeof (n)-1), (const unsigned char *) &n2, (sizeof (n2)-1));
5920 : : }
5921 : : }
5922 : 0 : else if (SymbolTable_IsProcedureVariable (sym))
5923 : : {
5924 : : /* avoid dangling else. */
5925 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsProcedureVariable (%a)", 31, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5926 : : }
5927 : 0 : else if (SymbolTable_IsProcedureNested (sym))
5928 : : {
5929 : : /* avoid dangling else. */
5930 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsProcedureNested (%a)", 29, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5931 : : }
5932 : 0 : else if (SymbolTable_IsAModula2Type (sym))
5933 : : {
5934 : : /* avoid dangling else. */
5935 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsAModula2Type (%a)", 26, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5936 : : }
5937 : 0 : else if (SymbolTable_IsObject (sym))
5938 : : {
5939 : : /* avoid dangling else. */
5940 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsObject (%a)", 20, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5941 : : }
5942 : 0 : else if (SymbolTable_IsTuple (sym))
5943 : : {
5944 : : /* avoid dangling else. */
5945 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsTuple (%a)", 19, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5946 : 0 : low = SymbolTable_GetNth (sym, 1);
5947 : 0 : high = SymbolTable_GetNth (sym, 2);
5948 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "%d, %d\\n", 8, (const unsigned char *) &low, (sizeof (low)-1), (const unsigned char *) &high, (sizeof (high)-1));
5949 : : }
5950 : 0 : else if (SymbolTable_IsGnuAsm (sym))
5951 : : {
5952 : : /* avoid dangling else. */
5953 : 0 : if (SymbolTable_IsGnuAsmVolatile (sym))
5954 : : {
5955 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsGnuAsmVolatile (%a)", 28, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5956 : : }
5957 : : else
5958 : : {
5959 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsGnuAsm (%a)", 20, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5960 : : }
5961 : : }
5962 : 0 : else if (SymbolTable_IsComponent (sym))
5963 : : {
5964 : : /* avoid dangling else. */
5965 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsComponent (%a) ", 24, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
5966 : 0 : i = 1;
5967 : 0 : do {
5968 : 0 : type = SymbolTable_GetNth (sym, i);
5969 : 0 : if (type != SymbolTable_NulSym)
5970 : : {
5971 : 0 : Lists_IncludeItemIntoList (l, type);
5972 : 0 : n = SymbolTable_GetSymName (type);
5973 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "[%a %d] ", 8, (const unsigned char *) &n, (sizeof (n)-1), (const unsigned char *) &type, (sizeof (type)-1));
5974 : 0 : i += 1;
5975 : : }
5976 : 0 : } while (! (type == SymbolTable_NulSym));
5977 : : }
5978 : 0 : if (SymbolTable_IsHiddenType (sym))
5979 : : {
5980 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " IsHiddenType", 13);
5981 : : }
5982 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "\\n", 2);
5983 : 0 : }
5984 : :
5985 : :
5986 : : /*
5987 : : PrintVerbose - prints limited information about a symbol.
5988 : : */
5989 : :
5990 : 0 : static void PrintVerbose (unsigned int sym)
5991 : : {
5992 : 0 : Lists_List l;
5993 : 0 : unsigned int i;
5994 : :
5995 : 0 : Lists_InitList (&l);
5996 : 0 : Lists_IncludeItemIntoList (l, sym);
5997 : 0 : i = 1;
5998 : 0 : while (i <= (Lists_NoOfItemsInList (l)))
5999 : : {
6000 : 0 : PrintVerboseFromList (l, i);
6001 : 0 : i += 1;
6002 : : }
6003 : 0 : Lists_KillList (&l);
6004 : 0 : }
6005 : :
6006 : :
6007 : : /*
6008 : : PrintTerse -
6009 : : */
6010 : :
6011 : 0 : static void PrintTerse (unsigned int sym)
6012 : : {
6013 : 0 : NameKey_Name n;
6014 : :
6015 : 0 : n = SymbolTable_GetSymName (sym);
6016 : 0 : if (SymbolTable_IsError (sym))
6017 : : {
6018 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsError (%a)", 19, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6019 : : }
6020 : 0 : else if (SymbolTable_IsDefImp (sym))
6021 : : {
6022 : : /* avoid dangling else. */
6023 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsDefImp (%a)", 20, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6024 : 0 : if (SymbolTable_IsDefinitionForC (sym))
6025 : : {
6026 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "and IsDefinitionForC", 20);
6027 : : }
6028 : 0 : if (SymbolTable_IsHiddenTypeDeclared (sym))
6029 : : {
6030 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " IsHiddenTypeDeclared", 21);
6031 : : }
6032 : : }
6033 : 0 : else if (SymbolTable_IsModule (sym))
6034 : : {
6035 : : /* avoid dangling else. */
6036 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsModule (%a)", 20, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6037 : 0 : if (SymbolTable_IsModuleWithinProcedure (sym))
6038 : : {
6039 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " and IsModuleWithinProcedure", 28);
6040 : : }
6041 : : }
6042 : 0 : else if (SymbolTable_IsInnerModule (sym))
6043 : : {
6044 : : /* avoid dangling else. */
6045 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsInnerModule (%a)", 25, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6046 : : }
6047 : 0 : else if (SymbolTable_IsUnknown (sym))
6048 : : {
6049 : : /* avoid dangling else. */
6050 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsUnknown (%a)", 21, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6051 : : }
6052 : 0 : else if (SymbolTable_IsType (sym))
6053 : : {
6054 : : /* avoid dangling else. */
6055 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsType (%a)", 18, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6056 : : }
6057 : 0 : else if (SymbolTable_IsProcedure (sym))
6058 : : {
6059 : : /* avoid dangling else. */
6060 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsProcedure (%a)", 23, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6061 : 0 : if (SymbolTable_IsProcedureReachable (sym))
6062 : : {
6063 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " and IsProcedureReachable", 25);
6064 : : }
6065 : : }
6066 : 0 : else if (SymbolTable_IsParameter (sym))
6067 : : {
6068 : : /* avoid dangling else. */
6069 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsParameter (%a)", 23, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6070 : : }
6071 : 0 : else if (SymbolTable_IsPointer (sym))
6072 : : {
6073 : : /* avoid dangling else. */
6074 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsPointer (%a)", 21, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6075 : : }
6076 : 0 : else if (SymbolTable_IsRecord (sym))
6077 : : {
6078 : : /* avoid dangling else. */
6079 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsRecord (%a)", 20, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6080 : : }
6081 : 0 : else if (SymbolTable_IsVarient (sym))
6082 : : {
6083 : : /* avoid dangling else. */
6084 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsVarient (%a)", 21, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6085 : : }
6086 : 0 : else if (SymbolTable_IsFieldVarient (sym))
6087 : : {
6088 : : /* avoid dangling else. */
6089 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsFieldVarient (%a)", 26, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6090 : : }
6091 : 0 : else if (SymbolTable_IsFieldEnumeration (sym))
6092 : : {
6093 : : /* avoid dangling else. */
6094 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsFieldEnumeration (%a)", 30, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6095 : : }
6096 : 0 : else if (SymbolTable_IsArray (sym))
6097 : : {
6098 : : /* avoid dangling else. */
6099 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsArray (%a)", 19, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6100 : : }
6101 : 0 : else if (SymbolTable_IsEnumeration (sym))
6102 : : {
6103 : : /* avoid dangling else. */
6104 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsEnumeration (%a)", 25, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6105 : : }
6106 : 0 : else if (SymbolTable_IsSet (sym))
6107 : : {
6108 : : /* avoid dangling else. */
6109 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsSet (%a)", 17, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6110 : : }
6111 : 0 : else if (SymbolTable_IsUnbounded (sym))
6112 : : {
6113 : : /* avoid dangling else. */
6114 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsUnbounded (%a)", 23, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6115 : : }
6116 : 0 : else if (SymbolTable_IsRecordField (sym))
6117 : : {
6118 : : /* avoid dangling else. */
6119 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsRecordField (%a)", 25, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6120 : : }
6121 : 0 : else if (SymbolTable_IsProcType (sym))
6122 : : {
6123 : : /* avoid dangling else. */
6124 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsProcType (%a)", 22, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6125 : : }
6126 : 0 : else if (SymbolTable_IsVar (sym))
6127 : : {
6128 : : /* avoid dangling else. */
6129 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsVar (%a)", 17, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6130 : : }
6131 : 0 : else if (SymbolTable_IsConstString (sym))
6132 : : {
6133 : : /* avoid dangling else. */
6134 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsConstString (%a)", 25, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6135 : : }
6136 : 0 : else if (SymbolTable_IsConst (sym))
6137 : : {
6138 : : /* avoid dangling else. */
6139 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsConst (%a)", 19, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6140 : : }
6141 : 0 : else if (SymbolTable_IsConstLit (sym))
6142 : : {
6143 : : /* avoid dangling else. */
6144 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsConstLit (%a)", 22, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6145 : : }
6146 : 0 : else if (SymbolTable_IsDummy (sym))
6147 : : {
6148 : : /* avoid dangling else. */
6149 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsDummy (%a)", 19, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6150 : : }
6151 : 0 : else if (SymbolTable_IsTemporary (sym))
6152 : : {
6153 : : /* avoid dangling else. */
6154 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsTemporary (%a)", 23, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6155 : : }
6156 : 0 : else if (SymbolTable_IsVarAParam (sym))
6157 : : {
6158 : : /* avoid dangling else. */
6159 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsVarAParam (%a)", 23, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6160 : : }
6161 : 0 : else if (SymbolTable_IsSubscript (sym))
6162 : : {
6163 : : /* avoid dangling else. */
6164 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsSubscript (%a)", 23, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6165 : : }
6166 : 0 : else if (SymbolTable_IsSubrange (sym))
6167 : : {
6168 : : /* avoid dangling else. */
6169 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsSubrange (%a)", 22, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6170 : : }
6171 : 0 : else if (SymbolTable_IsProcedureVariable (sym))
6172 : : {
6173 : : /* avoid dangling else. */
6174 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsProcedureVariable (%a)", 31, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6175 : : }
6176 : 0 : else if (SymbolTable_IsProcedureNested (sym))
6177 : : {
6178 : : /* avoid dangling else. */
6179 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsProcedureNested (%a)", 29, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6180 : : }
6181 : 0 : else if (SymbolTable_IsAModula2Type (sym))
6182 : : {
6183 : : /* avoid dangling else. */
6184 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsAModula2Type (%a)", 26, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6185 : : }
6186 : 0 : else if (SymbolTable_IsGnuAsm (sym))
6187 : : {
6188 : : /* avoid dangling else. */
6189 : 0 : M2Printf_fprintf2 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsGnuAsm (%a)", 20, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &n, (sizeof (n)-1));
6190 : : }
6191 : 0 : else if (SymbolTable_IsImport (sym))
6192 : : {
6193 : : /* avoid dangling else. */
6194 : 0 : M2Printf_fprintf1 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsImport", 15, (const unsigned char *) &sym, (sizeof (sym)-1));
6195 : : }
6196 : 0 : else if (SymbolTable_IsImportStatement (sym))
6197 : : {
6198 : : /* avoid dangling else. */
6199 : 0 : M2Printf_fprintf1 (M2LangDump_GetDumpFile (), (const char *) "sym %d IsImportStatement", 24, (const unsigned char *) &sym, (sizeof (sym)-1));
6200 : : }
6201 : 0 : if (SymbolTable_IsHiddenType (sym))
6202 : : {
6203 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) " IsHiddenType", 13);
6204 : : }
6205 : 0 : }
6206 : :
6207 : :
6208 : : /*
6209 : : CheckAlignment -
6210 : : */
6211 : :
6212 : 866175 : static tree CheckAlignment (tree type, unsigned int sym)
6213 : : {
6214 : 866175 : unsigned int align;
6215 : :
6216 : 866175 : align = SymbolTable_GetAlignment (sym);
6217 : 866175 : if (align != SymbolTable_NulSym)
6218 : : {
6219 : 192 : M2ALU_PushInt (0);
6220 : 192 : SymbolTable_PushValue (align);
6221 : 192 : if (! (M2ALU_Equ (SymbolTable_GetDeclaredMod (sym))))
6222 : : {
6223 : 84 : return m2type_SetAlignment (type, SymbolConversion_Mod2Gcc (SymbolTable_GetAlignment (sym)));
6224 : : }
6225 : : }
6226 : : return type;
6227 : : /* static analysis guarentees a RETURN statement will be used before here. */
6228 : : __builtin_unreachable ();
6229 : : }
6230 : :
6231 : :
6232 : : /*
6233 : : CheckPragma -
6234 : : */
6235 : :
6236 : 391122 : static tree CheckPragma (tree type, unsigned int sym)
6237 : : {
6238 : 391122 : if (SymbolTable_IsDeclaredPacked (sym))
6239 : : {
6240 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
6241 : 144 : if ((SymbolTable_IsRecordField (sym)) || (SymbolTable_IsFieldVarient (sym)))
6242 : : {
6243 : 108 : type = m2type_SetDeclPacked (type);
6244 : : }
6245 : 36 : else if ((SymbolTable_IsRecord (sym)) || (SymbolTable_IsVarient (sym)))
6246 : : {
6247 : : /* avoid dangling else. */
6248 : 36 : type = m2type_SetTypePacked (type);
6249 : : }
6250 : : }
6251 : 391122 : return CheckAlignment (type, sym);
6252 : : /* static analysis guarentees a RETURN statement will be used before here. */
6253 : : __builtin_unreachable ();
6254 : : }
6255 : :
6256 : :
6257 : : /*
6258 : : IsZero - returns TRUE if symbol, sym, is zero.
6259 : : */
6260 : :
6261 : 36 : static bool IsZero (unsigned int sym)
6262 : : {
6263 : 36 : M2ALU_PushIntegerTree (SymbolConversion_Mod2Gcc (sym));
6264 : 36 : M2ALU_PushInt (0);
6265 : 36 : return M2ALU_Equ (SymbolTable_GetDeclaredMod (sym));
6266 : : /* static analysis guarentees a RETURN statement will be used before here. */
6267 : : __builtin_unreachable ();
6268 : : }
6269 : :
6270 : :
6271 : : /*
6272 : : SetFieldPacked - sets Varient, VarientField and RecordField symbols
6273 : : as packed.
6274 : : */
6275 : :
6276 : 360 : static void SetFieldPacked (unsigned int field)
6277 : : {
6278 : 360 : if (((SymbolTable_IsVarient (field)) || (SymbolTable_IsFieldVarient (field))) || (SymbolTable_IsRecordField (field)))
6279 : : {
6280 : 108 : SymbolTable_PutDeclaredPacked (field, true);
6281 : : }
6282 : 360 : }
6283 : :
6284 : :
6285 : : /*
6286 : : RecordPacked - indicates that record, sym, and its fields
6287 : : are all packed.
6288 : : */
6289 : :
6290 : 36 : static void RecordPacked (unsigned int sym)
6291 : : {
6292 : 36 : SymbolTable_PutDeclaredPacked (sym, true);
6293 : 36 : WalkRecordDependants (sym, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) SetFieldPacked});
6294 : 36 : }
6295 : :
6296 : :
6297 : : /*
6298 : : SetFieldNotPacked - sets Varient, VarientField and RecordField symbols
6299 : : as not packed.
6300 : : */
6301 : :
6302 : 626572 : static void SetFieldNotPacked (unsigned int field)
6303 : : {
6304 : 626572 : if (((SymbolTable_IsVarient (field)) || (SymbolTable_IsFieldVarient (field))) || (SymbolTable_IsRecordField (field)))
6305 : : {
6306 : 313832 : SymbolTable_PutDeclaredPacked (field, false);
6307 : : }
6308 : 626572 : }
6309 : :
6310 : :
6311 : : /*
6312 : : RecordNotPacked - indicates that record, sym, and its fields
6313 : : are all not packed.
6314 : : */
6315 : :
6316 : 78166 : static void RecordNotPacked (unsigned int sym)
6317 : : {
6318 : 78166 : SymbolTable_PutDeclaredPacked (sym, false);
6319 : 78166 : WalkRecordDependants (sym, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) SetFieldNotPacked});
6320 : 78166 : }
6321 : :
6322 : :
6323 : : /*
6324 : : DetermineIfRecordPacked -
6325 : : */
6326 : :
6327 : 78202 : static void DetermineIfRecordPacked (unsigned int sym)
6328 : : {
6329 : 78202 : unsigned int defaultAlignment;
6330 : :
6331 : 78202 : defaultAlignment = SymbolTable_GetDefaultRecordFieldAlignment (sym);
6332 : 78202 : if ((defaultAlignment != SymbolTable_NulSym) && (IsZero (defaultAlignment)))
6333 : : {
6334 : 36 : RecordPacked (sym);
6335 : : }
6336 : : else
6337 : : {
6338 : 78166 : RecordNotPacked (sym);
6339 : : }
6340 : 78202 : }
6341 : :
6342 : :
6343 : : /*
6344 : : DeclarePackedSubrange -
6345 : : */
6346 : :
6347 : 60 : static void DeclarePackedSubrange (unsigned int equiv, unsigned int sym)
6348 : : {
6349 : 60 : tree type;
6350 : 60 : tree gccsym;
6351 : 60 : unsigned int high;
6352 : 60 : unsigned int low;
6353 : 60 : location_t location;
6354 : :
6355 : 60 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (sym));
6356 : 60 : SymbolTable_GetSubrange (sym, &high, &low);
6357 : 60 : type = m2type_BuildSmallestTypeRange (location, SymbolConversion_Mod2Gcc (low), SymbolConversion_Mod2Gcc (high));
6358 : 60 : gccsym = m2type_BuildSubrangeType (location, reinterpret_cast <char * > (NameKey_KeyToCharStar (M2AsmUtil_GetFullSymName (sym))), type, SymbolConversion_Mod2Gcc (low), SymbolConversion_Mod2Gcc (high));
6359 : 60 : SymbolConversion_AddModGcc (equiv, gccsym);
6360 : 60 : }
6361 : :
6362 : :
6363 : : /*
6364 : : DeclarePackedSet -
6365 : : */
6366 : :
6367 : 0 : static void DeclarePackedSet (unsigned int equiv, unsigned int sym)
6368 : : {
6369 : 0 : tree highLimit;
6370 : 0 : tree range;
6371 : 0 : tree gccsym;
6372 : 0 : unsigned int type;
6373 : 0 : unsigned int high;
6374 : 0 : unsigned int low;
6375 : 0 : location_t location;
6376 : :
6377 : 0 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (sym));
6378 : 0 : M2Debug_Assert (SymbolTable_IsSet (sym));
6379 : 0 : type = SymbolTable_GetDType (sym);
6380 : 0 : low = M2GCCDeclare_GetTypeMin (type);
6381 : 0 : high = M2GCCDeclare_GetTypeMax (type);
6382 : 0 : highLimit = m2expr_BuildSub (location, SymbolConversion_Mod2Gcc (high), SymbolConversion_Mod2Gcc (low), false);
6383 : : /* --fixme-- we need to check that low <= WORDLENGTH. */
6384 : 0 : highLimit = m2expr_BuildLSL (location, m2expr_GetIntegerOne (location), highLimit, false);
6385 : 0 : range = m2type_BuildSmallestTypeRange (location, m2expr_GetIntegerZero (location), highLimit);
6386 : 0 : gccsym = m2type_BuildSubrangeType (location, reinterpret_cast <char * > (NameKey_KeyToCharStar (M2AsmUtil_GetFullSymName (sym))), range, m2expr_GetIntegerZero (location), highLimit);
6387 : 0 : SymbolConversion_AddModGcc (equiv, gccsym);
6388 : 0 : }
6389 : :
6390 : 120 : static void DeclarePackedFieldEnumeration (unsigned int sym)
6391 : : {
6392 : 120 : unsigned int equiv;
6393 : 120 : unsigned int type;
6394 : 120 : tree field;
6395 : 120 : tree enumlist;
6396 : :
6397 : : /* add relationship between gccSym and sym */
6398 : 120 : type = SymbolTable_GetSType (sym);
6399 : 120 : equiv = SymbolTable_GetPackedEquivalent (type);
6400 : 120 : enumlist = GetEnumList (equiv);
6401 : 120 : SymbolTable_PushValue (sym);
6402 : 120 : field = DeclareFieldValue (sym, M2ALU_PopIntegerTree (), &enumlist);
6403 : 120 : M2Debug_Assert (field != NULL);
6404 : 120 : PutEnumList (equiv, enumlist);
6405 : 120 : }
6406 : :
6407 : :
6408 : : /*
6409 : : DeclarePackedEnumeration -
6410 : : */
6411 : :
6412 : 36 : static void DeclarePackedEnumeration (unsigned int equiv, unsigned int sym)
6413 : : {
6414 : 36 : tree enumlist;
6415 : 36 : tree gccenum;
6416 : 36 : location_t location;
6417 : :
6418 : 36 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (sym));
6419 : 36 : gccenum = m2type_BuildStartEnumeration (location, reinterpret_cast <char * > (NameKey_KeyToCharStar (M2AsmUtil_GetFullSymName (sym))), true);
6420 : 36 : SymbolTable_ForeachLocalSymDo (sym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) DeclarePackedFieldEnumeration});
6421 : 36 : enumlist = GetEnumList (equiv);
6422 : 36 : gccenum = m2type_BuildEndEnumeration (location, gccenum, enumlist);
6423 : 36 : SymbolConversion_AddModGcc (equiv, gccenum);
6424 : 36 : }
6425 : :
6426 : :
6427 : : /*
6428 : : DeclarePackedType -
6429 : : */
6430 : :
6431 : 0 : static void DeclarePackedType (unsigned int equiv, unsigned int sym)
6432 : : {
6433 : 0 : unsigned int type;
6434 : :
6435 : 0 : type = SymbolTable_GetSType (sym);
6436 : 0 : if (type == SymbolTable_NulSym)
6437 : : {
6438 : 0 : if (sym == M2Base_Boolean)
6439 : : {
6440 : 0 : SymbolConversion_AddModGcc (equiv, m2type_GetPackedBooleanType ());
6441 : : }
6442 : : else
6443 : : {
6444 : 0 : SymbolConversion_AddModGcc (equiv, SymbolConversion_Mod2Gcc (sym));
6445 : : }
6446 : : }
6447 : : else
6448 : : {
6449 : 0 : DeclarePackedType (SymbolTable_GetPackedEquivalent (type), type);
6450 : 0 : SymbolConversion_AddModGcc (equiv, SymbolConversion_Mod2Gcc (SymbolTable_GetPackedEquivalent (type)));
6451 : : }
6452 : 0 : }
6453 : :
6454 : :
6455 : : /*
6456 : : doDeclareEquivalent -
6457 : : */
6458 : :
6459 : 216 : static tree doDeclareEquivalent (unsigned int sym, M2GCCDeclare_doDeclareProcedure p)
6460 : : {
6461 : 216 : unsigned int equiv;
6462 : :
6463 : 216 : equiv = SymbolTable_GetPackedEquivalent (sym);
6464 : 216 : if (! (SymbolConversion_GccKnowsAbout (equiv)))
6465 : : {
6466 : 96 : (*p.proc) (equiv, sym);
6467 : 96 : Sets_IncludeElementIntoSet (GlobalGroup->FullyDeclared, equiv);
6468 : : }
6469 : 216 : return SymbolConversion_Mod2Gcc (equiv);
6470 : : /* static analysis guarentees a RETURN statement will be used before here. */
6471 : : __builtin_unreachable ();
6472 : : }
6473 : :
6474 : :
6475 : : /*
6476 : : PossiblyPacked -
6477 : : */
6478 : :
6479 : 312920 : static tree PossiblyPacked (unsigned int sym, bool isPacked)
6480 : : {
6481 : 312920 : if (isPacked)
6482 : : {
6483 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
6484 : 108 : if (SymbolTable_IsSubrange (sym))
6485 : : {
6486 : 60 : return doDeclareEquivalent (sym, (M2GCCDeclare_doDeclareProcedure) {(M2GCCDeclare_doDeclareProcedure_t) DeclarePackedSubrange});
6487 : : }
6488 : 48 : else if (SymbolTable_IsType (sym))
6489 : : {
6490 : : /* avoid dangling else. */
6491 : 0 : return doDeclareEquivalent (sym, (M2GCCDeclare_doDeclareProcedure) {(M2GCCDeclare_doDeclareProcedure_t) DeclarePackedType});
6492 : : }
6493 : 48 : else if (SymbolTable_IsEnumeration (sym))
6494 : : {
6495 : : /* avoid dangling else. */
6496 : 48 : return doDeclareEquivalent (sym, (M2GCCDeclare_doDeclareProcedure) {(M2GCCDeclare_doDeclareProcedure_t) DeclarePackedEnumeration});
6497 : : }
6498 : 0 : else if (SymbolTable_IsSet (sym))
6499 : : {
6500 : : /* avoid dangling else. */
6501 : 0 : return doDeclareEquivalent (sym, (M2GCCDeclare_doDeclareProcedure) {(M2GCCDeclare_doDeclareProcedure_t) DeclarePackedSet});
6502 : : }
6503 : : }
6504 : 312812 : return SymbolConversion_Mod2Gcc (sym);
6505 : : /* static analysis guarentees a RETURN statement will be used before here. */
6506 : : __builtin_unreachable ();
6507 : : }
6508 : :
6509 : :
6510 : : /*
6511 : : GetPackedType - returns a possibly packed type for field.
6512 : : */
6513 : :
6514 : 108 : static tree GetPackedType (unsigned int sym)
6515 : : {
6516 : 108 : if (SymbolTable_IsSubrange (sym))
6517 : : {
6518 : 60 : return doDeclareEquivalent (sym, (M2GCCDeclare_doDeclareProcedure) {(M2GCCDeclare_doDeclareProcedure_t) DeclarePackedSubrange});
6519 : : }
6520 : 48 : else if (SymbolTable_IsType (sym))
6521 : : {
6522 : : /* avoid dangling else. */
6523 : 0 : return doDeclareEquivalent (sym, (M2GCCDeclare_doDeclareProcedure) {(M2GCCDeclare_doDeclareProcedure_t) DeclarePackedType});
6524 : : }
6525 : 48 : else if (SymbolTable_IsEnumeration (sym))
6526 : : {
6527 : : /* avoid dangling else. */
6528 : 48 : return doDeclareEquivalent (sym, (M2GCCDeclare_doDeclareProcedure) {(M2GCCDeclare_doDeclareProcedure_t) DeclarePackedEnumeration});
6529 : : }
6530 : 0 : return SymbolConversion_Mod2Gcc (sym);
6531 : : /* static analysis guarentees a RETURN statement will be used before here. */
6532 : : __builtin_unreachable ();
6533 : : }
6534 : :
6535 : :
6536 : : /*
6537 : : MaybeAlignField - checks to see whether, field, is packed or aligned and it updates
6538 : : the offsets if appropriate.
6539 : : */
6540 : :
6541 : 313592 : static tree MaybeAlignField (unsigned int field, tree *byteOffset, tree *bitOffset)
6542 : : {
6543 : 313592 : tree f;
6544 : 313592 : tree ftype;
6545 : 313592 : tree nbits;
6546 : 313592 : location_t location;
6547 : :
6548 : 313592 : f = SymbolConversion_Mod2Gcc (field);
6549 : 313592 : if (SymbolTable_IsDeclaredPacked (field))
6550 : : {
6551 : 108 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (field));
6552 : 108 : f = m2type_SetDeclPacked (f);
6553 : 108 : ftype = GetPackedType (SymbolTable_GetSType (field));
6554 : 108 : nbits = m2expr_BuildTBitSize (location, ftype);
6555 : 108 : f = m2type_SetRecordFieldOffset (f, (*byteOffset), (*bitOffset), ftype, nbits);
6556 : 108 : (*bitOffset) = m2expr_BuildAdd (location, (*bitOffset), nbits, false);
6557 : 108 : return f;
6558 : : }
6559 : : else
6560 : : {
6561 : 313484 : return CheckAlignment (f, field);
6562 : : }
6563 : : /* static analysis guarentees a RETURN statement will be used before here. */
6564 : : __builtin_unreachable ();
6565 : : }
6566 : :
6567 : :
6568 : : /*
6569 : : DeclareRecord - declares a record and its fields to gcc.
6570 : : The final gcc record type is returned.
6571 : : */
6572 : :
6573 : 78202 : static tree DeclareRecord (unsigned int Sym)
6574 : : {
6575 : 78202 : unsigned int Field;
6576 : 78202 : unsigned int i;
6577 : 78202 : tree nbits;
6578 : 78202 : tree ftype;
6579 : 78202 : tree field;
6580 : 78202 : tree byteOffset;
6581 : 78202 : tree bitOffset;
6582 : 78202 : tree FieldList;
6583 : 78202 : tree RecordType;
6584 : 78202 : location_t location;
6585 : :
6586 : 78202 : i = 1;
6587 : 78202 : FieldList = (tree) (NULL);
6588 : 78202 : RecordType = DoStartDeclaration (Sym, (M2GCCDeclare_StartProcedure) {(M2GCCDeclare_StartProcedure_t) m2type_BuildStartRecord});
6589 : 78202 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (Sym));
6590 : 78202 : byteOffset = m2expr_GetIntegerZero (location);
6591 : 78202 : bitOffset = m2expr_GetIntegerZero (location);
6592 : 390696 : do {
6593 : 390696 : Field = SymbolTable_GetNth (Sym, i);
6594 : 390696 : if (Field != SymbolTable_NulSym)
6595 : : {
6596 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
6597 : 312494 : if (((SymbolTable_IsRecordField (Field)) && (SymbolTable_IsRecordFieldAVarientTag (Field))) && ((SymbolTable_GetSymName (Field)) == NameKey_NulName))
6598 : : {} /* empty. */
6599 : : /* do not include a nameless tag into the C struct */
6600 : 312464 : else if (SymbolTable_IsVarient (Field))
6601 : : {
6602 : : /* avoid dangling else. */
6603 : 240 : Field = Chained (Field);
6604 : 240 : field = SymbolConversion_Mod2Gcc (Field);
6605 : 240 : if (SymbolTable_IsDeclaredPacked (Field))
6606 : : {
6607 : 0 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (Field));
6608 : 0 : field = m2type_SetDeclPacked (field);
6609 : 0 : ftype = GetPackedType (SymbolTable_GetSType (Field));
6610 : 0 : nbits = m2expr_BuildTBitSize (location, ftype);
6611 : 0 : field = m2type_SetRecordFieldOffset (field, byteOffset, bitOffset, ftype, nbits);
6612 : 0 : bitOffset = m2expr_BuildAdd (location, bitOffset, nbits, false);
6613 : 0 : byteOffset = m2expr_BuildAdd (location, byteOffset, m2expr_BuildDivTrunc (location, bitOffset, m2decl_BuildIntegerConstant (8), false), false);
6614 : 0 : bitOffset = m2expr_BuildModTrunc (location, bitOffset, m2decl_BuildIntegerConstant (8), false);
6615 : : }
6616 : 240 : FieldList = m2type_ChainOn (FieldList, field);
6617 : : }
6618 : : else
6619 : : {
6620 : : /* avoid dangling else. */
6621 : 312224 : if (Debugging)
6622 : : {
6623 : : M2Printf_printf0 ((const char *) "chaining ", 9);
6624 : : PrintTerse (Field);
6625 : : M2Printf_printf0 ((const char *) "\\n", 2);
6626 : : }
6627 : 312224 : FieldList = m2type_ChainOn (FieldList, MaybeAlignField (Chained (Field), &byteOffset, &bitOffset));
6628 : : }
6629 : : }
6630 : 390696 : i += 1;
6631 : 390696 : } while (! (Field == SymbolTable_NulSym));
6632 : 78202 : WatchRemoveList (Sym, M2GCCDeclare_partiallydeclared);
6633 : 78202 : WatchRemoveList (Sym, M2GCCDeclare_heldbyalignment);
6634 : 78202 : WatchRemoveList (Sym, M2GCCDeclare_finishedalignment);
6635 : 78202 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (Sym));
6636 : 78202 : return m2type_BuildEndRecord (location, RecordType, FieldList, SymbolTable_IsDeclaredPacked (Sym));
6637 : : /* static analysis guarentees a RETURN statement will be used before here. */
6638 : : __builtin_unreachable ();
6639 : : }
6640 : :
6641 : :
6642 : : /*
6643 : : DeclareRecordField -
6644 : : */
6645 : :
6646 : 312920 : static tree DeclareRecordField (unsigned int sym)
6647 : : {
6648 : 312920 : tree field;
6649 : 312920 : tree GccFieldType;
6650 : 312920 : location_t location;
6651 : :
6652 : 312920 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (sym));
6653 : 312920 : GccFieldType = PossiblyPacked (SymbolTable_GetSType (sym), SymbolTable_IsDeclaredPacked (sym));
6654 : 312920 : field = m2type_BuildFieldRecord (location, reinterpret_cast <char * > (NameKey_KeyToCharStar (M2AsmUtil_GetFullSymName (sym))), GccFieldType);
6655 : 312920 : return field;
6656 : : /* static analysis guarentees a RETURN statement will be used before here. */
6657 : : __builtin_unreachable ();
6658 : : }
6659 : :
6660 : :
6661 : : /*
6662 : : DeclareVarient - declares a record and its fields to gcc.
6663 : : The final gcc record type is returned.
6664 : : */
6665 : :
6666 : 276 : static tree DeclareVarient (unsigned int sym)
6667 : : {
6668 : 276 : unsigned int Field;
6669 : 276 : unsigned int i;
6670 : 276 : tree byteOffset;
6671 : 276 : tree bitOffset;
6672 : 276 : tree FieldList;
6673 : 276 : tree VarientType;
6674 : 276 : location_t location;
6675 : :
6676 : 276 : i = 1;
6677 : 276 : FieldList = (tree) (NULL);
6678 : 276 : VarientType = DoStartDeclaration (sym, (M2GCCDeclare_StartProcedure) {(M2GCCDeclare_StartProcedure_t) m2type_BuildStartVarient});
6679 : 276 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (sym));
6680 : 276 : byteOffset = m2expr_GetIntegerZero (location);
6681 : 276 : bitOffset = m2expr_GetIntegerZero (location);
6682 : 942 : while ((SymbolTable_GetNth (sym, i)) != SymbolTable_NulSym)
6683 : : {
6684 : 666 : Field = SymbolTable_GetNth (sym, i);
6685 : 666 : if (((SymbolTable_IsRecordField (Field)) && (SymbolTable_IsRecordFieldAVarientTag (Field))) && ((SymbolTable_GetSymName (Field)) == NameKey_NulName))
6686 : : {} /* empty. */
6687 : : else
6688 : : {
6689 : : /* do not include a nameless tag into the C struct */
6690 : 666 : if (Debugging)
6691 : : {
6692 : : M2Printf_printf0 ((const char *) "chaining ", 9);
6693 : : PrintTerse (Field);
6694 : : M2Printf_printf0 ((const char *) "\\n", 2);
6695 : : }
6696 : 666 : FieldList = m2type_ChainOn (FieldList, MaybeAlignField (Chained (Field), &byteOffset, &bitOffset));
6697 : : }
6698 : 666 : i += 1;
6699 : : }
6700 : 276 : WatchRemoveList (sym, M2GCCDeclare_partiallydeclared);
6701 : 276 : WatchRemoveList (sym, M2GCCDeclare_heldbyalignment);
6702 : 276 : WatchRemoveList (sym, M2GCCDeclare_finishedalignment);
6703 : 276 : VarientType = m2type_BuildEndVarient (location, VarientType, FieldList, SymbolTable_IsDeclaredPacked (sym));
6704 : 276 : return VarientType;
6705 : : /* static analysis guarentees a RETURN statement will be used before here. */
6706 : : __builtin_unreachable ();
6707 : : }
6708 : :
6709 : :
6710 : : /*
6711 : : DeclareFieldVarient -
6712 : : */
6713 : :
6714 : 666 : static tree DeclareFieldVarient (unsigned int sym)
6715 : : {
6716 : 666 : unsigned int i;
6717 : 666 : unsigned int f;
6718 : 666 : tree VarientList;
6719 : 666 : tree VarientType;
6720 : 666 : tree byteOffset;
6721 : 666 : tree bitOffset;
6722 : 666 : tree GccFieldType;
6723 : 666 : location_t location;
6724 : :
6725 : 666 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (sym));
6726 : 666 : i = 1;
6727 : 666 : VarientList = (tree) (NULL);
6728 : 666 : VarientType = DoStartDeclaration (sym, (M2GCCDeclare_StartProcedure) {(M2GCCDeclare_StartProcedure_t) m2type_BuildStartFieldVarient});
6729 : : /* no need to store the [sym, RecordType] tuple as it is stored by DeclareRecord which calls us */
6730 : 666 : byteOffset = m2expr_GetIntegerZero (location);
6731 : 666 : bitOffset = m2expr_GetIntegerZero (location);
6732 : 1368 : while ((SymbolTable_GetNth (sym, i)) != SymbolTable_NulSym)
6733 : : {
6734 : 702 : f = SymbolTable_GetNth (sym, i);
6735 : 702 : if ((SymbolTable_IsFieldVarient (f)) && (SymbolTable_IsEmptyFieldVarient (f)))
6736 : : {} /* empty. */
6737 : : else
6738 : : {
6739 : : /* do not include empty varient fields (created via 'else end' in variant records */
6740 : 702 : if (Debugging)
6741 : : {
6742 : : M2Printf_printf0 ((const char *) "chaining ", 9);
6743 : : PrintTerse (f);
6744 : : M2Printf_printf0 ((const char *) "\\n", 2);
6745 : : }
6746 : 702 : VarientList = m2type_ChainOn (VarientList, MaybeAlignField (Chained (f), &byteOffset, &bitOffset));
6747 : : }
6748 : 702 : i += 1;
6749 : : }
6750 : 666 : WatchRemoveList (sym, M2GCCDeclare_partiallydeclared);
6751 : 666 : GccFieldType = m2type_BuildEndFieldVarient (location, VarientType, VarientList, SymbolTable_IsDeclaredPacked (sym));
6752 : 666 : return GccFieldType;
6753 : : /* static analysis guarentees a RETURN statement will be used before here. */
6754 : : __builtin_unreachable ();
6755 : : }
6756 : :
6757 : :
6758 : : /*
6759 : : DeclarePointer - declares a pointer type to gcc and returns the Tree.
6760 : : */
6761 : :
6762 : 126490 : static tree DeclarePointer (unsigned int sym)
6763 : : {
6764 : 126490 : return m2type_BuildPointerType (SymbolConversion_Mod2Gcc (SymbolTable_GetSType (sym)));
6765 : : /* static analysis guarentees a RETURN statement will be used before here. */
6766 : : __builtin_unreachable ();
6767 : : }
6768 : :
6769 : :
6770 : : /*
6771 : : DeclareUnbounded - builds an unbounded type and returns the gcc tree.
6772 : : */
6773 : :
6774 : 29774 : static tree DeclareUnbounded (unsigned int sym)
6775 : : {
6776 : 29774 : unsigned int record;
6777 : :
6778 : 29774 : M2Debug_Assert (SymbolTable_IsUnbounded (sym));
6779 : 29774 : if (SymbolConversion_GccKnowsAbout (sym))
6780 : : {
6781 : 0 : return SymbolConversion_Mod2Gcc (sym);
6782 : : }
6783 : : else
6784 : : {
6785 : 29774 : record = SymbolTable_GetUnboundedRecordType (sym);
6786 : 29774 : M2Debug_Assert (SymbolTable_IsRecord (record));
6787 : 29774 : M2Debug_Assert (AllDependantsFullyDeclared (record));
6788 : 29774 : if (! (SymbolConversion_GccKnowsAbout (record)))
6789 : : {
6790 : 0 : DeclareTypeConstFully (record);
6791 : 0 : WatchRemoveList (record, M2GCCDeclare_todolist);
6792 : : }
6793 : 29774 : return SymbolConversion_Mod2Gcc (record);
6794 : : }
6795 : : /* static analysis guarentees a RETURN statement will be used before here. */
6796 : : __builtin_unreachable ();
6797 : : }
6798 : :
6799 : :
6800 : : /*
6801 : : BuildIndex -
6802 : : */
6803 : :
6804 : 31604 : static tree BuildIndex (unsigned int tokenno, unsigned int array)
6805 : : {
6806 : 31604 : unsigned int Subscript;
6807 : 31604 : unsigned int Type;
6808 : 31604 : unsigned int High;
6809 : 31604 : unsigned int Low;
6810 : 31604 : tree n;
6811 : 31604 : tree low;
6812 : 31604 : tree high;
6813 : 31604 : location_t location;
6814 : :
6815 : 31604 : location = M2LexBuf_TokenToLocation (tokenno);
6816 : 31604 : Subscript = SymbolTable_GetArraySubscript (array);
6817 : 31604 : M2Debug_Assert (SymbolTable_IsSubscript (Subscript));
6818 : 31604 : Type = SymbolTable_GetDType (Subscript);
6819 : 31604 : Low = M2GCCDeclare_GetTypeMin (Type);
6820 : 31604 : High = M2GCCDeclare_GetTypeMax (Type);
6821 : 31604 : M2GCCDeclare_DeclareConstant (tokenno, Low);
6822 : 31604 : M2GCCDeclare_DeclareConstant (tokenno, High);
6823 : 31604 : low = SymbolConversion_Mod2Gcc (Low);
6824 : 31604 : high = SymbolConversion_Mod2Gcc (High);
6825 : 31604 : if (m2type_ExceedsTypeRange (m2type_GetIntegerType (), low, high))
6826 : : {
6827 : 24 : location = M2LexBuf_TokenToLocation (tokenno);
6828 : 24 : n = m2convert_BuildConvert (location, m2type_GetIntegerType (), m2expr_BuildSub (location, high, low, false), false);
6829 : 24 : if ((m2expr_TreeOverflow (n)) || (m2type_ValueOutOfTypeRange (m2type_GetIntegerType (), n)))
6830 : : {
6831 : 0 : M2MetaError_MetaError3 ((const char *) "implementation restriction, array is too large {%1EDM}, the range {%2ad}..{%3ad} exceeds the integer range", 106, array, Low, High);
6832 : 0 : return m2type_BuildArrayIndexType (m2expr_GetIntegerZero (location), m2expr_GetIntegerZero (location));
6833 : : }
6834 : : else
6835 : : {
6836 : 24 : SymbolTable_PutArrayLarge (array);
6837 : 24 : return m2type_BuildArrayIndexType (m2expr_GetIntegerZero (location), n);
6838 : : }
6839 : : }
6840 : : else
6841 : : {
6842 : 31580 : low = m2convert_BuildConvert (location, m2type_GetIntegerType (), low, false);
6843 : 31580 : high = m2convert_BuildConvert (location, m2type_GetIntegerType (), high, false);
6844 : 31580 : return m2type_BuildArrayIndexType (low, high);
6845 : : }
6846 : : /* static analysis guarentees a RETURN statement will be used before here. */
6847 : : __builtin_unreachable ();
6848 : : }
6849 : :
6850 : :
6851 : : /*
6852 : : DeclareArray - declares an array to gcc and returns the gcc tree.
6853 : : */
6854 : :
6855 : 24558 : static tree DeclareArray (unsigned int Sym)
6856 : : {
6857 : 24558 : unsigned int typeOfArray;
6858 : 24558 : tree ArrayType;
6859 : 24558 : tree GccArray;
6860 : 24558 : tree GccIndex;
6861 : 24558 : unsigned int Subscript;
6862 : 24558 : unsigned int tokenno;
6863 : 24558 : location_t location;
6864 : :
6865 : 24558 : M2Debug_Assert (SymbolTable_IsArray (Sym));
6866 : 24558 : tokenno = SymbolTable_GetDeclaredMod (Sym);
6867 : 24558 : location = M2LexBuf_TokenToLocation (tokenno);
6868 : 24558 : Subscript = SymbolTable_GetArraySubscript (Sym);
6869 : 24558 : typeOfArray = SymbolTable_GetDType (Sym);
6870 : 24558 : GccArray = SymbolConversion_Mod2Gcc (typeOfArray);
6871 : 24558 : GccIndex = BuildIndex (tokenno, Sym);
6872 : 24558 : if (SymbolConversion_GccKnowsAbout (Sym))
6873 : : {
6874 : 6446 : ArrayType = SymbolConversion_Mod2Gcc (Sym);
6875 : : }
6876 : : else
6877 : : {
6878 : 18112 : ArrayType = m2type_BuildStartArrayType (GccIndex, GccArray, static_cast<int> (typeOfArray));
6879 : 18112 : PreAddModGcc (Sym, ArrayType);
6880 : : }
6881 : 24558 : PreAddModGcc (Subscript, GccArray); /* we save the type of this array as the subscript */
6882 : 24558 : M2ALU_PushIntegerTree (m2expr_BuildSize (location, GccArray, false)); /* and the size of this array so far */
6883 : 24558 : SymbolTable_PopSize (Subscript); /* and the size of this array so far */
6884 : 24558 : GccArray = m2type_BuildEndArrayType (ArrayType, GccArray, GccIndex, static_cast<int> (typeOfArray));
6885 : 24558 : M2Debug_Assert (GccArray == ArrayType);
6886 : 24558 : return GccArray;
6887 : : /* static analysis guarentees a RETURN statement will be used before here. */
6888 : : __builtin_unreachable ();
6889 : : }
6890 : :
6891 : :
6892 : : /*
6893 : : DeclareProcType - declares a procedure type to gcc and returns the gcc type tree.
6894 : : */
6895 : :
6896 : 51840 : static tree DeclareProcType (unsigned int Sym)
6897 : : {
6898 : 51840 : unsigned int i;
6899 : 51840 : unsigned int p;
6900 : 51840 : unsigned int Parameter;
6901 : 51840 : unsigned int ReturnType;
6902 : 51840 : tree func;
6903 : 51840 : tree GccParam;
6904 : 51840 : location_t location;
6905 : :
6906 : 51840 : ReturnType = SymbolTable_GetSType (Sym);
6907 : 51840 : func = DoStartDeclaration (Sym, (M2GCCDeclare_StartProcedure) {(M2GCCDeclare_StartProcedure_t) m2type_BuildStartFunctionType});
6908 : 51840 : m2type_InitFunctionTypeParameters ();
6909 : 51840 : p = SymbolTable_NoOfParamAny (Sym);
6910 : 51840 : i = p;
6911 : 177533 : while (i > 0)
6912 : : {
6913 : 73853 : Parameter = SymbolTable_GetNthParamAny (Sym, i);
6914 : 73853 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (Parameter));
6915 : 73853 : GccParam = m2type_BuildProcTypeParameterDeclaration (location, SymbolConversion_Mod2Gcc (SymbolTable_GetSType (Parameter)), SymbolTable_IsVarParamAny (Sym, i));
6916 : 73853 : PreAddModGcc (Parameter, GccParam);
6917 : 73853 : i -= 1;
6918 : : }
6919 : 51840 : if (ReturnType == SymbolTable_NulSym)
6920 : : {
6921 : 44534 : return m2type_BuildEndFunctionType (func, NULL, SymbolTable_UsesVarArgs (Sym));
6922 : : }
6923 : : else
6924 : : {
6925 : 7306 : return m2type_BuildEndFunctionType (func, SymbolConversion_Mod2Gcc (ReturnType), SymbolTable_UsesVarArgs (Sym));
6926 : : }
6927 : : /* static analysis guarentees a RETURN statement will be used before here. */
6928 : : __builtin_unreachable ();
6929 : : }
6930 : :
6931 : :
6932 : : /*
6933 : : FindMinMaxEnum - finds the minimum and maximum enumeration fields.
6934 : : */
6935 : :
6936 : 2827816 : static void FindMinMaxEnum (unsigned int field)
6937 : : {
6938 : 2827816 : if (MaxEnumerationField == SymbolTable_NulSym)
6939 : : {
6940 : 417288 : MaxEnumerationField = static_cast<unsigned int> (field);
6941 : : }
6942 : : else
6943 : : {
6944 : 2410528 : SymbolTable_PushValue (field);
6945 : 2410528 : SymbolTable_PushValue (MaxEnumerationField);
6946 : 2410528 : if (M2ALU_Gre (SymbolTable_GetDeclaredMod (field)))
6947 : : {
6948 : 196836 : MaxEnumerationField = static_cast<unsigned int> (field);
6949 : : }
6950 : : }
6951 : 2827816 : if (MinEnumerationField == SymbolTable_NulSym)
6952 : : {
6953 : 417288 : MinEnumerationField = static_cast<unsigned int> (field);
6954 : : }
6955 : : else
6956 : : {
6957 : 2410528 : SymbolTable_PushValue (field);
6958 : 2410528 : SymbolTable_PushValue (MinEnumerationField);
6959 : 2410528 : if (M2ALU_Less (SymbolTable_GetDeclaredMod (field)))
6960 : : {
6961 : 1855000 : MinEnumerationField = static_cast<unsigned int> (field);
6962 : : }
6963 : : }
6964 : 2827816 : }
6965 : :
6966 : :
6967 : : /*
6968 : : PushNoOfBits - pushes the integer value of the number of bits required
6969 : : to maintain a set of type.
6970 : : */
6971 : :
6972 : 2448 : static void PushNoOfBits (unsigned int type, unsigned int low, unsigned int high)
6973 : : {
6974 : 2448 : SymbolTable_PushValue (high);
6975 : 2448 : M2ALU_ConvertToType (type);
6976 : 2448 : SymbolTable_PushValue (low);
6977 : 2448 : M2ALU_ConvertToType (type);
6978 : 2448 : M2ALU_Sub ();
6979 : 2448 : M2ALU_ConvertToType (M2Base_Cardinal);
6980 : 2448 : }
6981 : :
6982 : :
6983 : : /*
6984 : : DeclareLargeSet - n is the name of the set.
6985 : : type is the subrange type (or simple type)
6986 : : low and high are the limits of the subrange.
6987 : : */
6988 : :
6989 : 712 : static tree DeclareLargeSet (NameKey_Name n, unsigned int type, unsigned int low, unsigned int high)
6990 : : {
6991 : 712 : tree lowtree;
6992 : 712 : tree hightree;
6993 : 712 : tree BitsInSet;
6994 : 712 : tree RecordType;
6995 : 712 : tree GccField;
6996 : 712 : tree FieldList;
6997 : 712 : unsigned int bpw;
6998 : 712 : location_t location;
6999 : :
7000 : 712 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (type));
7001 : 712 : bpw = m2decl_GetBitsPerBitset ();
7002 : 712 : SymbolTable_PushValue (low);
7003 : 712 : lowtree = M2ALU_PopIntegerTree ();
7004 : 712 : SymbolTable_PushValue (high);
7005 : 712 : hightree = M2ALU_PopIntegerTree ();
7006 : 712 : FieldList = (tree) (NULL);
7007 : 712 : RecordType = m2type_BuildStartRecord (location, reinterpret_cast <char * > (NameKey_KeyToCharStar (n))); /* no problem with recursive types here */
7008 : 712 : PushNoOfBits (type, low, high); /* no problem with recursive types here */
7009 : 712 : M2ALU_PushCard (1);
7010 : 712 : M2ALU_Addn ();
7011 : 712 : BitsInSet = M2ALU_PopIntegerTree ();
7012 : 712 : M2ALU_PushIntegerTree (BitsInSet);
7013 : 712 : M2ALU_PushCard (0);
7014 : 26794 : while (M2ALU_Gre (SymbolTable_GetDeclaredMod (type)))
7015 : : {
7016 : 25370 : M2ALU_PushIntegerTree (BitsInSet);
7017 : 25370 : M2ALU_PushCard (bpw-1);
7018 : 25370 : if (M2ALU_GreEqu (SymbolTable_GetDeclaredMod (type)))
7019 : : {
7020 : 25226 : M2ALU_PushIntegerTree (lowtree);
7021 : 25226 : M2ALU_PushCard (bpw-1);
7022 : 25226 : M2ALU_Addn ();
7023 : 25226 : GccField = m2type_BuildFieldRecord (location, NULL, m2type_BuildSetType (location, NULL, SymbolConversion_Mod2Gcc (type), lowtree, M2ALU_PopIntegerTree (), false));
7024 : 25226 : M2ALU_PushIntegerTree (lowtree);
7025 : 25226 : M2ALU_PushCard (bpw);
7026 : 25226 : M2ALU_Addn ();
7027 : 25226 : lowtree = M2ALU_PopIntegerTree ();
7028 : 25226 : M2ALU_PushIntegerTree (BitsInSet);
7029 : 25226 : M2ALU_PushCard (bpw);
7030 : 25226 : M2ALU_Sub ();
7031 : 25226 : BitsInSet = M2ALU_PopIntegerTree ();
7032 : : }
7033 : : else
7034 : : {
7035 : : /* printf2('range is %a..%a
7036 : : ', GetSymName(low), GetSymName(high)) ; */
7037 : 144 : GccField = m2type_BuildFieldRecord (location, NULL, m2type_BuildSetType (location, NULL, SymbolConversion_Mod2Gcc (type), lowtree, hightree, false));
7038 : 144 : M2ALU_PushCard (0);
7039 : 144 : BitsInSet = M2ALU_PopIntegerTree ();
7040 : : }
7041 : 25370 : FieldList = m2type_ChainOn (FieldList, GccField);
7042 : 25370 : M2ALU_PushIntegerTree (BitsInSet);
7043 : 25370 : M2ALU_PushCard (0);
7044 : : }
7045 : 712 : return m2type_BuildEndRecord (location, RecordType, FieldList, false);
7046 : : /* static analysis guarentees a RETURN statement will be used before here. */
7047 : : __builtin_unreachable ();
7048 : : }
7049 : :
7050 : :
7051 : : /*
7052 : : DeclareLargeOrSmallSet - works out whether the set will exceed TSIZE(WORD). If it does
7053 : : we manufacture a set using:
7054 : :
7055 : : settype = RECORD
7056 : : w1: SET OF [...]
7057 : : w2: SET OF [...]
7058 : : END
7059 : :
7060 : : We do this as GCC and GDB (stabs) only knows about WORD sized sets.
7061 : : If the set will fit into a WORD then we call gccgm2 directly.
7062 : : */
7063 : :
7064 : 1736 : static tree DeclareLargeOrSmallSet (unsigned int sym, NameKey_Name n, unsigned int type, unsigned int low, unsigned int high)
7065 : : {
7066 : 1736 : location_t location;
7067 : 1736 : bool packed;
7068 : :
7069 : 1736 : PushNoOfBits (type, low, high);
7070 : 1736 : M2ALU_PushCard (static_cast<unsigned int> (m2decl_GetBitsPerBitset ()));
7071 : 1736 : packed = SymbolTable_IsSetPacked (sym);
7072 : 1736 : if (M2ALU_Less (SymbolTable_GetDeclaredMod (type)))
7073 : : {
7074 : 1024 : location = M2LexBuf_TokenToLocation (SymbolTable_GetDeclaredMod (sym));
7075 : : /* PutSetSmall(sym) ; */
7076 : 1024 : return m2type_BuildSetType (location, reinterpret_cast <char * > (NameKey_KeyToCharStar (n)), SymbolConversion_Mod2Gcc (type), SymbolConversion_Mod2Gcc (low), SymbolConversion_Mod2Gcc (high), packed);
7077 : : }
7078 : : else
7079 : : {
7080 : 712 : return DeclareLargeSet (n, type, low, high); /* --fixme-- finish packed here as well. */
7081 : : }
7082 : : /* static analysis guarentees a RETURN statement will be used before here. */
7083 : : __builtin_unreachable ();
7084 : : }
7085 : :
7086 : :
7087 : : /*
7088 : : DeclareSet - declares a set type to gcc and returns a Tree.
7089 : : */
7090 : :
7091 : 1736 : static tree DeclareSet (unsigned int sym)
7092 : : {
7093 : 1736 : tree gccsym;
7094 : 1736 : unsigned int type;
7095 : 1736 : unsigned int high;
7096 : 1736 : unsigned int low;
7097 : :
7098 : 1736 : type = SymbolTable_GetDType (sym);
7099 : 1736 : if (SymbolTable_IsSubrange (type))
7100 : : {
7101 : 966 : SymbolTable_GetSubrange (type, &high, &low);
7102 : 966 : gccsym = DeclareLargeOrSmallSet (sym, M2AsmUtil_GetFullSymName (sym), SymbolTable_GetSType (type), low, high);
7103 : : }
7104 : : else
7105 : : {
7106 : 770 : gccsym = DeclareLargeOrSmallSet (sym, M2AsmUtil_GetFullSymName (sym), type, M2GCCDeclare_GetTypeMin (type), M2GCCDeclare_GetTypeMax (type));
7107 : : }
7108 : 1736 : return gccsym;
7109 : : /* static analysis guarentees a RETURN statement will be used before here. */
7110 : : __builtin_unreachable ();
7111 : : }
7112 : :
7113 : :
7114 : : /*
7115 : : CheckResolveSubrange - checks to see whether we can determine
7116 : : the subrange type. We are able to do
7117 : : this once low, high and the type are known.
7118 : : */
7119 : :
7120 : 1136749 : static void CheckResolveSubrange (unsigned int sym)
7121 : : {
7122 : 1136749 : unsigned int tokenno;
7123 : 1136749 : unsigned int size;
7124 : 1136749 : unsigned int high;
7125 : 1136749 : unsigned int low;
7126 : 1136749 : unsigned int type;
7127 : :
7128 : 1136749 : SymbolTable_GetSubrange (sym, &high, &low);
7129 : 1136749 : tokenno = SymbolTable_GetDeclaredMod (sym);
7130 : 1136749 : type = SymbolTable_GetSType (sym);
7131 : 1136749 : if (type == SymbolTable_NulSym)
7132 : : {
7133 : 256548 : if ((SymbolConversion_GccKnowsAbout (low)) && (SymbolConversion_GccKnowsAbout (high)))
7134 : : {
7135 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
7136 : 21112 : if ((SymbolTable_IsConstString (low)) && (SymbolTable_IsConstStringKnown (low)))
7137 : : {
7138 : 72 : size = SymbolTable_GetStringLength (tokenno, low);
7139 : 72 : if (size <= 1)
7140 : : {
7141 : 72 : SymbolTable_PutSubrange (sym, low, high, M2Base_Char);
7142 : : }
7143 : : else
7144 : : {
7145 : 0 : M2MetaError_MetaError1 ((const char *) "cannot have a subrange of a string type {%1Uad}", 47, sym);
7146 : : }
7147 : : }
7148 : 21040 : else if (SymbolTable_IsFieldEnumeration (low))
7149 : : {
7150 : : /* avoid dangling else. */
7151 : 344 : if ((SymbolTable_GetSType (low)) == (SymbolTable_GetSType (high)))
7152 : : {
7153 : 344 : SymbolTable_PutSubrange (sym, low, high, SymbolTable_GetSType (low));
7154 : : }
7155 : : else
7156 : : {
7157 : 0 : M2MetaError_MetaError1 ((const char *) "subrange limits must be of the same type {%1Uad}", 48, sym);
7158 : : }
7159 : : }
7160 : 20696 : else if (SymbolTable_IsValueSolved (low))
7161 : : {
7162 : : /* avoid dangling else. */
7163 : 20696 : if ((SymbolTable_GetSType (low)) == M2Base_LongReal)
7164 : : {
7165 : 0 : M2MetaError_MetaError1 ((const char *) "cannot have a subrange of a SHORTREAL, REAL or LONGREAL type {%1Uad}", 68, sym);
7166 : : }
7167 : : else
7168 : : {
7169 : 20696 : SymbolTable_PutSubrange (sym, low, high, M2Base_MixTypes (SymbolTable_GetSType (low), SymbolTable_GetSType (high), SymbolTable_GetDeclaredMod (sym)));
7170 : : }
7171 : : }
7172 : : }
7173 : : }
7174 : 1136749 : }
7175 : :
7176 : :
7177 : : /*
7178 : : TypeConstFullyDeclared - all, sym, dependents are declared, so create and
7179 : : return the GCC Tree equivalent.
7180 : : */
7181 : :
7182 : 1143997 : static tree TypeConstFullyDeclared (unsigned int sym)
7183 : : {
7184 : 1143997 : tree t;
7185 : :
7186 : 1143997 : if (SymbolTable_IsEnumeration (sym))
7187 : : {
7188 : 22620 : t = DeclareEnumeration (sym);
7189 : : }
7190 : 1121377 : else if (SymbolTable_IsFieldEnumeration (sym))
7191 : : {
7192 : : /* avoid dangling else. */
7193 : 411938 : t = DeclareFieldEnumeration (sym);
7194 : : }
7195 : 709439 : else if (SymbolTable_IsSubrange (sym))
7196 : : {
7197 : : /* avoid dangling else. */
7198 : 23652 : t = DeclareSubrange (sym);
7199 : : }
7200 : 685787 : else if (SymbolTable_IsRecord (sym))
7201 : : {
7202 : : /* avoid dangling else. */
7203 : 78202 : t = CheckPragma (DeclareRecord (sym), sym);
7204 : : }
7205 : 607585 : else if (SymbolTable_IsRecordField (sym))
7206 : : {
7207 : : /* avoid dangling else. */
7208 : 312920 : t = CheckPragma (DeclareRecordField (sym), sym);
7209 : : }
7210 : 294665 : else if (SymbolTable_IsFieldVarient (sym))
7211 : : {
7212 : : /* avoid dangling else. */
7213 : 666 : t = DeclareFieldVarient (sym);
7214 : : }
7215 : 293999 : else if (SymbolTable_IsVarient (sym))
7216 : : {
7217 : : /* avoid dangling else. */
7218 : 276 : t = DeclareVarient (sym);
7219 : : }
7220 : 293723 : else if (SymbolTable_IsPointer (sym))
7221 : : {
7222 : : /* avoid dangling else. */
7223 : 109944 : t = CheckAlignment (DeclarePointer (sym), sym);
7224 : : }
7225 : 183779 : else if (SymbolTable_IsUnbounded (sym))
7226 : : {
7227 : : /* avoid dangling else. */
7228 : 29774 : t = DeclareUnbounded (sym);
7229 : : }
7230 : 154005 : else if (SymbolTable_IsArray (sym))
7231 : : {
7232 : : /* avoid dangling else. */
7233 : 24558 : t = CheckAlignment (DeclareArray (sym), sym);
7234 : : }
7235 : 129447 : else if (SymbolTable_IsProcType (sym))
7236 : : {
7237 : : /* avoid dangling else. */
7238 : 45882 : t = DeclareProcType (sym);
7239 : : }
7240 : 83565 : else if (SymbolTable_IsSet (sym))
7241 : : {
7242 : : /* avoid dangling else. */
7243 : 1736 : t = DeclareSet (sym);
7244 : : }
7245 : 81829 : else if (SymbolTable_IsConst (sym))
7246 : : {
7247 : : /* avoid dangling else. */
7248 : 54762 : if (SymbolTable_IsConstructor (sym))
7249 : : {
7250 : 8130 : SymbolTable_PushValue (sym);
7251 : 8130 : M2ALU_ChangeToConstructor (SymbolTable_GetDeclaredMod (sym), SymbolTable_GetSType (sym));
7252 : 8130 : SymbolTable_PopValue (sym);
7253 : 8130 : M2ALU_EvaluateValue (sym);
7254 : 8130 : M2ALU_PutConstructorSolved (sym);
7255 : : }
7256 : 46632 : else if (SymbolTable_IsConstSet (sym))
7257 : : {
7258 : : /* avoid dangling else. */
7259 : 0 : M2ALU_EvaluateValue (sym);
7260 : : }
7261 : 54762 : if (! (SymbolTable_IsValueSolved (sym)))
7262 : : {
7263 : : return NULL;
7264 : : }
7265 : 54762 : t = DeclareConst (SymbolTable_GetDeclaredMod (sym), sym);
7266 : 54762 : M2Debug_Assert (t != NULL);
7267 : : }
7268 : 27067 : else if (SymbolTable_IsConstructor (sym))
7269 : : {
7270 : : /* avoid dangling else. */
7271 : : /* not yet known as a constant */
7272 : : return NULL;
7273 : : }
7274 : : else
7275 : : {
7276 : : /* avoid dangling else. */
7277 : 27067 : t = DeclareType (sym);
7278 : 27067 : if (SymbolTable_IsType (sym))
7279 : : {
7280 : 27067 : t = CheckAlignment (t, sym);
7281 : : }
7282 : : }
7283 : 1143997 : return m2block_RememberType (t);
7284 : : /* static analysis guarentees a RETURN statement will be used before here. */
7285 : : __builtin_unreachable ();
7286 : : }
7287 : :
7288 : :
7289 : : /*
7290 : : IsBaseType - returns true if a type, Sym, is a base type and
7291 : : we use predefined GDB information to represent this
7292 : : type.
7293 : : */
7294 : :
7295 : 14770 : static bool IsBaseType (unsigned int Sym)
7296 : : {
7297 : 14770 : return (((Sym == M2Base_Cardinal) || (Sym == M2Base_Integer)) || (Sym == M2Base_Char)) || (Sym == M2Base_Proc);
7298 : : /* static analysis guarentees a RETURN statement will be used before here. */
7299 : : __builtin_unreachable ();
7300 : : }
7301 : :
7302 : :
7303 : : /*
7304 : : IsFieldEnumerationDependants - sets enumDeps to FALSE if action(Sym)
7305 : : is also FALSE.
7306 : : */
7307 : :
7308 : 1043788 : static void IsFieldEnumerationDependants (unsigned int Sym)
7309 : : {
7310 : 1043788 : if (! ((*action.proc) (Sym)))
7311 : : {
7312 : 411750 : enumDeps = false;
7313 : : }
7314 : 1043788 : }
7315 : :
7316 : :
7317 : : /*
7318 : : IsEnumerationDependants - returns true if the enumeration
7319 : : p(dependants) all return true.
7320 : : */
7321 : :
7322 : 115774 : static bool IsEnumerationDependants (unsigned int sym, M2GCCDeclare_IsAction q)
7323 : : {
7324 : 115774 : action = q;
7325 : 115774 : enumDeps = true;
7326 : 115774 : SymbolTable_ForeachLocalSymDo (sym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) IsFieldEnumerationDependants});
7327 : 115774 : return enumDeps;
7328 : : /* static analysis guarentees a RETURN statement will be used before here. */
7329 : : __builtin_unreachable ();
7330 : : }
7331 : :
7332 : :
7333 : : /*
7334 : : WalkEnumerationDependants - returns walks all dependants of Sym.
7335 : : */
7336 : :
7337 : 2546186 : static void WalkEnumerationDependants (unsigned int sym, M2GCCDeclare_WalkAction p)
7338 : : {
7339 : 2546186 : SymbolTable_ForeachLocalSymDo (sym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) p.proc});
7340 : 0 : }
7341 : :
7342 : :
7343 : : /*
7344 : : WalkSubrangeDependants - calls p(dependants) for each dependant of, sym.
7345 : : */
7346 : :
7347 : 1083625 : static void WalkSubrangeDependants (unsigned int sym, M2GCCDeclare_WalkAction p)
7348 : : {
7349 : 1083625 : unsigned int type;
7350 : 1083625 : unsigned int align;
7351 : 1083625 : unsigned int high;
7352 : 1083625 : unsigned int low;
7353 : :
7354 : 1083625 : SymbolTable_GetSubrange (sym, &high, &low);
7355 : 1083625 : CheckResolveSubrange (sym);
7356 : 1083625 : type = SymbolTable_GetSType (sym);
7357 : 1083625 : if (type != SymbolTable_NulSym)
7358 : : {
7359 : 870125 : (*p.proc) (type);
7360 : : }
7361 : : /* low and high are not types but constants and they are resolved by M2GenGCC */
7362 : 1083625 : (*p.proc) (low);
7363 : 1083625 : (*p.proc) (high);
7364 : 1083625 : align = SymbolTable_GetAlignment (sym);
7365 : 1083625 : if (align != SymbolTable_NulSym)
7366 : : {
7367 : 5952 : (*p.proc) (align);
7368 : : }
7369 : 1083625 : }
7370 : :
7371 : :
7372 : : /*
7373 : : IsSubrangeDependants - returns TRUE if the subrange
7374 : : q(dependants) all return TRUE.
7375 : : */
7376 : :
7377 : 53124 : static bool IsSubrangeDependants (unsigned int sym, M2GCCDeclare_IsAction q)
7378 : : {
7379 : 53124 : bool result;
7380 : 53124 : unsigned int align;
7381 : 53124 : unsigned int type;
7382 : 53124 : unsigned int high;
7383 : 53124 : unsigned int low;
7384 : :
7385 : 53124 : SymbolTable_GetSubrange (sym, &high, &low);
7386 : : /* low and high are not types but constants and they are resolved by M2GenGCC */
7387 : 53124 : CheckResolveSubrange (sym);
7388 : 53124 : result = true;
7389 : 53124 : type = SymbolTable_GetSType (sym);
7390 : 53124 : if ((type == SymbolTable_NulSym) || (! ((*q.proc) (type))))
7391 : : {
7392 : : result = false;
7393 : : }
7394 : 53124 : if (! ((*q.proc) (low)))
7395 : : {
7396 : 23600 : result = false;
7397 : : }
7398 : 53124 : if (! ((*q.proc) (high)))
7399 : : {
7400 : 8540 : result = false;
7401 : : }
7402 : 53124 : align = SymbolTable_GetAlignment (sym);
7403 : 53124 : if ((align != SymbolTable_NulSym) && (! ((*q.proc) (align))))
7404 : : {
7405 : : result = false;
7406 : : }
7407 : 53124 : return result;
7408 : : /* static analysis guarentees a RETURN statement will be used before here. */
7409 : : __builtin_unreachable ();
7410 : : }
7411 : :
7412 : :
7413 : : /*
7414 : : WalkComponentDependants -
7415 : : */
7416 : :
7417 : 94172 : static void WalkComponentDependants (unsigned int sym, M2GCCDeclare_WalkAction p)
7418 : : {
7419 : 94172 : unsigned int i;
7420 : 94172 : unsigned int type;
7421 : :
7422 : : /* need to walk record and field */
7423 : 94172 : i = 1;
7424 : 282516 : do {
7425 : 282516 : type = SymbolTable_GetNth (sym, i);
7426 : 282516 : if (type != SymbolTable_NulSym)
7427 : : {
7428 : 188344 : if (SymbolTable_IsVar (type))
7429 : : {
7430 : 94172 : (*p.proc) (SymbolTable_GetSType (type));
7431 : : }
7432 : : else
7433 : : {
7434 : 94172 : (*p.proc) (type);
7435 : : }
7436 : 188344 : i += 1;
7437 : : }
7438 : 282516 : } while (! (type == SymbolTable_NulSym));
7439 : 94172 : }
7440 : :
7441 : :
7442 : : /*
7443 : : IsComponentDependants -
7444 : : */
7445 : :
7446 : 94172 : static bool IsComponentDependants (unsigned int sym, M2GCCDeclare_IsAction q)
7447 : : {
7448 : 94172 : unsigned int type;
7449 : 94172 : unsigned int i;
7450 : 94172 : bool result;
7451 : :
7452 : : /* need to check record is completely resolved */
7453 : 94172 : result = true;
7454 : 94172 : i = 1;
7455 : 282516 : do {
7456 : 282516 : type = SymbolTable_GetNth (sym, i);
7457 : 282516 : if (type != SymbolTable_NulSym)
7458 : : {
7459 : 188344 : if (SymbolTable_IsVar (type))
7460 : : {
7461 : 94172 : type = SymbolTable_GetSType (type);
7462 : : }
7463 : 188344 : if (! ((*q.proc) (type)))
7464 : : {
7465 : 0 : result = false;
7466 : : }
7467 : 188344 : i += 1;
7468 : : }
7469 : 282516 : } while (! (type == SymbolTable_NulSym));
7470 : 94172 : return result;
7471 : : /* static analysis guarentees a RETURN statement will be used before here. */
7472 : : __builtin_unreachable ();
7473 : : }
7474 : :
7475 : :
7476 : : /*
7477 : : WalkVarDependants - walks all dependants of sym.
7478 : : */
7479 : :
7480 : 541951 : static void WalkVarDependants (unsigned int sym, M2GCCDeclare_WalkAction p)
7481 : : {
7482 : 541951 : unsigned int type;
7483 : :
7484 : 541951 : (*p.proc) (SymbolTable_GetSType (sym));
7485 : 541951 : if (SymbolTable_IsComponent (sym))
7486 : : {
7487 : 0 : WalkComponentDependants (sym, p);
7488 : : }
7489 : 541951 : type = SymbolTable_GetVarBackEndType (sym);
7490 : 541951 : if (type != SymbolTable_NulSym)
7491 : : {
7492 : 44132 : (*p.proc) (type);
7493 : : }
7494 : 541951 : }
7495 : :
7496 : :
7497 : : /*
7498 : : IsVarDependants - returns TRUE if the pointer symbol, sym,
7499 : : p(dependants) all return TRUE.
7500 : : */
7501 : :
7502 : 541055 : static bool IsVarDependants (unsigned int sym, M2GCCDeclare_IsAction q)
7503 : : {
7504 : 541055 : unsigned int type;
7505 : 541055 : bool result;
7506 : :
7507 : 541055 : result = true;
7508 : 541055 : if (! ((*q.proc) (SymbolTable_GetSType (sym))))
7509 : : {
7510 : : result = false;
7511 : : }
7512 : 541055 : if (SymbolTable_IsComponent (sym))
7513 : : {
7514 : 94172 : if (! (IsComponentDependants (sym, q)))
7515 : : {
7516 : 541055 : result = false;
7517 : : }
7518 : : }
7519 : 541055 : type = SymbolTable_GetVarBackEndType (sym);
7520 : 541055 : if (type != SymbolTable_NulSym)
7521 : : {
7522 : 44132 : if (! ((*q.proc) (type)))
7523 : : {
7524 : 541055 : result = false;
7525 : : }
7526 : : }
7527 : 541055 : return result;
7528 : : /* static analysis guarentees a RETURN statement will be used before here. */
7529 : : __builtin_unreachable ();
7530 : : }
7531 : :
7532 : :
7533 : : /*
7534 : : WalkPointerDependants - walks all dependants of sym.
7535 : : */
7536 : :
7537 : 9315928 : static void WalkPointerDependants (unsigned int sym, M2GCCDeclare_WalkAction p)
7538 : : {
7539 : 9315928 : unsigned int align;
7540 : :
7541 : 9315928 : (*p.proc) (SymbolTable_GetSType (sym));
7542 : 9315928 : align = SymbolTable_GetAlignment (sym);
7543 : 9315928 : if (align != SymbolTable_NulSym)
7544 : : {
7545 : 24 : (*p.proc) (align);
7546 : : }
7547 : 9315928 : }
7548 : :
7549 : :
7550 : : /*
7551 : : IsPointerDependants - returns TRUE if the pointer symbol, sym,
7552 : : p(dependants) all return TRUE.
7553 : : */
7554 : :
7555 : 950398 : static bool IsPointerDependants (unsigned int sym, M2GCCDeclare_IsAction q)
7556 : : {
7557 : 950398 : unsigned int align;
7558 : 950398 : bool final;
7559 : :
7560 : 950398 : final = true;
7561 : 950398 : if (! ((*q.proc) (SymbolTable_GetSType (sym))))
7562 : : {
7563 : : final = false;
7564 : : }
7565 : 950398 : align = SymbolTable_GetAlignment (sym);
7566 : 950398 : if (final && (align != SymbolTable_NulSym))
7567 : : {
7568 : 48 : if (! ((*q.proc) (align)))
7569 : : {
7570 : : final = false;
7571 : : }
7572 : : }
7573 : 950398 : return final;
7574 : : /* static analysis guarentees a RETURN statement will be used before here. */
7575 : : __builtin_unreachable ();
7576 : : }
7577 : :
7578 : :
7579 : : /*
7580 : : IsRecordAlignment -
7581 : : */
7582 : :
7583 : 504744 : static bool IsRecordAlignment (unsigned int sym, M2GCCDeclare_IsAction q)
7584 : : {
7585 : 504744 : if ((SymbolTable_GetDefaultRecordFieldAlignment (sym)) != SymbolTable_NulSym)
7586 : : {
7587 : 216 : if (! ((*q.proc) (SymbolTable_GetDefaultRecordFieldAlignment (sym))))
7588 : : {
7589 : : return false;
7590 : : }
7591 : : }
7592 : : return true;
7593 : : /* static analysis guarentees a RETURN statement will be used before here. */
7594 : : __builtin_unreachable ();
7595 : : }
7596 : :
7597 : :
7598 : : /*
7599 : : IsRecordDependants - returns TRUE if the symbol, sym,
7600 : : q(dependants) all return TRUE.
7601 : : */
7602 : :
7603 : 504744 : static bool IsRecordDependants (unsigned int sym, M2GCCDeclare_IsAction q)
7604 : : {
7605 : 504744 : bool result;
7606 : 504744 : unsigned int i;
7607 : 504744 : unsigned int field;
7608 : :
7609 : 504744 : result = IsRecordAlignment (sym, q);
7610 : 504744 : i = 1;
7611 : 2641786 : do {
7612 : 2641786 : field = SymbolTable_GetNth (sym, i);
7613 : 2641786 : if (field != SymbolTable_NulSym)
7614 : : {
7615 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
7616 : 2137042 : if (SymbolTable_IsRecordField (field))
7617 : : {
7618 : : /* avoid dangling else. */
7619 : 2134942 : if ((! (SymbolTable_IsRecordFieldAVarientTag (field))) || ((SymbolTable_GetSymName (field)) != NameKey_NulName))
7620 : : {
7621 : 2134744 : if (! ((*q.proc) (field)))
7622 : : {
7623 : 1007650 : result = false;
7624 : : }
7625 : : }
7626 : : }
7627 : 2100 : else if (SymbolTable_IsVarient (field))
7628 : : {
7629 : : /* avoid dangling else. */
7630 : 2100 : if (! ((*q.proc) (field)))
7631 : : {
7632 : 1007650 : result = false;
7633 : : }
7634 : : }
7635 : 0 : else if (SymbolTable_IsFieldVarient (field))
7636 : : {
7637 : : /* avoid dangling else. */
7638 : 0 : M2Error_InternalError ((const char *) "should not see a field varient", 30);
7639 : : }
7640 : : else
7641 : : {
7642 : : /* avoid dangling else. */
7643 : 0 : M2Error_InternalError ((const char *) "unknown symbol in record", 24);
7644 : : }
7645 : : }
7646 : 2641786 : i += 1;
7647 : 2641786 : } while (! (field == SymbolTable_NulSym));
7648 : 504744 : return result;
7649 : : /* static analysis guarentees a RETURN statement will be used before here. */
7650 : : __builtin_unreachable ();
7651 : : }
7652 : :
7653 : :
7654 : : /*
7655 : : WalkRecordAlignment - walks the alignment constant associated with
7656 : : record, sym.
7657 : : */
7658 : :
7659 : 6098653 : static void WalkRecordAlignment (unsigned int sym, M2GCCDeclare_WalkAction p)
7660 : : {
7661 : 6098653 : if ((SymbolTable_GetDefaultRecordFieldAlignment (sym)) != SymbolTable_NulSym)
7662 : : {
7663 : 216 : (*p.proc) (SymbolTable_GetDefaultRecordFieldAlignment (sym));
7664 : : }
7665 : 6098653 : }
7666 : :
7667 : :
7668 : : /*
7669 : : WalkRecordDependants - walks symbol, sym, dependants. It only
7670 : : walks the fields if the alignment is
7671 : : unused or fully declared.
7672 : : */
7673 : :
7674 : 6098653 : static void WalkRecordDependants (unsigned int sym, M2GCCDeclare_WalkAction p)
7675 : : {
7676 : 6098653 : WalkRecordAlignment (sym, p);
7677 : 6098653 : WalkRecordDependants2 (sym, p);
7678 : 6098653 : }
7679 : :
7680 : :
7681 : : /*
7682 : : WalkRecordFieldDependants -
7683 : : */
7684 : :
7685 : 36150210 : static void WalkRecordFieldDependants (unsigned int sym, M2GCCDeclare_WalkAction p)
7686 : : {
7687 : 36150210 : unsigned int v;
7688 : 36150210 : unsigned int align;
7689 : :
7690 : 36150210 : M2Debug_Assert (SymbolTable_IsRecordField (sym));
7691 : 36150210 : (*p.proc) (SymbolTable_GetSType (sym));
7692 : 36150210 : v = SymbolTable_GetVarient (sym);
7693 : 36150210 : if (v != SymbolTable_NulSym)
7694 : : {
7695 : 25944 : (*p.proc) (v);
7696 : : }
7697 : 36150210 : align = SymbolTable_GetAlignment (sym);
7698 : 36150210 : if (align != SymbolTable_NulSym)
7699 : : {
7700 : 1320 : (*p.proc) (align);
7701 : : }
7702 : 36150210 : }
7703 : :
7704 : :
7705 : : /*
7706 : : WalkRecordDependants2 - walks the fields of record, sym, calling
7707 : : p on every dependant.
7708 : : */
7709 : :
7710 : 6098653 : static void WalkRecordDependants2 (unsigned int sym, M2GCCDeclare_WalkAction p)
7711 : : {
7712 : 6098653 : unsigned int i;
7713 : 6098653 : unsigned int Field;
7714 : :
7715 : 6098653 : i = 1;
7716 : 25190999 : while ((SymbolTable_GetNth (sym, i)) != SymbolTable_NulSym)
7717 : : {
7718 : 19092346 : Field = SymbolTable_GetNth (sym, i);
7719 : 19092346 : (*p.proc) (Field);
7720 : 19092346 : if (SymbolTable_IsRecordField (Field))
7721 : : {
7722 : 19088278 : WalkRecordFieldDependants (Field, p);
7723 : : }
7724 : 4068 : else if (SymbolTable_IsVarient (Field))
7725 : : {
7726 : : /* avoid dangling else. */
7727 : 4068 : WalkVarientDependants (Field, p);
7728 : : }
7729 : 0 : else if (SymbolTable_IsFieldVarient (Field))
7730 : : {
7731 : : /* avoid dangling else. */
7732 : 0 : M2Error_InternalError ((const char *) "should not see a field varient", 30);
7733 : : }
7734 : : else
7735 : : {
7736 : : /* avoid dangling else. */
7737 : 0 : M2Error_InternalError ((const char *) "unknown symbol in record", 24);
7738 : : }
7739 : 19092346 : i += 1;
7740 : : }
7741 : 6098653 : }
7742 : :
7743 : :
7744 : : /*
7745 : : IsVarientAlignment -
7746 : : */
7747 : :
7748 : 5844 : static bool IsVarientAlignment (unsigned int sym, M2GCCDeclare_IsAction q)
7749 : : {
7750 : 5844 : unsigned int align;
7751 : :
7752 : 5844 : sym = GetRecordOfVarient (sym);
7753 : 5844 : align = SymbolTable_GetDefaultRecordFieldAlignment (sym);
7754 : 5844 : if ((align != SymbolTable_NulSym) && (! ((*q.proc) (align))))
7755 : : {
7756 : : return false;
7757 : : }
7758 : : return true;
7759 : : /* static analysis guarentees a RETURN statement will be used before here. */
7760 : : __builtin_unreachable ();
7761 : : }
7762 : :
7763 : :
7764 : : /*
7765 : : IsVarientDependants - returns TRUE if the symbol, sym,
7766 : : q(dependants) all return TRUE.
7767 : : */
7768 : :
7769 : 2190 : static bool IsVarientDependants (unsigned int sym, M2GCCDeclare_IsAction q)
7770 : : {
7771 : 2190 : bool result;
7772 : 2190 : unsigned int i;
7773 : 2190 : unsigned int Field;
7774 : :
7775 : 2190 : result = IsVarientAlignment (sym, q);
7776 : 2190 : i = 1;
7777 : 9618 : while ((SymbolTable_GetNth (sym, i)) != SymbolTable_NulSym)
7778 : : {
7779 : 5238 : Field = SymbolTable_GetNth (sym, i);
7780 : 5238 : M2Debug_Assert (SymbolTable_IsFieldVarient (Field));
7781 : 5238 : if (! ((*q.proc) (Field)))
7782 : : {
7783 : 3654 : result = false;
7784 : : }
7785 : 5238 : i += 1;
7786 : : }
7787 : 2190 : return result;
7788 : : /* static analysis guarentees a RETURN statement will be used before here. */
7789 : : __builtin_unreachable ();
7790 : : }
7791 : :
7792 : :
7793 : : /*
7794 : : WalkVarientAlignment -
7795 : : */
7796 : :
7797 : 59406 : static void WalkVarientAlignment (unsigned int sym, M2GCCDeclare_WalkAction p)
7798 : : {
7799 : 59406 : unsigned int align;
7800 : :
7801 : 59406 : sym = GetRecordOfVarient (sym);
7802 : 59406 : align = SymbolTable_GetDefaultRecordFieldAlignment (sym);
7803 : 59406 : if (align != SymbolTable_NulSym)
7804 : : {
7805 : 0 : (*p.proc) (align);
7806 : : }
7807 : 59406 : }
7808 : :
7809 : :
7810 : : /*
7811 : : WalkVarientDependants - walks symbol, sym, dependants.
7812 : : */
7813 : :
7814 : 11412 : static void WalkVarientDependants (unsigned int sym, M2GCCDeclare_WalkAction p)
7815 : : {
7816 : 11412 : unsigned int i;
7817 : 11412 : unsigned int v;
7818 : 11412 : unsigned int Field;
7819 : :
7820 : 11412 : WalkVarientAlignment (sym, p);
7821 : 11412 : if ((SymbolTable_GetSType (sym)) != SymbolTable_NulSym)
7822 : : {
7823 : 0 : (*p.proc) (SymbolTable_GetSType (sym));
7824 : : }
7825 : 11412 : v = SymbolTable_GetVarient (sym);
7826 : 11412 : if (v != SymbolTable_NulSym)
7827 : : {
7828 : 1104 : (*p.proc) (v);
7829 : : }
7830 : : i = 1;
7831 : 40578 : while ((SymbolTable_GetNth (sym, i)) != SymbolTable_NulSym)
7832 : : {
7833 : 29166 : Field = SymbolTable_GetNth (sym, i);
7834 : 29166 : M2Debug_Assert (SymbolTable_IsFieldVarient (Field)); /* field varients do _not_ have a type */
7835 : 29166 : (*p.proc) (Field); /* field varients do _not_ have a type */
7836 : 29166 : WalkVarientFieldDependants (Field, p);
7837 : 29166 : i += 1;
7838 : : }
7839 : 11412 : }
7840 : :
7841 : :
7842 : : /*
7843 : : IsVarientFieldDependants - returns TRUE if the symbol, sym,
7844 : : q(dependants) all return TRUE.
7845 : : */
7846 : :
7847 : 3654 : static bool IsVarientFieldDependants (unsigned int sym, M2GCCDeclare_IsAction q)
7848 : : {
7849 : 3654 : unsigned int i;
7850 : 3654 : unsigned int type;
7851 : 3654 : unsigned int Field;
7852 : 3654 : bool result;
7853 : :
7854 : 3654 : i = 1;
7855 : 3654 : result = IsVarientAlignment (sym, q);
7856 : 11766 : while ((SymbolTable_GetNth (sym, i)) != SymbolTable_NulSym)
7857 : : {
7858 : 4458 : Field = SymbolTable_GetNth (sym, i);
7859 : 4458 : if (! ((*q.proc) (Field)))
7860 : : {
7861 : 3546 : result = false;
7862 : : }
7863 : 4458 : type = SymbolTable_GetSType (Field);
7864 : 4458 : if (type != SymbolTable_NulSym)
7865 : : {
7866 : 4182 : if (! ((*q.proc) (type)))
7867 : : {
7868 : 4458 : result = false;
7869 : : }
7870 : : }
7871 : 4458 : i += 1;
7872 : : }
7873 : 3654 : return result;
7874 : : /* static analysis guarentees a RETURN statement will be used before here. */
7875 : : __builtin_unreachable ();
7876 : : }
7877 : :
7878 : :
7879 : : /*
7880 : : WalkVarientFieldDependants -
7881 : : */
7882 : :
7883 : 47994 : static void WalkVarientFieldDependants (unsigned int sym, M2GCCDeclare_WalkAction p)
7884 : : {
7885 : 47994 : unsigned int i;
7886 : 47994 : unsigned int type;
7887 : 47994 : unsigned int Field;
7888 : :
7889 : 47994 : WalkVarientAlignment (sym, p);
7890 : 47994 : i = 1;
7891 : 145500 : while ((SymbolTable_GetNth (sym, i)) != SymbolTable_NulSym)
7892 : : {
7893 : 49512 : Field = SymbolTable_GetNth (sym, i);
7894 : 49512 : (*p.proc) (Field);
7895 : 49512 : type = SymbolTable_GetSType (Field);
7896 : 49512 : if (type != SymbolTable_NulSym)
7897 : : {
7898 : 46836 : (*p.proc) (type);
7899 : : }
7900 : 49512 : i += 1;
7901 : : }
7902 : 47994 : }
7903 : :
7904 : :
7905 : : /*
7906 : : IsArrayDependants - returns TRUE if the symbol, sym,
7907 : : q(dependants) all return TRUE.
7908 : :
7909 : : */
7910 : :
7911 : 120242 : static bool IsArrayDependants (unsigned int sym, M2GCCDeclare_IsAction q)
7912 : : {
7913 : 120242 : bool result;
7914 : 120242 : unsigned int align;
7915 : 120242 : unsigned int subscript;
7916 : 120242 : unsigned int high;
7917 : 120242 : unsigned int low;
7918 : 120242 : unsigned int type;
7919 : :
7920 : 120242 : result = true;
7921 : 120242 : M2Debug_Assert (SymbolTable_IsArray (sym));
7922 : 120242 : type = SymbolTable_GetSType (sym);
7923 : 120242 : if (! ((*q.proc) (type)))
7924 : : {
7925 : : result = false;
7926 : : }
7927 : 120242 : subscript = SymbolTable_GetArraySubscript (sym);
7928 : 120242 : if (subscript != SymbolTable_NulSym)
7929 : : {
7930 : 120242 : M2Debug_Assert (SymbolTable_IsSubscript (subscript));
7931 : 120242 : type = SymbolTable_GetSType (subscript);
7932 : 120242 : if (! ((*q.proc) (type)))
7933 : : {
7934 : 47272 : result = false;
7935 : : }
7936 : 120242 : type = SymbolTable_SkipType (type);
7937 : : /* the array might be declared as ARRAY type OF foo */
7938 : 120242 : low = M2GCCDeclare_GetTypeMin (type);
7939 : 120242 : high = M2GCCDeclare_GetTypeMax (type);
7940 : 120242 : if (! ((*q.proc) (low)))
7941 : : {
7942 : 22300 : result = false;
7943 : : }
7944 : 120242 : if (! ((*q.proc) (high)))
7945 : : {
7946 : 7242 : result = false;
7947 : : }
7948 : 120242 : align = SymbolTable_GetAlignment (sym);
7949 : 120242 : if ((align != SymbolTable_NulSym) && (! ((*q.proc) (align))))
7950 : : {
7951 : : result = false;
7952 : : }
7953 : : }
7954 : 120242 : return result;
7955 : : /* static analysis guarentees a RETURN statement will be used before here. */
7956 : : __builtin_unreachable ();
7957 : : }
7958 : :
7959 : :
7960 : : /*
7961 : : WalkArrayDependants - walks symbol, sym, dependants.
7962 : : */
7963 : :
7964 : 562002 : static void WalkArrayDependants (unsigned int sym, M2GCCDeclare_WalkAction p)
7965 : : {
7966 : 562002 : unsigned int align;
7967 : 562002 : unsigned int subscript;
7968 : 562002 : unsigned int high;
7969 : 562002 : unsigned int low;
7970 : 562002 : unsigned int type;
7971 : :
7972 : 562002 : M2Debug_Assert (SymbolTable_IsArray (sym));
7973 : 562002 : type = SymbolTable_GetSType (sym);
7974 : 562002 : (*p.proc) (type);
7975 : 562002 : subscript = SymbolTable_GetArraySubscript (sym);
7976 : 562002 : if (subscript != SymbolTable_NulSym)
7977 : : {
7978 : 562002 : M2Debug_Assert (SymbolTable_IsSubscript (subscript));
7979 : 562002 : type = SymbolTable_GetSType (subscript);
7980 : 562002 : (*p.proc) (type);
7981 : 562002 : type = SymbolTable_SkipType (type);
7982 : : /* the array might be declared as ARRAY type OF foo */
7983 : 562002 : low = M2GCCDeclare_GetTypeMin (type);
7984 : 562002 : high = M2GCCDeclare_GetTypeMax (type);
7985 : 562002 : (*p.proc) (low);
7986 : 562002 : (*p.proc) (high);
7987 : 562002 : align = SymbolTable_GetAlignment (sym);
7988 : 562002 : if (align != SymbolTable_NulSym)
7989 : : {
7990 : 42 : (*p.proc) (align);
7991 : : }
7992 : : }
7993 : 562002 : }
7994 : :
7995 : :
7996 : : /*
7997 : : IsSetDependants - returns TRUE if the symbol, sym,
7998 : : q(dependants) all return TRUE.
7999 : : */
8000 : :
8001 : 25242 : static bool IsSetDependants (unsigned int sym, M2GCCDeclare_IsAction q)
8002 : : {
8003 : 25242 : bool result;
8004 : 25242 : unsigned int type;
8005 : 25242 : unsigned int low;
8006 : 25242 : unsigned int high;
8007 : :
8008 : 25242 : result = true;
8009 : 25242 : M2Debug_Assert (SymbolTable_IsSet (sym));
8010 : 25242 : type = SymbolTable_GetDType (sym);
8011 : 25242 : if (! ((*q.proc) (type)))
8012 : : {
8013 : : result = false;
8014 : : }
8015 : 25242 : low = M2GCCDeclare_GetTypeMin (type);
8016 : 25242 : high = M2GCCDeclare_GetTypeMax (type);
8017 : 25242 : if (! ((*q.proc) (low)))
8018 : : {
8019 : 942 : result = false;
8020 : : }
8021 : 25242 : if (! ((*q.proc) (high)))
8022 : : {
8023 : 594 : result = false;
8024 : : }
8025 : 25242 : return result;
8026 : : /* static analysis guarentees a RETURN statement will be used before here. */
8027 : : __builtin_unreachable ();
8028 : : }
8029 : :
8030 : :
8031 : : /*
8032 : : WalkSetDependants - walks dependants, sym.
8033 : : */
8034 : :
8035 : 925364 : static void WalkSetDependants (unsigned int sym, M2GCCDeclare_WalkAction p)
8036 : : {
8037 : 925364 : unsigned int type;
8038 : 925364 : unsigned int low;
8039 : 925364 : unsigned int high;
8040 : :
8041 : 925364 : M2Debug_Assert (SymbolTable_IsSet (sym));
8042 : 925364 : type = SymbolTable_GetDType (sym);
8043 : 925364 : (*p.proc) (type);
8044 : 925364 : low = M2GCCDeclare_GetTypeMin (type);
8045 : 925364 : (*p.proc) (low);
8046 : 925364 : high = M2GCCDeclare_GetTypeMax (type);
8047 : 925364 : (*p.proc) (high);
8048 : 925364 : }
8049 : :
8050 : :
8051 : : /*
8052 : : IsProcTypeDependants -
8053 : : */
8054 : :
8055 : 208204 : static bool IsProcTypeDependants (unsigned int sym, M2GCCDeclare_IsAction q)
8056 : : {
8057 : 208204 : unsigned int i;
8058 : 208204 : unsigned int p;
8059 : 208204 : unsigned int son;
8060 : 208204 : unsigned int ParamType;
8061 : 208204 : unsigned int ReturnType;
8062 : 208204 : bool result;
8063 : :
8064 : 208204 : result = true;
8065 : 208204 : M2Debug_Assert (SymbolTable_IsProcType (sym));
8066 : 208204 : i = 1;
8067 : 208204 : ReturnType = SymbolTable_GetSType (sym);
8068 : 208204 : p = SymbolTable_NoOfParamAny (sym);
8069 : 624819 : while (i <= p)
8070 : : {
8071 : 208411 : son = SymbolTable_GetNthParamAny (sym, i);
8072 : 208411 : ParamType = SymbolTable_GetSType (son);
8073 : 208411 : if (! ((*q.proc) (ParamType)))
8074 : : {
8075 : 69148 : result = false;
8076 : : }
8077 : 208411 : i += 1;
8078 : : }
8079 : 208204 : if ((ReturnType == SymbolTable_NulSym) || ((*q.proc) (ReturnType)))
8080 : : {
8081 : 208204 : return result;
8082 : : }
8083 : : else
8084 : : {
8085 : : return false;
8086 : : }
8087 : : /* static analysis guarentees a RETURN statement will be used before here. */
8088 : : __builtin_unreachable ();
8089 : : }
8090 : :
8091 : :
8092 : : /*
8093 : : WalkProcTypeDependants - walks dependants, sym.
8094 : : */
8095 : :
8096 : 2298926 : static void WalkProcTypeDependants (unsigned int sym, M2GCCDeclare_WalkAction p)
8097 : : {
8098 : 2298926 : unsigned int i;
8099 : 2298926 : unsigned int n;
8100 : 2298926 : unsigned int son;
8101 : 2298926 : unsigned int ParamType;
8102 : 2298926 : unsigned int ReturnType;
8103 : :
8104 : 2298926 : M2Debug_Assert (SymbolTable_IsProcType (sym));
8105 : 2298926 : i = 1;
8106 : 2298926 : ReturnType = SymbolTable_GetSType (sym);
8107 : 2298926 : n = SymbolTable_NoOfParamAny (sym);
8108 : 8617264 : while (i <= n)
8109 : : {
8110 : 4019412 : son = SymbolTable_GetNthParamAny (sym, i);
8111 : 4019412 : ParamType = SymbolTable_GetSType (son);
8112 : 4019412 : (*p.proc) (ParamType);
8113 : 4019412 : i += 1;
8114 : : }
8115 : 2298926 : if (ReturnType != SymbolTable_NulSym)
8116 : : {
8117 : 303110 : (*p.proc) (ReturnType);
8118 : : }
8119 : 2298926 : }
8120 : :
8121 : :
8122 : : /*
8123 : : IsProcedureDependants -
8124 : : */
8125 : :
8126 : 426 : static bool IsProcedureDependants (unsigned int sym, M2GCCDeclare_IsAction q)
8127 : : {
8128 : 426 : unsigned int i;
8129 : 426 : unsigned int son;
8130 : 426 : unsigned int type;
8131 : 426 : unsigned int ReturnType;
8132 : 426 : bool result;
8133 : :
8134 : 426 : result = true;
8135 : 426 : M2Debug_Assert (SymbolTable_IsProcedure (sym));
8136 : 426 : i = 1;
8137 : 426 : ReturnType = SymbolTable_GetSType (sym);
8138 : 1434 : while ((SymbolTable_GetNth (sym, i)) != SymbolTable_NulSym)
8139 : : {
8140 : 582 : son = SymbolTable_GetNth (sym, i);
8141 : 582 : type = SymbolTable_GetSType (son);
8142 : 582 : if (! ((*q.proc) (type)))
8143 : : {
8144 : 36 : result = false;
8145 : : }
8146 : 582 : i += 1;
8147 : : }
8148 : 426 : if ((ReturnType == SymbolTable_NulSym) || ((*q.proc) (ReturnType)))
8149 : : {
8150 : 426 : return result;
8151 : : }
8152 : : else
8153 : : {
8154 : : return false;
8155 : : }
8156 : : /* static analysis guarentees a RETURN statement will be used before here. */
8157 : : __builtin_unreachable ();
8158 : : }
8159 : :
8160 : :
8161 : : /*
8162 : : WalkProcedureDependants - walks dependants, sym.
8163 : : */
8164 : :
8165 : 408 : static void WalkProcedureDependants (unsigned int sym, M2GCCDeclare_WalkAction p)
8166 : : {
8167 : 408 : unsigned int i;
8168 : 408 : unsigned int son;
8169 : 408 : unsigned int type;
8170 : 408 : unsigned int ReturnType;
8171 : :
8172 : 408 : M2Debug_Assert (SymbolTable_IsProcedure (sym));
8173 : 408 : i = 1;
8174 : 408 : ReturnType = SymbolTable_GetSType (sym);
8175 : 1362 : while ((SymbolTable_GetNth (sym, i)) != SymbolTable_NulSym)
8176 : : {
8177 : 546 : son = SymbolTable_GetNth (sym, i);
8178 : 546 : type = SymbolTable_GetSType (son);
8179 : 546 : (*p.proc) (type);
8180 : 546 : i += 1;
8181 : : }
8182 : 408 : if (ReturnType != SymbolTable_NulSym)
8183 : : {
8184 : 42 : (*p.proc) (ReturnType);
8185 : : }
8186 : 408 : }
8187 : :
8188 : :
8189 : : /*
8190 : : IsUnboundedDependants - returns TRUE if the symbol, sym,
8191 : : q(dependants) all return TRUE.
8192 : : */
8193 : :
8194 : 212218 : static bool IsUnboundedDependants (unsigned int sym, M2GCCDeclare_IsAction q)
8195 : : {
8196 : 212218 : bool result;
8197 : :
8198 : 212218 : result = true;
8199 : 212218 : if (! ((*q.proc) (SymbolTable_GetUnboundedRecordType (sym))))
8200 : : {
8201 : : result = false;
8202 : : }
8203 : 212218 : if (! ((*q.proc) (M2Base_Cardinal)))
8204 : : {
8205 : 0 : result = false;
8206 : : }
8207 : 212218 : if (! ((*q.proc) (SymbolTable_GetSType (sym))))
8208 : : {
8209 : 54 : result = false;
8210 : : }
8211 : 212218 : return result;
8212 : : /* static analysis guarentees a RETURN statement will be used before here. */
8213 : : __builtin_unreachable ();
8214 : : }
8215 : :
8216 : :
8217 : : /*
8218 : : WalkUnboundedDependants - walks the dependants of, sym.
8219 : : */
8220 : :
8221 : 3697691 : static void WalkUnboundedDependants (unsigned int sym, M2GCCDeclare_WalkAction p)
8222 : : {
8223 : 3697691 : (*p.proc) (SymbolTable_GetUnboundedRecordType (sym));
8224 : 3697691 : (*p.proc) (M2Base_Cardinal);
8225 : 3697691 : (*p.proc) (SymbolTable_GetSType (sym));
8226 : 3697691 : }
8227 : :
8228 : :
8229 : : /*
8230 : : IsTypeDependants - returns TRUE if all q(dependants) return
8231 : : TRUE.
8232 : : */
8233 : :
8234 : 619713 : static bool IsTypeDependants (unsigned int sym, M2GCCDeclare_IsAction q)
8235 : : {
8236 : 619713 : unsigned int align;
8237 : 619713 : unsigned int type;
8238 : 619713 : bool final;
8239 : :
8240 : 619713 : type = SymbolTable_GetSType (sym);
8241 : 619713 : final = true;
8242 : 619713 : if ((type != SymbolTable_NulSym) && (! ((*q.proc) (type))))
8243 : : {
8244 : : final = false;
8245 : : }
8246 : 619713 : align = SymbolTable_GetAlignment (sym);
8247 : 619713 : if ((align != SymbolTable_NulSym) && (! ((*q.proc) (align))))
8248 : : {
8249 : : final = false;
8250 : : }
8251 : 619713 : return final;
8252 : : /* static analysis guarentees a RETURN statement will be used before here. */
8253 : : __builtin_unreachable ();
8254 : : }
8255 : :
8256 : :
8257 : : /*
8258 : : WalkTypeDependants - walks all dependants of, sym.
8259 : : */
8260 : :
8261 : 19190209 : static void WalkTypeDependants (unsigned int sym, M2GCCDeclare_WalkAction p)
8262 : : {
8263 : 19190209 : unsigned int align;
8264 : 19190209 : unsigned int type;
8265 : :
8266 : 19190209 : type = SymbolTable_GetSType (sym);
8267 : 19190209 : if (type != SymbolTable_NulSym)
8268 : : {
8269 : 849648 : (*p.proc) (type);
8270 : : }
8271 : 19190209 : align = SymbolTable_GetAlignment (sym);
8272 : 19190209 : if (align != SymbolTable_NulSym)
8273 : : {
8274 : 36 : (*p.proc) (align);
8275 : : }
8276 : 19190209 : }
8277 : :
8278 : :
8279 : : /*
8280 : : FoldConstants - a wrapper for ResolveConstantExpressions.
8281 : : */
8282 : :
8283 : 51030524 : extern "C" void M2GCCDeclare_FoldConstants (M2BasicBlock_BasicBlock bb)
8284 : : {
8285 : 51030524 : if (M2GenGCC_ResolveConstantExpressions ((M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) DeclareConstFully}, bb))
8286 : : {
8287 : 119446 : ConstantResolved = true;
8288 : : }
8289 : 51030464 : }
8290 : :
8291 : :
8292 : : /*
8293 : : StartDeclareScope - declares types, variables associated with this scope.
8294 : : */
8295 : :
8296 : 79856 : extern "C" void M2GCCDeclare_StartDeclareScope (unsigned int scope)
8297 : : {
8298 : 79856 : NameKey_Name n;
8299 : :
8300 : 79856 : if (Debugging)
8301 : : {
8302 : : n = SymbolTable_GetSymName (scope);
8303 : : M2Printf_printf1 ((const char *) "declaring symbols in BLOCK %a\\n", 31, (const unsigned char *) &n, (sizeof (n)-1));
8304 : : }
8305 : 79856 : if (SymbolTable_IsProcedure (scope))
8306 : : {
8307 : 65719 : StartDeclareProcedureScope (scope);
8308 : : }
8309 : : else
8310 : : {
8311 : 14137 : StartDeclareModuleScope (scope);
8312 : : }
8313 : 79808 : if (Debugging)
8314 : : {
8315 : : n = SymbolTable_GetSymName (scope);
8316 : : M2Printf_printf1 ((const char *) "\\nEND declaring symbols in BLOCK %a\\n", 37, (const unsigned char *) &n, (sizeof (n)-1));
8317 : : }
8318 : 79808 : }
8319 : :
8320 : :
8321 : : /*
8322 : : EndDeclareScope -
8323 : : */
8324 : :
8325 : 0 : extern "C" void M2GCCDeclare_EndDeclareScope (void)
8326 : : {
8327 : 0 : }
8328 : :
8329 : :
8330 : : /*
8331 : : DeclareParameters -
8332 : : */
8333 : :
8334 : 172947 : extern "C" void M2GCCDeclare_DeclareParameters (unsigned int sym)
8335 : : {
8336 : 172947 : DeclareUnboundedProcedureParameters (sym);
8337 : 172947 : }
8338 : :
8339 : :
8340 : : /*
8341 : : DeclareConstant - checks to see whether, sym, is a constant and
8342 : : declares the constant to gcc.
8343 : : */
8344 : :
8345 : 1468215 : extern "C" void M2GCCDeclare_DeclareConstant (unsigned int tokenno, unsigned int sym)
8346 : : {
8347 : 1468215 : unsigned int type;
8348 : 1468215 : tree t;
8349 : :
8350 : 1468215 : if (SymbolTable_IsConst (sym))
8351 : : {
8352 : 712691 : TraverseDependants (sym);
8353 : 712691 : type = SymbolTable_GetSType (sym);
8354 : 1425382 : M2Debug_Assert ((type == SymbolTable_NulSym) || (M2GCCDeclare_CompletelyResolved (type)));
8355 : 1425382 : M2Debug_Assert ((! (SymbolTable_IsConstructor (sym))) || (SymbolTable_IsConstructorConstant (sym)));
8356 : 1425382 : M2Debug_Assert ((type != SymbolTable_NulSym) || (! ((SymbolTable_IsConstructor (sym)) || (SymbolTable_IsConstSet (sym)))));
8357 : 712691 : t = DeclareConst (tokenno, sym);
8358 : 712691 : M2Debug_Assert (t != NULL);
8359 : : }
8360 : 1468215 : }
8361 : :
8362 : :
8363 : : /*
8364 : : DeclareConstructor - declares a constructor.
8365 : : */
8366 : :
8367 : 1218348 : extern "C" void M2GCCDeclare_DeclareConstructor (unsigned int tokenno, unsigned int quad, unsigned int sym)
8368 : : {
8369 : 1218348 : if (sym == SymbolTable_NulSym)
8370 : : {
8371 : 0 : M2Error_InternalError ((const char *) "trying to declare the NulSym", 28);
8372 : : }
8373 : 1218348 : if ((SymbolTable_IsConstructor (sym)) && (! (SymbolConversion_GccKnowsAbout (sym))))
8374 : : {
8375 : 0 : WalkConstructor (sym, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) TraverseDependants});
8376 : 0 : DeclareTypesConstantsProceduresInRange (SymbolTable_GetScope (sym), quad, quad);
8377 : 0 : M2Debug_Assert (M2ALU_IsConstructorDependants (sym, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) IsFullyDeclared}));
8378 : 0 : SymbolTable_PushValue (sym);
8379 : 0 : DeclareConstantFromTree (sym, M2ALU_PopConstructorTree (tokenno));
8380 : : }
8381 : 1218348 : }
8382 : :
8383 : :
8384 : : /*
8385 : : TryDeclareConstant - try and declare a constant. If, sym, is a
8386 : : constant try and declare it, if we cannot
8387 : : then enter it into the to do list.
8388 : : */
8389 : :
8390 : 20675108 : extern "C" void M2GCCDeclare_TryDeclareConstant (unsigned int tokenno, unsigned int sym)
8391 : : {
8392 : 20675108 : unsigned int type;
8393 : :
8394 : 20675108 : M2GCCDeclare_TryDeclareConstructor (tokenno, sym);
8395 : 20675102 : if (SymbolTable_IsConst (sym))
8396 : : {
8397 : 6211844 : TraverseDependants (sym);
8398 : 6211844 : type = SymbolTable_GetSType (sym);
8399 : 6211844 : if ((type != SymbolTable_NulSym) && (! (M2GCCDeclare_CompletelyResolved (type))))
8400 : : {
8401 : 21350 : TraverseDependants (sym);
8402 : 21350 : return;
8403 : : }
8404 : 6190494 : if ((SymbolTable_IsConstructor (sym)) && (! (SymbolTable_IsConstructorConstant (sym))))
8405 : : {
8406 : 0 : TraverseDependants (sym);
8407 : 0 : return;
8408 : : }
8409 : 6190494 : if (((SymbolTable_IsConstructor (sym)) || (SymbolTable_IsConstSet (sym))) && (type == SymbolTable_NulSym))
8410 : : {
8411 : 240 : TraverseDependants (sym);
8412 : 240 : return;
8413 : : }
8414 : 6190254 : if (Sets_IsElementInSet (GlobalGroup->ToBeSolvedByQuads, sym))
8415 : : {
8416 : : /* we allow the above rules to be executed even if it is fully declared
8417 : : so to ensure that types of compiler builtin constants (BitsetSize
8418 : : etc) are fully declared.
8419 : :
8420 : : However at this point if, sym, is fully declared we return
8421 : : */
8422 : 34832 : if (IsFullyDeclared (sym))
8423 : : {
8424 : : return;
8425 : : }
8426 : 34802 : TraverseDependants (sym);
8427 : : }
8428 : : else
8429 : : {
8430 : 6155422 : TryDeclareConst (tokenno, sym);
8431 : : }
8432 : : }
8433 : : }
8434 : :
8435 : :
8436 : : /*
8437 : : TryDeclareConstructor - try and declare a constructor. If, sym, is a
8438 : : constructor try and declare it, if we cannot
8439 : : then enter it into the to do list.
8440 : : */
8441 : :
8442 : 24190865 : extern "C" void M2GCCDeclare_TryDeclareConstructor (unsigned int tokenno, unsigned int sym)
8443 : : {
8444 : 24190865 : if (sym != SymbolTable_NulSym)
8445 : : {
8446 : 24190865 : if ((SymbolTable_IsConstructor (sym)) && (! (SymbolConversion_GccKnowsAbout (sym))))
8447 : : {
8448 : 31344 : WalkConstructor (sym, (M2GCCDeclare_WalkAction) {(M2GCCDeclare_WalkAction_t) TraverseDependants});
8449 : 31344 : if (! (Sets_IsElementInSet (GlobalGroup->ToBeSolvedByQuads, sym)))
8450 : : {
8451 : 28626 : M2ALU_TryEvaluateValue (sym);
8452 : 28620 : if (M2ALU_IsConstructorDependants (sym, (M2GCCDeclare_IsAction) {(M2GCCDeclare_IsAction_t) IsFullyDeclared}))
8453 : : {
8454 : 2438 : SymbolTable_PushValue (sym);
8455 : 2438 : DeclareConstantFromTree (sym, M2ALU_PopConstructorTree (tokenno));
8456 : : }
8457 : : }
8458 : : }
8459 : : }
8460 : 24190859 : }
8461 : :
8462 : :
8463 : : /*
8464 : : DeclareLocalVariables - declares Local variables for procedure.
8465 : : */
8466 : :
8467 : 65719 : extern "C" void M2GCCDeclare_DeclareLocalVariables (unsigned int procedure)
8468 : : {
8469 : 65719 : unsigned int i;
8470 : 65719 : unsigned int var;
8471 : :
8472 : 65719 : i = (SymbolTable_NoOfParamAny (procedure))+1;
8473 : 65719 : var = SymbolTable_GetNth (procedure, i);
8474 : 672493 : while (var != SymbolTable_NulSym)
8475 : : {
8476 : 541055 : M2Debug_Assert (procedure == (SymbolTable_GetScope (var)));
8477 : 541055 : M2GCCDeclare_DeclareLocalVariable (var);
8478 : 541055 : i += 1;
8479 : 541055 : var = SymbolTable_GetNth (procedure, i);
8480 : : }
8481 : 65719 : }
8482 : :
8483 : :
8484 : : /*
8485 : : DeclareLocalVariable - declare a local variable var.
8486 : : */
8487 : :
8488 : 541055 : extern "C" void M2GCCDeclare_DeclareLocalVariable (unsigned int var)
8489 : : {
8490 : 541055 : M2Debug_Assert (AllDependantsFullyDeclared (var));
8491 : 541055 : DoVariableDeclaration (var, NameKey_KeyToCharStar (M2AsmUtil_GetFullSymName (var)), false, false, SymbolTable_IsTemporary (var), false, SymbolConversion_Mod2Gcc (SymbolTable_GetScope (var))); /* and are not global */
8492 : 541055 : }
8493 : :
8494 : :
8495 : : /*
8496 : : DeclareProcedure - declares procedure, sym, or all procedures inside
8497 : : module sym.
8498 : : */
8499 : :
8500 : 3742167 : extern "C" void M2GCCDeclare_DeclareProcedure (unsigned int sym)
8501 : : {
8502 : 3742167 : if (SymbolTable_IsProcedure (sym))
8503 : : {
8504 : 3583957 : DeclareProcedureToGcc (sym);
8505 : : }
8506 : 158210 : else if ((SymbolTable_IsModule (sym)) || (SymbolTable_IsDefImp (sym)))
8507 : : {
8508 : : /* avoid dangling else. */
8509 : 158210 : SymbolTable_ForeachProcedureDo (sym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2GCCDeclare_DeclareProcedure});
8510 : : }
8511 : : else
8512 : : {
8513 : : /* avoid dangling else. */
8514 : 0 : M2Error_InternalError ((const char *) "expecting procedure", 19);
8515 : : }
8516 : 3742167 : }
8517 : :
8518 : :
8519 : : /*
8520 : : DeclareModuleVariables - declares Module variables for a module
8521 : : which was declared inside a procedure.
8522 : : */
8523 : :
8524 : 144 : extern "C" void M2GCCDeclare_DeclareModuleVariables (unsigned int sym)
8525 : : {
8526 : 144 : tree scope;
8527 : 144 : unsigned int i;
8528 : 144 : unsigned int Var;
8529 : :
8530 : 144 : i = 1;
8531 : 144 : scope = SymbolConversion_Mod2Gcc (SymbolTable_GetProcedureScope (sym));
8532 : 144 : Var = SymbolTable_GetNth (sym, i);
8533 : 366 : while (Var != SymbolTable_NulSym)
8534 : : {
8535 : 78 : M2Debug_Assert (AllDependantsFullyDeclared (SymbolTable_GetSType (Var)));
8536 : 78 : DoVariableDeclaration (Var, NameKey_KeyToCharStar (M2AsmUtil_GetFullSymName (Var)), false, false, SymbolTable_IsTemporary (Var), false, scope); /* and are not global */
8537 : 78 : i += 1;
8538 : 78 : Var = SymbolTable_GetNth (sym, i);
8539 : : }
8540 : 144 : }
8541 : :
8542 : :
8543 : : /*
8544 : : IsProcedureGccNested - returns TRUE if procedure, sym, will be considered
8545 : : as nested by GCC.
8546 : : This will occur if either its outer defining scope
8547 : : is a procedure or is a module which is inside a
8548 : : procedure.
8549 : : */
8550 : :
8551 : 2235452 : extern "C" bool M2GCCDeclare_IsProcedureGccNested (unsigned int sym)
8552 : : {
8553 : 2235452 : return (SymbolTable_IsProcedureNested (sym)) || ((SymbolTable_IsModule (SymbolTable_GetScope (sym))) && (SymbolTable_IsModuleWithinProcedure (SymbolTable_GetScope (sym))));
8554 : : /* static analysis guarentees a RETURN statement will be used before here. */
8555 : : __builtin_unreachable ();
8556 : : }
8557 : :
8558 : :
8559 : : /*
8560 : : PoisonSymbols - poisons all gcc symbols from procedure, sym.
8561 : : A debugging aid.
8562 : : */
8563 : :
8564 : 65713 : extern "C" void M2GCCDeclare_PoisonSymbols (unsigned int sym)
8565 : : {
8566 : 65713 : if (SymbolTable_IsProcedure (sym))
8567 : : {
8568 : 65713 : SymbolTable_ForeachLocalSymDo (sym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) SymbolConversion_Poison});
8569 : : }
8570 : 65713 : }
8571 : :
8572 : :
8573 : : /*
8574 : : PromoteToString - declare, sym, and then promote it to a string.
8575 : : Note that if sym is a single character we do
8576 : : *not* record it as a string
8577 : : but as a char however we always
8578 : : return a string constant.
8579 : : */
8580 : :
8581 : 22132 : extern "C" tree M2GCCDeclare_PromoteToString (unsigned int tokenno, unsigned int sym)
8582 : : {
8583 : 22132 : unsigned int size;
8584 : 22132 : char ch;
8585 : :
8586 : 22132 : M2GCCDeclare_DeclareConstant (tokenno, sym);
8587 : 22132 : if ((SymbolTable_IsConst (sym)) && ((SymbolTable_GetSType (sym)) == M2Base_Char))
8588 : : {
8589 : 1516 : SymbolTable_PushValue (sym);
8590 : 1516 : ch = M2ALU_PopChar (tokenno);
8591 : 1516 : return m2decl_BuildCStringConstant (const_cast <const char * > (static_cast <char * > (DynamicStrings_string (DynamicStrings_InitStringChar (ch)))), 1);
8592 : : }
8593 : : else
8594 : : {
8595 : 20616 : M2Debug_Assert (SymbolTable_IsConstStringKnown (sym));
8596 : 20616 : size = SymbolTable_GetStringLength (tokenno, sym);
8597 : 20616 : if (size > 1)
8598 : : {
8599 : : /* It will be already be declared as a string, so return it. */
8600 : 20314 : return (tree) (SymbolConversion_Mod2Gcc (sym));
8601 : : }
8602 : : else
8603 : : {
8604 : 302 : return m2decl_BuildStringConstant (const_cast <const char * > (static_cast <char * > (NameKey_KeyToCharStar (SymbolTable_GetString (sym)))), static_cast<int> (SymbolTable_GetStringLength (tokenno, sym)));
8605 : : }
8606 : : }
8607 : : /* static analysis guarentees a RETURN statement will be used before here. */
8608 : : __builtin_unreachable ();
8609 : : }
8610 : :
8611 : :
8612 : : /*
8613 : : PromoteToCString - declare, sym, and then promote it to a string.
8614 : : Note that if sym is a single character we do
8615 : : *not* record it as a string
8616 : : but as a char however we always
8617 : : return a string constant.
8618 : : */
8619 : :
8620 : 48 : extern "C" tree M2GCCDeclare_PromoteToCString (unsigned int tokenno, unsigned int sym)
8621 : : {
8622 : 48 : unsigned int size;
8623 : 48 : char ch;
8624 : :
8625 : 48 : M2GCCDeclare_DeclareConstant (tokenno, sym);
8626 : 48 : M2Debug_Assert (SymbolTable_IsConstStringKnown (sym));
8627 : 48 : if ((SymbolTable_IsConst (sym)) && ((SymbolTable_GetSType (sym)) == M2Base_Char))
8628 : : {
8629 : 12 : SymbolTable_PushValue (sym);
8630 : 12 : ch = M2ALU_PopChar (tokenno);
8631 : 12 : return m2decl_BuildCStringConstant (const_cast <const char * > (static_cast <char * > (DynamicStrings_string (DynamicStrings_InitStringChar (ch)))), 1);
8632 : : }
8633 : : else
8634 : : {
8635 : 36 : size = SymbolTable_GetStringLength (tokenno, sym);
8636 : 36 : return m2decl_BuildCStringConstant (const_cast <const char * > (static_cast <char * > (NameKey_KeyToCharStar (SymbolTable_GetString (sym)))), static_cast<int> (size));
8637 : : }
8638 : : /* static analysis guarentees a RETURN statement will be used before here. */
8639 : : __builtin_unreachable ();
8640 : : }
8641 : :
8642 : :
8643 : : /*
8644 : : CompletelyResolved - returns TRUE if a symbols has been completely resolved
8645 : : and is not partically declared (such as a record).
8646 : : */
8647 : :
8648 : 6927919 : extern "C" bool M2GCCDeclare_CompletelyResolved (unsigned int sym)
8649 : : {
8650 : 6927919 : return Sets_IsElementInSet (GlobalGroup->FullyDeclared, sym);
8651 : : /* static analysis guarentees a RETURN statement will be used before here. */
8652 : : __builtin_unreachable ();
8653 : : }
8654 : :
8655 : :
8656 : : /*
8657 : : ConstantKnownAndUsed -
8658 : : */
8659 : :
8660 : 30 : extern "C" void M2GCCDeclare_ConstantKnownAndUsed (unsigned int sym, tree t)
8661 : : {
8662 : 30 : DeclareConstantFromTree (sym, m2block_RememberConstant (t));
8663 : 30 : }
8664 : :
8665 : :
8666 : : /*
8667 : : PutToBeSolvedByQuads - places, sym, to this list and returns,
8668 : : sym.
8669 : : */
8670 : :
8671 : 288405 : extern "C" void M2GCCDeclare_PutToBeSolvedByQuads (unsigned int sym)
8672 : : {
8673 : 288405 : WatchIncludeList (sym, M2GCCDeclare_tobesolvedbyquads);
8674 : 288405 : }
8675 : :
8676 : :
8677 : : /*
8678 : : MarkExported - tell GCC to mark all exported procedures in module sym.
8679 : : */
8680 : :
8681 : 21421 : extern "C" void M2GCCDeclare_MarkExported (unsigned int sym)
8682 : : {
8683 : 21421 : if (M2Options_Optimizing)
8684 : : {
8685 : 14345 : m2type_MarkFunctionReferenced (SymbolConversion_Mod2Gcc (sym));
8686 : 14345 : if ((SymbolTable_IsDefImp (sym)) || (SymbolTable_IsModule (sym)))
8687 : : {
8688 : 6125 : SymbolTable_ForeachExportedDo (sym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2GCCDeclare_MarkExported});
8689 : : }
8690 : : }
8691 : 21421 : }
8692 : :
8693 : :
8694 : : /*
8695 : : GetTypeMin -
8696 : : */
8697 : :
8698 : 1807558 : extern "C" unsigned int M2GCCDeclare_GetTypeMin (unsigned int type)
8699 : : {
8700 : 1809476 : unsigned int min;
8701 : 1809476 : unsigned int max;
8702 : :
8703 : 1809476 : if (SymbolTable_IsSubrange (type))
8704 : : {
8705 : 1591038 : SymbolTable_GetSubrange (type, &max, &min);
8706 : 1591038 : return min;
8707 : : }
8708 : 218438 : else if (SymbolTable_IsSet (type))
8709 : : {
8710 : : /* avoid dangling else. */
8711 : 1900 : return M2GCCDeclare_GetTypeMin (SymbolTable_GetSType (type));
8712 : : }
8713 : 216538 : else if (SymbolTable_IsEnumeration (type))
8714 : : {
8715 : : /* avoid dangling else. */
8716 : 209144 : MinEnumerationField = SymbolTable_NulSym;
8717 : 209144 : MaxEnumerationField = SymbolTable_NulSym;
8718 : 209144 : SymbolTable_ForeachLocalSymDo (type, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) FindMinMaxEnum});
8719 : 209144 : return MinEnumerationField;
8720 : : }
8721 : 7394 : else if (IsBaseType (type))
8722 : : {
8723 : : /* avoid dangling else. */
8724 : 7376 : M2Base_GetBaseTypeMinMax (type, &min, &max);
8725 : 7376 : return min;
8726 : : }
8727 : 18 : else if (M2System_IsSystemType (type))
8728 : : {
8729 : : /* avoid dangling else. */
8730 : 0 : M2System_GetSystemTypeMinMax (type, &min, &max);
8731 : 0 : return min;
8732 : : }
8733 : 18 : else if ((SymbolTable_GetSType (type)) == SymbolTable_NulSym)
8734 : : {
8735 : : /* avoid dangling else. */
8736 : 0 : M2MetaError_MetaError1 ((const char *) "unable to obtain the MIN value for type {%1as}", 46, type);
8737 : 0 : return SymbolTable_NulSym;
8738 : : }
8739 : : else
8740 : : {
8741 : : /* avoid dangling else. */
8742 : 18 : return M2GCCDeclare_GetTypeMin (SymbolTable_GetSType (type));
8743 : : }
8744 : : /* static analysis guarentees a RETURN statement will be used before here. */
8745 : : __builtin_unreachable ();
8746 : : }
8747 : :
8748 : :
8749 : : /*
8750 : : GetTypeMax -
8751 : : */
8752 : :
8753 : 1768590 : extern "C" unsigned int M2GCCDeclare_GetTypeMax (unsigned int type)
8754 : : {
8755 : 1770508 : unsigned int min;
8756 : 1770508 : unsigned int max;
8757 : :
8758 : 1770508 : if (SymbolTable_IsSubrange (type))
8759 : : {
8760 : 1553088 : SymbolTable_GetSubrange (type, &max, &min);
8761 : 1553088 : return max;
8762 : : }
8763 : 217420 : else if (SymbolTable_IsSet (type))
8764 : : {
8765 : : /* avoid dangling else. */
8766 : 1900 : return M2GCCDeclare_GetTypeMax (SymbolTable_GetSType (type));
8767 : : }
8768 : 215520 : else if (SymbolTable_IsEnumeration (type))
8769 : : {
8770 : : /* avoid dangling else. */
8771 : 208144 : MinEnumerationField = SymbolTable_NulSym;
8772 : 208144 : MaxEnumerationField = SymbolTable_NulSym;
8773 : 208144 : SymbolTable_ForeachLocalSymDo (type, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) FindMinMaxEnum});
8774 : 208144 : return MaxEnumerationField;
8775 : : }
8776 : 7376 : else if (IsBaseType (type))
8777 : : {
8778 : : /* avoid dangling else. */
8779 : 7358 : M2Base_GetBaseTypeMinMax (type, &min, &max);
8780 : 7358 : return max;
8781 : : }
8782 : 18 : else if (M2System_IsSystemType (type))
8783 : : {
8784 : : /* avoid dangling else. */
8785 : 0 : M2System_GetSystemTypeMinMax (type, &min, &max);
8786 : 0 : return max;
8787 : : }
8788 : 18 : else if ((SymbolTable_GetSType (type)) == SymbolTable_NulSym)
8789 : : {
8790 : : /* avoid dangling else. */
8791 : 0 : M2MetaError_MetaError1 ((const char *) "unable to obtain the MAX value for type {%1as}", 46, type);
8792 : 0 : return SymbolTable_NulSym;
8793 : : }
8794 : : else
8795 : : {
8796 : : /* avoid dangling else. */
8797 : 18 : return M2GCCDeclare_GetTypeMax (SymbolTable_GetSType (type));
8798 : : }
8799 : : /* static analysis guarentees a RETURN statement will be used before here. */
8800 : : __builtin_unreachable ();
8801 : : }
8802 : :
8803 : :
8804 : : /*
8805 : : PrintSym - prints limited information about a symbol.
8806 : : This procedure is externally visible.
8807 : : */
8808 : :
8809 : 0 : extern "C" void M2GCCDeclare_PrintSym (unsigned int sym)
8810 : : {
8811 : 0 : M2Printf_printf1 ((const char *) "information about symbol: %d\\n", 30, (const unsigned char *) &sym, (sizeof (sym)-1));
8812 : 0 : M2Printf_fprintf0 (M2LangDump_GetDumpFile (), (const char *) "==============================\\n", 32);
8813 : 0 : PrintVerbose (sym);
8814 : 0 : }
8815 : :
8816 : :
8817 : : /*
8818 : : IncludeDumpSymbol - include sym into the watch list and all syms dependants.
8819 : : */
8820 : :
8821 : 0 : extern "C" void M2GCCDeclare_IncludeDumpSymbol (unsigned int sym)
8822 : : {
8823 : 0 : if (sym != SymbolTable_NulSym)
8824 : : {
8825 : : /*
8826 : : fprintf0 (GetDumpFile (), "
8827 : : ") ;
8828 : : PrintVerbose (sym) ;
8829 : : fprintf0 (GetDumpFile (), "
8830 : : ")
8831 : : */
8832 : 0 : AddSymToWatch (sym);
8833 : : }
8834 : 0 : }
8835 : :
8836 : :
8837 : : /*
8838 : : DumpFilteredResolver - dumps the gimple or tree representation of all watched symbols.
8839 : : */
8840 : :
8841 : 0 : extern "C" void M2GCCDeclare_DumpFilteredResolver (void)
8842 : : {
8843 : 0 : Sets_ForeachElementInSetDo (WatchList, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) DumpResolver});
8844 : 0 : }
8845 : :
8846 : :
8847 : : /*
8848 : : DumpFilteredDefinitive - dumps the gimple or tree representation of all watched symbols.
8849 : : */
8850 : :
8851 : 0 : extern "C" void M2GCCDeclare_DumpFilteredDefinitive (void)
8852 : : {
8853 : 0 : Sets_ForeachElementInSetDo (WatchList, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) DumpDefinitive});
8854 : 0 : }
8855 : :
8856 : :
8857 : : /*
8858 : : InitDeclarations - initializes default types and the source filename.
8859 : : */
8860 : :
8861 : 13345 : extern "C" void M2GCCDeclare_InitDeclarations (void)
8862 : : {
8863 : 13345 : DeclareDefaultTypes ();
8864 : 13345 : DeclareDefaultConstants ();
8865 : 13345 : }
8866 : :
8867 : 14232 : extern "C" void _M2_M2GCCDeclare_init (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
8868 : : {
8869 : 14232 : FreeGroup = NULL;
8870 : 14232 : GlobalGroup = InitGroup ();
8871 : 14232 : ChainedList = Sets_InitSet (1);
8872 : 14232 : WatchList = Sets_InitSet (1);
8873 : 14232 : VisitedList = static_cast<Sets_Set> (NULL);
8874 : 14232 : EnumerationIndex = Indexing_InitIndex (1);
8875 : 14232 : HaveInitDefaultTypes = false;
8876 : 14232 : recursionCaught = false;
8877 : 14232 : }
8878 : :
8879 : 0 : extern "C" void _M2_M2GCCDeclare_fini (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
8880 : : {
8881 : 0 : }
|