Branch data Line data Source code
1 : : /* do not edit automatically generated by mc from M2SymInit. */
2 : : /* M2SymInit.mod records initialization state for variables.
3 : :
4 : : Copyright (C) 2001-2025 Free Software Foundation, Inc.
5 : : Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
6 : :
7 : : This file is part of GNU Modula-2.
8 : :
9 : : GNU Modula-2 is free software; you can redistribute it and/or modify
10 : : it under the terms of the GNU General Public License as published by
11 : : the Free Software Foundation; either version 3, or (at your option)
12 : : any later version.
13 : :
14 : : GNU Modula-2 is distributed in the hope that it will be useful, but
15 : : WITHOUT ANY WARRANTY; without even the implied warranty of
16 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 : : General Public License for more details.
18 : :
19 : : You should have received a copy of the GNU General Public License
20 : : along with GNU Modula-2; see the file COPYING3. If not see
21 : : <http://www.gnu.org/licenses/>. */
22 : :
23 : : #define INCLUDE_MEMORY
24 : : #include "config.h"
25 : : #include "system.h"
26 : : #include "gcc-consolidation.h"
27 : :
28 : : #include <stdbool.h>
29 : : # if !defined (PROC_D)
30 : : # define PROC_D
31 : : typedef void (*PROC_t) (void);
32 : : typedef struct { PROC_t proc; } PROC;
33 : : # endif
34 : :
35 : : # if !defined (TRUE)
36 : : # define TRUE (1==1)
37 : : # endif
38 : :
39 : : # if !defined (FALSE)
40 : : # define FALSE (1==0)
41 : : # endif
42 : :
43 : : # include "GStorage.h"
44 : : # include "Gmcrts.h"
45 : : #if defined(__cplusplus)
46 : : # undef NULL
47 : : # define NULL 0
48 : : #endif
49 : : #define _M2SymInit_C
50 : :
51 : : #include "GM2SymInit.h"
52 : : # include "GStorage.h"
53 : : # include "GM2Debug.h"
54 : : # include "GM2Printf.h"
55 : : # include "Glibc.h"
56 : : # include "GNameKey.h"
57 : : # include "GM2Base.h"
58 : : # include "GM2Options.h"
59 : : # include "GM2MetaError.h"
60 : : # include "GM2LexBuf.h"
61 : : # include "GDynamicStrings.h"
62 : : # include "GM2Error.h"
63 : : # include "GM2BasicBlock.h"
64 : : # include "GIndexing.h"
65 : : # include "GLists.h"
66 : : # include "GSymbolTable.h"
67 : : # include "GM2Quads.h"
68 : : # include "GM2GCCDeclare.h"
69 : :
70 : : # define Debugging false
71 : : typedef struct M2SymInit_recordDesc_r M2SymInit_recordDesc;
72 : :
73 : : typedef struct M2SymInit__T1_r M2SymInit__T1;
74 : :
75 : : typedef struct M2SymInit__T2_r M2SymInit__T2;
76 : :
77 : : typedef M2SymInit__T2 *M2SymInit_symAlias;
78 : :
79 : : typedef struct M2SymInit__T3_r M2SymInit__T3;
80 : :
81 : : typedef M2SymInit__T3 *M2SymInit_bbEntry;
82 : :
83 : : typedef enum {M2SymInit_scalar, M2SymInit_record} M2SymInit_descType;
84 : :
85 : : typedef M2SymInit__T1 *M2SymInit_InitDesc__opaque;
86 : :
87 : : struct M2SymInit_recordDesc_r {
88 : : Indexing_Index fieldDesc;
89 : : };
90 : :
91 : : struct M2SymInit__T2_r {
92 : : unsigned int keySym;
93 : : unsigned int alias;
94 : : M2SymInit_symAlias next;
95 : : };
96 : :
97 : : struct M2SymInit__T3_r {
98 : : unsigned int start;
99 : : unsigned int end;
100 : : bool first;
101 : : bool endCall;
102 : : bool endGoto;
103 : : bool endCond;
104 : : bool topOfLoop;
105 : : unsigned int trashQuad;
106 : : unsigned int indexBB;
107 : : unsigned int nextQuad;
108 : : unsigned int condQuad;
109 : : unsigned int nextBB;
110 : : unsigned int condBB;
111 : : M2SymInit_bbEntry next;
112 : : };
113 : :
114 : : struct M2SymInit__T1_r {
115 : : unsigned int sym;
116 : : unsigned int type;
117 : : bool initialized;
118 : : M2SymInit_descType kind; /* case tag */
119 : : union {
120 : : M2SymInit_recordDesc rec;
121 : : };
122 : : };
123 : :
124 : : static Indexing_Index IndirectArray;
125 : : static Indexing_Index LArray;
126 : : static M2SymInit_symAlias freeList;
127 : : static Indexing_Index bbArray;
128 : : static M2SymInit_bbEntry bbFreeList;
129 : : static Lists_List ignoreList;
130 : : static Lists_List errorList;
131 : :
132 : : /*
133 : : PrintSymInit -
134 : : */
135 : :
136 : : extern "C" M2SymInit_InitDesc M2SymInit_InitSymInit (void);
137 : :
138 : : /*
139 : : PrintSymInit -
140 : : */
141 : :
142 : : extern "C" void M2SymInit_KillSymInit (M2SymInit_InitDesc *desc);
143 : :
144 : : /*
145 : : PrintSymInit -
146 : : */
147 : :
148 : : extern "C" void M2SymInit_ConfigSymInit (M2SymInit_InitDesc desc, unsigned int sym);
149 : :
150 : : /*
151 : : PopulateFields -
152 : : */
153 : :
154 : : extern "C" void M2SymInit_SetInitialized (M2SymInit_InitDesc desc);
155 : :
156 : : /*
157 : : PopulateFields -
158 : : */
159 : :
160 : : extern "C" bool M2SymInit_GetInitialized (M2SymInit_InitDesc desc);
161 : :
162 : : /*
163 : : PopulateFields -
164 : : */
165 : :
166 : : extern "C" M2SymInit_InitDesc M2SymInit_GetFieldDesc (M2SymInit_InitDesc desc, unsigned int field);
167 : :
168 : : /*
169 : : PopulateFields -
170 : : */
171 : :
172 : : extern "C" bool M2SymInit_SetFieldInitialized (M2SymInit_InitDesc desc, Lists_List fieldlist);
173 : :
174 : : /*
175 : : SetFieldInitializedNo -
176 : : */
177 : :
178 : : extern "C" bool M2SymInit_GetFieldInitialized (M2SymInit_InitDesc desc, Lists_List fieldlist);
179 : :
180 : : /*
181 : : ScopeBlockVariableAnalysis - checks to see whether a variable is
182 : : read before it has been initialized.
183 : : */
184 : :
185 : : extern "C" void M2SymInit_ScopeBlockVariableAnalysis (unsigned int Scope, unsigned int Start, unsigned int End);
186 : :
187 : : /*
188 : : PrintSymInit -
189 : : */
190 : :
191 : : extern "C" void M2SymInit_PrintSymInit (M2SymInit_InitDesc desc);
192 : :
193 : : /*
194 : : KillFieldDesc -
195 : : */
196 : :
197 : : static void KillFieldDesc (Indexing_Index *fielddesc);
198 : :
199 : : /*
200 : : PopulateFields -
201 : : */
202 : :
203 : : static void PopulateFields (M2SymInit_InitDesc__opaque desc, unsigned int recsym);
204 : :
205 : : /*
206 : : TrySetInitialized -
207 : : */
208 : :
209 : : static void TrySetInitialized (M2SymInit_InitDesc__opaque desc);
210 : :
211 : : /*
212 : : SetFieldInitializedNo -
213 : : */
214 : :
215 : : static bool SetFieldInitializedNo (M2SymInit_InitDesc__opaque desc, Lists_List fieldlist, unsigned int level);
216 : :
217 : : /*
218 : : SetFieldInitializedNo -
219 : : */
220 : :
221 : : static bool GetFieldInitializedNo (M2SymInit_InitDesc__opaque desc, Lists_List fieldlist, unsigned int level);
222 : :
223 : : /*
224 : : IsGlobalVar -
225 : : */
226 : :
227 : : static bool IsGlobalVar (unsigned int sym);
228 : :
229 : : /*
230 : : RecordFieldContainsVarient -
231 : : */
232 : :
233 : : static bool RecordFieldContainsVarient (unsigned int sym, Lists_List visited);
234 : :
235 : : /*
236 : : RecordContainsVarient -
237 : : */
238 : :
239 : : static bool RecordContainsVarient (unsigned int sym, Lists_List visited);
240 : :
241 : : /*
242 : : VarContainsVarient -
243 : : */
244 : :
245 : : static bool VarContainsVarient (unsigned int sym, Lists_List visited);
246 : :
247 : : /*
248 : : TypeContainsVarient -
249 : : */
250 : :
251 : : static bool TypeContainsVarient (unsigned int sym, Lists_List visited);
252 : :
253 : : /*
254 : : ArrayContainsVarient -
255 : : */
256 : :
257 : : static bool ArrayContainsVarient (unsigned int sym, Lists_List visited);
258 : :
259 : : /*
260 : : PointerContainsVarient -
261 : : */
262 : :
263 : : static bool PointerContainsVarient (unsigned int sym, Lists_List visited);
264 : :
265 : : /*
266 : : doContainsVariant -
267 : : */
268 : :
269 : : static bool doContainsVariant (unsigned int sym, Lists_List visited);
270 : :
271 : : /*
272 : : ContainsVariant - returns TRUE if type sym contains a variant record.
273 : : */
274 : :
275 : : static bool ContainsVariant (unsigned int sym);
276 : :
277 : : /*
278 : : IssueConditional -
279 : : */
280 : :
281 : : static void IssueConditional (unsigned int quad, bool conditional);
282 : :
283 : : /*
284 : : GenerateNoteFlow -
285 : : */
286 : :
287 : : static void GenerateNoteFlow (unsigned int n, bool warning);
288 : :
289 : : /*
290 : : IssueWarning - issue a warning or note at tok location.
291 : : */
292 : :
293 : : static void IssueWarning (unsigned int tok, const char *before_, unsigned int _before_high, const char *after_, unsigned int _after_high, unsigned int sym, bool warning);
294 : :
295 : : /*
296 : : IsUniqueWarning - return TRUE if a warning has not been issued at tok.
297 : : It remembers tok and subsequent calls will always return FALSE.
298 : : */
299 : :
300 : : static bool IsUniqueWarning (unsigned int tok);
301 : :
302 : : /*
303 : : CheckDeferredRecordAccess -
304 : : */
305 : :
306 : : static void CheckDeferredRecordAccess (unsigned int tok, unsigned int sym, bool canDereference, bool warning, unsigned int i);
307 : :
308 : : /*
309 : : SetVarUninitialized - resets variable init state.
310 : : */
311 : :
312 : : static void SetVarUninitialized (unsigned int sym);
313 : :
314 : : /*
315 : : ComponentFindVar -
316 : : */
317 : :
318 : : static unsigned int ComponentFindVar (unsigned int sym, bool *lvalue, unsigned int tok);
319 : :
320 : : /*
321 : : ComponentCreateFieldList - builds a list of fields accessed by the component var.
322 : : Each item in the list will be a field of incremental levels
323 : : though a nested record. It is not a list of fields
324 : : at the same level.
325 : :
326 : : foo = RECORD
327 : : v: RECORD
328 : : x, y: CARDINAL ;
329 : : END ;
330 : : w: CARDINAL ;
331 : : END ;
332 : :
333 : : { v, x } for example and not { v, w }
334 : : */
335 : :
336 : : static Lists_List ComponentCreateFieldList (unsigned int sym);
337 : :
338 : : /*
339 : : ComponentCreateFieldList - builds a list of fields accessed by the component var.
340 : : Each item in the list will be a field of incremental levels
341 : : though a nested record. It is not a list of fields
342 : : at the same level.
343 : :
344 : : foo = RECORD
345 : : v: RECORD
346 : : x, y: CARDINAL ;
347 : : END ;
348 : : w: CARDINAL ;
349 : : END ;
350 : :
351 : : { v, x } for example and not { v, w }
352 : : */
353 : :
354 : : static void ComponentBuildFieldList (Lists_List lst, unsigned int sym);
355 : :
356 : : /*
357 : : deRefComponent -
358 : : */
359 : :
360 : : static unsigned int deRefComponent (unsigned int component, bool lvalue, unsigned int sym, unsigned int tok);
361 : :
362 : : /*
363 : : SetVarComponentInitialized -
364 : : */
365 : :
366 : : static void SetVarComponentInitialized (unsigned int sym, unsigned int tok);
367 : :
368 : : /*
369 : : GetVarComponentInitialized -
370 : : */
371 : :
372 : : static bool GetVarComponentInitialized (unsigned int sym, unsigned int tok);
373 : :
374 : : /*
375 : : Trace -
376 : : */
377 : :
378 : : static void Trace (const char *message_, unsigned int _message_high, unsigned int sym);
379 : :
380 : : /*
381 : : SetVarInitialized - if the variable has a left mode and can be dereferenced
382 : : then set the left and right initialization state.
383 : : */
384 : :
385 : : static void SetVarInitialized (unsigned int sym, bool canDereference, unsigned int tok);
386 : :
387 : : /*
388 : : doGetVarInitialized -
389 : : */
390 : :
391 : : static bool doGetVarInitialized (unsigned int sym, unsigned int tok);
392 : :
393 : : /*
394 : : GetVarInitialized -
395 : : */
396 : :
397 : : static bool GetVarInitialized (unsigned int sym, unsigned int tok);
398 : :
399 : : /*
400 : : IsExempt - returns TRUE if sym is a global variable or a parameter or
401 : : a variable with a variant record type.
402 : : */
403 : :
404 : : static bool IsExempt (unsigned int sym);
405 : :
406 : : /*
407 : : CheckBinary -
408 : : */
409 : :
410 : : static void CheckBinary (unsigned int op1tok, unsigned int op1, unsigned int op2tok, unsigned int op2, unsigned int op3tok, unsigned int op3, bool warning, unsigned int i);
411 : :
412 : : /*
413 : : CheckUnary -
414 : : */
415 : :
416 : : static void CheckUnary (unsigned int lhstok, unsigned int lhs, unsigned int rhstok, unsigned int rhs, bool warning, unsigned int i);
417 : :
418 : : /*
419 : : CheckXIndr -
420 : : */
421 : :
422 : : static void CheckXIndr (unsigned int lhstok, unsigned int lhs, unsigned int type, unsigned int rhstok, unsigned int rhs, bool warning, unsigned int i);
423 : :
424 : : /*
425 : : CheckIndrX -
426 : : */
427 : :
428 : : static void CheckIndrX (unsigned int lhstok, unsigned int lhs, unsigned int rhstok, unsigned int rhs, bool warning, unsigned int i);
429 : :
430 : : /*
431 : : CheckRecordField -
432 : : */
433 : :
434 : : static void CheckRecordField (unsigned int op1);
435 : :
436 : : /*
437 : : CheckLastForIterator -
438 : : */
439 : :
440 : : static void CheckLastForIterator (unsigned int op1tok, unsigned int op1, unsigned int op2tok, unsigned int op2, bool warning, unsigned int i);
441 : :
442 : : /*
443 : : CheckBecomes -
444 : : */
445 : :
446 : : static void CheckBecomes (unsigned int destok, unsigned int des, unsigned int exprtok, unsigned int expr, bool warning, unsigned int i);
447 : :
448 : : /*
449 : : CheckComparison -
450 : : */
451 : :
452 : : static void CheckComparison (unsigned int op1tok, unsigned int op1, unsigned int op2tok, unsigned int op2, bool warning, unsigned int i);
453 : :
454 : : /*
455 : : CheckAddr -
456 : : */
457 : :
458 : : static void CheckAddr (unsigned int ptrtok, unsigned int ptr, unsigned int contenttok, unsigned int content);
459 : :
460 : : /*
461 : : DefaultTokPos -
462 : : */
463 : :
464 : : static unsigned int DefaultTokPos (unsigned int preferredPos, unsigned int defaultPos);
465 : :
466 : : /*
467 : : stop -
468 : : */
469 : :
470 : : static void stop (void);
471 : :
472 : : /*
473 : : CheckReadBeforeInitQuad -
474 : : */
475 : :
476 : : static bool CheckReadBeforeInitQuad (unsigned int procSym, unsigned int quad, bool warning, unsigned int i);
477 : :
478 : : /*
479 : : SetParameterVariablesInitialized - sets all shadow variables for parameters as
480 : : initialized.
481 : : */
482 : :
483 : : static void SetParameterVariablesInitialized (unsigned int procSym);
484 : :
485 : : /*
486 : : FilterCheckReadBeforeInitQuad -
487 : : */
488 : :
489 : : static bool FilterCheckReadBeforeInitQuad (unsigned int procSym, unsigned int start, bool warning, unsigned int i);
490 : :
491 : : /*
492 : : CheckReadBeforeInitFirstBasicBlock -
493 : : */
494 : :
495 : : static void CheckReadBeforeInitFirstBasicBlock (unsigned int procSym, unsigned int start, unsigned int end, bool warning, unsigned int i);
496 : :
497 : : /*
498 : : bbArrayKill -
499 : : */
500 : :
501 : : static void bbArrayKill (void);
502 : :
503 : : /*
504 : : DumpBBEntry -
505 : : */
506 : :
507 : : static void DumpBBEntry (M2SymInit_bbEntry bbPtr, unsigned int procSym);
508 : :
509 : : /*
510 : : DumpBBArray -
511 : : */
512 : :
513 : : static void DumpBBArray (unsigned int procSym);
514 : :
515 : : /*
516 : : DumpBBSequence -
517 : : */
518 : :
519 : : static void DumpBBSequence (Lists_List lst);
520 : :
521 : : /*
522 : : trashParam -
523 : : */
524 : :
525 : : static void trashParam (unsigned int trashQuad);
526 : :
527 : : /*
528 : : SetVarLRInitialized - this sets up an alias between the parameter
529 : : value and the pointer for the case:
530 : :
531 : : procedure foo (var shadow: PtrToType) ;
532 : :
533 : : which allows shadow to be statically analyzed
534 : : once it is re-assigned.
535 : : */
536 : :
537 : : static void SetVarLRInitialized (unsigned int param);
538 : :
539 : : /*
540 : : TestBBSequence -
541 : : */
542 : :
543 : : static void TestBBSequence (unsigned int procSym, Lists_List lst);
544 : :
545 : : /*
546 : : CreateBBPermultations -
547 : : */
548 : :
549 : : static void CreateBBPermultations (unsigned int procSym, unsigned int i, Lists_List lst);
550 : :
551 : : /*
552 : : GetOp3 -
553 : : */
554 : :
555 : : static unsigned int GetOp3 (unsigned int quad);
556 : :
557 : : /*
558 : : getBBindex - return the basic block index which starts with quad.
559 : : */
560 : :
561 : : static unsigned int getBBindex (unsigned int quad);
562 : :
563 : : /*
564 : : GenerateCFG -
565 : : */
566 : :
567 : : static void GenerateCFG (void);
568 : :
569 : : /*
570 : : NewEntry -
571 : : */
572 : :
573 : : static M2SymInit_bbEntry NewEntry (void);
574 : :
575 : : /*
576 : : IsAllocate - return TRUE is sym is ALLOCATE.
577 : : */
578 : :
579 : : static bool IsAllocate (unsigned int sym);
580 : :
581 : : /*
582 : : IsDeallocate - return TRUE is sym is DEALLOCATE.
583 : : */
584 : :
585 : : static bool IsDeallocate (unsigned int sym);
586 : :
587 : : /*
588 : : DetectTrash -
589 : : */
590 : :
591 : : static void DetectTrash (M2SymInit_bbEntry bbPtr);
592 : :
593 : : /*
594 : : AppendEntry -
595 : : */
596 : :
597 : : static void AppendEntry (M2BasicBlock_BasicBlock bb);
598 : :
599 : : /*
600 : : DumpAlias -
601 : : */
602 : :
603 : : static void DumpAlias (Indexing_Index array, unsigned int aliasIndex);
604 : :
605 : : /*
606 : : doDumpAliases -
607 : : */
608 : :
609 : : static void doDumpAliases (Indexing_Index array);
610 : :
611 : : /*
612 : : DumpAliases -
613 : : */
614 : :
615 : : static void DumpAliases (void);
616 : :
617 : : /*
618 : : newAlias -
619 : : */
620 : :
621 : : static M2SymInit_symAlias newAlias (void);
622 : :
623 : : /*
624 : : initAlias -
625 : : */
626 : :
627 : : static M2SymInit_symAlias initAlias (unsigned int sym);
628 : :
629 : : /*
630 : : killAlias -
631 : : */
632 : :
633 : : static void killAlias (M2SymInit_symAlias sa);
634 : :
635 : : /*
636 : : initBlock -
637 : : */
638 : :
639 : : static void initBlock (void);
640 : :
641 : : /*
642 : : killBlock -
643 : : */
644 : :
645 : : static void killBlock (void);
646 : :
647 : : /*
648 : : killBlock -
649 : : */
650 : :
651 : : static void doKillBlock (Indexing_Index *array);
652 : :
653 : : /*
654 : : addAlias -
655 : : */
656 : :
657 : : static void addAlias (Indexing_Index array, unsigned int sym, unsigned int aliased);
658 : :
659 : : /*
660 : : lookupAlias -
661 : : */
662 : :
663 : : static M2SymInit_symAlias lookupAlias (Indexing_Index array, unsigned int sym);
664 : :
665 : : /*
666 : : doGetAlias -
667 : : */
668 : :
669 : : static unsigned int doGetAlias (Indexing_Index array, unsigned int sym);
670 : :
671 : : /*
672 : : getLAlias - attempts to looks up an alias which is not a temporary variable.
673 : : */
674 : :
675 : : static unsigned int getLAlias (unsigned int sym);
676 : :
677 : : /*
678 : : SetupLAlias -
679 : : */
680 : :
681 : : static void SetupLAlias (unsigned int des, unsigned int exp);
682 : :
683 : : /*
684 : : SetupIndr -
685 : : */
686 : :
687 : : static void SetupIndr (unsigned int ptr, unsigned int content);
688 : :
689 : : /*
690 : : getContent - attempts to return the content pointed to by ptr.
691 : : sym is the original symbol and ptr will be the equivalent lvalue.
692 : : */
693 : :
694 : : static unsigned int getContent (unsigned int ptr, unsigned int sym, unsigned int tok);
695 : :
696 : : /*
697 : : init -
698 : : */
699 : :
700 : : static void init (void);
701 : :
702 : :
703 : : /*
704 : : KillFieldDesc -
705 : : */
706 : :
707 : 0 : static void KillFieldDesc (Indexing_Index *fielddesc)
708 : : {
709 : 0 : unsigned int i;
710 : 0 : unsigned int h;
711 : 0 : M2SymInit_InitDesc__opaque id;
712 : :
713 : 0 : i = 1;
714 : 0 : h = Indexing_HighIndice ((*fielddesc));
715 : 0 : while (i <= h)
716 : : {
717 : 0 : id = static_cast<M2SymInit_InitDesc__opaque> (Indexing_GetIndice ((*fielddesc), i));
718 : 0 : M2SymInit_KillSymInit (reinterpret_cast<M2SymInit_InitDesc *> (&id));
719 : 0 : i += 1;
720 : : }
721 : 0 : (*fielddesc) = Indexing_KillIndex ((*fielddesc));
722 : 0 : }
723 : :
724 : :
725 : : /*
726 : : PopulateFields -
727 : : */
728 : :
729 : 68824 : static void PopulateFields (M2SymInit_InitDesc__opaque desc, unsigned int recsym)
730 : : {
731 : 68824 : unsigned int field;
732 : 68824 : unsigned int i;
733 : 68824 : M2SymInit_InitDesc__opaque fdesc;
734 : :
735 : 68824 : M2Debug_Assert (SymbolTable_IsRecord (recsym));
736 : 68824 : i = 1;
737 : 332252 : do {
738 : 332252 : field = SymbolTable_GetNth (recsym, i);
739 : 332252 : if (field != SymbolTable_NulSym)
740 : : {
741 : 263428 : fdesc = static_cast<M2SymInit_InitDesc__opaque> (M2SymInit_InitSymInit ());
742 : 263428 : M2SymInit_ConfigSymInit (static_cast<M2SymInit_InitDesc> (fdesc), field);
743 : 263428 : Indexing_IncludeIndiceIntoIndex (desc->rec.fieldDesc, reinterpret_cast <void *> (fdesc));
744 : 263428 : i += 1;
745 : : }
746 : 332252 : } while (! (field == SymbolTable_NulSym));
747 : 68824 : }
748 : :
749 : :
750 : : /*
751 : : TrySetInitialized -
752 : : */
753 : :
754 : 936 : static void TrySetInitialized (M2SymInit_InitDesc__opaque desc)
755 : : {
756 : 936 : unsigned int i;
757 : 936 : unsigned int h;
758 : 936 : M2SymInit_InitDesc__opaque fdesc;
759 : :
760 : 936 : h = Indexing_HighIndice (desc->rec.fieldDesc);
761 : 936 : i = 1;
762 : 2712 : while (i <= h)
763 : : {
764 : 1692 : fdesc = static_cast<M2SymInit_InitDesc__opaque> (Indexing_GetIndice (desc->rec.fieldDesc, i));
765 : 1692 : if (! fdesc->initialized)
766 : : {
767 : : return;
768 : : }
769 : 840 : i += 1;
770 : : }
771 : 84 : desc->initialized = true;
772 : : }
773 : :
774 : :
775 : : /*
776 : : SetFieldInitializedNo -
777 : : */
778 : :
779 : 900 : static bool SetFieldInitializedNo (M2SymInit_InitDesc__opaque desc, Lists_List fieldlist, unsigned int level)
780 : : {
781 : 900 : unsigned int nsym;
782 : 900 : M2SymInit_InitDesc__opaque fdesc;
783 : :
784 : 900 : if (level > (Lists_NoOfItemsInList (fieldlist)))
785 : : {
786 : : return false;
787 : : }
788 : : else
789 : : {
790 : 900 : nsym = static_cast<unsigned int> (Lists_GetItemFromList (fieldlist, level));
791 : 900 : fdesc = static_cast<M2SymInit_InitDesc__opaque> (M2SymInit_GetFieldDesc (static_cast<M2SymInit_InitDesc> (desc), nsym));
792 : 900 : if (fdesc == NULL)
793 : : {
794 : : return false;
795 : : }
796 : 828 : else if (level == (Lists_NoOfItemsInList (fieldlist)))
797 : : {
798 : : /* avoid dangling else. */
799 : 612 : M2SymInit_SetInitialized (static_cast<M2SymInit_InitDesc> (fdesc));
800 : 612 : TrySetInitialized (desc);
801 : 612 : return desc->initialized;
802 : : }
803 : : else
804 : : {
805 : : /* avoid dangling else. */
806 : 216 : if (SetFieldInitializedNo (fdesc, fieldlist, level+1))
807 : : {} /* empty. */
808 : 216 : TrySetInitialized (desc);
809 : 216 : return desc->initialized;
810 : : }
811 : : }
812 : : /* static analysis guarentees a RETURN statement will be used before here. */
813 : : __builtin_unreachable ();
814 : : }
815 : :
816 : :
817 : : /*
818 : : SetFieldInitializedNo -
819 : : */
820 : :
821 : 204 : static bool GetFieldInitializedNo (M2SymInit_InitDesc__opaque desc, Lists_List fieldlist, unsigned int level)
822 : : {
823 : 372 : unsigned int nsym;
824 : 372 : M2SymInit_InitDesc__opaque fdesc;
825 : :
826 : 372 : if (desc->initialized)
827 : : {
828 : : return true;
829 : : }
830 : 324 : else if (level > (Lists_NoOfItemsInList (fieldlist)))
831 : : {
832 : : /* avoid dangling else. */
833 : : return false;
834 : : }
835 : : else
836 : : {
837 : : /* avoid dangling else. */
838 : 180 : nsym = static_cast<unsigned int> (Lists_GetItemFromList (fieldlist, level));
839 : 180 : fdesc = static_cast<M2SymInit_InitDesc__opaque> (M2SymInit_GetFieldDesc (static_cast<M2SymInit_InitDesc> (desc), nsym));
840 : 180 : if (fdesc == NULL)
841 : : {
842 : : /* The pointer variable maybe uninitialized and hence we cannot
843 : : find the record variable. */
844 : : return false;
845 : : }
846 : 180 : else if (fdesc->initialized)
847 : : {
848 : : /* avoid dangling else. */
849 : : return true;
850 : : }
851 : : else
852 : : {
853 : : /* avoid dangling else. */
854 : 168 : return GetFieldInitializedNo (fdesc, fieldlist, level+1);
855 : : }
856 : : }
857 : : /* static analysis guarentees a RETURN statement will be used before here. */
858 : : __builtin_unreachable ();
859 : : }
860 : :
861 : :
862 : : /*
863 : : IsGlobalVar -
864 : : */
865 : :
866 : 3610 : static bool IsGlobalVar (unsigned int sym)
867 : : {
868 : 3610 : return (SymbolTable_IsVar (sym)) && (! (SymbolTable_IsProcedure (SymbolTable_GetVarScope (sym))));
869 : : /* static analysis guarentees a RETURN statement will be used before here. */
870 : : __builtin_unreachable ();
871 : : }
872 : :
873 : :
874 : : /*
875 : : RecordFieldContainsVarient -
876 : : */
877 : :
878 : 2052 : static bool RecordFieldContainsVarient (unsigned int sym, Lists_List visited)
879 : : {
880 : 2052 : M2Debug_Assert (SymbolTable_IsRecordField (sym));
881 : 2052 : if (doContainsVariant (SymbolTable_GetSType (sym), visited))
882 : : {
883 : : return true;
884 : : }
885 : 2052 : return (SymbolTable_GetVarient (sym)) != SymbolTable_NulSym;
886 : : /* static analysis guarentees a RETURN statement will be used before here. */
887 : : __builtin_unreachable ();
888 : : }
889 : :
890 : :
891 : : /*
892 : : RecordContainsVarient -
893 : : */
894 : :
895 : 972 : static bool RecordContainsVarient (unsigned int sym, Lists_List visited)
896 : : {
897 : 972 : unsigned int i;
898 : 972 : unsigned int fieldsym;
899 : :
900 : 972 : M2Debug_Assert (SymbolTable_IsRecord (sym));
901 : 972 : i = 1;
902 : 3024 : do {
903 : 3024 : fieldsym = SymbolTable_GetNth (sym, i);
904 : 3024 : if (fieldsym != SymbolTable_NulSym)
905 : : {
906 : 2052 : if (SymbolTable_IsRecordField (fieldsym))
907 : : {
908 : : /* avoid dangling else. */
909 : 2052 : if (RecordFieldContainsVarient (fieldsym, visited))
910 : : {
911 : : return true;
912 : : }
913 : : }
914 : 0 : else if (SymbolTable_IsVarient (fieldsym))
915 : : {
916 : : /* avoid dangling else. */
917 : : return true;
918 : : }
919 : 2052 : i += 1;
920 : : }
921 : 3024 : } while (! (fieldsym == SymbolTable_NulSym));
922 : : return false;
923 : : /* static analysis guarentees a RETURN statement will be used before here. */
924 : : __builtin_unreachable ();
925 : : }
926 : :
927 : :
928 : : /*
929 : : VarContainsVarient -
930 : : */
931 : :
932 : 3406 : static bool VarContainsVarient (unsigned int sym, Lists_List visited)
933 : : {
934 : 3406 : M2Debug_Assert (SymbolTable_IsVar (sym));
935 : 3406 : return doContainsVariant (SymbolTable_GetSType (sym), visited);
936 : : /* static analysis guarentees a RETURN statement will be used before here. */
937 : : __builtin_unreachable ();
938 : : }
939 : :
940 : :
941 : : /*
942 : : TypeContainsVarient -
943 : : */
944 : :
945 : 3406 : static bool TypeContainsVarient (unsigned int sym, Lists_List visited)
946 : : {
947 : 3406 : M2Debug_Assert (SymbolTable_IsType (sym));
948 : 3406 : return doContainsVariant (SymbolTable_GetSType (sym), visited);
949 : : /* static analysis guarentees a RETURN statement will be used before here. */
950 : : __builtin_unreachable ();
951 : : }
952 : :
953 : :
954 : : /*
955 : : ArrayContainsVarient -
956 : : */
957 : :
958 : 12 : static bool ArrayContainsVarient (unsigned int sym, Lists_List visited)
959 : : {
960 : 12 : M2Debug_Assert (SymbolTable_IsArray (sym));
961 : 12 : return doContainsVariant (SymbolTable_GetSType (sym), visited);
962 : : /* static analysis guarentees a RETURN statement will be used before here. */
963 : : __builtin_unreachable ();
964 : : }
965 : :
966 : :
967 : : /*
968 : : PointerContainsVarient -
969 : : */
970 : :
971 : 2488 : static bool PointerContainsVarient (unsigned int sym, Lists_List visited)
972 : : {
973 : 2488 : M2Debug_Assert (SymbolTable_IsPointer (sym));
974 : 2488 : return doContainsVariant (SymbolTable_GetSType (sym), visited);
975 : : /* static analysis guarentees a RETURN statement will be used before here. */
976 : : __builtin_unreachable ();
977 : : }
978 : :
979 : :
980 : : /*
981 : : doContainsVariant -
982 : : */
983 : :
984 : 14770 : static bool doContainsVariant (unsigned int sym, Lists_List visited)
985 : : {
986 : 14770 : if ((sym != SymbolTable_NulSym) && (! (Lists_IsItemInList (visited, sym))))
987 : : {
988 : 10296 : Lists_IncludeItemIntoList (visited, sym);
989 : 10296 : if (SymbolTable_IsVar (sym))
990 : : {
991 : 3406 : return VarContainsVarient (sym, visited);
992 : : }
993 : 6890 : else if (SymbolTable_IsRecord (sym))
994 : : {
995 : : /* avoid dangling else. */
996 : 972 : return RecordContainsVarient (sym, visited);
997 : : }
998 : 5918 : else if (SymbolTable_IsPointer (sym))
999 : : {
1000 : : /* avoid dangling else. */
1001 : 2488 : return PointerContainsVarient (sym, visited);
1002 : : }
1003 : 3430 : else if (SymbolTable_IsArray (sym))
1004 : : {
1005 : : /* avoid dangling else. */
1006 : 12 : return ArrayContainsVarient (sym, visited);
1007 : : }
1008 : 3418 : else if (SymbolTable_IsType (sym))
1009 : : {
1010 : : /* avoid dangling else. */
1011 : 3406 : return TypeContainsVarient (sym, visited);
1012 : : }
1013 : : }
1014 : : return false;
1015 : : /* static analysis guarentees a RETURN statement will be used before here. */
1016 : : __builtin_unreachable ();
1017 : : }
1018 : :
1019 : :
1020 : : /*
1021 : : ContainsVariant - returns TRUE if type sym contains a variant record.
1022 : : */
1023 : :
1024 : 3406 : static bool ContainsVariant (unsigned int sym)
1025 : : {
1026 : 3406 : Lists_List visited;
1027 : 3406 : bool result;
1028 : :
1029 : 3406 : Lists_InitList (&visited);
1030 : 3406 : result = doContainsVariant (sym, visited);
1031 : 3406 : Lists_KillList (&visited);
1032 : 3406 : return result;
1033 : : /* static analysis guarentees a RETURN statement will be used before here. */
1034 : : __builtin_unreachable ();
1035 : : }
1036 : :
1037 : :
1038 : : /*
1039 : : IssueConditional -
1040 : : */
1041 : :
1042 : 9 : static void IssueConditional (unsigned int quad, bool conditional)
1043 : : {
1044 : 9 : M2Quads_QuadOperator op;
1045 : 9 : unsigned int op1;
1046 : 9 : unsigned int op2;
1047 : 9 : unsigned int op3;
1048 : 9 : unsigned int op1tok;
1049 : 9 : unsigned int op2tok;
1050 : 9 : unsigned int op3tok;
1051 : 9 : unsigned int qtok;
1052 : 9 : bool constExpr;
1053 : 9 : bool overflowChecking;
1054 : 9 : DynamicStrings_String s;
1055 : :
1056 : 9 : M2Quads_GetQuadOtok (quad, &qtok, &op, &op1, &op2, &op3, &overflowChecking, &constExpr, &op1tok, &op2tok, &op3tok);
1057 : 9 : if (IsUniqueWarning (qtok))
1058 : : {
1059 : 14 : op1tok = DefaultTokPos (op1tok, qtok);
1060 : 14 : op2tok = DefaultTokPos (op2tok, qtok);
1061 : 14 : op3tok = DefaultTokPos (op3tok, qtok);
1062 : 7 : if (! conditional)
1063 : : {
1064 : 7 : op = M2Quads_Opposite (op);
1065 : : }
1066 : 7 : s = DynamicStrings_InitString ((const char *) "depending upon the result of {%1Oad} ", 37);
1067 : 7 : s = DynamicStrings_ConCat (s, DynamicStrings_Mark (M2Quads_GetM2OperatorDesc (op)));
1068 : 7 : s = DynamicStrings_ConCat (s, DynamicStrings_InitString ((const char *) " {%2ad}", 7));
1069 : 7 : M2MetaError_MetaErrorStringT2 (qtok, s, op1, op2);
1070 : : }
1071 : 9 : }
1072 : :
1073 : :
1074 : : /*
1075 : : GenerateNoteFlow -
1076 : : */
1077 : :
1078 : 218 : static void GenerateNoteFlow (unsigned int n, bool warning)
1079 : : {
1080 : 218 : unsigned int i;
1081 : 218 : M2SymInit_bbEntry ip1Ptr;
1082 : 218 : M2SymInit_bbEntry iPtr;
1083 : :
1084 : 218 : if (! warning)
1085 : : {
1086 : : /* Only issue flow messages for non warnings. */
1087 : : i = 1;
1088 : 46 : while (i <= n)
1089 : : {
1090 : 38 : iPtr = static_cast<M2SymInit_bbEntry> (Indexing_GetIndice (bbArray, i));
1091 : 38 : if (iPtr->endCond)
1092 : : {
1093 : 11 : if (i < n)
1094 : : {
1095 : 9 : ip1Ptr = static_cast<M2SymInit_bbEntry> (Indexing_GetIndice (bbArray, i+1));
1096 : 9 : IssueConditional (iPtr->end, iPtr->condBB == ip1Ptr->indexBB);
1097 : : }
1098 : : }
1099 : 38 : i += 1;
1100 : : }
1101 : : }
1102 : 218 : }
1103 : :
1104 : :
1105 : : /*
1106 : : IssueWarning - issue a warning or note at tok location.
1107 : : */
1108 : :
1109 : 218 : static void IssueWarning (unsigned int tok, const char *before_, unsigned int _before_high, const char *after_, unsigned int _after_high, unsigned int sym, bool warning)
1110 : : {
1111 : 218 : DynamicStrings_String s;
1112 : 218 : char before[_before_high+1];
1113 : 218 : char after[_after_high+1];
1114 : :
1115 : : /* make a local copy of each unbounded array. */
1116 : 218 : memcpy (before, before_, _before_high+1);
1117 : 218 : memcpy (after, after_, _after_high+1);
1118 : :
1119 : 436 : s = DynamicStrings_InitString ((const char *) before, _before_high);
1120 : 218 : if (warning)
1121 : : {
1122 : 210 : s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "{%1Wad}", 7)));
1123 : : }
1124 : : else
1125 : : {
1126 : 8 : s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "{%1Oad}", 7)));
1127 : : }
1128 : 218 : s = DynamicStrings_ConCat (s, DynamicStrings_Mark (DynamicStrings_InitString ((const char *) after, _after_high)));
1129 : 218 : M2MetaError_MetaErrorStringT1 (tok, s, sym);
1130 : 218 : }
1131 : :
1132 : :
1133 : : /*
1134 : : IsUniqueWarning - return TRUE if a warning has not been issued at tok.
1135 : : It remembers tok and subsequent calls will always return FALSE.
1136 : : */
1137 : :
1138 : 292 : static bool IsUniqueWarning (unsigned int tok)
1139 : : {
1140 : 292 : if (! (Lists_IsItemInList (errorList, tok)))
1141 : : {
1142 : 201 : Lists_IncludeItemIntoList (errorList, tok);
1143 : 201 : return true;
1144 : : }
1145 : : else
1146 : : {
1147 : : return false;
1148 : : }
1149 : : /* static analysis guarentees a RETURN statement will be used before here. */
1150 : : __builtin_unreachable ();
1151 : : }
1152 : :
1153 : :
1154 : : /*
1155 : : CheckDeferredRecordAccess -
1156 : : */
1157 : :
1158 : 8903 : static void CheckDeferredRecordAccess (unsigned int tok, unsigned int sym, bool canDereference, bool warning, unsigned int i)
1159 : : {
1160 : 8903 : bool unique;
1161 : :
1162 : 8903 : if (SymbolTable_IsVar (sym))
1163 : : {
1164 : 3196 : if (Debugging)
1165 : : {
1166 : : Trace ((const char *) "CheckDeferredRecordAccess %d\\n", 30, sym);
1167 : : M2GCCDeclare_PrintSym (sym);
1168 : : if (canDereference)
1169 : : {
1170 : : M2Printf_printf1 ((const char *) "checkReadInit (%d, true)\\n", 26, (const unsigned char *) &sym, (sizeof (sym)-1));
1171 : : }
1172 : : else
1173 : : {
1174 : : M2Printf_printf1 ((const char *) "checkReadInit (%d, false)\\n", 27, (const unsigned char *) &sym, (sizeof (sym)-1));
1175 : : }
1176 : : }
1177 : 3196 : if (IsExempt (sym))
1178 : : {
1179 : 414 : Trace ((const char *) "checkReadInit sym is a parameter or not a local variable (%d)", 61, sym);
1180 : : /* We assume parameters have been initialized. */
1181 : 414 : SymbolTable_PutVarInitialized (sym, SymbolTable_LeftValue);
1182 : : /* SetVarInitialized (sym, TRUE) */
1183 : 414 : SymbolTable_PutVarInitialized (sym, SymbolTable_RightValue);
1184 : : }
1185 : 2782 : else if (SymbolTable_IsUnbounded (SymbolTable_GetSType (sym)))
1186 : : {
1187 : : /* avoid dangling else. */
1188 : 0 : SetVarInitialized (sym, true, tok);
1189 : : }
1190 : 2782 : else if (SymbolTable_IsComponent (sym))
1191 : : {
1192 : : /* avoid dangling else. */
1193 : 264 : Trace ((const char *) "checkReadInit IsComponent (%d) is true)", 39, sym);
1194 : 264 : if ((! (GetVarComponentInitialized (sym, tok))) && (IsUniqueWarning (tok)))
1195 : : {
1196 : 126 : GenerateNoteFlow (i, warning);
1197 : 126 : IssueWarning (tok, (const char *) "attempting to access ", 21, (const char *) " before it has been initialized", 31, sym, warning);
1198 : : }
1199 : : }
1200 : 2518 : else if (((SymbolTable_GetMode (sym)) == SymbolTable_LeftValue) && canDereference)
1201 : : {
1202 : : /* avoid dangling else. */
1203 : 30 : Trace ((const char *) "checkReadInit GetMode (%d) = LeftValue and canDereference (LeftValue and RightValue VarCheckReadInit)", 101, sym);
1204 : 30 : unique = true;
1205 : 30 : if (! (SymbolTable_VarCheckReadInit (sym, SymbolTable_LeftValue)))
1206 : : {
1207 : 0 : unique = IsUniqueWarning (tok);
1208 : 0 : if (unique)
1209 : : {
1210 : 0 : GenerateNoteFlow (i, warning);
1211 : 0 : IssueWarning (tok, (const char *) "attempting to access the address of ", 36, (const char *) " before it has been initialized", 31, sym, warning);
1212 : : }
1213 : : }
1214 : 30 : if (! (SymbolTable_VarCheckReadInit (sym, SymbolTable_RightValue)))
1215 : : {
1216 : 24 : if (unique)
1217 : : {
1218 : 24 : GenerateNoteFlow (i, warning);
1219 : 24 : IssueWarning (tok, (const char *) "attempting to access ", 21, (const char *) " before it has been initialized", 31, sym, warning);
1220 : : }
1221 : : }
1222 : : }
1223 : : else
1224 : : {
1225 : : /* avoid dangling else. */
1226 : 2488 : Trace ((const char *) "checkReadInit call VarCheckReadInit using GetMode (%d)", 54, sym);
1227 : 2488 : if ((! (SymbolTable_VarCheckReadInit (sym, SymbolTable_GetMode (sym)))) && (IsUniqueWarning (tok)))
1228 : : {
1229 : 68 : GenerateNoteFlow (i, warning);
1230 : 68 : IssueWarning (tok, (const char *) "attempting to access ", 21, (const char *) " before it has been initialized", 31, sym, warning);
1231 : : }
1232 : : }
1233 : : }
1234 : 8903 : }
1235 : :
1236 : :
1237 : : /*
1238 : : SetVarUninitialized - resets variable init state.
1239 : : */
1240 : :
1241 : 64923 : static void SetVarUninitialized (unsigned int sym)
1242 : : {
1243 : 64923 : if (SymbolTable_IsVar (sym))
1244 : : {
1245 : 10660 : if (! (SymbolTable_IsUnbounded (SymbolTable_GetSType (sym))))
1246 : : {
1247 : 10408 : SymbolTable_VarInitState (sym);
1248 : : }
1249 : : }
1250 : 64923 : }
1251 : :
1252 : :
1253 : : /*
1254 : : ComponentFindVar -
1255 : : */
1256 : :
1257 : 972 : static unsigned int ComponentFindVar (unsigned int sym, bool *lvalue, unsigned int tok)
1258 : : {
1259 : 1224 : unsigned int nsym;
1260 : 1224 : unsigned int i;
1261 : :
1262 : 1224 : i = 1;
1263 : 1224 : do {
1264 : 1224 : nsym = SymbolTable_GetNth (sym, i);
1265 : 1224 : (*lvalue) = (SymbolTable_GetMode (nsym)) == SymbolTable_LeftValue;
1266 : 1224 : nsym = getLAlias (nsym);
1267 : 1224 : if (nsym == M2Base_Nil)
1268 : : {
1269 : 36 : M2MetaError_MetaErrorT1 (tok, (const char *) "attempting to dereference {%1Wad} which will be a {%kNIL} pointer", 65, sym);
1270 : 36 : return SymbolTable_NulSym;
1271 : : }
1272 : 1188 : else if ((nsym != SymbolTable_NulSym) && (SymbolTable_IsVar (nsym)))
1273 : : {
1274 : : /* avoid dangling else. */
1275 : 1188 : if ((nsym != sym) && (SymbolTable_IsComponent (nsym)))
1276 : : {
1277 : : return ComponentFindVar (nsym, lvalue, tok);
1278 : : }
1279 : : else
1280 : : {
1281 : 936 : return nsym;
1282 : : }
1283 : : }
1284 : 0 : i += 1;
1285 : 0 : } while (! (nsym == SymbolTable_NulSym));
1286 : : return SymbolTable_NulSym;
1287 : : /* static analysis guarentees a RETURN statement will be used before here. */
1288 : : __builtin_unreachable ();
1289 : : }
1290 : :
1291 : :
1292 : : /*
1293 : : ComponentCreateFieldList - builds a list of fields accessed by the component var.
1294 : : Each item in the list will be a field of incremental levels
1295 : : though a nested record. It is not a list of fields
1296 : : at the same level.
1297 : :
1298 : : foo = RECORD
1299 : : v: RECORD
1300 : : x, y: CARDINAL ;
1301 : : END ;
1302 : : w: CARDINAL ;
1303 : : END ;
1304 : :
1305 : : { v, x } for example and not { v, w }
1306 : : */
1307 : :
1308 : 888 : static Lists_List ComponentCreateFieldList (unsigned int sym)
1309 : : {
1310 : 888 : Lists_List lst;
1311 : :
1312 : 888 : Lists_InitList (&lst);
1313 : 888 : if ((SymbolTable_IsVar (sym)) && (SymbolTable_IsComponent (sym)))
1314 : : {
1315 : 888 : ComponentBuildFieldList (lst, sym);
1316 : : }
1317 : 888 : return lst;
1318 : : /* static analysis guarentees a RETURN statement will be used before here. */
1319 : : __builtin_unreachable ();
1320 : : }
1321 : :
1322 : :
1323 : : /*
1324 : : ComponentCreateFieldList - builds a list of fields accessed by the component var.
1325 : : Each item in the list will be a field of incremental levels
1326 : : though a nested record. It is not a list of fields
1327 : : at the same level.
1328 : :
1329 : : foo = RECORD
1330 : : v: RECORD
1331 : : x, y: CARDINAL ;
1332 : : END ;
1333 : : w: CARDINAL ;
1334 : : END ;
1335 : :
1336 : : { v, x } for example and not { v, w }
1337 : : */
1338 : :
1339 : 1140 : static void ComponentBuildFieldList (Lists_List lst, unsigned int sym)
1340 : : {
1341 : 1140 : unsigned int i;
1342 : 1140 : unsigned int nsym;
1343 : :
1344 : 1140 : i = 1;
1345 : 3420 : do {
1346 : 3420 : nsym = SymbolTable_GetNth (sym, i);
1347 : 3420 : if (nsym != SymbolTable_NulSym)
1348 : : {
1349 : 2280 : if (SymbolTable_IsComponent (nsym))
1350 : : {
1351 : 252 : ComponentBuildFieldList (lst, nsym);
1352 : : }
1353 : 2028 : else if (SymbolTable_IsRecordField (nsym))
1354 : : {
1355 : : /* avoid dangling else. */
1356 : 1140 : Lists_IncludeItemIntoList (lst, nsym);
1357 : : }
1358 : 2280 : i += 1;
1359 : : }
1360 : 3420 : } while (! (nsym == SymbolTable_NulSym));
1361 : 1140 : }
1362 : :
1363 : :
1364 : : /*
1365 : : deRefComponent -
1366 : : */
1367 : :
1368 : 954 : static unsigned int deRefComponent (unsigned int component, bool lvalue, unsigned int sym, unsigned int tok)
1369 : : {
1370 : 0 : if (lvalue)
1371 : : {
1372 : 498 : return getContent (component, sym, tok);
1373 : : }
1374 : : else
1375 : : {
1376 : : return component;
1377 : : }
1378 : : /* static analysis guarentees a RETURN statement will be used before here. */
1379 : : __builtin_unreachable ();
1380 : : }
1381 : :
1382 : :
1383 : : /*
1384 : : SetVarComponentInitialized -
1385 : : */
1386 : :
1387 : 366 : static void SetVarComponentInitialized (unsigned int sym, unsigned int tok)
1388 : : {
1389 : 366 : bool lvalue;
1390 : 366 : unsigned int i;
1391 : 366 : unsigned int n;
1392 : 366 : unsigned int fsym;
1393 : 366 : unsigned int vsym;
1394 : 366 : Lists_List lst;
1395 : :
1396 : 366 : vsym = ComponentFindVar (sym, &lvalue, tok);
1397 : 366 : vsym = deRefComponent (vsym, lvalue, sym, tok);
1398 : 366 : if (vsym != SymbolTable_NulSym)
1399 : : {
1400 : 354 : if (Debugging)
1401 : : {
1402 : : M2Printf_printf0 ((const char *) "*************** vsym is: ", 25);
1403 : : M2GCCDeclare_PrintSym (vsym);
1404 : : }
1405 : : /* Build list accessing the field. */
1406 : 354 : lst = ComponentCreateFieldList (sym);
1407 : 354 : if (Debugging)
1408 : : {
1409 : : M2Printf_printf2 ((const char *) "sym = %d, vsym = %d, fields:", 28, (const unsigned char *) &sym, (sizeof (sym)-1), (const unsigned char *) &vsym, (sizeof (vsym)-1));
1410 : : }
1411 : : /* Now mark this field in the record variable as initialized. */
1412 : 354 : if (SymbolTable_PutVarFieldInitialized (vsym, SymbolTable_RightValue, lst))
1413 : : {
1414 : : /* avoid dangling else. */
1415 : : if (Debugging)
1416 : : {
1417 : : i = 1;
1418 : : n = Lists_NoOfItemsInList (lst);
1419 : : while (i <= n)
1420 : : {
1421 : : fsym = static_cast<unsigned int> (Lists_GetItemFromList (lst, i));
1422 : : M2Printf_printf1 ((const char *) " %d", 3, (const unsigned char *) &fsym, (sizeof (fsym)-1));
1423 : : i += 1;
1424 : : }
1425 : : M2Printf_printf0 ((const char *) " is initialized\\n", 17);
1426 : : }
1427 : : }
1428 : 354 : else if (Debugging)
1429 : : {
1430 : : /* avoid dangling else. */
1431 : : M2Printf_printf0 ((const char *) " vsym is not a var\\n", 20);
1432 : : }
1433 : 354 : Lists_KillList (&lst);
1434 : : }
1435 : 366 : }
1436 : :
1437 : :
1438 : : /*
1439 : : GetVarComponentInitialized -
1440 : : */
1441 : :
1442 : 264 : static bool GetVarComponentInitialized (unsigned int sym, unsigned int tok)
1443 : : {
1444 : 264 : bool lvalue;
1445 : 264 : bool init;
1446 : 264 : unsigned int component;
1447 : 264 : unsigned int vsym;
1448 : 264 : Lists_List lst;
1449 : :
1450 : 264 : component = ComponentFindVar (sym, &lvalue, tok);
1451 : 264 : if ((Lists_IsItemInList (ignoreList, component)) || (IsExempt (component)))
1452 : : {
1453 : 18 : return true;
1454 : : }
1455 : : else
1456 : : {
1457 : 246 : init = false;
1458 : 246 : vsym = deRefComponent (component, lvalue, sym, tok);
1459 : 246 : if (vsym != SymbolTable_NulSym)
1460 : : {
1461 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
1462 : 204 : if (IsExempt (vsym))
1463 : : {
1464 : : init = true;
1465 : : }
1466 : : else
1467 : : {
1468 : : /* Create list representing how the field is accessed. */
1469 : 204 : lst = ComponentCreateFieldList (sym);
1470 : : /* Now obtain the mark indicating whether this field was initialized. */
1471 : 204 : init = SymbolTable_GetVarFieldInitialized (vsym, SymbolTable_RightValue, lst);
1472 : 204 : Lists_KillList (&lst);
1473 : : }
1474 : : }
1475 : 246 : return init;
1476 : : }
1477 : : /* static analysis guarentees a RETURN statement will be used before here. */
1478 : : __builtin_unreachable ();
1479 : : }
1480 : :
1481 : :
1482 : : /*
1483 : : Trace -
1484 : : */
1485 : :
1486 : 6691 : static void Trace (const char *message_, unsigned int _message_high, unsigned int sym)
1487 : : {
1488 : 6691 : char message[_message_high+1];
1489 : :
1490 : : /* make a local copy of each unbounded array. */
1491 : 6691 : memcpy (message, message_, _message_high+1);
1492 : :
1493 : 6691 : if (Debugging)
1494 : : {
1495 : : M2Printf_printf1 ((const char *) message, _message_high, (const unsigned char *) &sym, (sizeof (sym)-1));
1496 : : M2Printf_printf0 ((const char *) "\\n", 2);
1497 : : }
1498 : 3196 : }
1499 : :
1500 : :
1501 : : /*
1502 : : SetVarInitialized - if the variable has a left mode and can be dereferenced
1503 : : then set the left and right initialization state.
1504 : : */
1505 : :
1506 : 3615 : static void SetVarInitialized (unsigned int sym, bool canDereference, unsigned int tok)
1507 : : {
1508 : 3615 : if (SymbolTable_IsVar (sym))
1509 : : {
1510 : 3495 : Lists_RemoveItemFromList (ignoreList, sym);
1511 : 3495 : if (SymbolTable_IsComponent (sym))
1512 : : {
1513 : 366 : Trace ((const char *) "SetVarInitialized sym %d is a component and calling SetVarComponentInitialized", 78, sym);
1514 : 366 : SetVarComponentInitialized (sym, tok);
1515 : : }
1516 : 3129 : else if (((SymbolTable_GetMode (sym)) == SymbolTable_LeftValue) && canDereference)
1517 : : {
1518 : : /* avoid dangling else. */
1519 : 234 : Trace ((const char *) "SetVarInitialized sym %d is LeftValue and canDeference and calling PutVarInitialized LeftValue and RightValue", 109, sym);
1520 : 234 : SymbolTable_PutVarInitialized (sym, SymbolTable_LeftValue);
1521 : 234 : SymbolTable_PutVarInitialized (sym, SymbolTable_RightValue);
1522 : : }
1523 : : else
1524 : : {
1525 : : /* avoid dangling else. */
1526 : 2895 : Trace ((const char *) "SetVarInitialized sym %d calling PutVarInitialized with its mode", 64, sym);
1527 : 2895 : SymbolTable_PutVarInitialized (sym, SymbolTable_GetMode (sym));
1528 : : }
1529 : : if (Debugging)
1530 : : {
1531 : : M2GCCDeclare_PrintSym (sym);
1532 : : }
1533 : : }
1534 : 3615 : }
1535 : :
1536 : :
1537 : : /*
1538 : : doGetVarInitialized -
1539 : : */
1540 : :
1541 : 1990 : static bool doGetVarInitialized (unsigned int sym, unsigned int tok)
1542 : : {
1543 : 1990 : if (SymbolTable_IsVar (sym))
1544 : : {
1545 : 258 : if (SymbolTable_IsUnbounded (SymbolTable_GetSType (sym)))
1546 : : {
1547 : : return true;
1548 : : }
1549 : 258 : else if (SymbolTable_IsComponent (sym))
1550 : : {
1551 : : /* avoid dangling else. */
1552 : 0 : return GetVarComponentInitialized (sym, tok);
1553 : : }
1554 : 258 : return SymbolTable_VarCheckReadInit (sym, SymbolTable_GetMode (sym));
1555 : : }
1556 : 1732 : return (SymbolTable_IsConst (sym)) && (SymbolTable_IsConstString (sym));
1557 : : /* static analysis guarentees a RETURN statement will be used before here. */
1558 : : __builtin_unreachable ();
1559 : : }
1560 : :
1561 : :
1562 : : /*
1563 : : GetVarInitialized -
1564 : : */
1565 : :
1566 : 1990 : static bool GetVarInitialized (unsigned int sym, unsigned int tok)
1567 : : {
1568 : 1990 : bool init;
1569 : :
1570 : 0 : init = doGetVarInitialized (sym, tok);
1571 : 1990 : if (Debugging)
1572 : : {
1573 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
1574 : : if (init)
1575 : : {
1576 : : Trace ((const char *) "GetVarInitialized (sym = %d) returning TRUE", 43, sym);
1577 : : }
1578 : : else
1579 : : {
1580 : : Trace ((const char *) "GetVarInitialized (sym = %d) returning FALSE", 44, sym);
1581 : : }
1582 : : }
1583 : 1990 : return init;
1584 : : /* static analysis guarentees a RETURN statement will be used before here. */
1585 : : __builtin_unreachable ();
1586 : : }
1587 : :
1588 : :
1589 : : /*
1590 : : IsExempt - returns TRUE if sym is a global variable or a parameter or
1591 : : a variable with a variant record type.
1592 : : */
1593 : :
1594 : 3646 : static bool IsExempt (unsigned int sym)
1595 : : {
1596 : : /* (IsVarAParam (sym) AND (GetMode (sym) = LeftValue)) OR */
1597 : 3646 : return ((sym != SymbolTable_NulSym) && (SymbolTable_IsVar (sym))) && (((((((IsGlobalVar (sym)) || (ContainsVariant (sym))) || (SymbolTable_IsArray (SymbolTable_GetSType (sym)))) || (SymbolTable_IsSet (SymbolTable_GetSType (sym)))) || (SymbolTable_IsUnbounded (SymbolTable_GetSType (sym)))) || (SymbolTable_IsVarArrayRef (sym))) || (Lists_IsItemInList (ignoreList, sym)));
1598 : : /* static analysis guarentees a RETURN statement will be used before here. */
1599 : : __builtin_unreachable ();
1600 : : }
1601 : :
1602 : :
1603 : : /*
1604 : : CheckBinary -
1605 : : */
1606 : :
1607 : 6 : static void CheckBinary (unsigned int op1tok, unsigned int op1, unsigned int op2tok, unsigned int op2, unsigned int op3tok, unsigned int op3, bool warning, unsigned int i)
1608 : : {
1609 : 6 : CheckDeferredRecordAccess (op2tok, op2, false, warning, i);
1610 : 6 : CheckDeferredRecordAccess (op3tok, op3, false, warning, i);
1611 : 6 : SetVarInitialized (op1, false, op1tok);
1612 : 6 : }
1613 : :
1614 : :
1615 : : /*
1616 : : CheckUnary -
1617 : : */
1618 : :
1619 : 6 : static void CheckUnary (unsigned int lhstok, unsigned int lhs, unsigned int rhstok, unsigned int rhs, bool warning, unsigned int i)
1620 : : {
1621 : 6 : CheckDeferredRecordAccess (rhstok, rhs, false, warning, i);
1622 : 6 : SetVarInitialized (lhs, false, lhstok);
1623 : 6 : }
1624 : :
1625 : :
1626 : : /*
1627 : : CheckXIndr -
1628 : : */
1629 : :
1630 : 30 : static void CheckXIndr (unsigned int lhstok, unsigned int lhs, unsigned int type, unsigned int rhstok, unsigned int rhs, bool warning, unsigned int i)
1631 : : {
1632 : 30 : Lists_List lst;
1633 : 30 : unsigned int content;
1634 : :
1635 : 30 : CheckDeferredRecordAccess (rhstok, rhs, false, warning, i);
1636 : 30 : CheckDeferredRecordAccess (lhstok, lhs, false, warning, i);
1637 : : /* Now see if we know what lhs is pointing to and set fields if necessary. */
1638 : 30 : content = getContent (getLAlias (lhs), lhs, lhstok);
1639 : 30 : if (((content != SymbolTable_NulSym) && (content != lhs)) && ((SymbolTable_GetSType (content)) == type))
1640 : : {
1641 : 18 : if (SymbolTable_IsReallyPointer (rhs))
1642 : : {
1643 : 0 : SetupLAlias (content, rhs);
1644 : : }
1645 : 18 : if (SymbolTable_IsRecord (type))
1646 : : {
1647 : : /* Set all fields of content as initialized. */
1648 : 18 : SetVarInitialized (content, false, lhstok);
1649 : : }
1650 : : else
1651 : : {
1652 : : /* Set only the field assigned in vsym as initialized. */
1653 : 0 : lst = ComponentCreateFieldList (rhs);
1654 : 0 : if (SymbolTable_PutVarFieldInitialized (content, SymbolTable_RightValue, lst))
1655 : : {} /* empty. */
1656 : 0 : Lists_KillList (&lst);
1657 : : }
1658 : : }
1659 : 30 : }
1660 : :
1661 : :
1662 : : /*
1663 : : CheckIndrX -
1664 : : */
1665 : :
1666 : 108 : static void CheckIndrX (unsigned int lhstok, unsigned int lhs, unsigned int rhstok, unsigned int rhs, bool warning, unsigned int i)
1667 : : {
1668 : 108 : unsigned int content;
1669 : :
1670 : 108 : CheckDeferredRecordAccess (rhstok, rhs, false, warning, i);
1671 : 108 : content = getContent (getLAlias (rhs), rhs, rhstok);
1672 : 108 : if (content == SymbolTable_NulSym)
1673 : : {
1674 : 42 : Lists_IncludeItemIntoList (ignoreList, lhs);
1675 : : }
1676 : : else
1677 : : {
1678 : 66 : CheckDeferredRecordAccess (rhstok, content, true, warning, i);
1679 : 66 : SetVarInitialized (lhs, SymbolTable_VarCheckReadInit (content, SymbolTable_RightValue), lhstok);
1680 : 66 : if (SymbolTable_IsReallyPointer (content))
1681 : : {
1682 : 66 : SetupLAlias (lhs, content);
1683 : : }
1684 : : }
1685 : 108 : }
1686 : :
1687 : :
1688 : : /*
1689 : : CheckRecordField -
1690 : : */
1691 : :
1692 : 774 : static void CheckRecordField (unsigned int op1)
1693 : : {
1694 : 0 : SymbolTable_PutVarInitialized (op1, SymbolTable_LeftValue);
1695 : 774 : }
1696 : :
1697 : :
1698 : : /*
1699 : : CheckLastForIterator -
1700 : : */
1701 : :
1702 : 0 : static void CheckLastForIterator (unsigned int op1tok, unsigned int op1, unsigned int op2tok, unsigned int op2, bool warning, unsigned int i)
1703 : : {
1704 : 0 : SetVarInitialized (op1, false, op1tok);
1705 : 0 : M2Debug_Assert (SymbolTable_IsTuple (op2));
1706 : 0 : CheckDeferredRecordAccess (op2tok, SymbolTable_GetNth (op2, 1), false, warning, i);
1707 : 0 : CheckDeferredRecordAccess (op2tok, SymbolTable_GetNth (op2, 2), false, warning, i);
1708 : 0 : }
1709 : :
1710 : :
1711 : : /*
1712 : : CheckBecomes -
1713 : : */
1714 : :
1715 : 953 : static void CheckBecomes (unsigned int destok, unsigned int des, unsigned int exprtok, unsigned int expr, bool warning, unsigned int i)
1716 : : {
1717 : 953 : bool lvalue;
1718 : 953 : Lists_List lst;
1719 : 953 : unsigned int vsym;
1720 : :
1721 : 953 : CheckDeferredRecordAccess (exprtok, expr, false, warning, i);
1722 : 953 : SetupLAlias (des, expr);
1723 : 953 : SetVarInitialized (des, false, destok);
1724 : : /* Now see if we know what lhs is pointing to and set fields if necessary. */
1725 : 953 : if (SymbolTable_IsComponent (des))
1726 : : {
1727 : 342 : vsym = ComponentFindVar (des, &lvalue, destok);
1728 : 342 : vsym = deRefComponent (vsym, lvalue, des, destok);
1729 : 342 : if (vsym != SymbolTable_NulSym)
1730 : : {
1731 : : /* Set only the field assigned in vsym as initialized. */
1732 : 330 : lst = ComponentCreateFieldList (des);
1733 : 330 : if (SymbolTable_PutVarFieldInitialized (vsym, SymbolTable_RightValue, lst))
1734 : : {} /* empty. */
1735 : 330 : Lists_KillList (&lst);
1736 : : }
1737 : : }
1738 : 953 : }
1739 : :
1740 : :
1741 : : /*
1742 : : CheckComparison -
1743 : : */
1744 : :
1745 : 378 : static void CheckComparison (unsigned int op1tok, unsigned int op1, unsigned int op2tok, unsigned int op2, bool warning, unsigned int i)
1746 : : {
1747 : 378 : CheckDeferredRecordAccess (op1tok, op1, false, warning, i);
1748 : 378 : CheckDeferredRecordAccess (op2tok, op2, false, warning, i);
1749 : 378 : }
1750 : :
1751 : :
1752 : : /*
1753 : : CheckAddr -
1754 : : */
1755 : :
1756 : 1990 : static void CheckAddr (unsigned int ptrtok, unsigned int ptr, unsigned int contenttok, unsigned int content)
1757 : : {
1758 : 1990 : SetVarInitialized (ptr, GetVarInitialized (content, contenttok), ptrtok);
1759 : 3980 : SetupIndr (ptr, content);
1760 : 1990 : }
1761 : :
1762 : :
1763 : : /*
1764 : : DefaultTokPos -
1765 : : */
1766 : :
1767 : 45513 : static unsigned int DefaultTokPos (unsigned int preferredPos, unsigned int defaultPos)
1768 : : {
1769 : 7 : if (preferredPos == M2LexBuf_UnknownTokenNo)
1770 : : {
1771 : 39751 : return defaultPos;
1772 : : }
1773 : : return preferredPos;
1774 : : /* static analysis guarentees a RETURN statement will be used before here. */
1775 : : __builtin_unreachable ();
1776 : : }
1777 : :
1778 : :
1779 : : /*
1780 : : stop -
1781 : : */
1782 : :
1783 : 0 : static void stop (void)
1784 : : {
1785 : 0 : }
1786 : :
1787 : :
1788 : : /*
1789 : : CheckReadBeforeInitQuad -
1790 : : */
1791 : :
1792 : 15164 : static bool CheckReadBeforeInitQuad (unsigned int procSym, unsigned int quad, bool warning, unsigned int i)
1793 : : {
1794 : 15164 : M2Quads_QuadOperator op;
1795 : 15164 : unsigned int op1;
1796 : 15164 : unsigned int op2;
1797 : 15164 : unsigned int op3;
1798 : 15164 : unsigned int op1tok;
1799 : 15164 : unsigned int op2tok;
1800 : 15164 : unsigned int op3tok;
1801 : 15164 : unsigned int qtok;
1802 : 15164 : bool constExpr;
1803 : 15164 : bool overflowChecking;
1804 : :
1805 : 15164 : if (quad == 3140)
1806 : : {
1807 : 15164 : stop ();
1808 : : }
1809 : 15164 : if (Debugging)
1810 : : {
1811 : : M2Printf_printf1 ((const char *) "CheckReadBeforeInitQuad (quad %d)\\n", 35, (const unsigned char *) &quad, (sizeof (quad)-1));
1812 : : DumpAliases ();
1813 : : SymbolTable_ForeachLocalSymDo (procSym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2GCCDeclare_PrintSym});
1814 : : M2Printf_printf0 ((const char *) "***********************************\\n", 37);
1815 : : }
1816 : 15164 : M2Quads_GetQuadOtok (quad, &qtok, &op, &op1, &op2, &op3, &overflowChecking, &constExpr, &op1tok, &op2tok, &op3tok);
1817 : 15164 : op1tok = DefaultTokPos (op1tok, qtok);
1818 : 15164 : op2tok = DefaultTokPos (op2tok, qtok);
1819 : 15164 : op3tok = DefaultTokPos (op3tok, qtok);
1820 : 15164 : switch (op)
1821 : : {
1822 : 378 : case M2Quads_IfInOp:
1823 : 378 : case M2Quads_IfNotInOp:
1824 : 378 : case M2Quads_IfEquOp:
1825 : 378 : case M2Quads_IfNotEquOp:
1826 : 378 : case M2Quads_IfLessOp:
1827 : 378 : case M2Quads_IfLessEquOp:
1828 : 378 : case M2Quads_IfGreOp:
1829 : 378 : case M2Quads_IfGreEquOp:
1830 : : /* Jumps, calls and branches. */
1831 : 378 : CheckComparison (op1tok, op1, op2tok, op2, warning, i);
1832 : 378 : break;
1833 : :
1834 : 0 : case M2Quads_LastForIteratorOp:
1835 : 0 : CheckLastForIterator (op1tok, op1, op2tok, op2, warning, i);
1836 : 0 : M2Debug_Assert (SymbolTable_IsConst (op3));
1837 : 0 : break;
1838 : :
1839 : : case M2Quads_TryOp:
1840 : : case M2Quads_ReturnOp:
1841 : : case M2Quads_CallOp:
1842 : : case M2Quads_KillLocalVarOp:
1843 : : case M2Quads_RetryOp:
1844 : : case M2Quads_GotoOp:
1845 : : return true;
1846 : 0 : break;
1847 : :
1848 : 0 : case M2Quads_InclOp:
1849 : 0 : case M2Quads_ExclOp:
1850 : : /* Variable references. */
1851 : 0 : CheckDeferredRecordAccess (op1tok, op1, false, warning, i);
1852 : 0 : CheckDeferredRecordAccess (op1tok, op1, true, warning, i);
1853 : 0 : CheckDeferredRecordAccess (op3tok, op3, false, warning, i);
1854 : 0 : break;
1855 : :
1856 : 6 : case M2Quads_NegateOp:
1857 : 6 : CheckUnary (op1tok, op1, op3tok, op3, warning, i);
1858 : 6 : break;
1859 : :
1860 : 953 : case M2Quads_BecomesOp:
1861 : 953 : CheckBecomes (op1tok, op1, op3tok, op3, warning, i);
1862 : 953 : break;
1863 : :
1864 : 162 : case M2Quads_UnboundedOp:
1865 : 162 : case M2Quads_FunctValueOp:
1866 : 162 : case M2Quads_StandardFunctionOp:
1867 : 162 : case M2Quads_HighOp:
1868 : 162 : case M2Quads_SizeOp:
1869 : 162 : SetVarInitialized (op1, false, op1tok);
1870 : 162 : break;
1871 : :
1872 : 1990 : case M2Quads_AddrOp:
1873 : 1990 : CheckAddr (op1tok, op1, op3tok, op3);
1874 : 1990 : break;
1875 : :
1876 : 6 : case M2Quads_ReturnValueOp:
1877 : 6 : SetVarInitialized (op1, false, op1tok);
1878 : 6 : break;
1879 : :
1880 : 1087 : case M2Quads_NewLocalVarOp:
1881 : 1087 : SetParameterVariablesInitialized (op3);
1882 : 1087 : break;
1883 : :
1884 : 3465 : case M2Quads_ParamOp:
1885 : 3465 : CheckDeferredRecordAccess (op2tok, op2, false, warning, i);
1886 : 3465 : CheckDeferredRecordAccess (op3tok, op3, false, warning, i);
1887 : 3465 : if (((op1 > 0) && (op1 <= (SymbolTable_NoOfParamAny (op2)))) && (SymbolTable_IsVarParamAny (op2, op1)))
1888 : : {
1889 : 156 : SetVarInitialized (op3, true, op3tok);
1890 : : }
1891 : : break;
1892 : :
1893 : 12 : case M2Quads_ArrayOp:
1894 : 12 : CheckDeferredRecordAccess (op3tok, op3, false, warning, i);
1895 : 12 : SetVarInitialized (op1, true, op1tok);
1896 : 12 : break;
1897 : :
1898 : 774 : case M2Quads_RecordFieldOp:
1899 : 774 : CheckRecordField (op1);
1900 : 774 : break;
1901 : :
1902 : 6 : case M2Quads_LogicalShiftOp:
1903 : 6 : case M2Quads_LogicalRotateOp:
1904 : 6 : case M2Quads_LogicalOrOp:
1905 : 6 : case M2Quads_LogicalAndOp:
1906 : 6 : case M2Quads_LogicalXorOp:
1907 : 6 : case M2Quads_LogicalDiffOp:
1908 : 6 : case M2Quads_CoerceOp:
1909 : 6 : case M2Quads_ConvertOp:
1910 : 6 : case M2Quads_CastOp:
1911 : 6 : case M2Quads_AddOp:
1912 : 6 : case M2Quads_ArithAddOp:
1913 : 6 : case M2Quads_SubOp:
1914 : 6 : case M2Quads_MultOp:
1915 : 6 : case M2Quads_DivM2Op:
1916 : 6 : case M2Quads_ModM2Op:
1917 : 6 : case M2Quads_ModFloorOp:
1918 : 6 : case M2Quads_DivCeilOp:
1919 : 6 : case M2Quads_ModCeilOp:
1920 : 6 : case M2Quads_DivFloorOp:
1921 : 6 : case M2Quads_ModTruncOp:
1922 : 6 : case M2Quads_DivTruncOp:
1923 : 6 : CheckBinary (op1tok, op1, op2tok, op2, op3tok, op3, warning, i);
1924 : 6 : break;
1925 : :
1926 : 30 : case M2Quads_XIndrOp:
1927 : 30 : CheckXIndr (op1tok, op1, op2, op3tok, op3, warning, i);
1928 : 30 : break;
1929 : :
1930 : 108 : case M2Quads_IndrXOp:
1931 : 108 : CheckIndrX (op1tok, op1, op3tok, op3, warning, i);
1932 : 108 : break;
1933 : :
1934 : 0 : case M2Quads_SaveExceptionOp:
1935 : 0 : SetVarInitialized (op1, false, op1tok);
1936 : 0 : break;
1937 : :
1938 : 0 : case M2Quads_RestoreExceptionOp:
1939 : 0 : CheckDeferredRecordAccess (op1tok, op1, false, warning, i);
1940 : 0 : break;
1941 : :
1942 : 0 : case M2Quads_SubrangeLowOp:
1943 : 0 : case M2Quads_SubrangeHighOp:
1944 : 0 : M2Error_InternalError ((const char *) "quadruples should have been resolved", 36);
1945 : : break;
1946 : :
1947 : : case M2Quads_ElementSizeOp:
1948 : : case M2Quads_BuiltinConstOp:
1949 : : case M2Quads_BuiltinTypeInfoOp:
1950 : : case M2Quads_StringConvertCnulOp:
1951 : : case M2Quads_StringConvertM2nulOp:
1952 : : case M2Quads_StringLengthOp:
1953 : : case M2Quads_ProcedureScopeOp:
1954 : : case M2Quads_InitEndOp:
1955 : : case M2Quads_InitStartOp:
1956 : : case M2Quads_FinallyStartOp:
1957 : : case M2Quads_FinallyEndOp:
1958 : : case M2Quads_CatchBeginOp:
1959 : : case M2Quads_CatchEndOp:
1960 : : case M2Quads_ThrowOp:
1961 : : case M2Quads_StartDefFileOp:
1962 : : case M2Quads_StartModFileOp:
1963 : : case M2Quads_EndFileOp:
1964 : : case M2Quads_CodeOnOp:
1965 : : case M2Quads_CodeOffOp:
1966 : : case M2Quads_ProfileOnOp:
1967 : : case M2Quads_ProfileOffOp:
1968 : : case M2Quads_OptimizeOnOp:
1969 : : case M2Quads_OptimizeOffOp:
1970 : : case M2Quads_InlineOp:
1971 : : case M2Quads_LineNumberOp:
1972 : : case M2Quads_StatementNoteOp:
1973 : : case M2Quads_SavePriorityOp:
1974 : : case M2Quads_RestorePriorityOp:
1975 : : case M2Quads_RangeCheckOp:
1976 : : case M2Quads_ModuleScopeOp:
1977 : : case M2Quads_ErrorOp:
1978 : : case M2Quads_DummyOp:
1979 : : case M2Quads_OptParamOp:
1980 : : case M2Quads_InitAddressOp:
1981 : : break;
1982 : :
1983 : :
1984 : 0 : default:
1985 : 0 : CaseException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/M2SymInit.def", 20, 1);
1986 : 0 : __builtin_unreachable ();
1987 : : }
1988 : : return false; /* Likewise assigning op1 (const) with a type. */
1989 : : /* static analysis guarentees a RETURN statement will be used before here. */
1990 : : __builtin_unreachable ();
1991 : : }
1992 : :
1993 : :
1994 : : /*
1995 : : SetParameterVariablesInitialized - sets all shadow variables for parameters as
1996 : : initialized.
1997 : : */
1998 : :
1999 : 1087 : static void SetParameterVariablesInitialized (unsigned int procSym)
2000 : : {
2001 : 1087 : SymbolTable_ForeachLocalSymDo (procSym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) SetVarUninitialized});
2002 : 1087 : SymbolTable_ForeachParamSymDo (procSym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) SetVarLRInitialized});
2003 : 1087 : }
2004 : :
2005 : :
2006 : : /*
2007 : : FilterCheckReadBeforeInitQuad -
2008 : : */
2009 : :
2010 : 25283 : static bool FilterCheckReadBeforeInitQuad (unsigned int procSym, unsigned int start, bool warning, unsigned int i)
2011 : : {
2012 : 25283 : M2Quads_QuadOperator Op;
2013 : 25283 : unsigned int Op1;
2014 : 25283 : unsigned int Op2;
2015 : 25283 : unsigned int Op3;
2016 : :
2017 : 25283 : M2Quads_GetQuad (start, &Op, &Op1, &Op2, &Op3);
2018 : 25283 : if ((Op != M2Quads_RangeCheckOp) && (Op != M2Quads_StatementNoteOp))
2019 : : {
2020 : 15164 : return CheckReadBeforeInitQuad (procSym, start, warning, i);
2021 : : }
2022 : : return false;
2023 : : /* static analysis guarentees a RETURN statement will be used before here. */
2024 : : __builtin_unreachable ();
2025 : : }
2026 : :
2027 : :
2028 : : /*
2029 : : CheckReadBeforeInitFirstBasicBlock -
2030 : : */
2031 : :
2032 : 5979 : static void CheckReadBeforeInitFirstBasicBlock (unsigned int procSym, unsigned int start, unsigned int end, bool warning, unsigned int i)
2033 : : {
2034 : 44587 : for (;;)
2035 : : {
2036 : 25283 : if (FilterCheckReadBeforeInitQuad (procSym, start, warning, i))
2037 : : {} /* empty. */
2038 : 25283 : if (start == end)
2039 : : {
2040 : 5979 : return;
2041 : : }
2042 : : else
2043 : : {
2044 : 19304 : start = M2Quads_GetNextQuad (start);
2045 : : }
2046 : : }
2047 : : }
2048 : :
2049 : :
2050 : : /*
2051 : : bbArrayKill -
2052 : : */
2053 : :
2054 : 2840 : static void bbArrayKill (void)
2055 : : {
2056 : 2840 : unsigned int i;
2057 : 2840 : unsigned int h;
2058 : 2840 : M2SymInit_bbEntry bbPtr;
2059 : :
2060 : 2840 : h = Indexing_HighIndice (bbArray);
2061 : 2840 : i = 1;
2062 : 13047 : while (i <= h)
2063 : : {
2064 : 7367 : bbPtr = static_cast<M2SymInit_bbEntry> (Indexing_GetIndice (bbArray, i));
2065 : 7367 : bbPtr->next = bbFreeList;
2066 : 7367 : bbFreeList = bbPtr;
2067 : 7367 : i += 1;
2068 : : }
2069 : 2840 : bbArray = Indexing_KillIndex (bbArray);
2070 : 2840 : }
2071 : :
2072 : :
2073 : : /*
2074 : : DumpBBEntry -
2075 : : */
2076 : :
2077 : 0 : static void DumpBBEntry (M2SymInit_bbEntry bbPtr, unsigned int procSym)
2078 : : {
2079 : 0 : M2Printf_printf4 ((const char *) "bb %d: scope %d: quads: %d .. %d", 33, (const unsigned char *) &bbPtr->indexBB, (sizeof (bbPtr->indexBB)-1), (const unsigned char *) &procSym, (sizeof (procSym)-1), (const unsigned char *) &bbPtr->start, (sizeof (bbPtr->start)-1), (const unsigned char *) &bbPtr->end, (sizeof (bbPtr->end)-1));
2080 : 0 : if (bbPtr->first)
2081 : : {
2082 : 0 : M2Printf_printf0 ((const char *) " first", 6);
2083 : : }
2084 : 0 : if (bbPtr->endCall)
2085 : : {
2086 : 0 : M2Printf_printf0 ((const char *) " endcall", 8);
2087 : : }
2088 : 0 : if (bbPtr->endGoto)
2089 : : {
2090 : 0 : M2Printf_printf0 ((const char *) " endgoto", 8);
2091 : : }
2092 : 0 : if (bbPtr->endCond)
2093 : : {
2094 : 0 : M2Printf_printf0 ((const char *) " endcond", 8);
2095 : : }
2096 : 0 : if (bbPtr->topOfLoop)
2097 : : {
2098 : 0 : M2Printf_printf0 ((const char *) " topofloop", 10);
2099 : : }
2100 : 0 : if (bbPtr->condBB != 0)
2101 : : {
2102 : 0 : M2Printf_printf1 ((const char *) " cond %d", 8, (const unsigned char *) &bbPtr->condBB, (sizeof (bbPtr->condBB)-1));
2103 : : }
2104 : 0 : if (bbPtr->nextBB != 0)
2105 : : {
2106 : 0 : M2Printf_printf1 ((const char *) " next %d", 8, (const unsigned char *) &bbPtr->nextBB, (sizeof (bbPtr->nextBB)-1));
2107 : : }
2108 : 0 : M2Printf_printf0 ((const char *) "\\n", 2);
2109 : 0 : }
2110 : :
2111 : :
2112 : : /*
2113 : : DumpBBArray -
2114 : : */
2115 : :
2116 : 0 : static void DumpBBArray (unsigned int procSym)
2117 : : {
2118 : 0 : M2SymInit_bbEntry bbPtr;
2119 : 0 : unsigned int i;
2120 : 0 : unsigned int n;
2121 : :
2122 : 0 : i = 1;
2123 : 0 : n = Indexing_HighIndice (bbArray);
2124 : 0 : while (i <= n)
2125 : : {
2126 : 0 : bbPtr = static_cast<M2SymInit_bbEntry> (Indexing_GetIndice (bbArray, i));
2127 : 0 : DumpBBEntry (bbPtr, procSym);
2128 : 0 : i += 1;
2129 : : }
2130 : : i = 1;
2131 : 0 : while (i <= n)
2132 : : {
2133 : 0 : bbPtr = static_cast<M2SymInit_bbEntry> (Indexing_GetIndice (bbArray, i));
2134 : 0 : M2Printf_printf4 ((const char *) "bb %d: scope %d: quads: %d .. %d\\n", 35, (const unsigned char *) &bbPtr->indexBB, (sizeof (bbPtr->indexBB)-1), (const unsigned char *) &procSym, (sizeof (procSym)-1), (const unsigned char *) &bbPtr->start, (sizeof (bbPtr->start)-1), (const unsigned char *) &bbPtr->end, (sizeof (bbPtr->end)-1));
2135 : 0 : M2Quads_DisplayQuadRange (procSym, bbPtr->start, bbPtr->end);
2136 : 0 : i += 1;
2137 : : }
2138 : 0 : }
2139 : :
2140 : :
2141 : : /*
2142 : : DumpBBSequence -
2143 : : */
2144 : :
2145 : 0 : static void DumpBBSequence (Lists_List lst)
2146 : : {
2147 : 0 : unsigned int arrayindex;
2148 : 0 : unsigned int listindex;
2149 : 0 : unsigned int n;
2150 : :
2151 : 0 : n = Lists_NoOfItemsInList (lst);
2152 : 0 : listindex = 1;
2153 : 0 : M2Printf_printf0 ((const char *) "=============\\n", 15);
2154 : 0 : M2Printf_printf0 ((const char *) " checking sequence:", 19);
2155 : 0 : while (listindex <= n)
2156 : : {
2157 : 0 : arrayindex = static_cast<unsigned int> (Lists_GetItemFromList (lst, listindex));
2158 : 0 : M2Printf_printf2 ((const char *) " lst[%d] -> %d", 14, (const unsigned char *) &listindex, (sizeof (listindex)-1), (const unsigned char *) &arrayindex, (sizeof (arrayindex)-1));
2159 : 0 : listindex += 1;
2160 : : }
2161 : 0 : M2Printf_printf0 ((const char *) "\\n", 2);
2162 : 0 : }
2163 : :
2164 : :
2165 : : /*
2166 : : trashParam -
2167 : : */
2168 : :
2169 : 120 : static void trashParam (unsigned int trashQuad)
2170 : : {
2171 : 120 : M2Quads_QuadOperator op;
2172 : 120 : unsigned int op1;
2173 : 120 : unsigned int proc;
2174 : 120 : unsigned int param;
2175 : 120 : unsigned int paramValue;
2176 : 120 : unsigned int op1tok;
2177 : 120 : unsigned int op2tok;
2178 : 120 : unsigned int paramtok;
2179 : 120 : unsigned int qtok;
2180 : 120 : bool constExpr;
2181 : 120 : bool overflowChecking;
2182 : 120 : unsigned int heapValue;
2183 : 120 : unsigned int ptrToHeap;
2184 : :
2185 : 120 : if (trashQuad != 0)
2186 : : {
2187 : 120 : M2Quads_GetQuadOtok (trashQuad, &qtok, &op, &op1, &proc, ¶m, &overflowChecking, &constExpr, &op1tok, &op2tok, ¶mtok);
2188 : 120 : heapValue = M2Quads_GetQuadTrash (trashQuad);
2189 : 120 : if (Debugging)
2190 : : {
2191 : : M2Printf_printf1 ((const char *) "heapValue = %d\\n", 16, (const unsigned char *) &heapValue, (sizeof (heapValue)-1));
2192 : : }
2193 : 120 : if (heapValue != SymbolTable_NulSym)
2194 : : {
2195 : 120 : SetVarInitialized (param, false, paramtok);
2196 : 120 : paramValue = getLAlias (param);
2197 : 120 : ptrToHeap = getContent (paramValue, param, paramtok);
2198 : 120 : if (ptrToHeap != SymbolTable_NulSym)
2199 : : {
2200 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
2201 : 120 : if (IsDeallocate (proc))
2202 : : {
2203 : 48 : SetupLAlias (ptrToHeap, M2Base_Nil);
2204 : 48 : SetVarInitialized (ptrToHeap, false, paramtok);
2205 : : }
2206 : : else
2207 : : {
2208 : 144 : SetupIndr (ptrToHeap, heapValue);
2209 : 72 : SetVarInitialized (ptrToHeap, true, paramtok);
2210 : : }
2211 : : }
2212 : : }
2213 : : }
2214 : 120 : DumpAliases ();
2215 : 120 : }
2216 : :
2217 : :
2218 : : /*
2219 : : SetVarLRInitialized - this sets up an alias between the parameter
2220 : : value and the pointer for the case:
2221 : :
2222 : : procedure foo (var shadow: PtrToType) ;
2223 : :
2224 : : which allows shadow to be statically analyzed
2225 : : once it is re-assigned.
2226 : : */
2227 : :
2228 : 300 : static void SetVarLRInitialized (unsigned int param)
2229 : : {
2230 : 300 : unsigned int heap;
2231 : 300 : unsigned int shadow;
2232 : :
2233 : 300 : M2Debug_Assert (SymbolTable_IsParameter (param));
2234 : 300 : shadow = SymbolTable_GetParameterShadowVar (param);
2235 : 300 : if (shadow != SymbolTable_NulSym)
2236 : : {
2237 : 300 : Lists_IncludeItemIntoList (ignoreList, shadow);
2238 : : }
2239 : 300 : heap = SymbolTable_GetParameterHeapVar (param);
2240 : 300 : if ((shadow != SymbolTable_NulSym) && (heap != SymbolTable_NulSym))
2241 : : {
2242 : 96 : SymbolTable_PutVarInitialized (shadow, SymbolTable_GetMode (shadow));
2243 : 96 : SymbolTable_PutVarInitialized (heap, SymbolTable_GetMode (heap));
2244 : 192 : SetupIndr (shadow, heap);
2245 : 96 : Lists_IncludeItemIntoList (ignoreList, heap);
2246 : : }
2247 : 300 : }
2248 : :
2249 : :
2250 : : /*
2251 : : TestBBSequence -
2252 : : */
2253 : :
2254 : 2946 : static void TestBBSequence (unsigned int procSym, Lists_List lst)
2255 : : {
2256 : 2946 : M2SymInit_bbEntry bbPtr;
2257 : 2946 : unsigned int bbi;
2258 : 2946 : unsigned int i;
2259 : 2946 : unsigned int n;
2260 : 2946 : bool warning;
2261 : :
2262 : 2946 : if (Debugging) /* Should we issue a warning rather than a note? */
2263 : : {
2264 : : DumpBBSequence (lst);
2265 : : }
2266 : 2946 : initBlock ();
2267 : 2946 : SymbolTable_ForeachLocalSymDo (procSym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) SetVarUninitialized});
2268 : 2946 : SymbolTable_ForeachParamSymDo (procSym, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) SetVarLRInitialized});
2269 : 2946 : n = Lists_NoOfItemsInList (lst);
2270 : 2946 : i = 1;
2271 : 2946 : warning = true;
2272 : 11871 : while (i <= n)
2273 : : {
2274 : 5979 : bbi = static_cast<unsigned int> (Lists_GetItemFromList (lst, i));
2275 : 5979 : bbPtr = static_cast<M2SymInit_bbEntry> (Indexing_GetIndice (bbArray, bbi));
2276 : 5979 : CheckReadBeforeInitFirstBasicBlock (procSym, bbPtr->start, bbPtr->end, warning, i);
2277 : 5979 : if (bbPtr->endCond)
2278 : : {
2279 : : /* Check to see if we are moving into an conditional block in which case
2280 : : we will issue a note. */
2281 : : warning = false;
2282 : : }
2283 : 5601 : else if (bbPtr->endCall && (bbPtr->trashQuad != 0))
2284 : : {
2285 : : /* avoid dangling else. */
2286 : 120 : trashParam (bbPtr->trashQuad);
2287 : : }
2288 : 5979 : i += 1;
2289 : : }
2290 : 2946 : killBlock ();
2291 : 2946 : }
2292 : :
2293 : :
2294 : : /*
2295 : : CreateBBPermultations -
2296 : : */
2297 : :
2298 : 7493 : static void CreateBBPermultations (unsigned int procSym, unsigned int i, Lists_List lst)
2299 : : {
2300 : 7493 : Lists_List duplst;
2301 : 7493 : M2SymInit_bbEntry iPtr;
2302 : :
2303 : 7493 : if (i == 0)
2304 : : {
2305 : 1749 : TestBBSequence (procSym, lst);
2306 : : }
2307 : : else
2308 : : {
2309 : 5744 : iPtr = static_cast<M2SymInit_bbEntry> (Indexing_GetIndice (bbArray, i));
2310 : 5744 : if (iPtr->topOfLoop)
2311 : : {
2312 : 18 : TestBBSequence (procSym, lst);
2313 : : }
2314 : : else
2315 : : {
2316 : 5726 : duplst = Lists_DuplicateList (lst);
2317 : 5726 : Lists_IncludeItemIntoList (duplst, i);
2318 : 5726 : if (iPtr->endCall && (iPtr->trashQuad == 0))
2319 : : {
2320 : 1017 : TestBBSequence (procSym, duplst);
2321 : : }
2322 : 4709 : else if (iPtr->endGoto)
2323 : : {
2324 : : /* avoid dangling else. */
2325 : 13 : CreateBBPermultations (procSym, iPtr->nextBB, duplst);
2326 : : }
2327 : 4696 : else if (M2Options_UninitVariableConditionalChecking && iPtr->endCond)
2328 : : {
2329 : : /* avoid dangling else. */
2330 : 106 : CreateBBPermultations (procSym, iPtr->nextBB, duplst);
2331 : 106 : CreateBBPermultations (procSym, iPtr->condBB, duplst);
2332 : : }
2333 : 4590 : else if (iPtr->endCond)
2334 : : {
2335 : : /* avoid dangling else. */
2336 : 162 : TestBBSequence (procSym, duplst);
2337 : : }
2338 : : else
2339 : : {
2340 : : /* avoid dangling else. */
2341 : : /* Fall through. */
2342 : 4428 : CreateBBPermultations (procSym, iPtr->nextBB, duplst);
2343 : : }
2344 : 5726 : Lists_KillList (&duplst);
2345 : : }
2346 : : }
2347 : 7493 : }
2348 : :
2349 : :
2350 : : /*
2351 : : GetOp3 -
2352 : : */
2353 : :
2354 : 303 : static unsigned int GetOp3 (unsigned int quad)
2355 : : {
2356 : 303 : M2Quads_QuadOperator op;
2357 : 303 : unsigned int op1;
2358 : 303 : unsigned int op2;
2359 : 303 : unsigned int op3;
2360 : :
2361 : 303 : M2Quads_GetQuad (quad, &op, &op1, &op2, &op3);
2362 : 303 : return op3;
2363 : : /* static analysis guarentees a RETURN statement will be used before here. */
2364 : : __builtin_unreachable ();
2365 : : }
2366 : :
2367 : :
2368 : : /*
2369 : : getBBindex - return the basic block index which starts with quad.
2370 : : */
2371 : :
2372 : 6677 : static unsigned int getBBindex (unsigned int quad)
2373 : : {
2374 : 6677 : M2SymInit_bbEntry iPtr;
2375 : 6677 : unsigned int i;
2376 : 6677 : unsigned int high;
2377 : :
2378 : 6677 : i = 1;
2379 : 6677 : high = Indexing_HighIndice (bbArray);
2380 : 27386 : while (i <= high)
2381 : : {
2382 : 18862 : iPtr = static_cast<M2SymInit_bbEntry> (Indexing_GetIndice (bbArray, i));
2383 : 18862 : if (iPtr->start == quad)
2384 : : {
2385 : 4830 : return iPtr->indexBB;
2386 : : }
2387 : 14032 : i += 1;
2388 : : }
2389 : : return 0;
2390 : : /* static analysis guarentees a RETURN statement will be used before here. */
2391 : : __builtin_unreachable ();
2392 : : }
2393 : :
2394 : :
2395 : : /*
2396 : : GenerateCFG -
2397 : : */
2398 : :
2399 : 2840 : static void GenerateCFG (void)
2400 : : {
2401 : 2840 : M2SymInit_bbEntry iPtr;
2402 : 2840 : unsigned int next;
2403 : 2840 : unsigned int i;
2404 : 2840 : unsigned int high;
2405 : :
2406 : 2840 : i = 1;
2407 : 2840 : high = Indexing_HighIndice (bbArray);
2408 : 13047 : while (i <= high)
2409 : : {
2410 : 7367 : iPtr = static_cast<M2SymInit_bbEntry> (Indexing_GetIndice (bbArray, i));
2411 : 7367 : if ((M2Quads_IsKillLocalVar (iPtr->end)) || (M2Quads_IsReturn (iPtr->end)))
2412 : : {} /* empty. */
2413 : : else
2414 : : {
2415 : : /* Nothing to do as we have reached the end of this scope. */
2416 : 6374 : next = M2Quads_GetNextQuad (iPtr->end);
2417 : 6374 : iPtr->nextQuad = next;
2418 : 6374 : iPtr->nextBB = getBBindex (next);
2419 : 6374 : if (iPtr->endCond)
2420 : : {
2421 : 303 : iPtr->condQuad = GetOp3 (iPtr->end);
2422 : 303 : iPtr->condBB = getBBindex (iPtr->condQuad);
2423 : : }
2424 : : }
2425 : 7367 : i += 1;
2426 : : }
2427 : 2840 : }
2428 : :
2429 : :
2430 : : /*
2431 : : NewEntry -
2432 : : */
2433 : :
2434 : 7367 : static M2SymInit_bbEntry NewEntry (void)
2435 : : {
2436 : 7367 : M2SymInit_bbEntry bbPtr;
2437 : :
2438 : 7367 : if (bbFreeList == NULL)
2439 : : {
2440 : 1579 : Storage_ALLOCATE ((void **) &bbPtr, sizeof (M2SymInit__T3));
2441 : : }
2442 : : else
2443 : : {
2444 : 5788 : bbPtr = bbFreeList;
2445 : 5788 : bbFreeList = bbFreeList->next;
2446 : : }
2447 : 7367 : return bbPtr;
2448 : : /* static analysis guarentees a RETURN statement will be used before here. */
2449 : : __builtin_unreachable ();
2450 : : }
2451 : :
2452 : :
2453 : : /*
2454 : : IsAllocate - return TRUE is sym is ALLOCATE.
2455 : : */
2456 : :
2457 : 1160 : static bool IsAllocate (unsigned int sym)
2458 : : {
2459 : 1160 : return (SymbolTable_IsProcedure (sym)) && ((SymbolTable_GetSymName (sym)) == (NameKey_MakeKey ((const char *) "ALLOCATE", 8)));
2460 : : /* static analysis guarentees a RETURN statement will be used before here. */
2461 : : __builtin_unreachable ();
2462 : : }
2463 : :
2464 : :
2465 : : /*
2466 : : IsDeallocate - return TRUE is sym is DEALLOCATE.
2467 : : */
2468 : :
2469 : 1232 : static bool IsDeallocate (unsigned int sym)
2470 : : {
2471 : 1232 : return (SymbolTable_IsProcedure (sym)) && ((SymbolTable_GetSymName (sym)) == (NameKey_MakeKey ((const char *) "DEALLOCATE", 10)));
2472 : : /* static analysis guarentees a RETURN statement will be used before here. */
2473 : : __builtin_unreachable ();
2474 : : }
2475 : :
2476 : :
2477 : : /*
2478 : : DetectTrash -
2479 : : */
2480 : :
2481 : 7367 : static void DetectTrash (M2SymInit_bbEntry bbPtr)
2482 : : {
2483 : 7367 : unsigned int i;
2484 : 7367 : M2Quads_QuadOperator op;
2485 : 7367 : unsigned int op1;
2486 : 7367 : unsigned int op2;
2487 : 7367 : unsigned int op3;
2488 : :
2489 : 7367 : if (bbPtr->endCall)
2490 : : {
2491 : 1401 : i = bbPtr->start;
2492 : 32739 : for (;;)
2493 : : {
2494 : 17070 : M2Quads_GetQuad (i, &op, &op1, &op2, &op3);
2495 : 17070 : if (((op == M2Quads_ParamOp) && (op1 == 1)) && ((IsAllocate (op2)) || (IsDeallocate (op2))))
2496 : : {
2497 : 72 : bbPtr->trashQuad = i;
2498 : : }
2499 : 17070 : if (i == bbPtr->end)
2500 : : {
2501 : 1401 : return;
2502 : : }
2503 : 15669 : i = M2Quads_GetNextQuad (i);
2504 : : }
2505 : : }
2506 : : }
2507 : :
2508 : :
2509 : : /*
2510 : : AppendEntry -
2511 : : */
2512 : :
2513 : 7367 : static void AppendEntry (M2BasicBlock_BasicBlock bb)
2514 : : {
2515 : 7367 : M2SymInit_bbEntry bbPtr;
2516 : 7367 : unsigned int high;
2517 : :
2518 : 7367 : high = Indexing_HighIndice (bbArray);
2519 : 7367 : bbPtr = NewEntry ();
2520 : 7367 : bbPtr->start = M2BasicBlock_GetBasicBlockStart (bb);
2521 : 7367 : bbPtr->end = M2BasicBlock_GetBasicBlockEnd (bb);
2522 : 7367 : bbPtr->first = high == 0;
2523 : 7367 : bbPtr->endCall = M2Quads_IsCall (bbPtr->end);
2524 : 7367 : bbPtr->endGoto = M2Quads_IsGoto (bbPtr->end);
2525 : 7367 : bbPtr->endCond = M2Quads_IsConditional (bbPtr->end);
2526 : 7367 : bbPtr->topOfLoop = M2Quads_IsBackReference (bbPtr->start);
2527 : 7367 : bbPtr->trashQuad = 0;
2528 : 7367 : bbPtr->indexBB = high+1;
2529 : 7367 : bbPtr->nextQuad = 0;
2530 : 7367 : bbPtr->condQuad = 0;
2531 : 7367 : bbPtr->nextBB = 0;
2532 : 7367 : bbPtr->condBB = 0;
2533 : 7367 : bbPtr->next = NULL;
2534 : 7367 : DetectTrash (bbPtr);
2535 : 7367 : Indexing_PutIndice (bbArray, high+1, reinterpret_cast <void *> (bbPtr));
2536 : 7367 : }
2537 : :
2538 : :
2539 : : /*
2540 : : DumpAlias -
2541 : : */
2542 : :
2543 : 0 : static void DumpAlias (Indexing_Index array, unsigned int aliasIndex)
2544 : : {
2545 : 0 : M2SymInit_symAlias sa;
2546 : :
2547 : 0 : sa = static_cast<M2SymInit_symAlias> (Indexing_GetIndice (array, aliasIndex));
2548 : 0 : M2Printf_printf2 ((const char *) "keySym = %d: alias = %d\\n", 25, (const unsigned char *) &sa->keySym, (sizeof (sa->keySym)-1), (const unsigned char *) &sa->alias, (sizeof (sa->alias)-1));
2549 : 0 : }
2550 : :
2551 : :
2552 : : /*
2553 : : doDumpAliases -
2554 : : */
2555 : :
2556 : 0 : static void doDumpAliases (Indexing_Index array)
2557 : : {
2558 : 0 : unsigned int i;
2559 : 0 : unsigned int n;
2560 : :
2561 : 0 : i = 1;
2562 : 0 : n = Indexing_HighIndice (array);
2563 : 0 : while (i <= n)
2564 : : {
2565 : 0 : DumpAlias (array, i);
2566 : 0 : i += 1;
2567 : : }
2568 : 0 : }
2569 : :
2570 : :
2571 : : /*
2572 : : DumpAliases -
2573 : : */
2574 : :
2575 : 654 : static void DumpAliases (void)
2576 : : {
2577 : 654 : if (Debugging)
2578 : : {
2579 : : M2Printf_printf0 ((const char *) "LArray\\n", 8);
2580 : : doDumpAliases (LArray);
2581 : : M2Printf_printf0 ((const char *) "IndirectArray\\n", 15);
2582 : : doDumpAliases (IndirectArray);
2583 : : }
2584 : 654 : }
2585 : :
2586 : :
2587 : : /*
2588 : : newAlias -
2589 : : */
2590 : :
2591 : 2764 : static M2SymInit_symAlias newAlias (void)
2592 : : {
2593 : 2764 : M2SymInit_symAlias sa;
2594 : :
2595 : 2764 : if (freeList == NULL)
2596 : : {
2597 : 1124 : Storage_ALLOCATE ((void **) &sa, sizeof (M2SymInit__T2));
2598 : : }
2599 : : else
2600 : : {
2601 : 1640 : sa = freeList;
2602 : 1640 : freeList = freeList->next;
2603 : : }
2604 : 2764 : return sa;
2605 : : /* static analysis guarentees a RETURN statement will be used before here. */
2606 : : __builtin_unreachable ();
2607 : : }
2608 : :
2609 : :
2610 : : /*
2611 : : initAlias -
2612 : : */
2613 : :
2614 : 2764 : static M2SymInit_symAlias initAlias (unsigned int sym)
2615 : : {
2616 : 2764 : M2SymInit_symAlias sa;
2617 : :
2618 : 0 : sa = newAlias ();
2619 : 2764 : sa->keySym = sym;
2620 : 2764 : sa->alias = SymbolTable_NulSym;
2621 : 2764 : sa->next = NULL;
2622 : 2764 : return sa;
2623 : : /* static analysis guarentees a RETURN statement will be used before here. */
2624 : : __builtin_unreachable ();
2625 : : }
2626 : :
2627 : :
2628 : : /*
2629 : : killAlias -
2630 : : */
2631 : :
2632 : 2764 : static void killAlias (M2SymInit_symAlias sa)
2633 : : {
2634 : 2764 : sa->next = freeList;
2635 : 2764 : freeList = sa;
2636 : 0 : }
2637 : :
2638 : :
2639 : : /*
2640 : : initBlock -
2641 : : */
2642 : :
2643 : 2946 : static void initBlock (void)
2644 : : {
2645 : 2946 : LArray = Indexing_InitIndex (1);
2646 : 2946 : IndirectArray = Indexing_InitIndex (1);
2647 : 2946 : Lists_InitList (&ignoreList);
2648 : 2946 : }
2649 : :
2650 : :
2651 : : /*
2652 : : killBlock -
2653 : : */
2654 : :
2655 : 2946 : static void killBlock (void)
2656 : : {
2657 : 2946 : doKillBlock (&LArray);
2658 : 2946 : doKillBlock (&IndirectArray);
2659 : 2946 : Lists_KillList (&ignoreList);
2660 : 2946 : }
2661 : :
2662 : :
2663 : : /*
2664 : : killBlock -
2665 : : */
2666 : :
2667 : 5892 : static void doKillBlock (Indexing_Index *array)
2668 : : {
2669 : 5892 : unsigned int i;
2670 : 5892 : unsigned int n;
2671 : :
2672 : 5892 : i = 1;
2673 : 5892 : n = Indexing_HighIndice ((*array));
2674 : 14548 : while (i <= n)
2675 : : {
2676 : 2764 : killAlias (reinterpret_cast <M2SymInit_symAlias> (Indexing_GetIndice ((*array), i)));
2677 : 2764 : i += 1;
2678 : : }
2679 : 5892 : (*array) = Indexing_KillIndex ((*array));
2680 : 5892 : }
2681 : :
2682 : :
2683 : : /*
2684 : : addAlias -
2685 : : */
2686 : :
2687 : 2812 : static void addAlias (Indexing_Index array, unsigned int sym, unsigned int aliased)
2688 : : {
2689 : 2812 : unsigned int i;
2690 : 2812 : unsigned int n;
2691 : 2812 : M2SymInit_symAlias sa;
2692 : :
2693 : 2812 : i = 1;
2694 : 2812 : n = Indexing_HighIndice (array);
2695 : 7948 : while (i <= n)
2696 : : {
2697 : 2372 : sa = static_cast<M2SymInit_symAlias> (Indexing_GetIndice (array, i));
2698 : 2372 : if (sa->keySym == sym)
2699 : : {
2700 : 48 : sa->alias = aliased;
2701 : 48 : return;
2702 : : }
2703 : 2324 : i += 1;
2704 : : }
2705 : 2764 : sa = initAlias (sym);
2706 : 2764 : Indexing_IncludeIndiceIntoIndex (array, reinterpret_cast <void *> (sa));
2707 : 2764 : sa->alias = aliased;
2708 : : }
2709 : :
2710 : :
2711 : : /*
2712 : : lookupAlias -
2713 : : */
2714 : :
2715 : 2754 : static M2SymInit_symAlias lookupAlias (Indexing_Index array, unsigned int sym)
2716 : : {
2717 : 2754 : unsigned int i;
2718 : 2754 : unsigned int n;
2719 : 2754 : M2SymInit_symAlias sa;
2720 : :
2721 : 2754 : i = 1;
2722 : 2754 : n = Indexing_HighIndice (array);
2723 : 8598 : while (i <= n)
2724 : : {
2725 : 4974 : sa = static_cast<M2SymInit_symAlias> (Indexing_GetIndice (array, i));
2726 : 4974 : if (sa->keySym == sym)
2727 : : {
2728 : : return sa;
2729 : : }
2730 : 3090 : i += 1;
2731 : : }
2732 : : return NULL;
2733 : : /* static analysis guarentees a RETURN statement will be used before here. */
2734 : : __builtin_unreachable ();
2735 : : }
2736 : :
2737 : :
2738 : : /*
2739 : : doGetAlias -
2740 : : */
2741 : :
2742 : 2754 : static unsigned int doGetAlias (Indexing_Index array, unsigned int sym)
2743 : : {
2744 : 2754 : M2SymInit_symAlias sa;
2745 : :
2746 : 0 : sa = lookupAlias (array, sym);
2747 : 2754 : if ((sa != NULL) && (sa->alias != SymbolTable_NulSym))
2748 : : {
2749 : : return sa->alias;
2750 : : }
2751 : : return SymbolTable_NulSym;
2752 : : /* static analysis guarentees a RETURN statement will be used before here. */
2753 : : __builtin_unreachable ();
2754 : : }
2755 : :
2756 : :
2757 : : /*
2758 : : getLAlias - attempts to looks up an alias which is not a temporary variable.
2759 : : */
2760 : :
2761 : 1482 : static unsigned int getLAlias (unsigned int sym)
2762 : : {
2763 : 1482 : unsigned int type;
2764 : 1482 : unsigned int nsym;
2765 : :
2766 : 1482 : nsym = sym;
2767 : 2730 : do {
2768 : 2730 : sym = nsym;
2769 : 2730 : type = SymbolTable_GetSType (sym);
2770 : 2730 : if (((SymbolTable_IsTemporary (sym)) && ((SymbolTable_GetMode (sym)) == SymbolTable_LeftValue)) || ((type != SymbolTable_NulSym) && (SymbolTable_IsReallyPointer (type))))
2771 : : {
2772 : 2022 : nsym = doGetAlias (LArray, sym);
2773 : : }
2774 : : else
2775 : : {
2776 : 708 : return sym;
2777 : : }
2778 : 2022 : } while (! (nsym == SymbolTable_NulSym));
2779 : : return sym;
2780 : : /* static analysis guarentees a RETURN statement will be used before here. */
2781 : : __builtin_unreachable ();
2782 : : }
2783 : :
2784 : :
2785 : : /*
2786 : : SetupLAlias -
2787 : : */
2788 : :
2789 : 1067 : static void SetupLAlias (unsigned int des, unsigned int exp)
2790 : : {
2791 : 1067 : if ((exp == M2Base_Nil) || ((SymbolTable_IsVar (exp)) && (((SymbolTable_GetMode (des)) == SymbolTable_LeftValue) || (SymbolTable_IsReallyPointer (SymbolTable_GetSType (des))))))
2792 : : {
2793 : 654 : addAlias (LArray, des, exp);
2794 : 654 : DumpAliases ();
2795 : : }
2796 : 1067 : }
2797 : :
2798 : :
2799 : : /*
2800 : : SetupIndr -
2801 : : */
2802 : :
2803 : 2158 : static void SetupIndr (unsigned int ptr, unsigned int content)
2804 : : {
2805 : 2158 : addAlias (IndirectArray, ptr, content);
2806 : 0 : }
2807 : :
2808 : :
2809 : : /*
2810 : : getContent - attempts to return the content pointed to by ptr.
2811 : : sym is the original symbol and ptr will be the equivalent lvalue.
2812 : : */
2813 : :
2814 : 756 : static unsigned int getContent (unsigned int ptr, unsigned int sym, unsigned int tok)
2815 : : {
2816 : 756 : if (ptr == M2Base_Nil)
2817 : : {
2818 : 24 : M2MetaError_MetaErrorT1 (tok, (const char *) "attempting to dereference {%1Wad} which will be a {%kNIL} pointer", 65, sym);
2819 : 24 : return SymbolTable_NulSym;
2820 : : }
2821 : : else
2822 : : {
2823 : 732 : return doGetAlias (IndirectArray, ptr);
2824 : : }
2825 : : /* static analysis guarentees a RETURN statement will be used before here. */
2826 : : __builtin_unreachable ();
2827 : : }
2828 : :
2829 : :
2830 : : /*
2831 : : init -
2832 : : */
2833 : :
2834 : 15392 : static void init (void)
2835 : : {
2836 : 15392 : freeList = NULL;
2837 : 15392 : bbFreeList = NULL;
2838 : 0 : Lists_InitList (&errorList);
2839 : 0 : }
2840 : :
2841 : :
2842 : : /*
2843 : : PrintSymInit -
2844 : : */
2845 : :
2846 : 15484038 : extern "C" M2SymInit_InitDesc M2SymInit_InitSymInit (void)
2847 : : {
2848 : 15484038 : M2SymInit_InitDesc__opaque id;
2849 : :
2850 : 15484038 : Storage_ALLOCATE ((void **) &id, sizeof (M2SymInit__T1));
2851 : 15484038 : id->sym = SymbolTable_NulSym;
2852 : 15484038 : id->type = SymbolTable_NulSym;
2853 : 15484038 : id->initialized = true;
2854 : 15484038 : id->kind = M2SymInit_scalar;
2855 : 15484038 : return static_cast<M2SymInit_InitDesc> (id);
2856 : : /* static analysis guarentees a RETURN statement will be used before here. */
2857 : : __builtin_unreachable ();
2858 : : }
2859 : :
2860 : :
2861 : : /*
2862 : : PrintSymInit -
2863 : : */
2864 : :
2865 : 0 : extern "C" void M2SymInit_KillSymInit (M2SymInit_InitDesc *desc)
2866 : : {
2867 : 0 : switch (static_cast<M2SymInit_InitDesc__opaque> ((*desc))->kind)
2868 : : {
2869 : 0 : case M2SymInit_record:
2870 : 0 : KillFieldDesc (&static_cast<M2SymInit_InitDesc__opaque> ((*desc))->rec.fieldDesc);
2871 : 0 : break;
2872 : :
2873 : :
2874 : : default:
2875 : : break;
2876 : : }
2877 : 0 : Storage_DEALLOCATE ((void **) &(*desc), sizeof (M2SymInit__T1));
2878 : 0 : (*desc) = static_cast<M2SymInit_InitDesc> (NULL);
2879 : 0 : }
2880 : :
2881 : :
2882 : : /*
2883 : : PrintSymInit -
2884 : : */
2885 : :
2886 : 15118638 : extern "C" void M2SymInit_ConfigSymInit (M2SymInit_InitDesc desc, unsigned int sym)
2887 : : {
2888 : 15118638 : if ((SymbolTable_IsVar (sym)) || (SymbolTable_IsRecordField (sym)))
2889 : : {
2890 : 15118218 : static_cast<M2SymInit_InitDesc__opaque> (desc)->sym = sym;
2891 : 15118218 : static_cast<M2SymInit_InitDesc__opaque> (desc)->type = SymbolTable_GetSType (sym);
2892 : 15118218 : static_cast<M2SymInit_InitDesc__opaque> (desc)->initialized = false;
2893 : 15118218 : if (SymbolTable_IsRecord (static_cast<M2SymInit_InitDesc__opaque> (desc)->type))
2894 : : {
2895 : 68824 : static_cast<M2SymInit_InitDesc__opaque> (desc)->kind = M2SymInit_record;
2896 : 68824 : static_cast<M2SymInit_InitDesc__opaque> (desc)->rec.fieldDesc = Indexing_InitIndex (1);
2897 : 68824 : PopulateFields (static_cast<M2SymInit_InitDesc__opaque> (desc), static_cast<M2SymInit_InitDesc__opaque> (desc)->type);
2898 : : }
2899 : : else
2900 : : {
2901 : 15049394 : static_cast<M2SymInit_InitDesc__opaque> (desc)->kind = M2SymInit_scalar;
2902 : 15049394 : if (SymbolTable_IsArray (static_cast<M2SymInit_InitDesc__opaque> (desc)->type))
2903 : : {
2904 : 172128 : static_cast<M2SymInit_InitDesc__opaque> (desc)->initialized = true; /* For now we don't attempt to handle array types. */
2905 : : }
2906 : : }
2907 : : }
2908 : 15118638 : }
2909 : :
2910 : :
2911 : : /*
2912 : : PopulateFields -
2913 : : */
2914 : :
2915 : 5769 : extern "C" void M2SymInit_SetInitialized (M2SymInit_InitDesc desc)
2916 : : {
2917 : 5769 : static_cast<M2SymInit_InitDesc__opaque> (desc)->initialized = true;
2918 : 5769 : }
2919 : :
2920 : :
2921 : : /*
2922 : : PopulateFields -
2923 : : */
2924 : :
2925 : 2872 : extern "C" bool M2SymInit_GetInitialized (M2SymInit_InitDesc desc)
2926 : : {
2927 : 2872 : if (! static_cast<M2SymInit_InitDesc__opaque> (desc)->initialized)
2928 : : {
2929 : 367 : if (SymbolTable_IsRecord (static_cast<M2SymInit_InitDesc__opaque> (desc)->type))
2930 : : {
2931 : 108 : TrySetInitialized (static_cast<M2SymInit_InitDesc__opaque> (desc));
2932 : : }
2933 : : }
2934 : 2872 : if (Debugging)
2935 : : {
2936 : : M2SymInit_PrintSymInit (desc);
2937 : : }
2938 : 2872 : return static_cast<M2SymInit_InitDesc__opaque> (desc)->initialized;
2939 : : /* static analysis guarentees a RETURN statement will be used before here. */
2940 : : __builtin_unreachable ();
2941 : : }
2942 : :
2943 : :
2944 : : /*
2945 : : PopulateFields -
2946 : : */
2947 : :
2948 : 1080 : extern "C" M2SymInit_InitDesc M2SymInit_GetFieldDesc (M2SymInit_InitDesc desc, unsigned int field)
2949 : : {
2950 : 1080 : unsigned int fsym;
2951 : 1080 : unsigned int i;
2952 : :
2953 : 1080 : if (SymbolTable_IsRecord (static_cast<M2SymInit_InitDesc__opaque> (desc)->type))
2954 : : {
2955 : : i = 1;
2956 : 1506 : do {
2957 : 1506 : fsym = SymbolTable_GetNth (static_cast<M2SymInit_InitDesc__opaque> (desc)->type, i);
2958 : 1506 : if (field == fsym)
2959 : : {
2960 : 1008 : return static_cast<M2SymInit_InitDesc> (Indexing_GetIndice (static_cast<M2SymInit_InitDesc__opaque> (desc)->rec.fieldDesc, i));
2961 : : }
2962 : 498 : i += 1;
2963 : 498 : } while (! (fsym == SymbolTable_NulSym));
2964 : : }
2965 : : return static_cast<M2SymInit_InitDesc> (NULL);
2966 : : /* static analysis guarentees a RETURN statement will be used before here. */
2967 : : __builtin_unreachable ();
2968 : : }
2969 : :
2970 : :
2971 : : /*
2972 : : PopulateFields -
2973 : : */
2974 : :
2975 : 684 : extern "C" bool M2SymInit_SetFieldInitialized (M2SymInit_InitDesc desc, Lists_List fieldlist)
2976 : : {
2977 : 684 : return SetFieldInitializedNo (static_cast<M2SymInit_InitDesc__opaque> (desc), fieldlist, 1);
2978 : : /* static analysis guarentees a RETURN statement will be used before here. */
2979 : : __builtin_unreachable ();
2980 : : }
2981 : :
2982 : :
2983 : : /*
2984 : : SetFieldInitializedNo -
2985 : : */
2986 : :
2987 : 204 : extern "C" bool M2SymInit_GetFieldInitialized (M2SymInit_InitDesc desc, Lists_List fieldlist)
2988 : : {
2989 : 204 : return GetFieldInitializedNo (static_cast<M2SymInit_InitDesc__opaque> (desc), fieldlist, 1);
2990 : : /* static analysis guarentees a RETURN statement will be used before here. */
2991 : : __builtin_unreachable ();
2992 : : }
2993 : :
2994 : :
2995 : : /*
2996 : : ScopeBlockVariableAnalysis - checks to see whether a variable is
2997 : : read before it has been initialized.
2998 : : */
2999 : :
3000 : 316541 : extern "C" void M2SymInit_ScopeBlockVariableAnalysis (unsigned int Scope, unsigned int Start, unsigned int End)
3001 : : {
3002 : 316541 : M2BasicBlock_BasicBlock bb;
3003 : 316541 : Lists_List lst;
3004 : :
3005 : 316541 : if (M2Options_UninitVariableChecking)
3006 : : {
3007 : 2840 : bbArray = Indexing_InitIndex (1);
3008 : 2840 : bb = M2BasicBlock_InitBasicBlocksFromRange (Scope, Start, End);
3009 : 2840 : M2BasicBlock_ForeachBasicBlockDo (bb, (M2BasicBlock_BasicBlockProc) {(M2BasicBlock_BasicBlockProc_t) AppendEntry});
3010 : 2840 : M2BasicBlock_KillBasicBlocks (&bb);
3011 : 2840 : GenerateCFG ();
3012 : 2840 : if (Scope != SymbolTable_NulSym)
3013 : : {
3014 : 2840 : Lists_InitList (&lst);
3015 : 2840 : if (Debugging)
3016 : : {
3017 : : DumpBBArray (Scope);
3018 : : if (M2Options_UninitVariableConditionalChecking)
3019 : : {
3020 : : M2Printf_printf0 ((const char *) "UninitVariableConditionalChecking is TRUE\\n", 43);
3021 : : }
3022 : : }
3023 : 2840 : CreateBBPermultations (Scope, 1, lst);
3024 : 2840 : Lists_KillList (&lst);
3025 : : }
3026 : 2840 : bbArrayKill ();
3027 : : }
3028 : 316541 : }
3029 : :
3030 : :
3031 : : /*
3032 : : PrintSymInit -
3033 : : */
3034 : :
3035 : 0 : extern "C" void M2SymInit_PrintSymInit (M2SymInit_InitDesc desc)
3036 : : {
3037 : 0 : unsigned int i;
3038 : 0 : unsigned int n;
3039 : :
3040 : 0 : libc_printf ((const char *) "sym %d: type %d ", 16, static_cast<M2SymInit_InitDesc__opaque> (desc)->sym, static_cast<M2SymInit_InitDesc__opaque> (desc)->type);
3041 : 0 : if (static_cast<M2SymInit_InitDesc__opaque> (desc)->kind == M2SymInit_scalar)
3042 : : {
3043 : 0 : libc_printf ((const char *) "scalar", 6);
3044 : : }
3045 : : else
3046 : : {
3047 : 0 : libc_printf ((const char *) "record", 6);
3048 : : }
3049 : 0 : if (! static_cast<M2SymInit_InitDesc__opaque> (desc)->initialized)
3050 : : {
3051 : 0 : libc_printf ((const char *) " not", 4);
3052 : : }
3053 : 0 : libc_printf ((const char *) " initialized\\n", 14);
3054 : 0 : if ((static_cast<M2SymInit_InitDesc__opaque> (desc)->type != SymbolTable_NulSym) && (SymbolTable_IsRecord (static_cast<M2SymInit_InitDesc__opaque> (desc)->type)))
3055 : : {
3056 : 0 : i = 1;
3057 : 0 : n = Indexing_HighIndice (static_cast<M2SymInit_InitDesc__opaque> (desc)->rec.fieldDesc);
3058 : 0 : while (i <= n)
3059 : : {
3060 : 0 : M2SymInit_PrintSymInit (static_cast<M2SymInit_InitDesc> (Indexing_GetIndice (static_cast<M2SymInit_InitDesc__opaque> (desc)->rec.fieldDesc, i)));
3061 : 0 : i += 1;
3062 : : }
3063 : : }
3064 : 0 : }
3065 : :
3066 : 15392 : extern "C" void _M2_M2SymInit_init (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
3067 : : {
3068 : 15392 : init ();
3069 : 15392 : }
3070 : :
3071 : 0 : extern "C" void _M2_M2SymInit_fini (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
3072 : : {
3073 : 0 : }
|