Branch data Line data Source code
1 : : /* do not edit automatically generated by mc from M2Scope. */
2 : : /* M2Scope.mod derive the subset of quadruples for each scope.
3 : :
4 : : Copyright (C) 2003-2024 Free Software Foundation, Inc.
5 : : Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
6 : :
7 : : This file is part of GNU Modula-2.
8 : :
9 : : GNU Modula-2 is free software; you can redistribute it and/or modify
10 : : it under the terms of the GNU General Public License as published by
11 : : the Free Software Foundation; either version 3, or (at your option)
12 : : any later version.
13 : :
14 : : GNU Modula-2 is distributed in the hope that it will be useful, but
15 : : WITHOUT ANY WARRANTY; without even the implied warranty of
16 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 : : General Public License for more details.
18 : :
19 : : You should have received a copy of the GNU General Public License
20 : : along with GNU Modula-2; see the file COPYING3. If not see
21 : : <http://www.gnu.org/licenses/>. */
22 : :
23 : : #include "config.h"
24 : : #include "system.h"
25 : : #include "gcc-consolidation.h"
26 : :
27 : : #include <stdbool.h>
28 : : # if !defined (PROC_D)
29 : : # define PROC_D
30 : : typedef void (*PROC_t) (void);
31 : : typedef struct { PROC_t proc; } PROC;
32 : : # endif
33 : :
34 : : # if !defined (TRUE)
35 : : # define TRUE (1==1)
36 : : # endif
37 : :
38 : : # if !defined (FALSE)
39 : : # define FALSE (1==0)
40 : : # endif
41 : :
42 : : # include "GStorage.h"
43 : : # include "Gmcrts.h"
44 : : #if defined(__cplusplus)
45 : : # undef NULL
46 : : # define NULL 0
47 : : #endif
48 : : #define _M2Scope_C
49 : :
50 : : #include "GM2Scope.h"
51 : : # include "GStorage.h"
52 : : # include "GM2Debug.h"
53 : : # include "GNameKey.h"
54 : : # include "GSymbolTable.h"
55 : : # include "GM2Printf.h"
56 : : # include "GM2Quads.h"
57 : : # include "GM2StackWord.h"
58 : : # include "GM2Error.h"
59 : :
60 : : typedef struct M2Scope_ScopeProcedure2_p M2Scope_ScopeProcedure2;
61 : :
62 : : typedef struct M2Scope_ScopeProcedure3_p M2Scope_ScopeProcedure3;
63 : :
64 : : # define Debugging false
65 : : # define TraceQuadruples false
66 : : typedef struct M2Scope__T1_r M2Scope__T1;
67 : :
68 : : typedef enum {M2Scope_unsetscope, M2Scope_ignorescope, M2Scope_procedurescope, M2Scope_modulescope, M2Scope_definitionscope, M2Scope_implementationscope, M2Scope_programscope} M2Scope_scopeKind;
69 : :
70 : : typedef M2Scope__T1 *M2Scope_ScopeBlock__opaque;
71 : :
72 : : struct M2Scope__T1_r {
73 : : unsigned int scopeSym;
74 : : M2Scope_scopeKind kindScope;
75 : : unsigned int low;
76 : : unsigned int high;
77 : : M2Scope_ScopeBlock__opaque next;
78 : : };
79 : :
80 : : static M2Scope_ScopeBlock__opaque FreeList;
81 : :
82 : : /*
83 : : InitScopeBlock -
84 : : */
85 : :
86 : : extern "C" M2Scope_ScopeBlock M2Scope_InitScopeBlock (unsigned int scope);
87 : :
88 : : /*
89 : : KillScopeBlock - destroys the ScopeBlock sb and assign sb to NIL.
90 : : */
91 : :
92 : : extern "C" void M2Scope_KillScopeBlock (M2Scope_ScopeBlock *sb);
93 : :
94 : : /*
95 : : ForeachScopeBlockDo2 - calls a procedure p for each block of contigeous quadruples
96 : : defining an outer scope sb.
97 : : */
98 : :
99 : : extern "C" void M2Scope_ForeachScopeBlockDo2 (M2Scope_ScopeBlock sb, M2Scope_ScopeProcedure2 p);
100 : :
101 : : /*
102 : : ForeachScopeBlockDo3 - calls a procedure p for each block of contigeous quadruples
103 : : defining an outer scope sb.
104 : : */
105 : :
106 : : extern "C" void M2Scope_ForeachScopeBlockDo3 (M2Scope_ScopeBlock sb, M2Scope_ScopeProcedure3 p);
107 : :
108 : : /*
109 : : New -
110 : : */
111 : :
112 : : static void New (M2Scope_ScopeBlock__opaque *sb);
113 : :
114 : : /*
115 : : Dispose -
116 : : */
117 : :
118 : : static void Dispose (M2Scope_ScopeBlock__opaque *sb);
119 : :
120 : : /*
121 : : SetScope - assigns the scopeSym and kindScope.
122 : : */
123 : :
124 : : static void SetScope (M2Scope_ScopeBlock__opaque sb, unsigned int sym, M2Scope_scopeKind kindScope);
125 : :
126 : : /*
127 : : AddToRange - returns a ScopeBlock pointer to the last block. The,
128 : : quad, will be added to the end of sb or a later block
129 : : if First is TRUE.
130 : : */
131 : :
132 : : static M2Scope_ScopeBlock__opaque AddToRange (M2Scope_ScopeBlock__opaque sb, bool First, unsigned int quad);
133 : :
134 : : /*
135 : : GetGlobalQuads -
136 : : */
137 : :
138 : : static M2Scope_ScopeBlock__opaque GetGlobalQuads (M2Scope_ScopeBlock__opaque sb, unsigned int scope);
139 : :
140 : : /*
141 : : GetProcQuads -
142 : : */
143 : :
144 : : static M2Scope_ScopeBlock__opaque GetProcQuads (M2Scope_ScopeBlock__opaque sb, unsigned int proc);
145 : :
146 : : /*
147 : : DisplayScope -
148 : : */
149 : :
150 : : static void DisplayScope (M2Scope_ScopeBlock__opaque sb);
151 : :
152 : : /*
153 : : enter -
154 : : */
155 : :
156 : : static void enter (M2Scope_ScopeBlock__opaque sb);
157 : :
158 : : /*
159 : : leave -
160 : : */
161 : :
162 : : static void leave (M2Scope_ScopeBlock__opaque sb);
163 : :
164 : : /*
165 : : Init - initializes the global variables for this module.
166 : : */
167 : :
168 : : static void Init (void);
169 : :
170 : :
171 : : /*
172 : : New -
173 : : */
174 : :
175 : 27763190 : static void New (M2Scope_ScopeBlock__opaque *sb)
176 : : {
177 : 27763190 : if (FreeList == NULL)
178 : : {
179 : 510260 : Storage_ALLOCATE ((void **) &(*sb), sizeof (M2Scope__T1));
180 : : }
181 : : else
182 : : {
183 : 27252930 : (*sb) = FreeList;
184 : 27252930 : FreeList = FreeList->next;
185 : : }
186 : 27763190 : }
187 : :
188 : :
189 : : /*
190 : : Dispose -
191 : : */
192 : :
193 : 27762440 : static void Dispose (M2Scope_ScopeBlock__opaque *sb)
194 : : {
195 : 27762440 : (*sb)->next = FreeList;
196 : 27762440 : FreeList = (*sb);
197 : 27762440 : (*sb) = static_cast<M2Scope_ScopeBlock__opaque> (NULL);
198 : 27762440 : }
199 : :
200 : :
201 : : /*
202 : : SetScope - assigns the scopeSym and kindScope.
203 : : */
204 : :
205 : 35436220 : static void SetScope (M2Scope_ScopeBlock__opaque sb, unsigned int sym, M2Scope_scopeKind kindScope)
206 : : {
207 : 35436220 : sb->scopeSym = sym;
208 : 35436220 : sb->kindScope = kindScope;
209 : 24685820 : }
210 : :
211 : :
212 : : /*
213 : : AddToRange - returns a ScopeBlock pointer to the last block. The,
214 : : quad, will be added to the end of sb or a later block
215 : : if First is TRUE.
216 : : */
217 : :
218 : 104009757 : static M2Scope_ScopeBlock__opaque AddToRange (M2Scope_ScopeBlock__opaque sb, bool First, unsigned int quad)
219 : : {
220 : 104009757 : if (First)
221 : : {
222 : 26653100 : if (sb->high == 0)
223 : : {
224 : 571192 : sb->high = sb->low;
225 : : }
226 : 26653100 : sb->next = static_cast<M2Scope_ScopeBlock__opaque> (M2Scope_InitScopeBlock (SymbolTable_NulSym));
227 : 26653100 : sb = sb->next;
228 : : }
229 : 104009757 : if (sb->low == 0)
230 : : {
231 : 26654366 : sb->low = quad;
232 : : }
233 : 104009757 : sb->high = quad;
234 : 104009757 : return sb;
235 : : /* static analysis guarentees a RETURN statement will be used before here. */
236 : : __builtin_unreachable ();
237 : : }
238 : :
239 : :
240 : : /*
241 : : GetGlobalQuads -
242 : : */
243 : :
244 : 570046 : static M2Scope_ScopeBlock__opaque GetGlobalQuads (M2Scope_ScopeBlock__opaque sb, unsigned int scope)
245 : : {
246 : 570046 : M2Scope_ScopeBlock__opaque prev;
247 : 570046 : M2Scope_ScopeBlock__opaque nb;
248 : 570046 : unsigned int NestedLevel;
249 : 570046 : unsigned int i;
250 : 570046 : M2Quads_QuadOperator op;
251 : 570046 : unsigned int op1;
252 : 570046 : unsigned int op2;
253 : 570046 : unsigned int op3;
254 : 570046 : bool First;
255 : 570046 : unsigned int start;
256 : 570046 : unsigned int end;
257 : :
258 : 570046 : NestedLevel = 0;
259 : 570046 : prev = static_cast<M2Scope_ScopeBlock__opaque> (NULL);
260 : 570046 : First = false;
261 : 570046 : if (((SymbolTable_GetScope (scope)) != SymbolTable_NulSym) && ((SymbolTable_IsProcedure (SymbolTable_GetScope (scope))) || ((SymbolTable_IsModule (scope)) && (SymbolTable_IsModuleWithinProcedure (scope)))))
262 : : {
263 : 1266 : SymbolTable_GetProcedureQuads (SymbolTable_GetProcedureScope (scope), &i, &start, &end);
264 : 1266 : M2Quads_GetQuad (i, &op, &op1, &op2, &op3);
265 : 5676 : while ((op != M2Quads_ModuleScopeOp) || (op3 != scope))
266 : : {
267 : 3144 : i = M2Quads_GetNextQuad (i);
268 : 3144 : M2Quads_GetQuad (i, &op, &op1, &op2, &op3);
269 : : }
270 : 1266 : end = i;
271 : 1266 : M2Quads_GetQuad (end, &op, &op1, &op2, &op3);
272 : 13890 : while ((op != M2Quads_FinallyEndOp) || (op3 != scope))
273 : : {
274 : 11358 : end = M2Quads_GetNextQuad (end);
275 : 11358 : M2Quads_GetQuad (end, &op, &op1, &op2, &op3);
276 : : }
277 : : }
278 : : else
279 : : {
280 : 568780 : i = M2Quads_GetFirstQuad ();
281 : 568780 : end = 0;
282 : : }
283 : 570046 : nb = sb;
284 : 570046 : sb->low = 0;
285 : 570046 : sb->high = 0;
286 : 1573965742 : for (;;)
287 : : {
288 : 787267894 : if (i == 0)
289 : : {
290 : : if (Debugging)
291 : : {
292 : : DisplayScope (sb);
293 : : }
294 : : return sb;
295 : : }
296 : 786699114 : M2Quads_GetQuad (i, &op, &op1, &op2, &op3);
297 : 786699114 : if (op == M2Quads_ProcedureScopeOp)
298 : : {
299 : 11710814 : NestedLevel += 1;
300 : : }
301 : 774988300 : else if (op == M2Quads_ReturnOp)
302 : : {
303 : : /* avoid dangling else. */
304 : 11710814 : if (NestedLevel > 0)
305 : : {
306 : 11710814 : NestedLevel -= 1;
307 : : }
308 : 11710814 : if (NestedLevel == 0)
309 : : {
310 : 11691320 : First = true;
311 : : }
312 : : }
313 : 763277486 : else if (NestedLevel == 0)
314 : : {
315 : : /* avoid dangling else. */
316 : 90978696 : if (op == M2Quads_StartDefFileOp)
317 : : {
318 : 10750400 : nb = AddToRange (nb, true, i);
319 : 10750400 : SetScope (nb, op3, M2Scope_definitionscope);
320 : 10750400 : prev = nb;
321 : : }
322 : 80228296 : else if ((op == M2Quads_StartModFileOp) || (op == M2Quads_InitStartOp))
323 : : {
324 : : /* avoid dangling else. */
325 : 15840058 : nb = AddToRange (nb, true, i);
326 : 15840058 : if (SymbolTable_IsDefImp (op3))
327 : : {
328 : 14813608 : SetScope (nb, op3, M2Scope_implementationscope);
329 : : }
330 : : else
331 : : {
332 : 1026450 : SetScope (nb, op3, M2Scope_programscope);
333 : : }
334 : : prev = nb;
335 : : }
336 : : else
337 : : {
338 : : /* avoid dangling else. */
339 : 64388238 : nb = AddToRange (nb, First, i);
340 : 64388238 : if (op == M2Quads_InitEndOp)
341 : : {
342 : 7937936 : if (SymbolTable_IsDefImp (op3))
343 : : {
344 : 7406804 : SetScope (nb, op3, M2Scope_implementationscope);
345 : : }
346 : : else
347 : : {
348 : 531132 : SetScope (nb, op3, M2Scope_programscope);
349 : : }
350 : : prev = nb;
351 : : }
352 : 56450302 : else if (First)
353 : : {
354 : : /* avoid dangling else. */
355 : 60158 : M2Debug_Assert (prev != NULL);
356 : 60158 : SetScope (nb, prev->scopeSym, prev->kindScope);
357 : : }
358 : : }
359 : : First = false;
360 : : }
361 : 786699114 : if (i == end)
362 : : {
363 : : if (Debugging)
364 : : {
365 : : DisplayScope (sb);
366 : : }
367 : : return sb;
368 : : }
369 : 786697848 : i = M2Quads_GetNextQuad (i);
370 : : }
371 : : ReturnException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/M2Scope.def", 20, 1);
372 : : __builtin_unreachable ();
373 : : }
374 : :
375 : :
376 : : /*
377 : : GetProcQuads -
378 : : */
379 : :
380 : 540044 : static M2Scope_ScopeBlock__opaque GetProcQuads (M2Scope_ScopeBlock__opaque sb, unsigned int proc)
381 : : {
382 : 540044 : M2Scope_ScopeBlock__opaque nb;
383 : 540044 : unsigned int scope;
384 : 540044 : unsigned int start;
385 : 540044 : unsigned int end;
386 : 540044 : unsigned int i;
387 : 540044 : unsigned int last;
388 : 540044 : M2Quads_QuadOperator op;
389 : 540044 : unsigned int op1;
390 : 540044 : unsigned int op2;
391 : 540044 : unsigned int op3;
392 : 540044 : bool First;
393 : 540044 : M2StackWord_StackOfWord s;
394 : 540044 : NameKey_Name n;
395 : :
396 : 540044 : s = M2StackWord_InitStackWord ();
397 : 540044 : if (Debugging)
398 : : {
399 : : n = SymbolTable_GetSymName (proc);
400 : : M2Printf_printf1 ((const char *) "GetProcQuads for %a\\n", 21, (const unsigned char *) &n, (sizeof (n)-1));
401 : : }
402 : 540044 : M2Debug_Assert (SymbolTable_IsProcedure (proc));
403 : 540044 : SymbolTable_GetProcedureQuads (proc, &scope, &start, &end);
404 : 540044 : if (Debugging)
405 : : {
406 : : M2Printf_printf1 ((const char *) " proc %d\\n", 10, (const unsigned char *) &proc, (sizeof (proc)-1));
407 : : M2Printf_printf1 ((const char *) " scope %d\\n", 11, (const unsigned char *) &scope, (sizeof (scope)-1));
408 : : M2Printf_printf1 ((const char *) " start %d\\n", 11, (const unsigned char *) &start, (sizeof (start)-1));
409 : : M2Printf_printf1 ((const char *) " end %d\\n", 9, (const unsigned char *) &end, (sizeof (end)-1));
410 : : }
411 : 540044 : M2StackWord_PushWord (s, static_cast<unsigned int> (0));
412 : 540044 : First = false;
413 : 540044 : i = scope;
414 : 540044 : last = scope;
415 : 540044 : nb = sb;
416 : 540044 : sb->low = scope;
417 : 540044 : sb->high = 0;
418 : 540044 : SetScope (sb, proc, M2Scope_procedurescope);
419 : 14222071 : while ((i <= end) && (start != 0))
420 : : {
421 : 13682027 : M2Quads_GetQuad (i, &op, &op1, &op2, &op3);
422 : 13682027 : if ((op == M2Quads_ProcedureScopeOp) || (op == M2Quads_ModuleScopeOp))
423 : : {
424 : 307624 : if (((M2StackWord_PeepWord (s, 1)) == proc) && (op3 == proc))
425 : : {
426 : 0 : nb = AddToRange (nb, First, last);
427 : 0 : First = false;
428 : : }
429 : 307624 : M2StackWord_PushWord (s, op3);
430 : 307624 : if (op == M2Quads_ProcedureScopeOp)
431 : : {
432 : 306742 : SetScope (nb, proc, M2Scope_procedurescope);
433 : : }
434 : : else
435 : : {
436 : 882 : SetScope (nb, proc, M2Scope_modulescope);
437 : : }
438 : : }
439 : 13374403 : else if ((op == M2Quads_ReturnOp) || (op == M2Quads_FinallyEndOp))
440 : : {
441 : : /* avoid dangling else. */
442 : 307624 : op3 = static_cast<unsigned int> (M2StackWord_PopWord (s));
443 : 307624 : if ((M2StackWord_PeepWord (s, 1)) == proc)
444 : : {
445 : 13682027 : First = true;
446 : : }
447 : : }
448 : : else
449 : : {
450 : : /* avoid dangling else. */
451 : 13066779 : if ((M2StackWord_PeepWord (s, 1)) == proc)
452 : : {
453 : 13031061 : nb = AddToRange (nb, First, i);
454 : 13031061 : First = false;
455 : : }
456 : : }
457 : 13682027 : last = i;
458 : 13682027 : i = M2Quads_GetNextQuad (i);
459 : : }
460 : 540044 : if (start <= nb->high)
461 : : {
462 : 540044 : nb->high = end;
463 : : }
464 : : else
465 : : {
466 : 0 : nb->next = static_cast<M2Scope_ScopeBlock__opaque> (M2Scope_InitScopeBlock (SymbolTable_NulSym));
467 : 0 : nb = nb->next;
468 : 0 : SetScope (nb, proc, M2Scope_unsetscope);
469 : 0 : nb->low = start;
470 : 0 : nb->high = end;
471 : : }
472 : 540044 : s = M2StackWord_KillStackWord (s);
473 : 540044 : return sb;
474 : : /* static analysis guarentees a RETURN statement will be used before here. */
475 : : __builtin_unreachable ();
476 : : }
477 : :
478 : :
479 : : /*
480 : : DisplayScope -
481 : : */
482 : :
483 : 0 : static void DisplayScope (M2Scope_ScopeBlock__opaque sb)
484 : : {
485 : 0 : NameKey_Name name;
486 : :
487 : 0 : M2Printf_printf0 ((const char *) "scope: ", 7);
488 : 0 : switch (sb->kindScope)
489 : : {
490 : 0 : case M2Scope_unsetscope:
491 : 0 : M2Printf_printf0 ((const char *) "unset", 5);
492 : 0 : break;
493 : :
494 : 0 : case M2Scope_ignorescope:
495 : 0 : M2Printf_printf0 ((const char *) "ignore", 6);
496 : 0 : break;
497 : :
498 : 0 : case M2Scope_procedurescope:
499 : 0 : name = SymbolTable_GetSymName (sb->scopeSym);
500 : 0 : M2Printf_printf1 ((const char *) "procedure %a", 12, (const unsigned char *) &name, (sizeof (name)-1));
501 : 0 : break;
502 : :
503 : 0 : case M2Scope_modulescope:
504 : 0 : name = SymbolTable_GetSymName (sb->scopeSym);
505 : 0 : M2Printf_printf1 ((const char *) "inner module %a", 15, (const unsigned char *) &name, (sizeof (name)-1));
506 : 0 : break;
507 : :
508 : 0 : case M2Scope_definitionscope:
509 : 0 : name = SymbolTable_GetSymName (sb->scopeSym);
510 : 0 : M2Printf_printf1 ((const char *) "definition module %a", 20, (const unsigned char *) &name, (sizeof (name)-1));
511 : 0 : break;
512 : :
513 : 0 : case M2Scope_implementationscope:
514 : 0 : name = SymbolTable_GetSymName (sb->scopeSym);
515 : 0 : M2Printf_printf1 ((const char *) "implementation module %a", 24, (const unsigned char *) &name, (sizeof (name)-1));
516 : 0 : break;
517 : :
518 : 0 : case M2Scope_programscope:
519 : 0 : name = SymbolTable_GetSymName (sb->scopeSym);
520 : 0 : M2Printf_printf1 ((const char *) "program module %a", 17, (const unsigned char *) &name, (sizeof (name)-1));
521 : 0 : break;
522 : :
523 : :
524 : 0 : default:
525 : 0 : CaseException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/M2Scope.def", 20, 1);
526 : 0 : __builtin_unreachable ();
527 : : }
528 : 0 : M2Printf_printf0 ((const char *) "\\n", 2);
529 : 0 : M2Quads_DisplayQuadRange (sb->scopeSym, sb->low, sb->high);
530 : 0 : if (sb->next != NULL)
531 : : {
532 : 0 : DisplayScope (sb->next);
533 : : }
534 : 0 : }
535 : :
536 : :
537 : : /*
538 : : enter -
539 : : */
540 : :
541 : 82600719 : static void enter (M2Scope_ScopeBlock__opaque sb)
542 : : {
543 : 82600719 : switch (sb->kindScope)
544 : : {
545 : : case M2Scope_unsetscope:
546 : : case M2Scope_ignorescope:
547 : : break;
548 : :
549 : 80902701 : case M2Scope_procedurescope:
550 : 80902701 : case M2Scope_modulescope:
551 : 80902701 : case M2Scope_definitionscope:
552 : 80902701 : case M2Scope_implementationscope:
553 : 80902701 : case M2Scope_programscope:
554 : 80902701 : M2Error_EnterErrorScope (SymbolTable_GetErrorScope (sb->scopeSym));
555 : 80902701 : break;
556 : :
557 : :
558 : 0 : default:
559 : 0 : CaseException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/M2Scope.def", 20, 1);
560 : 0 : __builtin_unreachable ();
561 : : }
562 : 82600719 : }
563 : :
564 : :
565 : : /*
566 : : leave -
567 : : */
568 : :
569 : 82600647 : static void leave (M2Scope_ScopeBlock__opaque sb)
570 : : {
571 : 0 : switch (sb->kindScope)
572 : : {
573 : : case M2Scope_unsetscope:
574 : : case M2Scope_ignorescope:
575 : : break;
576 : :
577 : :
578 : 80902629 : default:
579 : 80902629 : M2Error_LeaveErrorScope ();
580 : 80902629 : break;
581 : : }
582 : 0 : }
583 : :
584 : :
585 : : /*
586 : : Init - initializes the global variables for this module.
587 : : */
588 : :
589 : 0 : static void Init (void)
590 : : {
591 : 0 : FreeList = static_cast<M2Scope_ScopeBlock__opaque> (NULL);
592 : 0 : }
593 : :
594 : :
595 : : /*
596 : : InitScopeBlock -
597 : : */
598 : :
599 : 27763190 : extern "C" M2Scope_ScopeBlock M2Scope_InitScopeBlock (unsigned int scope)
600 : : {
601 : 27763190 : M2Scope_ScopeBlock__opaque sb;
602 : :
603 : 27763190 : New (&sb);
604 : 27763190 : sb->next = static_cast<M2Scope_ScopeBlock__opaque> (NULL);
605 : 27763190 : sb->kindScope = M2Scope_unsetscope;
606 : 27763190 : if (scope == SymbolTable_NulSym)
607 : : {
608 : 26653100 : sb->low = 0;
609 : 26653100 : sb->high = 0;
610 : : }
611 : : else
612 : : {
613 : 1110090 : if (SymbolTable_IsProcedure (scope))
614 : : {
615 : 540044 : sb = GetProcQuads (sb, scope);
616 : : }
617 : : else
618 : : {
619 : 570046 : sb = GetGlobalQuads (sb, scope);
620 : : }
621 : : if (TraceQuadruples)
622 : : {
623 : : DisplayScope (sb);
624 : : }
625 : : }
626 : 27763190 : return static_cast<M2Scope_ScopeBlock> (sb);
627 : : /* static analysis guarentees a RETURN statement will be used before here. */
628 : : __builtin_unreachable ();
629 : : }
630 : :
631 : :
632 : : /*
633 : : KillScopeBlock - destroys the ScopeBlock sb and assign sb to NIL.
634 : : */
635 : :
636 : 1109964 : extern "C" void M2Scope_KillScopeBlock (M2Scope_ScopeBlock *sb)
637 : : {
638 : 1109964 : M2Scope_ScopeBlock__opaque t;
639 : :
640 : 1109964 : t = static_cast<M2Scope_ScopeBlock__opaque> ((*sb));
641 : 28872404 : while (t != NULL)
642 : : {
643 : 27762440 : (*sb) = static_cast<M2Scope_ScopeBlock> (t);
644 : 27762440 : t = t->next;
645 : 27762440 : Dispose (reinterpret_cast<M2Scope_ScopeBlock__opaque *> (&(*sb)));
646 : : }
647 : 1109964 : (*sb) = static_cast<M2Scope_ScopeBlock> (NULL);
648 : 1109964 : }
649 : :
650 : :
651 : : /*
652 : : ForeachScopeBlockDo2 - calls a procedure p for each block of contigeous quadruples
653 : : defining an outer scope sb.
654 : : */
655 : :
656 : 253442 : extern "C" void M2Scope_ForeachScopeBlockDo2 (M2Scope_ScopeBlock sb, M2Scope_ScopeProcedure2 p)
657 : : {
658 : 253442 : if (TraceQuadruples)
659 : : {
660 : : M2Printf_printf0 ((const char *) "ForeachScopeBlockDo\\n", 21);
661 : : }
662 : 1016718 : while (sb != NULL)
663 : : {
664 : 763288 : if (TraceQuadruples)
665 : : {
666 : : DisplayScope (static_cast<M2Scope_ScopeBlock__opaque> (sb));
667 : : }
668 : 763288 : enter (static_cast<M2Scope_ScopeBlock__opaque> (sb));
669 : 763288 : if ((static_cast<M2Scope_ScopeBlock__opaque> (sb)->low != 0) && (static_cast<M2Scope_ScopeBlock__opaque> (sb)->high != 0))
670 : : {
671 : 605489 : (*p.proc) (static_cast<M2Scope_ScopeBlock__opaque> (sb)->low, static_cast<M2Scope_ScopeBlock__opaque> (sb)->high);
672 : : }
673 : 763276 : leave (static_cast<M2Scope_ScopeBlock__opaque> (sb));
674 : 763276 : sb = static_cast<M2Scope_ScopeBlock> (static_cast<M2Scope_ScopeBlock__opaque> (sb)->next);
675 : : }
676 : 253430 : if (TraceQuadruples)
677 : : {
678 : : M2Printf_printf0 ((const char *) "end ForeachScopeBlockDo\\n\\n", 27);
679 : : }
680 : 253430 : }
681 : :
682 : :
683 : : /*
684 : : ForeachScopeBlockDo3 - calls a procedure p for each block of contigeous quadruples
685 : : defining an outer scope sb.
686 : : */
687 : :
688 : 2736381 : extern "C" void M2Scope_ForeachScopeBlockDo3 (M2Scope_ScopeBlock sb, M2Scope_ScopeProcedure3 p)
689 : : {
690 : 2736381 : if (TraceQuadruples)
691 : : {
692 : : M2Printf_printf0 ((const char *) "ForeachScopeBlockDo\\n", 21);
693 : : }
694 : 84573752 : while (sb != NULL)
695 : : {
696 : 81837431 : if (TraceQuadruples)
697 : : {
698 : : DisplayScope (static_cast<M2Scope_ScopeBlock__opaque> (sb));
699 : : }
700 : 81837431 : enter (static_cast<M2Scope_ScopeBlock__opaque> (sb));
701 : 81837431 : if ((static_cast<M2Scope_ScopeBlock__opaque> (sb)->low != 0) && (static_cast<M2Scope_ScopeBlock__opaque> (sb)->high != 0))
702 : : {
703 : 79755795 : (*p.proc) (static_cast<M2Scope_ScopeBlock__opaque> (sb)->scopeSym, static_cast<M2Scope_ScopeBlock__opaque> (sb)->low, static_cast<M2Scope_ScopeBlock__opaque> (sb)->high);
704 : : }
705 : 81837371 : leave (static_cast<M2Scope_ScopeBlock__opaque> (sb));
706 : 81837371 : sb = static_cast<M2Scope_ScopeBlock> (static_cast<M2Scope_ScopeBlock__opaque> (sb)->next);
707 : : }
708 : 2736321 : if (TraceQuadruples)
709 : : {
710 : : M2Printf_printf0 ((const char *) "end ForeachScopeBlockDo\\n\\n", 27);
711 : : }
712 : 2736321 : }
713 : :
714 : 0 : extern "C" void _M2_M2Scope_init (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
715 : : {
716 : 0 : Init ();
717 : 0 : }
718 : :
719 : 0 : extern "C" void _M2_M2Scope_fini (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
720 : : {
721 : 0 : }
|