Branch data Line data Source code
1 : : /* do not edit automatically generated by mc from PCSymBuild. */
2 : : /* PCSymBuild.mod pass C symbol creation.
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 <stdbool.h>
26 : : # if !defined (PROC_D)
27 : : # define PROC_D
28 : : typedef void (*PROC_t) (void);
29 : : typedef struct { PROC_t proc; } PROC;
30 : : # endif
31 : :
32 : : # if !defined (TRUE)
33 : : # define TRUE (1==1)
34 : : # endif
35 : :
36 : : # if !defined (FALSE)
37 : : # define FALSE (1==0)
38 : : # endif
39 : :
40 : : # include "GStorage.h"
41 : : # include "Gmcrts.h"
42 : : #if defined(__cplusplus)
43 : : # undef NULL
44 : : # define NULL 0
45 : : #endif
46 : : #define _PCSymBuild_H
47 : : #define _PCSymBuild_C
48 : :
49 : : # include "GStorage.h"
50 : : # include "GNameKey.h"
51 : : # include "GStrIO.h"
52 : : # include "GNumberIO.h"
53 : : # include "GM2Debug.h"
54 : : # include "GM2Error.h"
55 : : # include "GM2MetaError.h"
56 : : # include "GM2LexBuf.h"
57 : : # include "GM2Reserved.h"
58 : : # include "GM2Const.h"
59 : : # include "GIndexing.h"
60 : : # include "GM2Quads.h"
61 : : # include "GM2Options.h"
62 : : # include "GStdIO.h"
63 : : # include "GM2System.h"
64 : : # include "GM2Base.h"
65 : : # include "GSymbolTable.h"
66 : : # include "GM2Batch.h"
67 : : # include "GM2Comp.h"
68 : : # include "GM2StackAddress.h"
69 : : # include "GM2StackWord.h"
70 : :
71 : : # define Debugging false
72 : : typedef struct PCSymBuild_eDes_r PCSymBuild_eDes;
73 : :
74 : : typedef struct PCSymBuild_eLeaf_r PCSymBuild_eLeaf;
75 : :
76 : : typedef struct PCSymBuild_eUnary_r PCSymBuild_eUnary;
77 : :
78 : : typedef struct PCSymBuild_eBinary_r PCSymBuild_eBinary;
79 : :
80 : : typedef struct PCSymBuild_eExpr_r PCSymBuild_eExpr;
81 : :
82 : : typedef struct PCSymBuild_eFunction_r PCSymBuild_eFunction;
83 : :
84 : : typedef struct PCSymBuild_eConvert_r PCSymBuild_eConvert;
85 : :
86 : : typedef struct PCSymBuild_eNode_r PCSymBuild_eNode;
87 : :
88 : : typedef PCSymBuild_eNode *PCSymBuild_exprNode;
89 : :
90 : : typedef enum {PCSymBuild_leaf, PCSymBuild_unary, PCSymBuild_binary, PCSymBuild_designator, PCSymBuild_expr, PCSymBuild_convert, PCSymBuild_function} PCSymBuild_tagType;
91 : :
92 : : struct PCSymBuild_eDes_r {
93 : : unsigned int type;
94 : : M2Const_constType meta;
95 : : unsigned int sym;
96 : : PCSymBuild_exprNode left;
97 : : };
98 : :
99 : : struct PCSymBuild_eLeaf_r {
100 : : unsigned int type;
101 : : M2Const_constType meta;
102 : : unsigned int sym;
103 : : };
104 : :
105 : : struct PCSymBuild_eUnary_r {
106 : : unsigned int type;
107 : : M2Const_constType meta;
108 : : PCSymBuild_exprNode left;
109 : : NameKey_Name op;
110 : : };
111 : :
112 : : struct PCSymBuild_eBinary_r {
113 : : unsigned int type;
114 : : M2Const_constType meta;
115 : : PCSymBuild_exprNode left;
116 : : PCSymBuild_exprNode right;
117 : : NameKey_Name op;
118 : : };
119 : :
120 : : struct PCSymBuild_eExpr_r {
121 : : unsigned int type;
122 : : M2Const_constType meta;
123 : : PCSymBuild_exprNode left;
124 : : };
125 : :
126 : : struct PCSymBuild_eFunction_r {
127 : : unsigned int type;
128 : : M2Const_constType meta;
129 : : unsigned int func;
130 : : PCSymBuild_exprNode first;
131 : : PCSymBuild_exprNode second;
132 : : bool third;
133 : : };
134 : :
135 : : struct PCSymBuild_eConvert_r {
136 : : unsigned int type;
137 : : M2Const_constType meta;
138 : : PCSymBuild_exprNode totype;
139 : : PCSymBuild_exprNode expr;
140 : : };
141 : :
142 : : struct PCSymBuild_eNode_r {
143 : : PCSymBuild_tagType tag; /* case tag */
144 : : union {
145 : : PCSymBuild_eDes edes;
146 : : PCSymBuild_eLeaf eleaf;
147 : : PCSymBuild_eUnary eunary;
148 : : PCSymBuild_eBinary ebinary;
149 : : PCSymBuild_eExpr eexpr;
150 : : PCSymBuild_eFunction efunction;
151 : : PCSymBuild_eConvert econvert;
152 : : };
153 : : };
154 : :
155 : : static M2StackAddress_StackOfAddress exprStack;
156 : : static Indexing_Index constList;
157 : : static unsigned int constToken;
158 : : static M2StackWord_StackOfWord desStack;
159 : : static bool inDesignator;
160 : : extern "C" void PCSymBuild_PCStartBuildDefModule (void);
161 : : extern "C" void PCSymBuild_PCEndBuildDefModule (void);
162 : : extern "C" void PCSymBuild_PCStartBuildImpModule (void);
163 : : extern "C" void PCSymBuild_PCEndBuildImpModule (void);
164 : : extern "C" void PCSymBuild_PCStartBuildProgModule (void);
165 : : extern "C" void PCSymBuild_PCEndBuildProgModule (void);
166 : : extern "C" void PCSymBuild_PCStartBuildInnerModule (void);
167 : : extern "C" void PCSymBuild_PCEndBuildInnerModule (void);
168 : : extern "C" void PCSymBuild_PCBuildProcedureHeading (void);
169 : : extern "C" void PCSymBuild_PCStartBuildProcedure (void);
170 : : extern "C" void PCSymBuild_PCEndBuildProcedure (void);
171 : : extern "C" void PCSymBuild_PCBuildImportOuterModule (void);
172 : : extern "C" void PCSymBuild_PCBuildImportInnerModule (void);
173 : :
174 : : /*
175 : : BuildNulName - Pushes a NulKey onto the top of the stack.
176 : : The Stack:
177 : :
178 : :
179 : : Entry Exit
180 : :
181 : : <- Ptr
182 : : Empty +------------+
183 : : | NulKey |
184 : : |------------|
185 : : */
186 : :
187 : : extern "C" void PCSymBuild_BuildNulName (void);
188 : :
189 : : /*
190 : : BuildConst - builds a constant.
191 : : Stack
192 : :
193 : : Entry Exit
194 : :
195 : : Ptr -> <- Ptr
196 : : +------------+ +------------+
197 : : | Name | | Sym |
198 : : |------------+ |------------|
199 : : */
200 : :
201 : : extern "C" void PCSymBuild_BuildConst (void);
202 : :
203 : : /*
204 : : StartDesConst -
205 : : */
206 : :
207 : : extern "C" void PCSymBuild_StartDesConst (void);
208 : :
209 : : /*
210 : : EndDesConst -
211 : : */
212 : :
213 : : extern "C" void PCSymBuild_EndDesConst (void);
214 : :
215 : : /*
216 : : BuildRelationConst - builds a relationship binary operation.
217 : : */
218 : :
219 : : extern "C" void PCSymBuild_BuildRelationConst (void);
220 : :
221 : : /*
222 : : BuildUnaryConst - builds a unary operator node.
223 : : */
224 : :
225 : : extern "C" void PCSymBuild_BuildUnaryConst (void);
226 : :
227 : : /*
228 : : BuildBinaryConst - builds a binary operator node.
229 : : */
230 : :
231 : : extern "C" void PCSymBuild_BuildBinaryConst (void);
232 : :
233 : : /*
234 : : PushConstFunctionType -
235 : : */
236 : :
237 : : extern "C" void PCSymBuild_PushConstFunctionType (void);
238 : :
239 : : /*
240 : : PushIntegerType -
241 : : */
242 : :
243 : : extern "C" void PCSymBuild_PushIntegerType (void);
244 : :
245 : : /*
246 : : PushRType -
247 : : */
248 : :
249 : : extern "C" void PCSymBuild_PushRType (void);
250 : :
251 : : /*
252 : : PushStringType -
253 : : */
254 : :
255 : : extern "C" void PCSymBuild_PushStringType (void);
256 : :
257 : : /*
258 : : SkipConst - returns an alias to constant, sym, if one exists.
259 : : Otherwise sym is returned.
260 : : */
261 : :
262 : : extern "C" unsigned int PCSymBuild_SkipConst (unsigned int sym);
263 : :
264 : : /*
265 : : PushConstType - pushes a constant to the expression stack.
266 : : */
267 : :
268 : : extern "C" void PCSymBuild_PushConstType (void);
269 : :
270 : : /*
271 : : PushConstAttributeType -
272 : : */
273 : :
274 : : extern "C" void PCSymBuild_PushConstAttributeType (void);
275 : :
276 : : /*
277 : : PushConstAttributePairType -
278 : : */
279 : :
280 : : extern "C" void PCSymBuild_PushConstAttributePairType (void);
281 : :
282 : : /*
283 : : PushConstructorCastType -
284 : : */
285 : :
286 : : extern "C" void PCSymBuild_PushConstructorCastType (void);
287 : :
288 : : /*
289 : : PushInConstructor -
290 : : */
291 : :
292 : : extern "C" void PCSymBuild_PushInConstructor (void);
293 : :
294 : : /*
295 : : PopInConstructor -
296 : : */
297 : :
298 : : extern "C" void PCSymBuild_PopInConstructor (void);
299 : :
300 : : /*
301 : : ResolveConstTypes - resolves the types of all designator declared constants.
302 : : */
303 : :
304 : : extern "C" void PCSymBuild_ResolveConstTypes (void);
305 : :
306 : : /*
307 : : GetSkippedType -
308 : : */
309 : :
310 : : static unsigned int GetSkippedType (unsigned int sym);
311 : :
312 : : /*
313 : : InitDesExpr -
314 : : */
315 : :
316 : : static void InitDesExpr (unsigned int des);
317 : :
318 : : /*
319 : : DebugNode -
320 : : */
321 : :
322 : : static void DebugNode (PCSymBuild_exprNode d);
323 : :
324 : : /*
325 : : DebugDes -
326 : : */
327 : :
328 : : static void DebugDes (PCSymBuild_exprNode d);
329 : :
330 : : /*
331 : : DebugSym -
332 : : */
333 : :
334 : : static void DebugSym (unsigned int sym);
335 : :
336 : : /*
337 : : DebugMeta -
338 : : */
339 : :
340 : : static void DebugMeta (M2Const_constType m);
341 : :
342 : : /*
343 : : DebugType -
344 : : */
345 : :
346 : : static void DebugType (unsigned int type);
347 : :
348 : : /*
349 : : DebugExpr -
350 : : */
351 : :
352 : : static void DebugExpr (PCSymBuild_exprNode e);
353 : :
354 : : /*
355 : : DebugFunction -
356 : : */
357 : :
358 : : static void DebugFunction (PCSymBuild_exprNode f);
359 : :
360 : : /*
361 : : DebugConvert -
362 : : */
363 : :
364 : : static void DebugConvert (PCSymBuild_exprNode f);
365 : :
366 : : /*
367 : : DebugLeaf -
368 : : */
369 : :
370 : : static void DebugLeaf (PCSymBuild_exprNode l);
371 : :
372 : : /*
373 : : DebugUnary -
374 : : */
375 : :
376 : : static void DebugUnary (PCSymBuild_exprNode l);
377 : :
378 : : /*
379 : : DebugBinary -
380 : : */
381 : :
382 : : static void DebugBinary (PCSymBuild_exprNode l);
383 : :
384 : : /*
385 : : DebugOp -
386 : : */
387 : :
388 : : static void DebugOp (NameKey_Name op);
389 : :
390 : : /*
391 : : fixupProcedureType - creates a proctype from a procedure.
392 : : */
393 : :
394 : : static unsigned int fixupProcedureType (unsigned int p);
395 : :
396 : : /*
397 : : InitFunction -
398 : : */
399 : :
400 : : static void InitFunction (M2Const_constType m, unsigned int p, unsigned int t, PCSymBuild_exprNode f, PCSymBuild_exprNode s, bool more);
401 : :
402 : : /*
403 : : InitConvert -
404 : : */
405 : :
406 : : static void InitConvert (M2Const_constType m, unsigned int t, PCSymBuild_exprNode to, PCSymBuild_exprNode e);
407 : :
408 : : /*
409 : : InitLeaf -
410 : : */
411 : :
412 : : static void InitLeaf (M2Const_constType m, unsigned int s, unsigned int t);
413 : :
414 : : /*
415 : : InitProcedure -
416 : : */
417 : :
418 : : static void InitProcedure (unsigned int s);
419 : :
420 : : /*
421 : : InitCharType -
422 : : */
423 : :
424 : : static void InitCharType (unsigned int s);
425 : :
426 : : /*
427 : : InitZType -
428 : : */
429 : :
430 : : static void InitZType (unsigned int s);
431 : :
432 : : /*
433 : : InitRType -
434 : : */
435 : :
436 : : static void InitRType (unsigned int s);
437 : :
438 : : /*
439 : : InitUnknown -
440 : : */
441 : :
442 : : static void InitUnknown (unsigned int s);
443 : :
444 : : /*
445 : : InitBooleanType -
446 : : */
447 : :
448 : : static void InitBooleanType (unsigned int s);
449 : :
450 : : /*
451 : : TypeToMeta -
452 : : */
453 : :
454 : : static M2Const_constType TypeToMeta (unsigned int type);
455 : :
456 : : /*
457 : : buildConstFunction - we are only concerned about resolving the return type o
458 : : a function, so we can ignore all parameters - except
459 : : the first one in the case of VAL(type, foo).
460 : : buildConstFunction uses a unary exprNode to represent
461 : : a function.
462 : : */
463 : :
464 : : static void buildConstFunction (unsigned int func, unsigned int n);
465 : :
466 : : /*
467 : : ErrorConstFunction - generate an error message at functok using func in the
468 : : error message providing it is not NulSym.
469 : : */
470 : :
471 : : static void ErrorConstFunction (unsigned int func, unsigned int functok);
472 : :
473 : : /*
474 : : InitBinary -
475 : : */
476 : :
477 : : static void InitBinary (M2Const_constType m, unsigned int t, NameKey_Name o);
478 : :
479 : : /*
480 : : InitUnary -
481 : : */
482 : :
483 : : static void InitUnary (M2Const_constType m, unsigned int t, NameKey_Name o);
484 : :
485 : : /*
486 : : isTypeResolved -
487 : : */
488 : :
489 : : static bool isTypeResolved (PCSymBuild_exprNode e);
490 : :
491 : : /*
492 : : getEtype -
493 : : */
494 : :
495 : : static unsigned int getEtype (PCSymBuild_exprNode e);
496 : :
497 : : /*
498 : : getEmeta -
499 : : */
500 : :
501 : : static M2Const_constType getEmeta (PCSymBuild_exprNode e);
502 : :
503 : : /*
504 : : assignTM -
505 : : */
506 : :
507 : : static void assignTM (unsigned int *td, M2Const_constType *md, unsigned int te, M2Const_constType me);
508 : :
509 : : /*
510 : : assignType -
511 : : */
512 : :
513 : : static void assignType (PCSymBuild_exprNode d, PCSymBuild_exprNode e);
514 : :
515 : : /*
516 : : deduceTypes - works out the type and metatype given, l, and, r.
517 : : */
518 : :
519 : : static void deduceTypes (unsigned int *t, M2Const_constType *m, PCSymBuild_exprNode l, PCSymBuild_exprNode r, NameKey_Name op);
520 : :
521 : : /*
522 : : WalkConvert -
523 : : */
524 : :
525 : : static bool WalkConvert (PCSymBuild_exprNode e);
526 : :
527 : : /*
528 : : WalkFunctionParam -
529 : : */
530 : :
531 : : static bool WalkFunctionParam (unsigned int func, PCSymBuild_exprNode e);
532 : :
533 : : /*
534 : : WalkFunction -
535 : : */
536 : :
537 : : static bool WalkFunction (PCSymBuild_exprNode e);
538 : :
539 : : /*
540 : : doWalkNode -
541 : : */
542 : :
543 : : static bool doWalkNode (PCSymBuild_exprNode e);
544 : :
545 : : /*
546 : : WalkLeaf -
547 : : */
548 : :
549 : : static bool WalkLeaf (PCSymBuild_exprNode e);
550 : :
551 : : /*
552 : : WalkUnary -
553 : : */
554 : :
555 : : static bool WalkUnary (PCSymBuild_exprNode e);
556 : :
557 : : /*
558 : : WalkBinary -
559 : : */
560 : :
561 : : static bool WalkBinary (PCSymBuild_exprNode e);
562 : :
563 : : /*
564 : : WalkExpr -
565 : : */
566 : :
567 : : static bool WalkExpr (PCSymBuild_exprNode e);
568 : :
569 : : /*
570 : : doWalkDesExpr - returns TRUE if the expression trees, d, or, e, are changed.
571 : : */
572 : :
573 : : static bool doWalkDesExpr (PCSymBuild_exprNode d, PCSymBuild_exprNode e);
574 : :
575 : : /*
576 : : doWalkDes - return TRUE if expression, e, is changed.
577 : : */
578 : :
579 : : static bool doWalkDes (PCSymBuild_exprNode d);
580 : :
581 : : /*
582 : : findConstDes -
583 : : */
584 : :
585 : : static PCSymBuild_exprNode findConstDes (unsigned int sym);
586 : :
587 : : /*
588 : : WalkDes - return TRUE if expression, e, is changed.
589 : : */
590 : :
591 : : static bool WalkDes (PCSymBuild_exprNode d);
592 : :
593 : : /*
594 : : WalkConsts - walk over the constant trees and return TRUE if any tree was changed.
595 : : (As a result of a type resolution).
596 : : */
597 : :
598 : : static bool WalkConsts (void);
599 : :
600 : : /*
601 : : DebugNodes -
602 : : */
603 : :
604 : : static void DebugNodes (void);
605 : :
606 : : /*
607 : : findAlias -
608 : : */
609 : :
610 : : static unsigned int findAlias (unsigned int sym, PCSymBuild_exprNode e);
611 : :
612 : : /*
613 : : CheckConsts -
614 : : */
615 : :
616 : : static void CheckConsts (void);
617 : :
618 : : /*
619 : : Init -
620 : : */
621 : :
622 : : static void Init (void);
623 : :
624 : :
625 : : /*
626 : : GetSkippedType -
627 : : */
628 : :
629 : 317545 : static unsigned int GetSkippedType (unsigned int sym)
630 : : {
631 : 317545 : return SymbolTable_SkipType (SymbolTable_GetType (sym));
632 : : /* static analysis guarentees a RETURN statement will be used before here. */
633 : : __builtin_unreachable ();
634 : : }
635 : :
636 : :
637 : : /*
638 : : InitDesExpr -
639 : : */
640 : :
641 : 248113 : static void InitDesExpr (unsigned int des)
642 : : {
643 : 248113 : PCSymBuild_exprNode e;
644 : :
645 : 248113 : Storage_ALLOCATE ((void **) &e, sizeof (PCSymBuild_eNode));
646 : 248113 : e->tag = PCSymBuild_designator;
647 : 248113 : switch (e->tag)
648 : : {
649 : 248113 : case PCSymBuild_designator:
650 : 248113 : e->edes.type = SymbolTable_NulSym;
651 : 248113 : e->edes.meta = M2Const_unknown;
652 : 248113 : e->tag = PCSymBuild_designator;
653 : 248113 : e->edes.sym = des;
654 : 248113 : e->edes.left = NULL;
655 : 248113 : break;
656 : :
657 : :
658 : : default:
659 : : M2Error_InternalError ((const char *) "expecting designator", 20);
660 : 248113 : break;
661 : : }
662 : 248113 : M2StackAddress_PushAddress (exprStack, reinterpret_cast<void *> (e));
663 : 248113 : }
664 : :
665 : :
666 : : /*
667 : : DebugNode -
668 : : */
669 : :
670 : 0 : static void DebugNode (PCSymBuild_exprNode d)
671 : : {
672 : 0 : if (Debugging && (d != NULL))
673 : : {
674 : : switch (d->tag)
675 : : {
676 : : case PCSymBuild_designator:
677 : : DebugDes (d);
678 : : break;
679 : :
680 : : case PCSymBuild_expr:
681 : : DebugExpr (d);
682 : : break;
683 : :
684 : : case PCSymBuild_leaf:
685 : : DebugLeaf (d);
686 : : break;
687 : :
688 : : case PCSymBuild_unary:
689 : : DebugUnary (d);
690 : : break;
691 : :
692 : : case PCSymBuild_binary:
693 : : DebugBinary (d);
694 : : break;
695 : :
696 : : case PCSymBuild_function:
697 : : DebugFunction (d);
698 : : break;
699 : :
700 : : case PCSymBuild_convert:
701 : : DebugConvert (d);
702 : : break;
703 : :
704 : :
705 : : default:
706 : : CaseException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/PCSymBuild.def", 20, 1);
707 : : __builtin_unreachable ();
708 : : }
709 : : }
710 : 0 : }
711 : :
712 : :
713 : : /*
714 : : DebugDes -
715 : : */
716 : :
717 : 0 : static void DebugDes (PCSymBuild_exprNode d)
718 : : {
719 : 0 : DebugSym (d->edes.sym);
720 : 0 : StdIO_Write (':');
721 : 0 : DebugMeta (d->edes.meta);
722 : 0 : StdIO_Write (':');
723 : 0 : DebugType (d->edes.type);
724 : 0 : StrIO_WriteString ((const char *) " = ", 3);
725 : 0 : DebugNode (d->edes.left);
726 : 0 : StrIO_WriteLn ();
727 : 0 : }
728 : :
729 : :
730 : : /*
731 : : DebugSym -
732 : : */
733 : :
734 : 0 : static void DebugSym (unsigned int sym)
735 : : {
736 : 0 : NameKey_Name n;
737 : :
738 : 0 : n = SymbolTable_GetSymName (sym);
739 : 0 : if (n != NameKey_NulName)
740 : : {
741 : 0 : NameKey_WriteKey (n);
742 : : }
743 : 0 : StdIO_Write (':');
744 : 0 : NumberIO_WriteCard (sym, 0);
745 : 0 : }
746 : :
747 : :
748 : : /*
749 : : DebugMeta -
750 : : */
751 : :
752 : 0 : static void DebugMeta (M2Const_constType m)
753 : : {
754 : 0 : switch (m)
755 : : {
756 : 0 : case M2Const_unknown:
757 : 0 : StrIO_WriteString ((const char *) "unknown", 7);
758 : 0 : break;
759 : :
760 : 0 : case M2Const_set:
761 : 0 : StrIO_WriteString ((const char *) "set", 3);
762 : 0 : break;
763 : :
764 : 0 : case M2Const_str:
765 : 0 : StrIO_WriteString ((const char *) "str", 3);
766 : 0 : break;
767 : :
768 : 0 : case M2Const_constructor:
769 : 0 : StrIO_WriteString ((const char *) "constructor", 11);
770 : 0 : break;
771 : :
772 : 0 : case M2Const_array:
773 : 0 : StrIO_WriteString ((const char *) "array", 5);
774 : 0 : break;
775 : :
776 : 0 : case M2Const_cast:
777 : 0 : StrIO_WriteString ((const char *) "cast", 4);
778 : 0 : break;
779 : :
780 : 0 : case M2Const_boolean:
781 : 0 : StrIO_WriteString ((const char *) "boolean", 7);
782 : 0 : break;
783 : :
784 : 0 : case M2Const_ztype:
785 : 0 : StrIO_WriteString ((const char *) "ztype", 5);
786 : 0 : break;
787 : :
788 : 0 : case M2Const_rtype:
789 : 0 : StrIO_WriteString ((const char *) "rtype", 5);
790 : 0 : break;
791 : :
792 : 0 : case M2Const_ctype:
793 : 0 : StrIO_WriteString ((const char *) "ctype", 5);
794 : 0 : break;
795 : :
796 : 0 : case M2Const_procedure:
797 : 0 : StrIO_WriteString ((const char *) "procedure", 9);
798 : 0 : break;
799 : :
800 : 0 : case M2Const_char:
801 : 0 : StrIO_WriteString ((const char *) "ctype", 5);
802 : 0 : break;
803 : :
804 : :
805 : 0 : default:
806 : 0 : CaseException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/PCSymBuild.def", 20, 1);
807 : 0 : __builtin_unreachable ();
808 : : }
809 : 0 : }
810 : :
811 : :
812 : : /*
813 : : DebugType -
814 : : */
815 : :
816 : 0 : static void DebugType (unsigned int type)
817 : : {
818 : 0 : NameKey_Name n;
819 : :
820 : 0 : StrIO_WriteString ((const char *) "[type:", 6);
821 : 0 : if (type == SymbolTable_NulSym)
822 : : {
823 : 0 : StrIO_WriteString ((const char *) "<nulsym>", 8);
824 : : }
825 : : else
826 : : {
827 : 0 : n = SymbolTable_GetSymName (type);
828 : 0 : if (n != SymbolTable_NulSym)
829 : : {
830 : 0 : NameKey_WriteKey (n);
831 : : }
832 : 0 : StdIO_Write (':');
833 : 0 : NumberIO_WriteCard (type, 0);
834 : : }
835 : 0 : StdIO_Write (']');
836 : 0 : }
837 : :
838 : :
839 : : /*
840 : : DebugExpr -
841 : : */
842 : :
843 : 0 : static void DebugExpr (PCSymBuild_exprNode e)
844 : : {
845 : 0 : StrIO_WriteString ((const char *) "expr (", 6);
846 : 0 : DebugType (e->eexpr.type);
847 : 0 : StdIO_Write (':');
848 : 0 : DebugMeta (e->eexpr.meta);
849 : 0 : StdIO_Write (' ');
850 : 0 : DebugNode (e->eexpr.left);
851 : 0 : StrIO_WriteString ((const char *) ") ", 2);
852 : 0 : }
853 : :
854 : :
855 : : /*
856 : : DebugFunction -
857 : : */
858 : :
859 : 0 : static void DebugFunction (PCSymBuild_exprNode f)
860 : : {
861 : 0 : NameKey_WriteKey (SymbolTable_GetSymName (f->efunction.func));
862 : 0 : StdIO_Write ('(');
863 : 0 : if (f->efunction.first != NULL)
864 : : {
865 : 0 : DebugNode (f->efunction.first);
866 : 0 : if (f->efunction.second != NULL)
867 : : {
868 : 0 : StrIO_WriteString ((const char *) ", ", 2);
869 : 0 : DebugNode (f->efunction.second);
870 : 0 : if (f->efunction.third)
871 : : {
872 : 0 : StrIO_WriteString ((const char *) ", ...", 5);
873 : : }
874 : : }
875 : : }
876 : 0 : StdIO_Write (')');
877 : 0 : }
878 : :
879 : :
880 : : /*
881 : : DebugConvert -
882 : : */
883 : :
884 : 0 : static void DebugConvert (PCSymBuild_exprNode f)
885 : : {
886 : 0 : DebugNode (f->econvert.totype);
887 : 0 : StdIO_Write ('(');
888 : 0 : DebugNode (f->econvert.expr);
889 : 0 : StdIO_Write (')');
890 : 0 : }
891 : :
892 : :
893 : : /*
894 : : DebugLeaf -
895 : : */
896 : :
897 : 0 : static void DebugLeaf (PCSymBuild_exprNode l)
898 : : {
899 : 0 : StrIO_WriteString ((const char *) "leaf (", 6);
900 : 0 : DebugType (l->eleaf.type);
901 : 0 : StdIO_Write (':');
902 : 0 : DebugMeta (l->eleaf.meta);
903 : 0 : StdIO_Write (':');
904 : 0 : DebugSym (l->eleaf.sym);
905 : 0 : StrIO_WriteString ((const char *) ") ", 2);
906 : 0 : }
907 : :
908 : :
909 : : /*
910 : : DebugUnary -
911 : : */
912 : :
913 : 0 : static void DebugUnary (PCSymBuild_exprNode l)
914 : : {
915 : 0 : StrIO_WriteString ((const char *) "unary (", 7);
916 : 0 : DebugType (l->eunary.type);
917 : 0 : StdIO_Write (':');
918 : 0 : DebugMeta (l->eunary.meta);
919 : 0 : StdIO_Write (' ');
920 : 0 : DebugOp (l->eunary.op);
921 : 0 : StdIO_Write (' ');
922 : 0 : DebugNode (l->eunary.left);
923 : 0 : StrIO_WriteString ((const char *) ") ", 2);
924 : 0 : }
925 : :
926 : :
927 : : /*
928 : : DebugBinary -
929 : : */
930 : :
931 : 0 : static void DebugBinary (PCSymBuild_exprNode l)
932 : : {
933 : 0 : StrIO_WriteString ((const char *) "unary (", 7);
934 : 0 : DebugType (l->ebinary.type);
935 : 0 : StdIO_Write (':');
936 : 0 : DebugMeta (l->ebinary.meta);
937 : 0 : StdIO_Write (' ');
938 : 0 : DebugNode (l->ebinary.left);
939 : 0 : DebugOp (l->ebinary.op);
940 : 0 : StdIO_Write (' ');
941 : 0 : DebugNode (l->ebinary.right);
942 : 0 : StrIO_WriteString ((const char *) ") ", 2);
943 : 0 : }
944 : :
945 : :
946 : : /*
947 : : DebugOp -
948 : : */
949 : :
950 : 0 : static void DebugOp (NameKey_Name op)
951 : : {
952 : 0 : NameKey_WriteKey (op);
953 : 0 : }
954 : :
955 : :
956 : : /*
957 : : fixupProcedureType - creates a proctype from a procedure.
958 : : */
959 : :
960 : 18 : static unsigned int fixupProcedureType (unsigned int p)
961 : : {
962 : 18 : unsigned int tok;
963 : 18 : unsigned int par;
964 : 18 : unsigned int t;
965 : 18 : unsigned int n;
966 : 18 : unsigned int i;
967 : :
968 : 18 : if (SymbolTable_IsProcedure (p))
969 : : {
970 : 18 : tok = M2LexBuf_GetTokenNo ();
971 : 18 : t = SymbolTable_MakeProcType (tok, SymbolTable_CheckAnonymous (NameKey_NulName));
972 : 18 : i = 1;
973 : 18 : n = SymbolTable_NoOfParam (p);
974 : 48 : while (i <= n)
975 : : {
976 : 12 : par = SymbolTable_GetParam (p, i);
977 : 12 : if (SymbolTable_IsParameterVar (par))
978 : : {
979 : 0 : SymbolTable_PutProcTypeVarParam (t, SymbolTable_GetType (par), SymbolTable_IsParameterUnbounded (par));
980 : : }
981 : : else
982 : : {
983 : 12 : SymbolTable_PutProcTypeParam (t, SymbolTable_GetType (par), SymbolTable_IsParameterUnbounded (par));
984 : : }
985 : 12 : i += 1;
986 : : }
987 : 18 : if ((SymbolTable_GetType (p)) != SymbolTable_NulSym)
988 : : {
989 : 18 : SymbolTable_PutFunction (t, SymbolTable_GetType (p));
990 : : }
991 : 18 : return t;
992 : : }
993 : : else
994 : : {
995 : 0 : M2Error_InternalError ((const char *) "expecting a procedure", 21);
996 : : }
997 : : return SymbolTable_NulSym;
998 : : /* static analysis guarentees a RETURN statement will be used before here. */
999 : : __builtin_unreachable ();
1000 : : }
1001 : :
1002 : :
1003 : : /*
1004 : : InitFunction -
1005 : : */
1006 : :
1007 : 3219 : static void InitFunction (M2Const_constType m, unsigned int p, unsigned int t, PCSymBuild_exprNode f, PCSymBuild_exprNode s, bool more)
1008 : : {
1009 : 3219 : PCSymBuild_exprNode n;
1010 : :
1011 : 3219 : Storage_ALLOCATE ((void **) &n, sizeof (PCSymBuild_eNode));
1012 : 3219 : n->tag = PCSymBuild_function;
1013 : 3219 : switch (n->tag)
1014 : : {
1015 : 3219 : case PCSymBuild_function:
1016 : 3219 : n->efunction.meta = m;
1017 : 3219 : n->efunction.type = t;
1018 : 3219 : n->efunction.func = p;
1019 : 3219 : n->efunction.first = f;
1020 : 3219 : n->efunction.second = s;
1021 : 3219 : n->efunction.third = more;
1022 : 3219 : break;
1023 : :
1024 : :
1025 : : default:
1026 : : M2Error_InternalError ((const char *) "expecting function", 18);
1027 : 3219 : break;
1028 : : }
1029 : 3219 : M2StackAddress_PushAddress (exprStack, reinterpret_cast<void *> (n));
1030 : 3219 : }
1031 : :
1032 : :
1033 : : /*
1034 : : InitConvert -
1035 : : */
1036 : :
1037 : 3596 : static void InitConvert (M2Const_constType m, unsigned int t, PCSymBuild_exprNode to, PCSymBuild_exprNode e)
1038 : : {
1039 : 3596 : PCSymBuild_exprNode n;
1040 : :
1041 : 3596 : Storage_ALLOCATE ((void **) &n, sizeof (PCSymBuild_eNode));
1042 : 3596 : n->tag = PCSymBuild_convert;
1043 : 3596 : switch (n->tag)
1044 : : {
1045 : 3596 : case PCSymBuild_convert:
1046 : 3596 : n->econvert.type = t;
1047 : 3596 : n->econvert.meta = m;
1048 : 3596 : n->econvert.totype = to;
1049 : 3596 : n->econvert.expr = e;
1050 : 3596 : break;
1051 : :
1052 : :
1053 : : default:
1054 : : M2Error_InternalError ((const char *) "expecting convert", 17);
1055 : 3596 : break;
1056 : : }
1057 : 3596 : M2StackAddress_PushAddress (exprStack, reinterpret_cast<void *> (n));
1058 : 3596 : }
1059 : :
1060 : :
1061 : : /*
1062 : : InitLeaf -
1063 : : */
1064 : :
1065 : 257425 : static void InitLeaf (M2Const_constType m, unsigned int s, unsigned int t)
1066 : : {
1067 : 257425 : PCSymBuild_exprNode l;
1068 : :
1069 : 257425 : Storage_ALLOCATE ((void **) &l, sizeof (PCSymBuild_eNode));
1070 : 257425 : l->tag = PCSymBuild_leaf;
1071 : 257425 : switch (l->tag)
1072 : : {
1073 : 257425 : case PCSymBuild_leaf:
1074 : 257425 : l->eleaf.type = t;
1075 : 257425 : l->eleaf.meta = m;
1076 : 257425 : l->eleaf.sym = s;
1077 : 257425 : break;
1078 : :
1079 : :
1080 : : default:
1081 : : M2Error_InternalError ((const char *) "expecting leaf", 14);
1082 : 257425 : break;
1083 : : }
1084 : 257425 : M2StackAddress_PushAddress (exprStack, reinterpret_cast<void *> (l));
1085 : 257425 : }
1086 : :
1087 : :
1088 : : /*
1089 : : InitProcedure -
1090 : : */
1091 : :
1092 : 18 : static void InitProcedure (unsigned int s)
1093 : : {
1094 : 18 : InitLeaf (M2Const_procedure, s, fixupProcedureType (s));
1095 : 18 : }
1096 : :
1097 : :
1098 : : /*
1099 : : InitCharType -
1100 : : */
1101 : :
1102 : 112236 : static void InitCharType (unsigned int s)
1103 : : {
1104 : 0 : InitLeaf (M2Const_char, s, M2Base_Char);
1105 : 112236 : }
1106 : :
1107 : :
1108 : : /*
1109 : : InitZType -
1110 : : */
1111 : :
1112 : 104817 : static void InitZType (unsigned int s)
1113 : : {
1114 : 0 : InitLeaf (M2Const_ztype, s, M2Base_ZType);
1115 : 72149 : }
1116 : :
1117 : :
1118 : : /*
1119 : : InitRType -
1120 : : */
1121 : :
1122 : 1080 : static void InitRType (unsigned int s)
1123 : : {
1124 : 0 : InitLeaf (M2Const_rtype, s, M2Base_RType);
1125 : 1080 : }
1126 : :
1127 : :
1128 : : /*
1129 : : InitUnknown -
1130 : : */
1131 : :
1132 : 25131 : static void InitUnknown (unsigned int s)
1133 : : {
1134 : 0 : InitLeaf (M2Const_unknown, s, SymbolTable_NulSym);
1135 : 25131 : }
1136 : :
1137 : :
1138 : : /*
1139 : : InitBooleanType -
1140 : : */
1141 : :
1142 : 11635 : static void InitBooleanType (unsigned int s)
1143 : : {
1144 : 0 : InitLeaf (M2Const_boolean, s, M2Base_Boolean);
1145 : 11635 : }
1146 : :
1147 : :
1148 : : /*
1149 : : TypeToMeta -
1150 : : */
1151 : :
1152 : 187538 : static M2Const_constType TypeToMeta (unsigned int type)
1153 : : {
1154 : 187538 : if (type == M2Base_Char)
1155 : : {
1156 : : return M2Const_char;
1157 : : }
1158 : 75266 : else if (type == M2Base_Boolean)
1159 : : {
1160 : : /* avoid dangling else. */
1161 : : return M2Const_boolean;
1162 : : }
1163 : 75254 : else if (M2Base_IsRealType (type))
1164 : : {
1165 : : /* avoid dangling else. */
1166 : : return M2Const_rtype;
1167 : : }
1168 : 75188 : else if (M2Base_IsComplexType (type))
1169 : : {
1170 : : /* avoid dangling else. */
1171 : : return M2Const_ctype;
1172 : : }
1173 : 74846 : else if (M2Base_IsOrdinalType (type))
1174 : : {
1175 : : /* avoid dangling else. */
1176 : : return M2Const_ztype;
1177 : : }
1178 : : else
1179 : : {
1180 : : /* avoid dangling else. */
1181 : 2474 : return M2Const_unknown;
1182 : : }
1183 : : /* static analysis guarentees a RETURN statement will be used before here. */
1184 : : __builtin_unreachable ();
1185 : : }
1186 : :
1187 : :
1188 : : /*
1189 : : buildConstFunction - we are only concerned about resolving the return type o
1190 : : a function, so we can ignore all parameters - except
1191 : : the first one in the case of VAL(type, foo).
1192 : : buildConstFunction uses a unary exprNode to represent
1193 : : a function.
1194 : : */
1195 : :
1196 : 3249 : static void buildConstFunction (unsigned int func, unsigned int n)
1197 : : {
1198 : 3249 : unsigned int i;
1199 : 3249 : PCSymBuild_exprNode first;
1200 : 3249 : PCSymBuild_exprNode second;
1201 : :
1202 : 3249 : first = NULL;
1203 : 3249 : second = NULL;
1204 : 3249 : if (n == 1)
1205 : : {
1206 : 2877 : first = static_cast<PCSymBuild_exprNode> (M2StackAddress_PopAddress (exprStack));
1207 : : }
1208 : 372 : else if (n >= 2)
1209 : : {
1210 : : /* avoid dangling else. */
1211 : : i = n;
1212 : 372 : while (i > 2)
1213 : : {
1214 : 0 : second = static_cast<PCSymBuild_exprNode> (M2StackAddress_PopAddress (exprStack));
1215 : 0 : Storage_DEALLOCATE ((void **) &second, sizeof (PCSymBuild_eNode));
1216 : 0 : i -= 1;
1217 : : }
1218 : 372 : second = static_cast<PCSymBuild_exprNode> (M2StackAddress_PopAddress (exprStack));
1219 : 372 : first = static_cast<PCSymBuild_exprNode> (M2StackAddress_PopAddress (exprStack));
1220 : : }
1221 : 3249 : if ((func == M2Base_Val) || (func == M2System_Cast))
1222 : : {
1223 : 30 : InitConvert (M2Const_cast, SymbolTable_NulSym, first, second);
1224 : : }
1225 : 3219 : else if ((func == M2Base_Max) || (func == M2Base_Min))
1226 : : {
1227 : : /* avoid dangling else. */
1228 : 2675 : InitFunction (M2Const_unknown, func, SymbolTable_NulSym, first, second, false);
1229 : : }
1230 : : else
1231 : : {
1232 : : /* avoid dangling else. */
1233 : 544 : InitFunction (TypeToMeta (GetSkippedType (func)), func, GetSkippedType (func), first, second, n > 2);
1234 : : }
1235 : 3249 : }
1236 : :
1237 : :
1238 : : /*
1239 : : ErrorConstFunction - generate an error message at functok using func in the
1240 : : error message providing it is not NulSym.
1241 : : */
1242 : :
1243 : 36 : static void ErrorConstFunction (unsigned int func, unsigned int functok)
1244 : : {
1245 : 36 : if (func == SymbolTable_NulSym)
1246 : : {
1247 : 24 : if (M2Options_Iso)
1248 : : {
1249 : 12 : M2Error_ErrorFormat0 (M2Error_NewError (functok), (const char *) "the only functions permissible in a constant expression are: CAP, CAST, CHR, CMPLX, FLOAT, HIGH, IM, LENGTH, MAX, MIN, ODD, ORD, RE, SIZE, TSIZE, TRUNC, VAL and gcc builtins", 173);
1250 : : }
1251 : : else
1252 : : {
1253 : 12 : M2Error_ErrorFormat0 (M2Error_NewError (functok), (const char *) "the only functions permissible in a constant expression are: CAP, CHR, FLOAT, HIGH, MAX, MIN, ODD, ORD, SIZE, TSIZE, TRUNC, VAL and gcc builtins", 144);
1254 : : }
1255 : : }
1256 : : else
1257 : : {
1258 : 12 : if (M2Options_Iso)
1259 : : {
1260 : 12 : M2MetaError_MetaErrorT1 (functok, (const char *) "the only functions permissible in a constant expression are: CAP, CAST, CHR, CMPLX, FLOAT, HIGH, IM, LENGTH, MAX, MIN, ODD, ORD, RE, SIZE, TSIZE, TRUNC, VAL and gcc builtins, but not {%1Ead}", 190, func);
1261 : : }
1262 : : else
1263 : : {
1264 : 0 : M2MetaError_MetaErrorT1 (functok, (const char *) "the only functions permissible in a constant expression are: CAP, CHR, FLOAT, HIGH, MAX, MIN, ODD, ORD, SIZE, TSIZE, TRUNC, VAL and gcc builtins, but not {%1Ead}", 161, func);
1265 : : }
1266 : : }
1267 : 36 : }
1268 : :
1269 : :
1270 : : /*
1271 : : InitBinary -
1272 : : */
1273 : :
1274 : 12518 : static void InitBinary (M2Const_constType m, unsigned int t, NameKey_Name o)
1275 : : {
1276 : 12518 : PCSymBuild_exprNode l;
1277 : 12518 : PCSymBuild_exprNode r;
1278 : 12518 : PCSymBuild_exprNode b;
1279 : :
1280 : 12518 : r = static_cast<PCSymBuild_exprNode> (M2StackAddress_PopAddress (exprStack));
1281 : 12518 : l = static_cast<PCSymBuild_exprNode> (M2StackAddress_PopAddress (exprStack));
1282 : 12518 : Storage_ALLOCATE ((void **) &b, sizeof (PCSymBuild_eNode));
1283 : 12518 : b->tag = PCSymBuild_binary;
1284 : 12518 : switch (b->tag)
1285 : : {
1286 : 12518 : case PCSymBuild_binary:
1287 : 12518 : b->ebinary.meta = m;
1288 : 12518 : b->ebinary.type = t;
1289 : 12518 : b->ebinary.left = l;
1290 : 12518 : b->ebinary.right = r;
1291 : 12518 : b->ebinary.op = o;
1292 : 12518 : break;
1293 : :
1294 : :
1295 : : default:
1296 : : M2Error_InternalError ((const char *) "expecting binary", 16);
1297 : 12518 : break;
1298 : : }
1299 : 12518 : M2StackAddress_PushAddress (exprStack, reinterpret_cast<void *> (b));
1300 : 12518 : }
1301 : :
1302 : :
1303 : : /*
1304 : : InitUnary -
1305 : : */
1306 : :
1307 : 294 : static void InitUnary (M2Const_constType m, unsigned int t, NameKey_Name o)
1308 : : {
1309 : 294 : PCSymBuild_exprNode l;
1310 : 294 : PCSymBuild_exprNode b;
1311 : :
1312 : 294 : l = static_cast<PCSymBuild_exprNode> (M2StackAddress_PopAddress (exprStack));
1313 : 294 : Storage_ALLOCATE ((void **) &b, sizeof (PCSymBuild_eNode));
1314 : 294 : b->tag = PCSymBuild_unary;
1315 : 294 : switch (b->tag)
1316 : : {
1317 : 294 : case PCSymBuild_unary:
1318 : 294 : b->eunary.meta = m;
1319 : 294 : b->eunary.type = t;
1320 : 294 : b->eunary.left = l;
1321 : 294 : b->eunary.op = o;
1322 : 294 : break;
1323 : :
1324 : :
1325 : : default:
1326 : : M2Error_InternalError ((const char *) "expecting unary", 15);
1327 : 294 : break;
1328 : : }
1329 : 294 : M2StackAddress_PushAddress (exprStack, reinterpret_cast<void *> (b));
1330 : 294 : }
1331 : :
1332 : :
1333 : : /*
1334 : : isTypeResolved -
1335 : : */
1336 : :
1337 : 1764557 : static bool isTypeResolved (PCSymBuild_exprNode e)
1338 : : {
1339 : 1764557 : switch (e->tag)
1340 : : {
1341 : 320498 : case PCSymBuild_leaf:
1342 : 320498 : return (e->eleaf.type != SymbolTable_NulSym) || (e->eleaf.meta == M2Const_str);
1343 : 600 : break;
1344 : :
1345 : 600 : case PCSymBuild_unary:
1346 : 600 : return (e->eunary.type != SymbolTable_NulSym) || (e->eunary.meta == M2Const_str);
1347 : 58478 : break;
1348 : :
1349 : 58478 : case PCSymBuild_binary:
1350 : 58478 : return (e->ebinary.type != SymbolTable_NulSym) || (e->ebinary.meta == M2Const_str);
1351 : 1367316 : break;
1352 : :
1353 : 1367316 : case PCSymBuild_designator:
1354 : 1367316 : return (e->edes.type != SymbolTable_NulSym) || (e->edes.meta == M2Const_str);
1355 : 0 : break;
1356 : :
1357 : 0 : case PCSymBuild_expr:
1358 : 0 : return (e->eexpr.type != SymbolTable_NulSym) || (e->eexpr.meta == M2Const_str);
1359 : 3710 : break;
1360 : :
1361 : 3710 : case PCSymBuild_convert:
1362 : 3710 : return (e->econvert.type != SymbolTable_NulSym) || (e->econvert.meta == M2Const_str);
1363 : 13955 : break;
1364 : :
1365 : 13955 : case PCSymBuild_function:
1366 : 13955 : return (e->efunction.type != SymbolTable_NulSym) || (e->efunction.meta == M2Const_str);
1367 : 0 : break;
1368 : :
1369 : :
1370 : 0 : default:
1371 : 0 : CaseException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/PCSymBuild.def", 20, 1);
1372 : 0 : __builtin_unreachable ();
1373 : : }
1374 : : /* static analysis guarentees a RETURN statement will be used before here. */
1375 : : __builtin_unreachable ();
1376 : : }
1377 : :
1378 : :
1379 : : /*
1380 : : getEtype -
1381 : : */
1382 : :
1383 : 275812 : static unsigned int getEtype (PCSymBuild_exprNode e)
1384 : : {
1385 : 275812 : switch (e->tag)
1386 : : {
1387 : 256359 : case PCSymBuild_leaf:
1388 : 256359 : return e->eleaf.type;
1389 : 228 : break;
1390 : :
1391 : 228 : case PCSymBuild_unary:
1392 : 228 : return e->eunary.type;
1393 : 12416 : break;
1394 : :
1395 : 12416 : case PCSymBuild_binary:
1396 : 12416 : return e->ebinary.type;
1397 : 24 : break;
1398 : :
1399 : 24 : case PCSymBuild_designator:
1400 : 24 : return e->edes.type;
1401 : 0 : break;
1402 : :
1403 : 0 : case PCSymBuild_expr:
1404 : 0 : return e->eexpr.type;
1405 : 3590 : break;
1406 : :
1407 : 3590 : case PCSymBuild_convert:
1408 : 3590 : return e->econvert.type;
1409 : 3195 : break;
1410 : :
1411 : 3195 : case PCSymBuild_function:
1412 : 3195 : return e->efunction.type;
1413 : 0 : break;
1414 : :
1415 : :
1416 : 0 : default:
1417 : 0 : CaseException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/PCSymBuild.def", 20, 1);
1418 : 0 : __builtin_unreachable ();
1419 : : }
1420 : : /* static analysis guarentees a RETURN statement will be used before here. */
1421 : : __builtin_unreachable ();
1422 : : }
1423 : :
1424 : :
1425 : : /*
1426 : : getEmeta -
1427 : : */
1428 : :
1429 : 35969 : static M2Const_constType getEmeta (PCSymBuild_exprNode e)
1430 : : {
1431 : 35969 : switch (e->tag)
1432 : : {
1433 : 32784 : case PCSymBuild_leaf:
1434 : 32784 : return e->eleaf.meta;
1435 : 0 : break;
1436 : :
1437 : 0 : case PCSymBuild_unary:
1438 : 0 : return e->eunary.meta;
1439 : 625 : break;
1440 : :
1441 : 625 : case PCSymBuild_binary:
1442 : 625 : return e->ebinary.meta;
1443 : 24 : break;
1444 : :
1445 : 24 : case PCSymBuild_designator:
1446 : 24 : return e->edes.meta;
1447 : 0 : break;
1448 : :
1449 : 0 : case PCSymBuild_expr:
1450 : 0 : return e->eexpr.meta;
1451 : 12 : break;
1452 : :
1453 : 12 : case PCSymBuild_convert:
1454 : 12 : return e->econvert.meta;
1455 : 2524 : break;
1456 : :
1457 : 2524 : case PCSymBuild_function:
1458 : 2524 : return e->efunction.meta;
1459 : 0 : break;
1460 : :
1461 : :
1462 : 0 : default:
1463 : 0 : CaseException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/PCSymBuild.def", 20, 1);
1464 : 0 : __builtin_unreachable ();
1465 : : }
1466 : : /* static analysis guarentees a RETURN statement will be used before here. */
1467 : : __builtin_unreachable ();
1468 : : }
1469 : :
1470 : :
1471 : : /*
1472 : : assignTM -
1473 : : */
1474 : :
1475 : 48 : static void assignTM (unsigned int *td, M2Const_constType *md, unsigned int te, M2Const_constType me)
1476 : : {
1477 : 48 : (*md) = me;
1478 : 48 : (*td) = te;
1479 : 48 : }
1480 : :
1481 : :
1482 : : /*
1483 : : assignType -
1484 : : */
1485 : :
1486 : 48 : static void assignType (PCSymBuild_exprNode d, PCSymBuild_exprNode e)
1487 : : {
1488 : 48 : unsigned int t;
1489 : 48 : M2Const_constType m;
1490 : :
1491 : 48 : m = getEmeta (e);
1492 : 48 : t = getEtype (e);
1493 : 48 : switch (d->tag)
1494 : : {
1495 : 24 : case PCSymBuild_leaf:
1496 : 24 : assignTM (&d->eleaf.type, &d->eleaf.meta, t, m);
1497 : 24 : break;
1498 : :
1499 : 0 : case PCSymBuild_unary:
1500 : 0 : assignTM (&d->eunary.type, &d->eunary.meta, t, m);
1501 : 0 : break;
1502 : :
1503 : 0 : case PCSymBuild_binary:
1504 : 0 : assignTM (&d->ebinary.type, &d->ebinary.meta, t, m);
1505 : 0 : break;
1506 : :
1507 : 0 : case PCSymBuild_designator:
1508 : 0 : assignTM (&d->edes.type, &d->edes.meta, t, m);
1509 : 0 : break;
1510 : :
1511 : 0 : case PCSymBuild_expr:
1512 : 0 : assignTM (&d->eexpr.type, &d->eexpr.meta, t, m);
1513 : 0 : break;
1514 : :
1515 : 24 : case PCSymBuild_convert:
1516 : 24 : assignTM (&d->econvert.type, &d->econvert.meta, t, m);
1517 : 24 : break;
1518 : :
1519 : 0 : case PCSymBuild_function:
1520 : 0 : assignTM (&d->efunction.type, &d->efunction.meta, t, m);
1521 : 0 : break;
1522 : :
1523 : :
1524 : 0 : default:
1525 : 0 : CaseException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/PCSymBuild.def", 20, 1);
1526 : 0 : __builtin_unreachable ();
1527 : : }
1528 : 48 : }
1529 : :
1530 : :
1531 : : /*
1532 : : deduceTypes - works out the type and metatype given, l, and, r.
1533 : : */
1534 : :
1535 : 12530 : static void deduceTypes (unsigned int *t, M2Const_constType *m, PCSymBuild_exprNode l, PCSymBuild_exprNode r, NameKey_Name op)
1536 : : {
1537 : 12530 : if (r == NULL)
1538 : : {
1539 : : /* function or cast */
1540 : 0 : (*t) = getEtype (l);
1541 : 0 : (*m) = getEmeta (l);
1542 : : }
1543 : 12530 : else if ((((((((((((op == M2Reserved_EqualTok) || (op == M2Reserved_HashTok)) || (op == M2Reserved_LessGreaterTok)) || (op == M2Reserved_LessTok)) || (op == M2Reserved_LessEqualTok)) || (op == M2Reserved_GreaterTok)) || (op == M2Reserved_GreaterEqualTok)) || (op == M2Reserved_InTok)) || (op == M2Reserved_OrTok)) || (op == M2Reserved_AndTok)) || (op == M2Reserved_NotTok)) || (op == M2Reserved_AmbersandTok))
1544 : : {
1545 : : /* avoid dangling else. */
1546 : 6 : (*t) = M2Base_Boolean;
1547 : 6 : (*m) = M2Const_boolean;
1548 : : }
1549 : 12524 : else if (((((((op == M2Reserved_PlusTok) || (op == M2Reserved_MinusTok)) || (op == M2Reserved_TimesTok)) || (op == M2Reserved_ModTok)) || (op == M2Reserved_DivTok)) || (op == M2Reserved_RemTok)) || (op == M2Reserved_DivideTok))
1550 : : {
1551 : : /* avoid dangling else. */
1552 : 12524 : (*t) = M2Base_MixTypes (getEtype (l), getEtype (r), constToken);
1553 : 12524 : (*m) = getEmeta (l);
1554 : 12524 : if ((*m) == M2Const_unknown)
1555 : : {
1556 : 3467 : (*m) = getEmeta (r);
1557 : : }
1558 : 9057 : else if (((getEmeta (r)) != M2Const_unknown) && ((*m) != (getEmeta (r))))
1559 : : {
1560 : : /* avoid dangling else. */
1561 : 0 : M2Error_ErrorFormat0 (M2Error_NewError (constToken), (const char *) "the operands to a binary constant expression have different types", 65);
1562 : : }
1563 : : }
1564 : : else
1565 : : {
1566 : : /* avoid dangling else. */
1567 : 0 : M2Error_InternalError ((const char *) "unexpected operator", 19);
1568 : : }
1569 : 12530 : }
1570 : :
1571 : :
1572 : : /*
1573 : : WalkConvert -
1574 : : */
1575 : :
1576 : 60 : static bool WalkConvert (PCSymBuild_exprNode e)
1577 : : {
1578 : 60 : if (isTypeResolved (e))
1579 : : {
1580 : : return false;
1581 : : }
1582 : : else
1583 : : {
1584 : 48 : if (isTypeResolved (e->econvert.totype))
1585 : : {
1586 : 24 : assignType (e, e->econvert.totype);
1587 : 24 : return true;
1588 : : }
1589 : 24 : return doWalkNode (e->econvert.totype);
1590 : : }
1591 : : /* static analysis guarentees a RETURN statement will be used before here. */
1592 : : __builtin_unreachable ();
1593 : : }
1594 : :
1595 : :
1596 : : /*
1597 : : WalkFunctionParam -
1598 : : */
1599 : :
1600 : 2669 : static bool WalkFunctionParam (unsigned int func, PCSymBuild_exprNode e)
1601 : : {
1602 : 2669 : if (isTypeResolved (e))
1603 : : {
1604 : : return false;
1605 : : }
1606 : : else
1607 : : {
1608 : 2669 : if (e->tag == PCSymBuild_leaf)
1609 : : {
1610 : 2669 : if ((e->eleaf.sym != SymbolTable_NulSym) && (e->eleaf.type == SymbolTable_NulSym))
1611 : : {
1612 : 2669 : if ((func == M2Base_Min) || (func == M2Base_Max))
1613 : : {
1614 : 2669 : if (SymbolTable_IsSet (e->eleaf.sym))
1615 : : {
1616 : 2450 : e->eleaf.type = SymbolTable_SkipType (SymbolTable_GetType (e->eleaf.sym));
1617 : : }
1618 : : else
1619 : : {
1620 : : /* sym is the type required for MAX, MIN and VAL */
1621 : 219 : e->eleaf.type = e->eleaf.sym;
1622 : : }
1623 : : }
1624 : : else
1625 : : {
1626 : 0 : M2Debug_Assert (func == M2Base_Val);
1627 : 0 : e->eleaf.type = e->eleaf.sym;
1628 : : }
1629 : 2669 : e->eleaf.meta = TypeToMeta (e->eleaf.sym);
1630 : 2669 : return true;
1631 : : }
1632 : : }
1633 : : }
1634 : : return false;
1635 : : /* static analysis guarentees a RETURN statement will be used before here. */
1636 : : __builtin_unreachable ();
1637 : : }
1638 : :
1639 : :
1640 : : /*
1641 : : WalkFunction -
1642 : : */
1643 : :
1644 : 5380 : static bool WalkFunction (PCSymBuild_exprNode e)
1645 : : {
1646 : 5380 : if (isTypeResolved (e))
1647 : : {
1648 : : return false;
1649 : : }
1650 : : else
1651 : : {
1652 : 5338 : if (((e->efunction.func == M2Base_Max) || (e->efunction.func == M2Base_Min)) || (e->efunction.func == M2Base_Val))
1653 : : {
1654 : 5338 : if (isTypeResolved (e->efunction.first))
1655 : : {
1656 : 2669 : if ((getEmeta (e->efunction.first)) == M2Const_str)
1657 : : {
1658 : 0 : M2MetaError_MetaError1 ((const char *) "a string parameter cannot be passed to function {%1Dad}", 55, e->efunction.func);
1659 : 0 : return false;
1660 : : }
1661 : 2669 : e->efunction.type = getEtype (e->efunction.first);
1662 : 2669 : return true;
1663 : : }
1664 : 2669 : return WalkFunctionParam (e->efunction.func, e->efunction.first);
1665 : : }
1666 : : else
1667 : : {
1668 : 0 : M2MetaError_MetaError1 ((const char *) "not expecting this function inside a constant expression {%1Dad}", 64, e->efunction.func);
1669 : : }
1670 : 0 : return true;
1671 : : }
1672 : : /* static analysis guarentees a RETURN statement will be used before here. */
1673 : : __builtin_unreachable ();
1674 : : }
1675 : :
1676 : :
1677 : : /*
1678 : : doWalkNode -
1679 : : */
1680 : :
1681 : 61759 : static bool doWalkNode (PCSymBuild_exprNode e)
1682 : : {
1683 : 61759 : switch (e->tag)
1684 : : {
1685 : 0 : case PCSymBuild_expr:
1686 : 0 : return WalkExpr (e);
1687 : 33012 : break;
1688 : :
1689 : 33012 : case PCSymBuild_leaf:
1690 : 33012 : return WalkLeaf (e);
1691 : 186 : break;
1692 : :
1693 : 186 : case PCSymBuild_unary:
1694 : 186 : return WalkUnary (e);
1695 : 23121 : break;
1696 : :
1697 : 23121 : case PCSymBuild_binary:
1698 : 23121 : return WalkBinary (e);
1699 : 60 : break;
1700 : :
1701 : 60 : case PCSymBuild_convert:
1702 : 60 : return WalkConvert (e);
1703 : 5380 : break;
1704 : :
1705 : 5380 : case PCSymBuild_function:
1706 : 5380 : return WalkFunction (e);
1707 : 0 : break;
1708 : :
1709 : :
1710 : 0 : default:
1711 : 0 : M2Error_InternalError ((const char *) "unexpected tag value", 20);
1712 : : break;
1713 : : }
1714 : : return false;
1715 : : /* static analysis guarentees a RETURN statement will be used before here. */
1716 : : __builtin_unreachable ();
1717 : : }
1718 : :
1719 : :
1720 : : /*
1721 : : WalkLeaf -
1722 : : */
1723 : :
1724 : 33012 : static bool WalkLeaf (PCSymBuild_exprNode e)
1725 : : {
1726 : 33012 : PCSymBuild_exprNode c;
1727 : :
1728 : 33012 : if (isTypeResolved (e))
1729 : : {
1730 : : return false;
1731 : : }
1732 : : else
1733 : : {
1734 : 23306 : if ((SymbolTable_IsConst (e->eleaf.sym)) && ((SymbolTable_GetType (e->eleaf.sym)) != SymbolTable_NulSym))
1735 : : {
1736 : 22122 : e->eleaf.type = GetSkippedType (e->eleaf.sym);
1737 : 22122 : return true;
1738 : : }
1739 : 1184 : if (SymbolTable_IsAModula2Type (e->eleaf.sym))
1740 : : {
1741 : 36 : e->eleaf.type = e->eleaf.sym;
1742 : 36 : return true;
1743 : : }
1744 : 1148 : c = findConstDes (e->eleaf.sym);
1745 : 1148 : if ((c != NULL) && (isTypeResolved (c)))
1746 : : {
1747 : 24 : assignType (e, c);
1748 : 24 : return true;
1749 : : }
1750 : : }
1751 : : return false;
1752 : : /* static analysis guarentees a RETURN statement will be used before here. */
1753 : : __builtin_unreachable ();
1754 : : }
1755 : :
1756 : :
1757 : : /*
1758 : : WalkUnary -
1759 : : */
1760 : :
1761 : 186 : static bool WalkUnary (PCSymBuild_exprNode e)
1762 : : {
1763 : 186 : if (isTypeResolved (e))
1764 : : {
1765 : : return false;
1766 : : }
1767 : : else
1768 : : {
1769 : 186 : if (isTypeResolved (e->eunary.left))
1770 : : {
1771 : 114 : deduceTypes (&e->eunary.type, &e->eunary.meta, e->eunary.left, e->eunary.left, e->eunary.op);
1772 : 114 : return true;
1773 : : }
1774 : 72 : return doWalkNode (e->eunary.left);
1775 : : }
1776 : : /* static analysis guarentees a RETURN statement will be used before here. */
1777 : : __builtin_unreachable ();
1778 : : }
1779 : :
1780 : :
1781 : : /*
1782 : : WalkBinary -
1783 : : */
1784 : :
1785 : 23121 : static bool WalkBinary (PCSymBuild_exprNode e)
1786 : : {
1787 : 23121 : bool changed;
1788 : :
1789 : 23121 : if (isTypeResolved (e))
1790 : : {
1791 : : return false;
1792 : : }
1793 : : else
1794 : : {
1795 : 23121 : if ((isTypeResolved (e->ebinary.left)) && (isTypeResolved (e->ebinary.right)))
1796 : : {
1797 : 12416 : deduceTypes (&e->ebinary.type, &e->ebinary.meta, e->ebinary.left, e->ebinary.right, e->ebinary.op);
1798 : 12416 : return true;
1799 : : }
1800 : 10705 : changed = doWalkNode (e->ebinary.left);
1801 : 10705 : return (doWalkNode (e->ebinary.right)) || changed;
1802 : : }
1803 : : /* static analysis guarentees a RETURN statement will be used before here. */
1804 : : __builtin_unreachable ();
1805 : : }
1806 : :
1807 : :
1808 : : /*
1809 : : WalkExpr -
1810 : : */
1811 : :
1812 : 0 : static bool WalkExpr (PCSymBuild_exprNode e)
1813 : : {
1814 : 0 : if (isTypeResolved (e))
1815 : : {
1816 : : return false;
1817 : : }
1818 : : else
1819 : : {
1820 : 0 : if (isTypeResolved (e->eexpr.left))
1821 : : {
1822 : 0 : assignType (e, e->eexpr.left);
1823 : 0 : return true;
1824 : : }
1825 : 0 : return doWalkNode (e->eexpr.left);
1826 : : }
1827 : : /* static analysis guarentees a RETURN statement will be used before here. */
1828 : : __builtin_unreachable ();
1829 : : }
1830 : :
1831 : :
1832 : : /*
1833 : : doWalkDesExpr - returns TRUE if the expression trees, d, or, e, are changed.
1834 : : */
1835 : :
1836 : 288300 : static bool doWalkDesExpr (PCSymBuild_exprNode d, PCSymBuild_exprNode e)
1837 : : {
1838 : 288300 : if (isTypeResolved (e))
1839 : : {
1840 : 248047 : d->edes.type = getEtype (e);
1841 : 248047 : if (d->edes.type == SymbolTable_NulSym)
1842 : : {
1843 : : /* avoid dangling else. */
1844 : 2502 : d->edes.meta = getEmeta (e);
1845 : 2502 : if (d->edes.meta == M2Const_str)
1846 : : {} /* empty. */
1847 : : /* PutConstString(sym, getString(e)) */
1848 : : }
1849 : : else
1850 : : {
1851 : 245545 : SymbolTable_PutConst (d->edes.sym, d->edes.type);
1852 : : }
1853 : 248047 : return true;
1854 : : }
1855 : 40253 : return doWalkNode (e);
1856 : : /* static analysis guarentees a RETURN statement will be used before here. */
1857 : : __builtin_unreachable ();
1858 : : }
1859 : :
1860 : :
1861 : : /*
1862 : : doWalkDes - return TRUE if expression, e, is changed.
1863 : : */
1864 : :
1865 : 1118169 : static bool doWalkDes (PCSymBuild_exprNode d)
1866 : : {
1867 : 1118169 : if (isTypeResolved (d))
1868 : : {
1869 : : return false;
1870 : : }
1871 : : else
1872 : : {
1873 : 288300 : switch (d->tag)
1874 : : {
1875 : 288300 : case PCSymBuild_designator:
1876 : 288300 : constToken = SymbolTable_GetDeclaredMod (d->edes.sym);
1877 : 288300 : return doWalkDesExpr (d, d->edes.left);
1878 : 0 : break;
1879 : :
1880 : :
1881 : 0 : default:
1882 : 0 : M2Error_InternalError ((const char *) "unexpected tag value", 20);
1883 : : break;
1884 : : }
1885 : : }
1886 : : ReturnException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/PCSymBuild.def", 20, 1);
1887 : : __builtin_unreachable ();
1888 : : }
1889 : :
1890 : :
1891 : : /*
1892 : : findConstDes -
1893 : : */
1894 : :
1895 : 1148 : static PCSymBuild_exprNode findConstDes (unsigned int sym)
1896 : : {
1897 : 1148 : unsigned int i;
1898 : 1148 : PCSymBuild_exprNode e;
1899 : :
1900 : 1148 : i = 1;
1901 : 45271 : while (i <= (Indexing_HighIndice (constList)))
1902 : : {
1903 : 45211 : e = static_cast<PCSymBuild_exprNode> (Indexing_GetIndice (constList, i));
1904 : 45211 : switch (e->tag)
1905 : : {
1906 : 45211 : case PCSymBuild_designator:
1907 : 45211 : if (e->edes.sym == sym)
1908 : : {
1909 : 1088 : return e;
1910 : : }
1911 : : break;
1912 : :
1913 : :
1914 : : default:
1915 : : break;
1916 : : }
1917 : 44123 : i += 1;
1918 : : }
1919 : : return NULL;
1920 : : /* static analysis guarentees a RETURN statement will be used before here. */
1921 : : __builtin_unreachable ();
1922 : : }
1923 : :
1924 : :
1925 : : /*
1926 : : WalkDes - return TRUE if expression, e, is changed.
1927 : : */
1928 : :
1929 : 1118169 : static bool WalkDes (PCSymBuild_exprNode d)
1930 : : {
1931 : 0 : if (d == NULL)
1932 : : {
1933 : : return false;
1934 : : }
1935 : : else
1936 : : {
1937 : 1118169 : if (Debugging)
1938 : : {
1939 : : DebugDes (d);
1940 : : }
1941 : 1118169 : return doWalkDes (d);
1942 : : }
1943 : : /* static analysis guarentees a RETURN statement will be used before here. */
1944 : : __builtin_unreachable ();
1945 : : }
1946 : :
1947 : :
1948 : : /*
1949 : : WalkConsts - walk over the constant trees and return TRUE if any tree was changed.
1950 : : (As a result of a type resolution).
1951 : : */
1952 : :
1953 : 47474 : static bool WalkConsts (void)
1954 : : {
1955 : 47474 : bool changed;
1956 : 47474 : unsigned int i;
1957 : :
1958 : 47474 : changed = false;
1959 : 47474 : i = 1;
1960 : 1165643 : while (i <= (Indexing_HighIndice (constList)))
1961 : : {
1962 : 2236338 : if (WalkDes (reinterpret_cast<PCSymBuild_exprNode> (Indexing_GetIndice (constList, i))))
1963 : : {
1964 : 1118169 : changed = true;
1965 : : }
1966 : 1118169 : i += 1;
1967 : : }
1968 : 47474 : return changed;
1969 : : /* static analysis guarentees a RETURN statement will be used before here. */
1970 : : __builtin_unreachable ();
1971 : : }
1972 : :
1973 : :
1974 : : /*
1975 : : DebugNodes -
1976 : : */
1977 : :
1978 : 0 : static void DebugNodes (void)
1979 : : {
1980 : 0 : unsigned int i;
1981 : :
1982 : 0 : i = 1;
1983 : 0 : while (i <= (Indexing_HighIndice (constList)))
1984 : : {
1985 : 0 : if (isTypeResolved (reinterpret_cast<PCSymBuild_exprNode> (Indexing_GetIndice (constList, i))))
1986 : : {
1987 : 0 : StrIO_WriteString ((const char *) "resolved ", 9);
1988 : : }
1989 : : else
1990 : : {
1991 : 0 : StrIO_WriteString ((const char *) "unresolved ", 11);
1992 : : }
1993 : 0 : DebugNode (reinterpret_cast<PCSymBuild_exprNode> (Indexing_GetIndice (constList, i)));
1994 : 0 : StrIO_WriteLn ();
1995 : 0 : i += 1;
1996 : : }
1997 : 0 : }
1998 : :
1999 : :
2000 : : /*
2001 : : findAlias -
2002 : : */
2003 : :
2004 : 84 : static unsigned int findAlias (unsigned int sym, PCSymBuild_exprNode e)
2005 : : {
2006 : 168 : switch (e->tag)
2007 : : {
2008 : 84 : case PCSymBuild_designator:
2009 : 84 : return findAlias (sym, e->edes.left);
2010 : 84 : break;
2011 : :
2012 : 84 : case PCSymBuild_leaf:
2013 : 84 : return e->eleaf.sym;
2014 : 0 : break;
2015 : :
2016 : 0 : case PCSymBuild_expr:
2017 : 0 : return findAlias (sym, e->eexpr.left);
2018 : : break;
2019 : :
2020 : : case PCSymBuild_unary:
2021 : : case PCSymBuild_binary:
2022 : : return sym;
2023 : 0 : break;
2024 : :
2025 : :
2026 : 0 : default:
2027 : 0 : M2Error_InternalError ((const char *) "not expecting this tag value", 28);
2028 : : break;
2029 : : }
2030 : : ReturnException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/PCSymBuild.def", 20, 1);
2031 : : __builtin_unreachable ();
2032 : : }
2033 : :
2034 : :
2035 : : /*
2036 : : CheckConsts -
2037 : : */
2038 : :
2039 : 16710 : static void CheckConsts (void)
2040 : : {
2041 : 16710 : unsigned int i;
2042 : 16710 : PCSymBuild_exprNode e;
2043 : :
2044 : 16710 : i = 1;
2045 : 264769 : while (i <= (Indexing_HighIndice (constList)))
2046 : : {
2047 : 248059 : e = static_cast<PCSymBuild_exprNode> (Indexing_GetIndice (constList, i));
2048 : 248059 : if (! (isTypeResolved (e)))
2049 : : {
2050 : 12 : switch (e->tag)
2051 : : {
2052 : 12 : case PCSymBuild_designator:
2053 : 12 : M2MetaError_MetaError1 ((const char *) "the type of the constant declaration {%1Dad} cannot be determined", 65, e->edes.sym);
2054 : 12 : break;
2055 : :
2056 : :
2057 : : default:
2058 : : break;
2059 : : }
2060 : : }
2061 : 248059 : i += 1;
2062 : : }
2063 : 16710 : }
2064 : :
2065 : :
2066 : : /*
2067 : : Init -
2068 : : */
2069 : :
2070 : 16817 : static void Init (void)
2071 : : {
2072 : 16817 : exprStack = M2StackAddress_InitStackAddress ();
2073 : 16817 : constList = Indexing_InitIndex (1);
2074 : 16817 : desStack = M2StackWord_InitStackWord ();
2075 : 16817 : inDesignator = false;
2076 : 16817 : }
2077 : :
2078 : 125237 : extern "C" void PCSymBuild_PCStartBuildDefModule (void)
2079 : : {
2080 : 125237 : unsigned int tok;
2081 : 125237 : NameKey_Name name;
2082 : 125237 : unsigned int ModuleSym;
2083 : :
2084 : : /*
2085 : : StartBuildDefinitionModule - Creates a definition module and starts
2086 : : a new scope.
2087 : :
2088 : : The Stack is expected:
2089 : :
2090 : : Entry Exit
2091 : :
2092 : : Ptr -> <- Ptr
2093 : : +------------+ +-----------+
2094 : : | NameStart | | NameStart |
2095 : : |------------| |-----------|
2096 : :
2097 : : */
2098 : 125237 : M2Quads_PopTtok (&name, &tok);
2099 : 125237 : ModuleSym = M2Batch_MakeDefinitionSource (tok, name);
2100 : 125237 : SymbolTable_SetCurrentModule (ModuleSym);
2101 : 125237 : SymbolTable_SetFileModule (ModuleSym);
2102 : 125237 : SymbolTable_StartScope (ModuleSym);
2103 : 125237 : M2Debug_Assert (SymbolTable_IsDefImp (ModuleSym));
2104 : 125237 : M2Debug_Assert (M2Comp_CompilingDefinitionModule ());
2105 : 125237 : M2Quads_PushT (name);
2106 : 125237 : M2Error_EnterDefinitionScope (name);
2107 : 125237 : }
2108 : :
2109 : 125237 : extern "C" void PCSymBuild_PCEndBuildDefModule (void)
2110 : : {
2111 : 125237 : unsigned int NameStart;
2112 : 125237 : unsigned int NameEnd;
2113 : :
2114 : : /*
2115 : : EndBuildDefinitionModule - Destroys the definition module scope and
2116 : : checks for correct name.
2117 : :
2118 : : The Stack is expected:
2119 : :
2120 : : Entry Exit
2121 : :
2122 : : Ptr ->
2123 : : +------------+ +-----------+
2124 : : | NameEnd | | |
2125 : : |------------| |-----------|
2126 : : | NameStart | | | <- Ptr
2127 : : |------------| |-----------|
2128 : : */
2129 : 125237 : M2Debug_Assert (M2Comp_CompilingDefinitionModule ());
2130 : 125237 : SymbolTable_CheckForUnknownInModule ();
2131 : 125237 : SymbolTable_EndScope ();
2132 : 125237 : M2Quads_PopT (&NameEnd);
2133 : 125237 : M2Quads_PopT (&NameStart);
2134 : 125237 : if (NameStart != NameEnd)
2135 : : {
2136 : 0 : M2Error_WriteFormat2 ((const char *) "inconsistant definition module was named (%a) and concluded as (%a)", 67, (const unsigned char *) &NameStart, (sizeof (NameStart)-1), (const unsigned char *) &NameEnd, (sizeof (NameEnd)-1));
2137 : : }
2138 : 125237 : M2Error_LeaveErrorScope ();
2139 : 125237 : }
2140 : :
2141 : 52758 : extern "C" void PCSymBuild_PCStartBuildImpModule (void)
2142 : : {
2143 : 52758 : unsigned int tok;
2144 : 52758 : NameKey_Name name;
2145 : 52758 : unsigned int ModuleSym;
2146 : :
2147 : : /*
2148 : : StartBuildImplementationModule - Creates an implementation module and starts
2149 : : a new scope.
2150 : :
2151 : : The Stack is expected:
2152 : :
2153 : : Entry Exit
2154 : :
2155 : : Ptr -> <- Ptr
2156 : : +------------+ +-----------+
2157 : : | NameStart | | NameStart |
2158 : : |------------| |-----------|
2159 : :
2160 : : */
2161 : 52758 : M2Quads_PopTtok (&name, &tok);
2162 : 52758 : ModuleSym = M2Batch_MakeImplementationSource (tok, name);
2163 : 52758 : SymbolTable_SetCurrentModule (ModuleSym);
2164 : 52758 : SymbolTable_SetFileModule (ModuleSym);
2165 : 52758 : SymbolTable_StartScope (ModuleSym);
2166 : 52758 : M2Debug_Assert (SymbolTable_IsDefImp (ModuleSym));
2167 : 52758 : M2Debug_Assert (M2Comp_CompilingImplementationModule ());
2168 : 52758 : M2Quads_PushTtok (name, tok);
2169 : 52758 : M2Error_EnterImplementationScope (name);
2170 : 52758 : }
2171 : :
2172 : 52746 : extern "C" void PCSymBuild_PCEndBuildImpModule (void)
2173 : : {
2174 : 52746 : NameKey_Name NameStart;
2175 : 52746 : NameKey_Name NameEnd;
2176 : :
2177 : : /*
2178 : : EndBuildImplementationModule - Destroys the implementation module scope and
2179 : : checks for correct name.
2180 : :
2181 : : The Stack is expected:
2182 : :
2183 : : Entry Exit
2184 : :
2185 : : Ptr ->
2186 : : +------------+ +-----------+
2187 : : | NameEnd | | |
2188 : : |------------| |-----------|
2189 : : | NameStart | | | <- Ptr
2190 : : |------------| |-----------|
2191 : : */
2192 : 52746 : M2Debug_Assert (M2Comp_CompilingImplementationModule ());
2193 : 52746 : SymbolTable_CheckForUnknownInModule ();
2194 : 52746 : SymbolTable_EndScope ();
2195 : 52746 : M2Quads_PopT (&NameEnd);
2196 : 52746 : M2Quads_PopT (&NameStart);
2197 : 52746 : if (NameStart != NameEnd)
2198 : : {
2199 : : /* we dont issue an error based around incorrect module names as this is done in P1 and P2.
2200 : : If we get here then something has gone wrong with our error recovery in PC, so we bail out.
2201 : : */
2202 : 0 : M2Error_WriteFormat0 ((const char *) "too many errors in pass 3", 25);
2203 : 0 : M2Error_FlushErrors ();
2204 : : }
2205 : 52746 : M2Error_LeaveErrorScope ();
2206 : 52746 : }
2207 : :
2208 : 10366 : extern "C" void PCSymBuild_PCStartBuildProgModule (void)
2209 : : {
2210 : 10366 : unsigned int tok;
2211 : 10366 : NameKey_Name name;
2212 : 10366 : unsigned int ModuleSym;
2213 : :
2214 : : /* WriteString('StartBuildProgramModule') ; WriteLn ; */
2215 : 10366 : M2Quads_PopTtok (&name, &tok);
2216 : 10366 : ModuleSym = M2Batch_MakeProgramSource (tok, name);
2217 : 10366 : SymbolTable_SetCurrentModule (ModuleSym);
2218 : 10366 : SymbolTable_SetFileModule (ModuleSym);
2219 : : /* WriteString('MODULE - ') ; WriteKey(GetSymName(ModuleSym)) ; WriteLn ; */
2220 : 10366 : SymbolTable_StartScope (ModuleSym);
2221 : 10366 : M2Debug_Assert (M2Comp_CompilingProgramModule ());
2222 : 10366 : M2Debug_Assert (! (SymbolTable_IsDefImp (ModuleSym)));
2223 : 10366 : M2Quads_PushTtok (name, tok);
2224 : 10366 : M2Error_EnterProgramScope (name);
2225 : 10366 : }
2226 : :
2227 : 10366 : extern "C" void PCSymBuild_PCEndBuildProgModule (void)
2228 : : {
2229 : 10366 : NameKey_Name NameStart;
2230 : 10366 : NameKey_Name NameEnd;
2231 : :
2232 : : /*
2233 : : EndBuildProgramModule - Destroys the program module scope and
2234 : : checks for correct name.
2235 : :
2236 : : The Stack is expected:
2237 : :
2238 : : Entry Exit
2239 : :
2240 : : Ptr ->
2241 : : +------------+ +-----------+
2242 : : | NameEnd | | |
2243 : : |------------| |-----------|
2244 : : | NameStart | | | <- Ptr
2245 : : |------------| |-----------|
2246 : : */
2247 : 10366 : M2Debug_Assert (M2Comp_CompilingProgramModule ());
2248 : 10366 : SymbolTable_CheckForUnknownInModule ();
2249 : 10366 : SymbolTable_EndScope ();
2250 : 10366 : M2Quads_PopT (&NameEnd);
2251 : 10366 : M2Quads_PopT (&NameStart);
2252 : 10366 : if (NameStart != NameEnd)
2253 : : {
2254 : : /* we dont issue an error based around incorrect module names this would be done in P1 and P2.
2255 : : If we get here then something has gone wrong with our error recovery in PC, so we bail out.
2256 : : */
2257 : 0 : M2Error_WriteFormat0 ((const char *) "too many errors in pass 3", 25);
2258 : 0 : M2Error_FlushErrors ();
2259 : : }
2260 : 10366 : M2Error_LeaveErrorScope ();
2261 : 10366 : }
2262 : :
2263 : 420 : extern "C" void PCSymBuild_PCStartBuildInnerModule (void)
2264 : : {
2265 : 420 : NameKey_Name name;
2266 : 420 : unsigned int tok;
2267 : 420 : unsigned int ModuleSym;
2268 : :
2269 : : /*
2270 : : StartBuildInnerModule - Creates an Inner module and starts
2271 : : a new scope.
2272 : :
2273 : : The Stack is expected:
2274 : :
2275 : : Entry Exit
2276 : :
2277 : : Ptr -> <- Ptr
2278 : : +------------+ +-----------+
2279 : : | NameStart | | NameStart |
2280 : : |------------| |-----------|
2281 : :
2282 : : */
2283 : 420 : M2Quads_PopTtok (&name, &tok);
2284 : 420 : ModuleSym = SymbolTable_RequestSym (tok, name);
2285 : 420 : M2Debug_Assert (SymbolTable_IsModule (ModuleSym));
2286 : 420 : SymbolTable_StartScope (ModuleSym);
2287 : 420 : M2Debug_Assert (! (SymbolTable_IsDefImp (ModuleSym)));
2288 : 420 : SymbolTable_SetCurrentModule (ModuleSym);
2289 : 420 : M2Quads_PushTtok (name, tok);
2290 : 420 : M2Error_EnterModuleScope (name);
2291 : 420 : }
2292 : :
2293 : 420 : extern "C" void PCSymBuild_PCEndBuildInnerModule (void)
2294 : : {
2295 : 420 : NameKey_Name NameStart;
2296 : 420 : NameKey_Name NameEnd;
2297 : :
2298 : : /*
2299 : : EndBuildInnerModule - Destroys the Inner module scope and
2300 : : checks for correct name.
2301 : :
2302 : : The Stack is expected:
2303 : :
2304 : : Entry Exit
2305 : :
2306 : : Ptr ->
2307 : : +------------+ +-----------+
2308 : : | NameEnd | | |
2309 : : |------------| |-----------|
2310 : : | NameStart | | | <- Ptr
2311 : : |------------| |-----------|
2312 : : */
2313 : 420 : SymbolTable_CheckForUnknownInModule ();
2314 : 420 : SymbolTable_EndScope ();
2315 : 420 : M2Quads_PopT (&NameEnd);
2316 : 420 : M2Quads_PopT (&NameStart);
2317 : 420 : if (NameStart != NameEnd)
2318 : : {
2319 : : /* we dont issue an error based around incorrect module names this would be done in P1 and P2.
2320 : : If we get here then something has gone wrong with our error recovery in PC, so we bail out.
2321 : : */
2322 : 0 : M2Error_WriteFormat0 ((const char *) "too many errors in pass 3", 25);
2323 : 0 : M2Error_FlushErrors ();
2324 : : }
2325 : 420 : SymbolTable_SetCurrentModule (SymbolTable_GetModuleScope (SymbolTable_GetCurrentModule ()));
2326 : 420 : M2Error_LeaveErrorScope ();
2327 : 420 : }
2328 : :
2329 : 2909942 : extern "C" void PCSymBuild_PCBuildProcedureHeading (void)
2330 : : {
2331 : 2909942 : unsigned int ProcSym;
2332 : 2909942 : NameKey_Name NameStart;
2333 : :
2334 : : /*
2335 : : BuildProcedureHeading - Builds a procedure heading for the definition
2336 : : module procedures.
2337 : :
2338 : : Operation only performed if compiling a
2339 : : definition module.
2340 : :
2341 : : The Stack:
2342 : :
2343 : : Entry Exit
2344 : :
2345 : : Ptr ->
2346 : : +------------+
2347 : : | ProcSym |
2348 : : |------------|
2349 : : | NameStart |
2350 : : |------------|
2351 : : Empty
2352 : :
2353 : : */
2354 : 2909942 : if (M2Comp_CompilingDefinitionModule ())
2355 : : {
2356 : 2013989 : M2Quads_PopT (&ProcSym);
2357 : 2013989 : M2Quads_PopT (&NameStart);
2358 : 2013989 : SymbolTable_EndScope ();
2359 : : }
2360 : 2909942 : }
2361 : :
2362 : 2909942 : extern "C" void PCSymBuild_PCStartBuildProcedure (void)
2363 : : {
2364 : 2909942 : NameKey_Name name;
2365 : 2909942 : unsigned int ProcSym;
2366 : 2909942 : unsigned int tok;
2367 : :
2368 : : /*
2369 : : StartBuildProcedure - Builds a Procedure.
2370 : :
2371 : : The Stack:
2372 : :
2373 : : Entry Exit
2374 : :
2375 : : <- Ptr
2376 : : +------------+
2377 : : Ptr -> | ProcSym |
2378 : : +------------+ |------------|
2379 : : | Name | | Name |
2380 : : |------------| |------------|
2381 : : */
2382 : 2909942 : M2Quads_PopTtok (&name, &tok);
2383 : 2909942 : M2Quads_PushTtok (name, tok); /* Name saved for the EndBuildProcedure name check */
2384 : 2909942 : ProcSym = SymbolTable_RequestSym (tok, name); /* Name saved for the EndBuildProcedure name check */
2385 : 2909942 : M2Debug_Assert (SymbolTable_IsProcedure (ProcSym));
2386 : 2909942 : M2Quads_PushTtok (ProcSym, tok);
2387 : 2909942 : SymbolTable_StartScope (ProcSym);
2388 : 2909942 : M2Error_EnterProcedureScope (name);
2389 : 2909942 : }
2390 : :
2391 : 895953 : extern "C" void PCSymBuild_PCEndBuildProcedure (void)
2392 : : {
2393 : 895953 : unsigned int ProcSym;
2394 : 895953 : NameKey_Name NameEnd;
2395 : 895953 : NameKey_Name NameStart;
2396 : :
2397 : : /*
2398 : : EndBuildProcedure - Ends building a Procedure.
2399 : : It checks the start procedure name matches the end
2400 : : procedure name.
2401 : :
2402 : : The Stack:
2403 : :
2404 : : (Procedure Not Defined in definition module)
2405 : :
2406 : : Entry Exit
2407 : :
2408 : : Ptr ->
2409 : : +------------+
2410 : : | NameEnd |
2411 : : |------------|
2412 : : | ProcSym |
2413 : : |------------|
2414 : : | NameStart |
2415 : : |------------|
2416 : : Empty
2417 : : */
2418 : 895953 : M2Quads_PopT (&NameEnd);
2419 : 895953 : M2Quads_PopT (&ProcSym);
2420 : 895953 : M2Quads_PopT (&NameStart);
2421 : 895953 : if (NameEnd != NameStart)
2422 : : {
2423 : : /* we dont issue an error based around incorrect module names this would be done in P1 and P2.
2424 : : If we get here then something has gone wrong with our error recovery in PC, so we bail out.
2425 : : */
2426 : 0 : M2Error_WriteFormat0 ((const char *) "too many errors in pass 3", 25);
2427 : 0 : M2Error_FlushErrors ();
2428 : : }
2429 : 895953 : SymbolTable_EndScope ();
2430 : 895953 : M2Error_LeaveErrorScope ();
2431 : 895953 : }
2432 : :
2433 : 276085 : extern "C" void PCSymBuild_PCBuildImportOuterModule (void)
2434 : : {
2435 : 276085 : unsigned int Sym;
2436 : 276085 : unsigned int ModSym;
2437 : 276085 : unsigned int i;
2438 : 276085 : unsigned int n;
2439 : :
2440 : : /*
2441 : : BuildImportOuterModule - Builds imported identifiers into an outer module
2442 : : from a definition module.
2443 : :
2444 : : The Stack is expected:
2445 : :
2446 : : Entry OR Entry
2447 : :
2448 : : Ptr -> Ptr ->
2449 : : +------------+ +-----------+
2450 : : | # | | # |
2451 : : |------------| |-----------|
2452 : : | Id1 | | Id1 |
2453 : : |------------| |-----------|
2454 : : . . . .
2455 : : . . . .
2456 : : . . . .
2457 : : |------------| |-----------|
2458 : : | Id# | | Id# |
2459 : : |------------| |-----------|
2460 : : | ImportTok | | Ident |
2461 : : |------------| |-----------|
2462 : :
2463 : : IMPORT Id1, .. Id# ; FROM Ident IMPORT Id1 .. Id# ;
2464 : :
2465 : :
2466 : : Exit
2467 : :
2468 : : All above stack discarded
2469 : : */
2470 : 276085 : M2Quads_PopT (&n); /* n = # of the Ident List */
2471 : 276085 : if ((M2Quads_OperandT (n+1)) != M2Reserved_ImportTok)
2472 : : {
2473 : : /* Ident List contains list of objects imported from ModSym */
2474 : 244518 : ModSym = M2Batch_LookupModule (M2Quads_OperandTok (n+1), M2Quads_OperandT (n+1));
2475 : 244518 : i = 1;
2476 : 1066138 : while (i <= n)
2477 : : {
2478 : 577102 : Sym = SymbolTable_GetExported (M2Quads_OperandTok (i), ModSym, M2Quads_OperandT (i));
2479 : 577102 : SymbolTable_CheckForEnumerationInCurrentModule (Sym);
2480 : 577102 : i += 1;
2481 : : }
2482 : : }
2483 : 276085 : M2Quads_PopN (n+1); /* clear stack */
2484 : 276085 : }
2485 : :
2486 : 222 : extern "C" void PCSymBuild_PCBuildImportInnerModule (void)
2487 : : {
2488 : 222 : unsigned int Sym;
2489 : 222 : unsigned int ModSym;
2490 : 222 : unsigned int n;
2491 : 222 : unsigned int i;
2492 : :
2493 : : /*
2494 : : BuildImportInnerModule - Builds imported identifiers into an inner module
2495 : : from the last level of module.
2496 : :
2497 : : The Stack is expected:
2498 : :
2499 : : Entry OR Entry
2500 : :
2501 : : Ptr -> Ptr ->
2502 : : +------------+ +-----------+
2503 : : | # | | # |
2504 : : |------------| |-----------|
2505 : : | Id1 | | Id1 |
2506 : : |------------| |-----------|
2507 : : . . . .
2508 : : . . . .
2509 : : . . . .
2510 : : |------------| |-----------|
2511 : : | Id# | | Id# |
2512 : : |------------| |-----------|
2513 : : | ImportTok | | Ident |
2514 : : |------------| |-----------|
2515 : :
2516 : : IMPORT Id1, .. Id# ; FROM Ident IMPORT Id1 .. Id# ;
2517 : :
2518 : : Exit
2519 : :
2520 : : All above stack discarded
2521 : : */
2522 : 222 : M2Quads_PopT (&n); /* i = # of the Ident List */
2523 : 222 : if ((M2Quads_OperandT (n+1)) == M2Reserved_ImportTok)
2524 : : {
2525 : : /* Ident List contains list of objects */
2526 : : i = 1;
2527 : 318 : while (i <= n)
2528 : : {
2529 : 162 : Sym = SymbolTable_GetFromOuterModule (M2Quads_OperandTok (i), M2Quads_OperandT (i));
2530 : 162 : SymbolTable_CheckForEnumerationInCurrentModule (Sym);
2531 : 162 : i += 1;
2532 : : }
2533 : : }
2534 : : else
2535 : : {
2536 : : /* Ident List contains list of objects imported from ModSym */
2537 : 66 : ModSym = M2Batch_LookupOuterModule (M2Quads_OperandTok (n+1), M2Quads_OperandT (n+1));
2538 : 66 : i = 1;
2539 : 198 : while (i <= n)
2540 : : {
2541 : 66 : Sym = SymbolTable_GetExported (M2Quads_OperandTok (i), ModSym, M2Quads_OperandT (i));
2542 : 66 : SymbolTable_CheckForEnumerationInCurrentModule (Sym);
2543 : 66 : i += 1;
2544 : : }
2545 : : }
2546 : 222 : M2Quads_PopN (n+1); /* Clear Stack */
2547 : 222 : }
2548 : :
2549 : :
2550 : : /*
2551 : : BuildNulName - Pushes a NulKey onto the top of the stack.
2552 : : The Stack:
2553 : :
2554 : :
2555 : : Entry Exit
2556 : :
2557 : : <- Ptr
2558 : : Empty +------------+
2559 : : | NulKey |
2560 : : |------------|
2561 : : */
2562 : :
2563 : 0 : extern "C" void PCSymBuild_BuildNulName (void)
2564 : : {
2565 : 0 : M2Quads_PushT (static_cast<unsigned int> (NameKey_NulName));
2566 : 0 : }
2567 : :
2568 : :
2569 : : /*
2570 : : BuildConst - builds a constant.
2571 : : Stack
2572 : :
2573 : : Entry Exit
2574 : :
2575 : : Ptr -> <- Ptr
2576 : : +------------+ +------------+
2577 : : | Name | | Sym |
2578 : : |------------+ |------------|
2579 : : */
2580 : :
2581 : 0 : extern "C" void PCSymBuild_BuildConst (void)
2582 : : {
2583 : 0 : NameKey_Name name;
2584 : 0 : unsigned int tok;
2585 : 0 : unsigned int Sym;
2586 : :
2587 : 0 : M2Quads_PopTtok (&name, &tok);
2588 : 0 : Sym = SymbolTable_RequestSym (tok, name);
2589 : 0 : M2Quads_PushTtok (Sym, tok);
2590 : 0 : }
2591 : :
2592 : :
2593 : : /*
2594 : : StartDesConst -
2595 : : */
2596 : :
2597 : 248113 : extern "C" void PCSymBuild_StartDesConst (void)
2598 : : {
2599 : 248113 : NameKey_Name name;
2600 : 248113 : unsigned int tok;
2601 : :
2602 : 248113 : inDesignator = true;
2603 : 248113 : exprStack = M2StackAddress_KillStackAddress (exprStack);
2604 : 248113 : exprStack = M2StackAddress_InitStackAddress ();
2605 : 248113 : M2Quads_PopTtok (&name, &tok);
2606 : 248113 : InitDesExpr (SymbolTable_RequestSym (tok, name));
2607 : 248113 : }
2608 : :
2609 : :
2610 : : /*
2611 : : EndDesConst -
2612 : : */
2613 : :
2614 : 248101 : extern "C" void PCSymBuild_EndDesConst (void)
2615 : : {
2616 : 248101 : PCSymBuild_exprNode d;
2617 : 248101 : PCSymBuild_exprNode e;
2618 : :
2619 : 248101 : e = static_cast<PCSymBuild_exprNode> (M2StackAddress_PopAddress (exprStack));
2620 : 248101 : d = static_cast<PCSymBuild_exprNode> (M2StackAddress_PopAddress (exprStack));
2621 : 248101 : M2Debug_Assert (d->tag == PCSymBuild_designator);
2622 : 248101 : d->edes.left = e;
2623 : 248101 : Indexing_IncludeIndiceIntoIndex (constList, reinterpret_cast<void *> (d));
2624 : 248101 : inDesignator = false;
2625 : 248101 : }
2626 : :
2627 : :
2628 : : /*
2629 : : BuildRelationConst - builds a relationship binary operation.
2630 : : */
2631 : :
2632 : 42 : extern "C" void PCSymBuild_BuildRelationConst (void)
2633 : : {
2634 : 42 : NameKey_Name op;
2635 : :
2636 : 42 : M2Quads_PopT (&op);
2637 : 42 : if (inDesignator)
2638 : : {
2639 : 42 : InitBinary (M2Const_boolean, M2Base_Boolean, op);
2640 : : }
2641 : 42 : }
2642 : :
2643 : :
2644 : : /*
2645 : : BuildUnaryConst - builds a unary operator node.
2646 : : */
2647 : :
2648 : 20136 : extern "C" void PCSymBuild_BuildUnaryConst (void)
2649 : : {
2650 : 20136 : NameKey_Name op;
2651 : :
2652 : 20136 : M2Quads_PopT (&op);
2653 : 20136 : if (inDesignator)
2654 : : {
2655 : 180 : InitUnary (M2Const_unknown, SymbolTable_NulSym, op);
2656 : : }
2657 : 20136 : }
2658 : :
2659 : :
2660 : : /*
2661 : : BuildBinaryConst - builds a binary operator node.
2662 : : */
2663 : :
2664 : 14580 : extern "C" void PCSymBuild_BuildBinaryConst (void)
2665 : : {
2666 : 14580 : NameKey_Name op;
2667 : :
2668 : 14580 : M2Quads_PopT (&op);
2669 : 14580 : if (inDesignator)
2670 : : {
2671 : 12476 : InitBinary (M2Const_unknown, SymbolTable_NulSym, op);
2672 : : }
2673 : 14580 : }
2674 : :
2675 : :
2676 : : /*
2677 : : PushConstFunctionType -
2678 : : */
2679 : :
2680 : 4115 : extern "C" void PCSymBuild_PushConstFunctionType (void)
2681 : : {
2682 : 4115 : unsigned int functok;
2683 : 4115 : unsigned int func;
2684 : 4115 : unsigned int n;
2685 : :
2686 : 4115 : M2Quads_PopT (&n);
2687 : 4115 : M2Quads_PopTtok (&func, &functok);
2688 : 4115 : if (inDesignator)
2689 : : {
2690 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
2691 : 3399 : if (func == SymbolTable_NulSym)
2692 : : {
2693 : 24 : ErrorConstFunction (func, functok);
2694 : : }
2695 : 3375 : else if ((func != M2Base_Convert) && (((M2Base_IsPseudoBaseFunction (func)) || (M2System_IsPseudoSystemFunctionConstExpression (func))) || ((SymbolTable_IsProcedure (func)) && (SymbolTable_IsProcedureBuiltin (func)))))
2696 : : {
2697 : : /* avoid dangling else. */
2698 : 3249 : buildConstFunction (func, n);
2699 : : }
2700 : 126 : else if (SymbolTable_IsAModula2Type (func))
2701 : : {
2702 : : /* avoid dangling else. */
2703 : 114 : if (n == 1)
2704 : : {
2705 : : /* the top element on the expression stack is the first and only parameter to the cast */
2706 : 114 : InitUnary (M2Const_cast, func, SymbolTable_GetSymName (func));
2707 : : }
2708 : : else
2709 : : {
2710 : 0 : M2Error_WriteFormat0 ((const char *) "a constant type conversion can only have one argument", 53);
2711 : : }
2712 : : }
2713 : : else
2714 : : {
2715 : : /* avoid dangling else. */
2716 : 12 : ErrorConstFunction (func, functok);
2717 : : }
2718 : : }
2719 : 4115 : M2Quads_PushTtok (func, functok);
2720 : 4115 : }
2721 : :
2722 : :
2723 : : /*
2724 : : PushIntegerType -
2725 : : */
2726 : :
2727 : 311812 : extern "C" void PCSymBuild_PushIntegerType (void)
2728 : : {
2729 : 311812 : unsigned int sym;
2730 : 311812 : M2Const_constType m;
2731 : :
2732 : 311812 : M2Quads_PopT (&sym);
2733 : 311812 : if (inDesignator)
2734 : : {
2735 : 184325 : m = TypeToMeta (GetSkippedType (sym));
2736 : 184325 : if (m == M2Const_char)
2737 : : {
2738 : 112236 : InitCharType (sym);
2739 : : }
2740 : : else
2741 : : {
2742 : 72089 : InitZType (sym);
2743 : : }
2744 : : }
2745 : 311812 : }
2746 : :
2747 : :
2748 : : /*
2749 : : PushRType -
2750 : : */
2751 : :
2752 : 2730 : extern "C" void PCSymBuild_PushRType (void)
2753 : : {
2754 : 2730 : unsigned int sym;
2755 : :
2756 : 2730 : M2Quads_PopT (&sym);
2757 : 2730 : if (inDesignator)
2758 : : {
2759 : 1056 : InitRType (sym);
2760 : : }
2761 : 2730 : }
2762 : :
2763 : :
2764 : : /*
2765 : : PushStringType -
2766 : : */
2767 : :
2768 : 13775 : extern "C" void PCSymBuild_PushStringType (void)
2769 : : {
2770 : 13775 : unsigned int sym;
2771 : :
2772 : 13775 : M2Quads_PopT (&sym);
2773 : 13775 : if (inDesignator)
2774 : : {
2775 : 2508 : InitLeaf (M2Const_str, sym, SymbolTable_NulSym);
2776 : : }
2777 : 13775 : }
2778 : :
2779 : :
2780 : : /*
2781 : : SkipConst - returns an alias to constant, sym, if one exists.
2782 : : Otherwise sym is returned.
2783 : : */
2784 : :
2785 : 1187632 : extern "C" unsigned int PCSymBuild_SkipConst (unsigned int sym)
2786 : : {
2787 : 1187632 : unsigned int i;
2788 : 1187632 : PCSymBuild_exprNode e;
2789 : :
2790 : 1187632 : i = 1;
2791 : 52125617 : while (i <= (Indexing_HighIndice (constList)))
2792 : : {
2793 : 50938069 : e = static_cast<PCSymBuild_exprNode> (Indexing_GetIndice (constList, i));
2794 : 50938069 : if ((e->tag == PCSymBuild_designator) && (e->edes.sym == sym))
2795 : : {
2796 : 84 : return findAlias (sym, e);
2797 : : }
2798 : 50937985 : i += 1;
2799 : : }
2800 : : return sym;
2801 : : /* static analysis guarentees a RETURN statement will be used before here. */
2802 : : __builtin_unreachable ();
2803 : : }
2804 : :
2805 : :
2806 : : /*
2807 : : PushConstType - pushes a constant to the expression stack.
2808 : : */
2809 : :
2810 : 118627 : extern "C" void PCSymBuild_PushConstType (void)
2811 : : {
2812 : 118627 : unsigned int c;
2813 : :
2814 : 118627 : M2Quads_PopT (&c);
2815 : 118627 : M2Quads_PushT (c);
2816 : 118627 : if (inDesignator)
2817 : : {
2818 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
2819 : 36700 : if (c == SymbolTable_NulSym)
2820 : : {
2821 : 12 : M2Error_WriteFormat0 ((const char *) "module or symbol in qualident is not known", 42);
2822 : 12 : M2Error_FlushErrors ();
2823 : 0 : InitUnknown (c);
2824 : : }
2825 : 36688 : else if (SymbolTable_IsProcedure (c))
2826 : : {
2827 : : /* avoid dangling else. */
2828 : 18 : InitProcedure (c);
2829 : : }
2830 : 36670 : else if ((GetSkippedType (c)) == M2Base_RType)
2831 : : {
2832 : : /* avoid dangling else. */
2833 : 0 : InitRType (c);
2834 : : }
2835 : 36670 : else if ((GetSkippedType (c)) == M2Base_ZType)
2836 : : {
2837 : : /* avoid dangling else. */
2838 : 0 : InitZType (c);
2839 : : }
2840 : 36670 : else if ((GetSkippedType (c)) == M2Base_Boolean)
2841 : : {
2842 : : /* avoid dangling else. */
2843 : 11539 : InitBooleanType (c);
2844 : : }
2845 : : else
2846 : : {
2847 : : /* avoid dangling else. */
2848 : 25131 : InitUnknown (c);
2849 : : }
2850 : : }
2851 : 118615 : }
2852 : :
2853 : :
2854 : : /*
2855 : : PushConstAttributeType -
2856 : : */
2857 : :
2858 : 32668 : extern "C" void PCSymBuild_PushConstAttributeType (void)
2859 : : {
2860 : 32668 : NameKey_Name n;
2861 : :
2862 : 32668 : M2Quads_PopT (&n);
2863 : 32668 : M2Quads_PushT (n);
2864 : 32668 : InitZType (SymbolTable_NulSym);
2865 : 32668 : if ((((n == (NameKey_MakeKey ((const char *) "BITS_PER_UNIT", 13))) || (n == (NameKey_MakeKey ((const char *) "BITS_PER_WORD", 13)))) || (n == (NameKey_MakeKey ((const char *) "BITS_PER_CHAR", 13)))) || (n == (NameKey_MakeKey ((const char *) "UNITS_PER_WORD", 14))))
2866 : : {} /* empty. */
2867 : : else
2868 : : {
2869 : : /* all ok */
2870 : 0 : M2Error_WriteFormat1 ((const char *) "unknown constant attribute value '%a'", 37, (const unsigned char *) &n, (sizeof (n)-1));
2871 : : }
2872 : 32668 : }
2873 : :
2874 : :
2875 : : /*
2876 : : PushConstAttributePairType -
2877 : : */
2878 : :
2879 : 180 : extern "C" void PCSymBuild_PushConstAttributePairType (void)
2880 : : {
2881 : 180 : NameKey_Name q;
2882 : 180 : NameKey_Name n;
2883 : :
2884 : 180 : M2Quads_PopT (&n);
2885 : 180 : M2Quads_PopT (&q);
2886 : 180 : M2Quads_PushT (q);
2887 : 180 : M2Quads_PushT (n);
2888 : 180 : if ((((((((n == (NameKey_MakeKey ((const char *) "IEC559", 6))) || (n == (NameKey_MakeKey ((const char *) "LIA1", 4)))) || (n == (NameKey_MakeKey ((const char *) "IEEE", 4)))) || (n == (NameKey_MakeKey ((const char *) "ISO", 3)))) || (n == (NameKey_MakeKey ((const char *) "rounds", 6)))) || (n == (NameKey_MakeKey ((const char *) "gUnderflow", 10)))) || (n == (NameKey_MakeKey ((const char *) "exception", 9)))) || (n == (NameKey_MakeKey ((const char *) "extend", 6))))
2889 : : {
2890 : 96 : InitBooleanType (SymbolTable_NulSym);
2891 : : }
2892 : 84 : else if (((((n == (NameKey_MakeKey ((const char *) "radix", 5))) || (n == (NameKey_MakeKey ((const char *) "places", 6)))) || (n == (NameKey_MakeKey ((const char *) "expoMin", 7)))) || (n == (NameKey_MakeKey ((const char *) "expoMax", 7)))) || (n == (NameKey_MakeKey ((const char *) "nModes", 6))))
2893 : : {
2894 : : /* avoid dangling else. */
2895 : 60 : InitZType (SymbolTable_NulSym);
2896 : : }
2897 : 24 : else if ((n == (NameKey_MakeKey ((const char *) "large", 5))) || (n == (NameKey_MakeKey ((const char *) "small", 5))))
2898 : : {
2899 : : /* avoid dangling else. */
2900 : 24 : InitRType (SymbolTable_NulSym);
2901 : : }
2902 : : else
2903 : : {
2904 : : /* avoid dangling else. */
2905 : 0 : M2Error_WriteFormat1 ((const char *) "unknown constant attribute value '%a'", 37, (const unsigned char *) &n, (sizeof (n)-1));
2906 : 0 : InitUnknown (SymbolTable_NulSym);
2907 : : }
2908 : 180 : }
2909 : :
2910 : :
2911 : : /*
2912 : : PushConstructorCastType -
2913 : : */
2914 : :
2915 : 20474 : extern "C" void PCSymBuild_PushConstructorCastType (void)
2916 : : {
2917 : 20474 : if (inDesignator)
2918 : : {
2919 : 3566 : InitConvert (M2Const_cast, M2Quads_OperandT (1), NULL, NULL);
2920 : : }
2921 : 20474 : }
2922 : :
2923 : :
2924 : : /*
2925 : : PushInConstructor -
2926 : : */
2927 : :
2928 : 20474 : extern "C" void PCSymBuild_PushInConstructor (void)
2929 : : {
2930 : 20474 : M2StackWord_PushWord (desStack, static_cast<unsigned int> (inDesignator));
2931 : 20474 : inDesignator = false;
2932 : 20474 : }
2933 : :
2934 : :
2935 : : /*
2936 : : PopInConstructor -
2937 : : */
2938 : :
2939 : 20474 : extern "C" void PCSymBuild_PopInConstructor (void)
2940 : : {
2941 : 20474 : inDesignator = static_cast<bool> (M2StackWord_PopWord (desStack));
2942 : 20474 : }
2943 : :
2944 : :
2945 : : /*
2946 : : ResolveConstTypes - resolves the types of all designator declared constants.
2947 : : */
2948 : :
2949 : 16710 : extern "C" void PCSymBuild_ResolveConstTypes (void)
2950 : : {
2951 : 16710 : if (Debugging)
2952 : : {
2953 : : StrIO_WriteString ((const char *) "initially", 9);
2954 : : StrIO_WriteLn ();
2955 : : DebugNodes ();
2956 : : }
2957 : 47474 : while (WalkConsts ())
2958 : : {
2959 : : if (Debugging)
2960 : : {
2961 : : StrIO_WriteString ((const char *) "iteration", 9);
2962 : : StrIO_WriteLn ();
2963 : : DebugNodes ();
2964 : : }
2965 : : }
2966 : 16710 : if (Debugging)
2967 : : {
2968 : : StrIO_WriteString ((const char *) "finally", 7);
2969 : : StrIO_WriteLn ();
2970 : : DebugNodes ();
2971 : : }
2972 : 16710 : CheckConsts ();
2973 : 16710 : }
2974 : :
2975 : 16817 : extern "C" void _M2_PCSymBuild_init (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[])
2976 : : {
2977 : 16817 : Init ();
2978 : 16817 : }
2979 : :
2980 : 0 : extern "C" void _M2_PCSymBuild_fini (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[])
2981 : : {
2982 : 0 : }
|