Branch data Line data Source code
1 : : /* do not edit automatically generated by mc from M2Code. */
2 : : /* M2Code.mod coordinate the activity of the front end.
3 : :
4 : : Copyright (C) 2001-2024 Free Software Foundation, Inc.
5 : : Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
6 : :
7 : : This file is part of GNU Modula-2.
8 : :
9 : : GNU Modula-2 is free software; you can redistribute it and/or modify
10 : : it under the terms of the GNU General Public License as published by
11 : : the Free Software Foundation; either version 3, or (at your option)
12 : : any later version.
13 : :
14 : : GNU Modula-2 is distributed in the hope that it will be useful, but
15 : : WITHOUT ANY WARRANTY; without even the implied warranty of
16 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 : : General Public License for more details.
18 : :
19 : : You should have received a copy of the GNU General Public License
20 : : along with GNU Modula-2; see the file COPYING3. If not see
21 : : <http://www.gnu.org/licenses/>. */
22 : :
23 : : #include "config.h"
24 : : #include "system.h"
25 : : #include "gcc-consolidation.h"
26 : :
27 : : #include <stdbool.h>
28 : : # if !defined (PROC_D)
29 : : # define PROC_D
30 : : typedef void (*PROC_t) (void);
31 : : typedef struct { PROC_t proc; } PROC;
32 : : # endif
33 : :
34 : : # if !defined (TRUE)
35 : : # define TRUE (1==1)
36 : : # endif
37 : :
38 : : # if !defined (FALSE)
39 : : # define FALSE (1==0)
40 : : # endif
41 : :
42 : : #define _M2Code_C
43 : :
44 : : #include "GM2Code.h"
45 : : # include "GSYSTEM.h"
46 : : # include "GM2Options.h"
47 : : # include "GM2LangDump.h"
48 : : # include "GM2Error.h"
49 : : # include "GM2Students.h"
50 : : # include "GSymbolTable.h"
51 : : # include "GM2Printf.h"
52 : : # include "GNameKey.h"
53 : : # include "GM2Batch.h"
54 : : # include "GM2Quads.h"
55 : : # include "GM2SymInit.h"
56 : : # include "GM2Pass.h"
57 : : # include "GM2BasicBlock.h"
58 : : # include "GM2Optimize.h"
59 : : # include "GM2GenGCC.h"
60 : : # include "GM2GCCDeclare.h"
61 : : # include "GM2Scope.h"
62 : : # include "Gm2top.h"
63 : : # include "GM2Swig.h"
64 : : # include "Gm2flex.h"
65 : : # include "GFIO.h"
66 : : # include "GM2Quiet.h"
67 : : # include "GM2SSA.h"
68 : : # include "Gm2pp.h"
69 : : # include "GDynamicStrings.h"
70 : :
71 : : # define MaxOptimTimes 10
72 : : # define Debugging true
73 : : # define TraceQuadruples false
74 : : static unsigned int Total;
75 : : static unsigned int Count;
76 : : static unsigned int OptimTimes;
77 : : static unsigned int DeltaProc;
78 : : static unsigned int Proc;
79 : : static unsigned int DeltaConst;
80 : : static unsigned int Const;
81 : : static unsigned int DeltaJump;
82 : : static unsigned int Jump;
83 : : static unsigned int DeltaBasicB;
84 : : static unsigned int BasicB;
85 : :
86 : : /*
87 : : Code - calls procedures to generates trees from the quadruples.
88 : : All front end quadruple optimization is performed via this call.
89 : : */
90 : :
91 : : extern "C" void M2Code_Code (void);
92 : :
93 : : /*
94 : : CodeBlock - generates all code for this block and also declares
95 : : all types and procedures for this block. It will
96 : : also optimize quadruples within this scope.
97 : : */
98 : :
99 : : extern "C" void M2Code_CodeBlock (unsigned int scope);
100 : :
101 : : /*
102 : : Percent - calculates the percentage from numerator and divisor
103 : : */
104 : :
105 : : static void Percent (unsigned int numerator, unsigned int divisor);
106 : :
107 : : /*
108 : : OptimizationAnalysis - displays some simple front end optimization statistics.
109 : : */
110 : :
111 : : static void OptimizationAnalysis (void);
112 : :
113 : : /*
114 : : RemoveUnreachableCode -
115 : : */
116 : :
117 : : static void RemoveUnreachableCode (void);
118 : :
119 : : /*
120 : : DoModuleDeclare - declare all constants, types, variables, procedures for the
121 : : main module or all modules.
122 : : */
123 : :
124 : : static void DoModuleDeclare (void);
125 : :
126 : : /*
127 : : DoCodeBlock - generate code for the main module or all modules.
128 : : */
129 : :
130 : : static void DoCodeBlock (void);
131 : :
132 : : /*
133 : : DetermineSubExpTemporaries -
134 : : */
135 : :
136 : : static void DetermineSubExpTemporaries (void);
137 : : static void InitialDeclareAndOptimize (unsigned int scope, unsigned int start, unsigned int end);
138 : : static void SecondDeclareAndOptimize (unsigned int scope, unsigned int start, unsigned int end);
139 : :
140 : : /*
141 : : InitOptimizeVariables -
142 : : */
143 : :
144 : : static void InitOptimizeVariables (void);
145 : :
146 : : /*
147 : : Init -
148 : : */
149 : :
150 : : static void Init (void);
151 : :
152 : : /*
153 : : OptimizeScopeBlock -
154 : : */
155 : :
156 : : static void OptimizeScopeBlock (M2Scope_ScopeBlock sb);
157 : :
158 : : /*
159 : : CodeProceduresWithinBlock - codes the procedures within the module scope.
160 : : */
161 : :
162 : : static void CodeProceduresWithinBlock (unsigned int scope);
163 : :
164 : : /*
165 : : CodeProcedures -
166 : : */
167 : :
168 : : static void CodeProcedures (unsigned int scope);
169 : :
170 : :
171 : : /*
172 : : Percent - calculates the percentage from numerator and divisor
173 : : */
174 : :
175 : 0 : static void Percent (unsigned int numerator, unsigned int divisor)
176 : : {
177 : 0 : unsigned int value;
178 : :
179 : 0 : M2Printf_printf0 ((const char *) " (", 3);
180 : 0 : if (divisor == 0)
181 : : {
182 : 0 : M2Printf_printf0 ((const char *) "overflow error", 14);
183 : : }
184 : : else
185 : : {
186 : 0 : value = (numerator*100) / divisor;
187 : 0 : M2Printf_printf1 ((const char *) "%3d", 3, (const unsigned char *) &value, (sizeof (value)-1));
188 : : }
189 : 0 : M2Printf_printf0 ((const char *) "\\%)", 3);
190 : 0 : }
191 : :
192 : :
193 : : /*
194 : : OptimizationAnalysis - displays some simple front end optimization statistics.
195 : : */
196 : :
197 : 13201 : static void OptimizationAnalysis (void)
198 : : {
199 : 13201 : unsigned int value;
200 : :
201 : 13201 : if (M2Options_Statistics)
202 : : {
203 : 0 : Count = M2Quads_CountQuads ();
204 : 0 : M2Printf_printf1 ((const char *) "M2 initial number of quadruples: %6d", 36, (const unsigned char *) &Total, (sizeof (Total)-1));
205 : 0 : Percent (Total, Total);
206 : 0 : M2Printf_printf0 ((const char *) "\\n", 2);
207 : 0 : M2Printf_printf1 ((const char *) "M2 constant folding achieved : %6d", 36, (const unsigned char *) &Const, (sizeof (Const)-1));
208 : 0 : Percent (Const, Total);
209 : 0 : M2Printf_printf0 ((const char *) "\\n", 2);
210 : 0 : M2Printf_printf1 ((const char *) "M2 branch folding achieved : %6d", 36, (const unsigned char *) &Jump, (sizeof (Jump)-1));
211 : 0 : Percent (Jump, Total);
212 : 0 : M2Printf_printf0 ((const char *) "\\n", 2);
213 : 0 : value = (Const+Jump)+Proc;
214 : 0 : M2Printf_printf1 ((const char *) "Front end optimization removed : %6d", 36, (const unsigned char *) &value, (sizeof (value)-1));
215 : 0 : Percent (value, Total);
216 : 0 : M2Printf_printf0 ((const char *) "\\n", 2);
217 : 0 : M2Printf_printf1 ((const char *) "Front end final : %6d", 36, (const unsigned char *) &Count, (sizeof (Count)-1));
218 : 0 : Percent (Count, Total);
219 : 0 : M2Printf_printf0 ((const char *) "\\n", 2);
220 : 0 : Count = m2flex_GetTotalLines ();
221 : 0 : M2Printf_printf1 ((const char *) "Total source lines compiled : %6d\\n", 38, (const unsigned char *) &Count, (sizeof (Count)-1));
222 : 0 : FIO_FlushBuffer (FIO_StdOut);
223 : : }
224 : 13201 : M2Quads_DumpQuadruples ((const char *) "after all front end optimization\\n", 34);
225 : 13201 : }
226 : :
227 : :
228 : : /*
229 : : RemoveUnreachableCode -
230 : : */
231 : :
232 : 13345 : static void RemoveUnreachableCode (void)
233 : : {
234 : 13345 : if (M2Options_WholeProgram)
235 : : {
236 : 24 : M2Batch_ForeachSourceModuleDo ((M2Batch_DoProcedure) {(M2Batch_DoProcedure_t) M2Optimize_RemoveProcedures});
237 : : }
238 : : else
239 : : {
240 : 13321 : M2Optimize_RemoveProcedures (SymbolTable_GetMainModule ());
241 : : }
242 : 13345 : }
243 : :
244 : :
245 : : /*
246 : : DoModuleDeclare - declare all constants, types, variables, procedures for the
247 : : main module or all modules.
248 : : */
249 : :
250 : 13345 : static void DoModuleDeclare (void)
251 : : {
252 : 13345 : if (M2Options_GetDumpDecl ())
253 : : {
254 : 0 : M2LangDump_CreateDumpDecl ((const char *) "symbol resolver of filtered symbols\\n", 37);
255 : 0 : M2GCCDeclare_DumpFilteredResolver ();
256 : : }
257 : 13345 : if (M2Options_WholeProgram)
258 : : {
259 : 24 : M2Batch_ForeachSourceModuleDo ((M2Batch_DoProcedure) {(M2Batch_DoProcedure_t) M2GCCDeclare_StartDeclareScope});
260 : : }
261 : : else
262 : : {
263 : 13321 : M2GCCDeclare_StartDeclareScope (SymbolTable_GetMainModule ());
264 : : }
265 : 13297 : if (M2Options_GetDumpDecl ())
266 : : {
267 : 0 : M2LangDump_CloseDumpDecl ();
268 : 0 : M2LangDump_CreateDumpDecl ((const char *) "definitive declaration of filtered symbols\\n", 44);
269 : 0 : M2GCCDeclare_DumpFilteredDefinitive ();
270 : 0 : M2LangDump_CloseDumpDecl ();
271 : : }
272 : 13297 : }
273 : :
274 : :
275 : : /*
276 : : DoCodeBlock - generate code for the main module or all modules.
277 : : */
278 : :
279 : 13231 : static void DoCodeBlock (void)
280 : : {
281 : 13231 : DynamicStrings_String filename;
282 : 13231 : unsigned int len;
283 : :
284 : 13231 : if (M2Options_GetDumpGimple ())
285 : : {
286 : 0 : filename = M2LangDump_MakeGimpleTemplate (&len);
287 : 0 : m2pp_CreateDumpGimple (reinterpret_cast <void *> (filename), len);
288 : 0 : filename = DynamicStrings_KillString (filename);
289 : 0 : M2Code_CodeBlock (SymbolTable_GetMainModule ());
290 : 0 : m2pp_CloseDumpGimple ();
291 : : }
292 : : else
293 : : {
294 : 13231 : M2Code_CodeBlock (SymbolTable_GetMainModule ());
295 : : }
296 : 13201 : }
297 : :
298 : :
299 : : /*
300 : : DetermineSubExpTemporaries -
301 : : */
302 : :
303 : 13345 : static void DetermineSubExpTemporaries (void)
304 : : {
305 : 13345 : if (M2Options_WholeProgram)
306 : : {
307 : 24 : M2Batch_ForeachSourceModuleDo ((M2Batch_DoProcedure) {(M2Batch_DoProcedure_t) M2SSA_DiscoverSSA});
308 : : }
309 : : else
310 : : {
311 : 13321 : M2SSA_DiscoverSSA (SymbolTable_GetMainModule ());
312 : : }
313 : 13345 : }
314 : :
315 : 304329 : static void InitialDeclareAndOptimize (unsigned int scope, unsigned int start, unsigned int end)
316 : : {
317 : : /*
318 : : InitialDeclareAndCodeBlock - declares all objects within scope,
319 : : */
320 : 304329 : Count = M2Quads_CountQuads ();
321 : 304329 : M2BasicBlock_FreeBasicBlocks (M2BasicBlock_InitBasicBlocksFromRange (scope, start, end));
322 : 304329 : BasicB = Count-(M2Quads_CountQuads ());
323 : 304329 : Count = M2Quads_CountQuads ();
324 : 304329 : M2Optimize_FoldBranches (start, end);
325 : 304329 : Jump = Count-(M2Quads_CountQuads ());
326 : 304329 : Count = M2Quads_CountQuads ();
327 : 304329 : }
328 : :
329 : 501276 : static void SecondDeclareAndOptimize (unsigned int scope, unsigned int start, unsigned int end)
330 : : {
331 : 568529 : M2BasicBlock_BasicBlock bb;
332 : :
333 : : /*
334 : : DeclareAndCodeBlock - declares all objects within scope,
335 : : */
336 : 568529 : do {
337 : 568529 : bb = M2BasicBlock_InitBasicBlocksFromRange (scope, start, end);
338 : 568529 : M2BasicBlock_ForeachBasicBlockDo (bb, (M2BasicBlock_BasicBlockProc) {(M2BasicBlock_BasicBlockProc_t) M2GCCDeclare_FoldConstants});
339 : 568511 : M2BasicBlock_FreeBasicBlocks (bb);
340 : 568511 : DeltaConst = Count-(M2Quads_CountQuads ());
341 : 568511 : Count = M2Quads_CountQuads ();
342 : 568511 : M2BasicBlock_FreeBasicBlocks (M2BasicBlock_InitBasicBlocksFromRange (scope, start, end));
343 : 568511 : DeltaBasicB = Count-(M2Quads_CountQuads ());
344 : 568511 : Count = M2Quads_CountQuads ();
345 : 568511 : M2BasicBlock_FreeBasicBlocks (M2BasicBlock_InitBasicBlocksFromRange (scope, start, end));
346 : 568511 : M2Optimize_FoldBranches (start, end);
347 : 568511 : DeltaJump = Count-(M2Quads_CountQuads ());
348 : 568511 : Count = M2Quads_CountQuads ();
349 : 568511 : M2BasicBlock_FreeBasicBlocks (M2BasicBlock_InitBasicBlocksFromRange (scope, start, end));
350 : 568511 : DeltaBasicB += Count-(M2Quads_CountQuads ());
351 : 568511 : Count = M2Quads_CountQuads ();
352 : : /* now total the optimization components */
353 : 568511 : Proc += DeltaProc;
354 : 568511 : Const += DeltaConst;
355 : 568511 : Jump += DeltaJump;
356 : 568511 : BasicB += DeltaBasicB;
357 : 568511 : } while (! ((OptimTimes >= MaxOptimTimes) || ((((DeltaProc == 0) && (DeltaConst == 0)) && (DeltaJump == 0)) && (DeltaBasicB == 0))));
358 : 501258 : if ((((DeltaProc != 0) || (DeltaConst != 0)) || (DeltaJump != 0)) || (DeltaBasicB != 0))
359 : : {
360 : 0 : M2Printf_printf0 ((const char *) "optimization finished although more reduction may be possible (increase MaxOptimTimes)\\n", 88);
361 : : }
362 : 501258 : }
363 : :
364 : :
365 : : /*
366 : : InitOptimizeVariables -
367 : : */
368 : :
369 : 184359 : static void InitOptimizeVariables (void)
370 : : {
371 : 184359 : Count = M2Quads_CountQuads ();
372 : 184359 : OptimTimes = 0;
373 : 184359 : DeltaProc = 0;
374 : 184359 : DeltaConst = 0;
375 : 184359 : DeltaJump = 0;
376 : 184359 : DeltaBasicB = 0;
377 : 184359 : }
378 : :
379 : :
380 : : /*
381 : : Init -
382 : : */
383 : :
384 : 14232 : static void Init (void)
385 : : {
386 : 14232 : Proc = 0;
387 : 14232 : Const = 0;
388 : 14232 : Jump = 0;
389 : 14232 : BasicB = 0;
390 : 0 : }
391 : :
392 : :
393 : : /*
394 : : OptimizeScopeBlock -
395 : : */
396 : :
397 : 184359 : static void OptimizeScopeBlock (M2Scope_ScopeBlock sb)
398 : : {
399 : 184359 : unsigned int OptimTimes;
400 : 184359 : unsigned int Previous;
401 : 184359 : unsigned int Current;
402 : :
403 : 184359 : InitOptimizeVariables ();
404 : 184359 : OptimTimes = 1;
405 : 184359 : Current = M2Quads_CountQuads ();
406 : 184359 : M2Scope_ForeachScopeBlockDo3 (sb, (M2Scope_ScopeProcedure3) {(M2Scope_ScopeProcedure3_t) InitialDeclareAndOptimize});
407 : 184359 : M2Scope_ForeachScopeBlockDo3 (sb, (M2Scope_ScopeProcedure3) {(M2Scope_ScopeProcedure3_t) M2SymInit_ScopeBlockVariableAnalysis});
408 : 252810 : do {
409 : 252810 : M2Scope_ForeachScopeBlockDo3 (sb, (M2Scope_ScopeProcedure3) {(M2Scope_ScopeProcedure3_t) SecondDeclareAndOptimize});
410 : 252792 : Previous = Current;
411 : 252792 : Current = M2Quads_CountQuads ();
412 : 252792 : OptimTimes += 1;
413 : 252792 : } while (! ((OptimTimes == MaxOptimTimes) || (Current == Previous)));
414 : 184341 : M2Scope_ForeachScopeBlockDo3 (sb, (M2Scope_ScopeProcedure3) {(M2Scope_ScopeProcedure3_t) M2Quads_LoopAnalysis});
415 : 184341 : }
416 : :
417 : :
418 : : /*
419 : : CodeProceduresWithinBlock - codes the procedures within the module scope.
420 : : */
421 : :
422 : 222 : static void CodeProceduresWithinBlock (unsigned int scope)
423 : : {
424 : 222 : SymbolTable_ForeachProcedureDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2Code_CodeBlock});
425 : 222 : }
426 : :
427 : :
428 : : /*
429 : : CodeProcedures -
430 : : */
431 : :
432 : 408 : static void CodeProcedures (unsigned int scope)
433 : : {
434 : 408 : if ((SymbolTable_IsDefImp (scope)) || (SymbolTable_IsModule (scope)))
435 : : {
436 : 408 : SymbolTable_ForeachProcedureDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2Code_CodeBlock});
437 : : }
438 : 408 : }
439 : :
440 : :
441 : : /*
442 : : Code - calls procedures to generates trees from the quadruples.
443 : : All front end quadruple optimization is performed via this call.
444 : : */
445 : :
446 : 13345 : extern "C" void M2Code_Code (void)
447 : : {
448 : 13345 : M2Quads_DumpQuadruples ((const char *) "before any optimization\\n", 25);
449 : 13345 : SymbolTable_CheckHiddenTypeAreAddress ();
450 : 13345 : M2Pass_SetPassToNoPass ();
451 : 13345 : M2Quads_BackPatchSubrangesAndOptParam ();
452 : 13345 : Total = M2Quads_CountQuads ();
453 : 13345 : M2Quads_ForLoopAnalysis (); /* must be done before any optimization as the index variable increment quad might change */
454 : 13345 : M2Quads_DumpQuadruples ((const char *) "before declaring symbols to gcc\\n", 33);
455 : : /* we know all the front end symbols must be resolved. */
456 : 13345 : if (M2Options_StyleChecking)
457 : : {
458 : 0 : M2Students_StudentVariableCheck ();
459 : : }
460 : 13345 : M2Pass_SetPassToCodeGeneration ();
461 : 13345 : m2top_SetFlagUnitAtATime (M2Options_Optimizing);
462 : 13345 : m2top_StartGlobalContext ();
463 : 13345 : M2GCCDeclare_InitDeclarations (); /* default and fixed sized types are all declared from now on. */
464 : 13345 : RemoveUnreachableCode (); /* default and fixed sized types are all declared from now on. */
465 : 13345 : M2Quads_DumpQuadruples ((const char *) "after dead procedure elimination\\n", 34);
466 : 13345 : DetermineSubExpTemporaries ();
467 : 13345 : M2Quads_DumpQuadruples ((const char *) "after identifying simple subexpression temporaries\\n", 52);
468 : 13345 : M2Quiet_qprintf0 ((const char *) " symbols to gcc trees\\n", 30);
469 : 13345 : DoModuleDeclare ();
470 : 13297 : M2Error_FlushWarnings ();
471 : 13297 : M2Error_FlushErrors ();
472 : 13231 : M2Quiet_qprintf0 ((const char *) " statements to gcc trees\\n", 33);
473 : 13231 : DoCodeBlock ();
474 : 13201 : M2GCCDeclare_MarkExported (SymbolTable_GetMainModule ());
475 : 13201 : M2Swig_GenerateSwigFile (SymbolTable_GetMainModule ());
476 : 13201 : SymbolTable_DebugLineNumbers (SymbolTable_GetMainModule ());
477 : 13201 : M2Quiet_qprintf0 ((const char *) " gcc trees given to the gcc backend\\n", 44);
478 : 13201 : m2top_EndGlobalContext ();
479 : 13201 : OptimizationAnalysis ();
480 : 13201 : }
481 : :
482 : :
483 : : /*
484 : : CodeBlock - generates all code for this block and also declares
485 : : all types and procedures for this block. It will
486 : : also optimize quadruples within this scope.
487 : : */
488 : :
489 : 184359 : extern "C" void M2Code_CodeBlock (unsigned int scope)
490 : : {
491 : 184359 : M2Scope_ScopeBlock sb;
492 : 184359 : NameKey_Name n;
493 : :
494 : 184359 : if (TraceQuadruples)
495 : : {
496 : : n = SymbolTable_GetSymName (scope);
497 : : M2Printf_printf1 ((const char *) "before coding block %a\\n", 24, (const unsigned char *) &n, (sizeof (n)-1));
498 : : }
499 : 184359 : sb = M2Scope_InitScopeBlock (scope);
500 : 184359 : OptimizeScopeBlock (sb);
501 : 184341 : if (SymbolTable_IsProcedure (scope))
502 : : {
503 : 170978 : if (TraceQuadruples)
504 : : {
505 : : n = SymbolTable_GetSymName (scope);
506 : : M2Printf_printf1 ((const char *) "before coding procedure %a\\n", 28, (const unsigned char *) &n, (sizeof (n)-1));
507 : : M2Scope_ForeachScopeBlockDo3 (sb, (M2Scope_ScopeProcedure3) {(M2Scope_ScopeProcedure3_t) M2Quads_DisplayQuadRange});
508 : : M2Printf_printf0 ((const char *) "===============\\n", 17);
509 : : }
510 : 170978 : M2Scope_ForeachScopeBlockDo2 (sb, (M2Scope_ScopeProcedure2) {(M2Scope_ScopeProcedure2_t) M2GenGCC_ConvertQuadsToTree});
511 : : }
512 : 13363 : else if (SymbolTable_IsModuleWithinProcedure (scope))
513 : : {
514 : : /* avoid dangling else. */
515 : 144 : if (TraceQuadruples)
516 : : {
517 : : n = SymbolTable_GetSymName (scope);
518 : : M2Printf_printf1 ((const char *) "before coding module %a within procedure\\n", 42, (const unsigned char *) &n, (sizeof (n)-1));
519 : : M2Scope_ForeachScopeBlockDo3 (sb, (M2Scope_ScopeProcedure3) {(M2Scope_ScopeProcedure3_t) M2Quads_DisplayQuadRange});
520 : : M2Printf_printf0 ((const char *) "===============\\n", 17);
521 : : }
522 : 144 : M2Scope_ForeachScopeBlockDo2 (sb, (M2Scope_ScopeProcedure2) {(M2Scope_ScopeProcedure2_t) M2GenGCC_ConvertQuadsToTree});
523 : 144 : SymbolTable_ForeachProcedureDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2Code_CodeBlock});
524 : : }
525 : : else
526 : : {
527 : : /* avoid dangling else. */
528 : 13219 : if (TraceQuadruples)
529 : : {
530 : : n = SymbolTable_GetSymName (scope);
531 : : M2Printf_printf1 ((const char *) "before coding module %a\\n", 25, (const unsigned char *) &n, (sizeof (n)-1));
532 : : M2Scope_ForeachScopeBlockDo3 (sb, (M2Scope_ScopeProcedure3) {(M2Scope_ScopeProcedure3_t) M2Quads_DisplayQuadRange});
533 : : M2Printf_printf0 ((const char *) "===============\\n", 17);
534 : : }
535 : 13219 : M2Scope_ForeachScopeBlockDo2 (sb, (M2Scope_ScopeProcedure2) {(M2Scope_ScopeProcedure2_t) M2GenGCC_ConvertQuadsToTree});
536 : 13213 : if (M2Options_WholeProgram)
537 : : {
538 : 24 : M2Batch_ForeachSourceModuleDo ((M2Batch_DoProcedure) {(M2Batch_DoProcedure_t) CodeProcedures});
539 : : }
540 : : else
541 : : {
542 : 13189 : SymbolTable_ForeachProcedureDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) M2Code_CodeBlock});
543 : : }
544 : 13201 : SymbolTable_ForeachInnerModuleDo (scope, (SymbolKey_PerformOperation) {(SymbolKey_PerformOperation_t) CodeProceduresWithinBlock});
545 : : }
546 : 184317 : M2Scope_KillScopeBlock (&sb);
547 : 184317 : }
548 : :
549 : 14232 : extern "C" void _M2_M2Code_init (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
550 : : {
551 : 14232 : Init ();
552 : 14232 : }
553 : :
554 : 0 : extern "C" void _M2_M2Code_fini (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
555 : : {
556 : 0 : }
|