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