Branch data Line data Source code
1 : : /* do not edit automatically generated by mc from P3SymBuild. */
2 : : /* P3SymBuild.mod pass 3 symbol creation.
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 : : #define _P3SymBuild_C
36 : :
37 : : #include "GP3SymBuild.h"
38 : : # include "GNameKey.h"
39 : : # include "GStrIO.h"
40 : : # include "GNumberIO.h"
41 : : # include "GM2Debug.h"
42 : : # include "GM2Error.h"
43 : : # include "GM2LexBuf.h"
44 : : # include "GSymbolTable.h"
45 : : # include "GM2Batch.h"
46 : : # include "GM2Quads.h"
47 : : # include "GM2Comp.h"
48 : : # include "GFifoQueue.h"
49 : : # include "GM2Reserved.h"
50 : :
51 : : extern "C" void P3SymBuild_P3StartBuildDefModule (void);
52 : : extern "C" void P3SymBuild_P3EndBuildDefModule (void);
53 : : extern "C" void P3SymBuild_P3StartBuildImpModule (void);
54 : : extern "C" void P3SymBuild_P3EndBuildImpModule (void);
55 : : extern "C" void P3SymBuild_P3StartBuildProgModule (void);
56 : : extern "C" void P3SymBuild_P3EndBuildProgModule (void);
57 : :
58 : : /*
59 : : CheckCanBeImported - checks to see that it is legal to import, Sym, from, ModSym.
60 : : */
61 : :
62 : : extern "C" void P3SymBuild_CheckCanBeImported (unsigned int ModSym, unsigned int Sym);
63 : :
64 : : /*
65 : : StartBuildInnerModule - Creates an Inner module and starts
66 : : a new scope.
67 : :
68 : : The Stack is expected:
69 : :
70 : : Entry Exit
71 : :
72 : : Ptr -> <- Ptr
73 : : +------------+ +-----------+
74 : : | NameStart | | NameStart |
75 : : |------------| |-----------|
76 : :
77 : : */
78 : :
79 : : extern "C" void P3SymBuild_StartBuildInnerModule (void);
80 : :
81 : : /*
82 : : EndBuildInnerModule - Destroys the Inner module scope and
83 : : checks for correct name.
84 : :
85 : : The Stack is expected:
86 : :
87 : : Entry Exit
88 : :
89 : : Ptr ->
90 : : +------------+ +-----------+
91 : : | NameEnd | | |
92 : : |------------| |-----------|
93 : : | NameStart | | | <- Ptr
94 : : |------------| |-----------|
95 : : */
96 : :
97 : : extern "C" void P3SymBuild_EndBuildInnerModule (void);
98 : :
99 : : /*
100 : : CheckImportListOuterModule - checks to see that all identifiers are
101 : : exported from the definition module.
102 : :
103 : : The Stack is expected:
104 : :
105 : : Entry OR Entry
106 : :
107 : : Ptr -> Ptr ->
108 : : +------------+ +-----------+
109 : : | # | | # |
110 : : |------------| |-----------|
111 : : | Id1 | | Id1 |
112 : : |------------| |-----------|
113 : : . . . .
114 : : . . . .
115 : : . . . .
116 : : |------------| |-----------|
117 : : | Id# | | Id# |
118 : : |------------| |-----------|
119 : : | ImportTok | | Ident |
120 : : |------------| |-----------|
121 : :
122 : : IMPORT Id1, .. Id# ; FROM Ident IMPORT Id1 .. Id# ;
123 : :
124 : :
125 : : Error Condition
126 : : Exit
127 : :
128 : : All above stack discarded
129 : : */
130 : :
131 : : extern "C" void P3SymBuild_CheckImportListOuterModule (void);
132 : :
133 : : /*
134 : : BuildProcedureHeading - Builds a procedure heading for the definition
135 : : module procedures.
136 : :
137 : : Operation only performed if compiling a
138 : : definition module.
139 : :
140 : : The Stack:
141 : :
142 : : Entry Exit
143 : :
144 : : Ptr ->
145 : : +------------+
146 : : | ProcSym |
147 : : |------------|
148 : : | NameStart |
149 : : |------------|
150 : : Empty
151 : :
152 : : */
153 : :
154 : : extern "C" void P3SymBuild_BuildProcedureHeading (void);
155 : :
156 : : /*
157 : : StartBuildProcedure - Builds a Procedure.
158 : :
159 : : The Stack:
160 : :
161 : : Entry Exit
162 : :
163 : : <- Ptr
164 : : +------------+
165 : : Ptr -> | ProcSym |
166 : : +------------+ |------------|
167 : : | Name | | Name |
168 : : |------------| |------------|
169 : : */
170 : :
171 : : extern "C" void P3SymBuild_StartBuildProcedure (void);
172 : :
173 : : /*
174 : : EndBuildProcedure - Ends building a Procedure.
175 : : It checks the start procedure name matches the end
176 : : procedure name.
177 : :
178 : : The Stack:
179 : :
180 : : (Procedure Not Defined in definition module)
181 : :
182 : : Entry Exit
183 : :
184 : : Ptr ->
185 : : +------------+
186 : : | NameEnd |
187 : : |------------|
188 : : | ProcSym |
189 : : |------------|
190 : : | NameStart |
191 : : |------------|
192 : : Empty
193 : : */
194 : :
195 : : extern "C" void P3SymBuild_EndBuildProcedure (void);
196 : :
197 : : /*
198 : : EndBuildForward -
199 : : */
200 : :
201 : : extern "C" void P3SymBuild_EndBuildForward (void);
202 : :
203 : : /*
204 : : BuildSubrange - Builds a Subrange type Symbol.
205 : :
206 : :
207 : : Stack
208 : :
209 : : Entry Exit
210 : :
211 : : Ptr ->
212 : : +------------+
213 : : | High |
214 : : |------------|
215 : : | Low | <- Ptr
216 : : |------------|
217 : : */
218 : :
219 : : extern "C" void P3SymBuild_BuildSubrange (void);
220 : :
221 : : /*
222 : : BuildNulName - Pushes a NulKey onto the top of the stack.
223 : : The Stack:
224 : :
225 : :
226 : : Entry Exit
227 : :
228 : : <- Ptr
229 : : Empty +------------+
230 : : | NulKey |
231 : : |------------|
232 : : */
233 : :
234 : : extern "C" void P3SymBuild_BuildNulName (void);
235 : :
236 : : /*
237 : : BuildConst - builds a constant.
238 : : Stack
239 : :
240 : : Entry Exit
241 : :
242 : : Ptr -> <- Ptr
243 : : +------------+ +------------+
244 : : | Name | | Sym |
245 : : |------------+ |------------|
246 : : */
247 : :
248 : : extern "C" void P3SymBuild_BuildConst (void);
249 : :
250 : : /*
251 : : BuildVarAtAddress - updates the symbol table entry of, variable sym, to be declared
252 : : at address, address.
253 : :
254 : : Stack
255 : :
256 : : Entry Exit
257 : :
258 : : Ptr ->
259 : : +--------------+
260 : : | Expr | EType | <- Ptr
261 : : |--------------+ +--------------+
262 : : | name | SType | | name | SType |
263 : : |--------------+ |--------------|
264 : : */
265 : :
266 : : extern "C" void P3SymBuild_BuildVarAtAddress (void);
267 : :
268 : : /*
269 : : BuildOptArgInitializer - assigns the constant value symbol, const, to be the
270 : : initial value of the optional parameter should it be
271 : : absent.
272 : :
273 : : Ptr ->
274 : : +------------+
275 : : | const |
276 : : |------------| <- Ptr
277 : : */
278 : :
279 : : extern "C" void P3SymBuild_BuildOptArgInitializer (void);
280 : :
281 : 119630 : extern "C" void P3SymBuild_P3StartBuildDefModule (void)
282 : : {
283 : 119630 : unsigned int tok;
284 : 119630 : NameKey_Name name;
285 : 119630 : unsigned int ModuleSym;
286 : :
287 : : /*
288 : : StartBuildDefinitionModule - Creates a definition module and starts
289 : : a new scope.
290 : :
291 : : The Stack is expected:
292 : :
293 : : Entry Exit
294 : :
295 : : Ptr -> <- Ptr
296 : : +------------+ +-----------+
297 : : | NameStart | | NameStart |
298 : : |------------| |-----------|
299 : :
300 : : */
301 : 119630 : M2Quads_PopTtok (&name, &tok);
302 : 119630 : ModuleSym = M2Batch_MakeDefinitionSource (tok, name);
303 : 119630 : SymbolTable_SetCurrentModule (ModuleSym);
304 : 119630 : SymbolTable_SetFileModule (ModuleSym);
305 : 119630 : SymbolTable_StartScope (ModuleSym);
306 : 119630 : M2Debug_Assert (SymbolTable_IsDefImp (ModuleSym));
307 : 119630 : M2Debug_Assert (M2Comp_CompilingDefinitionModule ());
308 : 119630 : M2Quads_PushT (name);
309 : 119630 : M2Error_EnterDefinitionScope (name);
310 : 119630 : }
311 : :
312 : 119630 : extern "C" void P3SymBuild_P3EndBuildDefModule (void)
313 : : {
314 : 119630 : unsigned int NameStart;
315 : 119630 : unsigned int NameEnd;
316 : :
317 : : /*
318 : : EndBuildDefinitionModule - Destroys the definition module scope and
319 : : checks for correct name.
320 : :
321 : : The Stack is expected:
322 : :
323 : : Entry Exit
324 : :
325 : : Ptr ->
326 : : +------------+ +-----------+
327 : : | NameEnd | | |
328 : : |------------| |-----------|
329 : : | NameStart | | | <- Ptr
330 : : |------------| |-----------|
331 : : */
332 : 119630 : M2Debug_Assert (M2Comp_CompilingDefinitionModule ());
333 : 119630 : SymbolTable_CheckForUnknownInModule ();
334 : 119630 : SymbolTable_EndScope ();
335 : 119630 : M2Quads_PopT (&NameEnd);
336 : 119630 : M2Quads_PopT (&NameStart);
337 : 119630 : if (NameStart != NameEnd)
338 : : {
339 : 0 : M2Error_WriteFormat2 ((const char *) "inconsistant definition module was named (%a) and concluded as (%a)", 67, (const unsigned char *) &NameStart, (sizeof (NameStart)-1), (const unsigned char *) &NameEnd, (sizeof (NameEnd)-1));
340 : : }
341 : 119630 : M2Error_LeaveErrorScope ();
342 : 119630 : }
343 : :
344 : 53271 : extern "C" void P3SymBuild_P3StartBuildImpModule (void)
345 : : {
346 : 53271 : unsigned int tok;
347 : 53271 : NameKey_Name name;
348 : 53271 : unsigned int ModuleSym;
349 : :
350 : : /*
351 : : StartBuildImplementationModule - Creates an implementation module and starts
352 : : a new scope.
353 : :
354 : : The Stack is expected:
355 : :
356 : : Entry Exit
357 : :
358 : : Ptr -> <- Ptr
359 : : +------------+ +-----------+
360 : : | NameStart | | NameStart |
361 : : |------------| |-----------|
362 : :
363 : : */
364 : 53271 : M2Quads_PopTtok (&name, &tok);
365 : 53271 : ModuleSym = M2Batch_MakeImplementationSource (tok, name);
366 : 53271 : SymbolTable_SetCurrentModule (ModuleSym);
367 : 53271 : SymbolTable_SetFileModule (ModuleSym);
368 : 53271 : SymbolTable_StartScope (ModuleSym);
369 : 53271 : M2Debug_Assert (SymbolTable_IsDefImp (ModuleSym));
370 : 53271 : M2Debug_Assert (M2Comp_CompilingImplementationModule ());
371 : 53271 : M2Quads_PushT (name);
372 : 53271 : M2Error_EnterImplementationScope (name);
373 : 53271 : }
374 : :
375 : 53271 : extern "C" void P3SymBuild_P3EndBuildImpModule (void)
376 : : {
377 : 53271 : NameKey_Name NameStart;
378 : 53271 : NameKey_Name NameEnd;
379 : :
380 : : /*
381 : : EndBuildImplementationModule - Destroys the implementation module scope and
382 : : checks for correct name.
383 : :
384 : : The Stack is expected:
385 : :
386 : : Entry Exit
387 : :
388 : : Ptr ->
389 : : +------------+ +-----------+
390 : : | NameEnd | | |
391 : : |------------| |-----------|
392 : : | NameStart | | | <- Ptr
393 : : |------------| |-----------|
394 : : */
395 : 53271 : M2Debug_Assert (M2Comp_CompilingImplementationModule ());
396 : 53271 : SymbolTable_CheckForUnknownInModule ();
397 : 53271 : SymbolTable_EndScope ();
398 : 53271 : M2Quads_PopT (&NameEnd);
399 : 53271 : M2Quads_PopT (&NameStart);
400 : 53271 : if (NameStart != NameEnd)
401 : : {
402 : : /* we dont issue an error based around incorrect module names as this is done in P1 and P2.
403 : : If we get here then something has gone wrong with our error recovery in P3, so we bail out.
404 : : */
405 : 0 : M2Error_WriteFormat0 ((const char *) "too many errors in pass 3", 25);
406 : 0 : M2Error_FlushErrors ();
407 : : }
408 : 53271 : M2Error_LeaveErrorScope ();
409 : 53271 : }
410 : :
411 : 10984 : extern "C" void P3SymBuild_P3StartBuildProgModule (void)
412 : : {
413 : 10984 : unsigned int tok;
414 : 10984 : NameKey_Name name;
415 : 10984 : unsigned int ModuleSym;
416 : :
417 : : /* WriteString('StartBuildProgramModule') ; WriteLn ; */
418 : 10984 : M2Quads_PopTtok (&name, &tok);
419 : 10984 : ModuleSym = M2Batch_MakeProgramSource (tok, name);
420 : 10984 : SymbolTable_SetCurrentModule (ModuleSym);
421 : 10984 : SymbolTable_SetFileModule (ModuleSym);
422 : : /* WriteString('MODULE - ') ; WriteKey(GetSymName(ModuleSym)) ; WriteLn ; */
423 : 10984 : SymbolTable_StartScope (ModuleSym);
424 : 10984 : M2Debug_Assert (M2Comp_CompilingProgramModule ());
425 : 10984 : M2Debug_Assert (! (SymbolTable_IsDefImp (ModuleSym)));
426 : 10984 : M2Quads_PushT (name);
427 : 10984 : M2Error_EnterProgramScope (name);
428 : 10984 : }
429 : :
430 : 10786 : extern "C" void P3SymBuild_P3EndBuildProgModule (void)
431 : : {
432 : 10786 : NameKey_Name NameStart;
433 : 10786 : NameKey_Name NameEnd;
434 : :
435 : : /*
436 : : EndBuildProgramModule - Destroys the program module scope and
437 : : checks for correct name.
438 : :
439 : : The Stack is expected:
440 : :
441 : : Entry Exit
442 : :
443 : : Ptr ->
444 : : +------------+ +-----------+
445 : : | NameEnd | | |
446 : : |------------| |-----------|
447 : : | NameStart | | | <- Ptr
448 : : |------------| |-----------|
449 : : */
450 : 10786 : M2Debug_Assert (M2Comp_CompilingProgramModule ());
451 : 10786 : SymbolTable_CheckForUnknownInModule ();
452 : 10786 : SymbolTable_EndScope ();
453 : 10786 : M2Quads_PopT (&NameEnd);
454 : 10786 : M2Quads_PopT (&NameStart);
455 : 10786 : if (NameStart != NameEnd)
456 : : {
457 : : /* we dont issue an error based around incorrect module names this would be done in P1 and P2.
458 : : If we get here then something has gone wrong with our error recovery in P3, so we bail out.
459 : : */
460 : 0 : M2Error_WriteFormat0 ((const char *) "too many errors in pass 3", 25);
461 : 0 : M2Error_FlushErrors ();
462 : : }
463 : 10786 : M2Error_LeaveErrorScope ();
464 : 10786 : }
465 : :
466 : :
467 : : /*
468 : : CheckCanBeImported - checks to see that it is legal to import, Sym, from, ModSym.
469 : : */
470 : :
471 : 285450 : extern "C" void P3SymBuild_CheckCanBeImported (unsigned int ModSym, unsigned int Sym)
472 : : {
473 : 285450 : NameKey_Name n1;
474 : 285450 : NameKey_Name n2;
475 : :
476 : 285450 : if (SymbolTable_IsDefImp (ModSym))
477 : : {
478 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
479 : 285402 : if (SymbolTable_IsExported (ModSym, Sym))
480 : : {
481 : : /* great all done */
482 : 285396 : return;
483 : : }
484 : : else
485 : : {
486 : 78 : if (SymbolTable_IsImplicityExported (ModSym, Sym))
487 : : {
488 : : /* this is also legal */
489 : : return;
490 : : }
491 : 18 : else if ((SymbolTable_IsDefImp (Sym)) && (SymbolTable_IsIncludedByDefinition (ModSym, Sym)))
492 : : {
493 : : /* avoid dangling else. */
494 : : /* this is also legal (for a definition module) */
495 : : return;
496 : : }
497 : 6 : n1 = SymbolTable_GetSymName (ModSym);
498 : 6 : n2 = SymbolTable_GetSymName (Sym);
499 : 6 : M2Error_WriteFormat2 ((const char *) "symbol %a is not exported from definition module %a", 51, (const unsigned char *) &n2, (sizeof (n2)-1), (const unsigned char *) &n1, (sizeof (n1)-1));
500 : : }
501 : : }
502 : : }
503 : :
504 : :
505 : : /*
506 : : StartBuildInnerModule - Creates an Inner module and starts
507 : : a new scope.
508 : :
509 : : The Stack is expected:
510 : :
511 : : Entry Exit
512 : :
513 : : Ptr -> <- Ptr
514 : : +------------+ +-----------+
515 : : | NameStart | | NameStart |
516 : : |------------| |-----------|
517 : :
518 : : */
519 : :
520 : 414 : extern "C" void P3SymBuild_StartBuildInnerModule (void)
521 : : {
522 : 414 : NameKey_Name name;
523 : 414 : unsigned int tok;
524 : 414 : unsigned int ModuleSym;
525 : :
526 : 414 : M2Quads_PopTtok (&name, &tok);
527 : 414 : ModuleSym = SymbolTable_RequestSym (tok, name);
528 : 414 : M2Debug_Assert (SymbolTable_IsModule (ModuleSym));
529 : 414 : SymbolTable_StartScope (ModuleSym);
530 : 414 : M2Debug_Assert (! (SymbolTable_IsDefImp (ModuleSym)));
531 : 414 : SymbolTable_SetCurrentModule (ModuleSym);
532 : 414 : M2Quads_PushT (name);
533 : 414 : M2Error_EnterModuleScope (name);
534 : 414 : }
535 : :
536 : :
537 : : /*
538 : : EndBuildInnerModule - Destroys the Inner module scope and
539 : : checks for correct name.
540 : :
541 : : The Stack is expected:
542 : :
543 : : Entry Exit
544 : :
545 : : Ptr ->
546 : : +------------+ +-----------+
547 : : | NameEnd | | |
548 : : |------------| |-----------|
549 : : | NameStart | | | <- Ptr
550 : : |------------| |-----------|
551 : : */
552 : :
553 : 414 : extern "C" void P3SymBuild_EndBuildInnerModule (void)
554 : : {
555 : 414 : NameKey_Name NameStart;
556 : 414 : NameKey_Name NameEnd;
557 : :
558 : 414 : SymbolTable_CheckForUnknownInModule ();
559 : 414 : SymbolTable_EndScope ();
560 : 414 : M2Quads_PopT (&NameEnd);
561 : 414 : M2Quads_PopT (&NameStart);
562 : 414 : if (NameStart != NameEnd)
563 : : {
564 : : /* we dont issue an error based around incorrect module names this would be done in P1 and P2.
565 : : If we get here then something has gone wrong with our error recovery in P3, so we bail out.
566 : : */
567 : 0 : M2Error_WriteFormat0 ((const char *) "too many errors in pass 3", 25);
568 : 0 : M2Error_FlushErrors ();
569 : : }
570 : 414 : SymbolTable_SetCurrentModule (SymbolTable_GetModuleScope (SymbolTable_GetCurrentModule ()));
571 : 414 : M2Error_LeaveErrorScope ();
572 : 414 : }
573 : :
574 : :
575 : : /*
576 : : CheckImportListOuterModule - checks to see that all identifiers are
577 : : exported from the definition module.
578 : :
579 : : The Stack is expected:
580 : :
581 : : Entry OR Entry
582 : :
583 : : Ptr -> Ptr ->
584 : : +------------+ +-----------+
585 : : | # | | # |
586 : : |------------| |-----------|
587 : : | Id1 | | Id1 |
588 : : |------------| |-----------|
589 : : . . . .
590 : : . . . .
591 : : . . . .
592 : : |------------| |-----------|
593 : : | Id# | | Id# |
594 : : |------------| |-----------|
595 : : | ImportTok | | Ident |
596 : : |------------| |-----------|
597 : :
598 : : IMPORT Id1, .. Id# ; FROM Ident IMPORT Id1 .. Id# ;
599 : :
600 : :
601 : : Error Condition
602 : : Exit
603 : :
604 : : All above stack discarded
605 : : */
606 : :
607 : 84072 : extern "C" void P3SymBuild_CheckImportListOuterModule (void)
608 : : {
609 : 84072 : NameKey_Name n1;
610 : 84072 : NameKey_Name n2;
611 : 84072 : unsigned int tok;
612 : 84072 : unsigned int ModSym;
613 : 84072 : unsigned int i;
614 : 84072 : unsigned int n;
615 : :
616 : 84072 : M2Quads_PopT (&n); /* n = # of the Ident List */
617 : 84072 : if ((M2Quads_OperandT (n+1)) != M2Reserved_ImportTok)
618 : : {
619 : : /* Ident List contains list of objects */
620 : 84072 : ModSym = M2Batch_LookupOuterModule (M2Quads_OperandTok (n+1), M2Quads_OperandT (n+1));
621 : 84072 : i = 1;
622 : 294440 : while (i <= n)
623 : : {
624 : 126296 : tok = static_cast<unsigned int> (M2Quads_OperandTok (i));
625 : 126296 : if ((! (SymbolTable_IsExported (ModSym, SymbolTable_RequestSym (tok, M2Quads_OperandT (i))))) && (! (SymbolTable_IsImplicityExported (ModSym, SymbolTable_RequestSym (tok, M2Quads_OperandT (i))))))
626 : : {
627 : 0 : n1 = static_cast<NameKey_Name> (M2Quads_OperandT (n+1));
628 : 0 : n2 = static_cast<NameKey_Name> (M2Quads_OperandT (i));
629 : 0 : M2Error_WriteFormat2 ((const char *) "symbol %a is not exported from definition or inner module %a", 60, (const unsigned char *) &n2, (sizeof (n2)-1), (const unsigned char *) &n1, (sizeof (n1)-1));
630 : : }
631 : 126296 : i += 1;
632 : : }
633 : : }
634 : 84072 : M2Quads_PopN (n+1); /* clear stack */
635 : 84072 : }
636 : :
637 : :
638 : : /*
639 : : BuildProcedureHeading - Builds a procedure heading for the definition
640 : : module procedures.
641 : :
642 : : Operation only performed if compiling a
643 : : definition module.
644 : :
645 : : The Stack:
646 : :
647 : : Entry Exit
648 : :
649 : : Ptr ->
650 : : +------------+
651 : : | ProcSym |
652 : : |------------|
653 : : | NameStart |
654 : : |------------|
655 : : Empty
656 : :
657 : : */
658 : :
659 : 2026896 : extern "C" void P3SymBuild_BuildProcedureHeading (void)
660 : : {
661 : 2026896 : unsigned int ProcSym;
662 : 2026896 : NameKey_Name NameStart;
663 : :
664 : 2026896 : if (M2Comp_CompilingDefinitionModule ())
665 : : {
666 : 1995899 : M2Quads_PopT (&ProcSym);
667 : 1995899 : M2Quads_PopT (&NameStart);
668 : 1995899 : SymbolTable_EndScope ();
669 : : }
670 : 2026896 : }
671 : :
672 : :
673 : : /*
674 : : StartBuildProcedure - Builds a Procedure.
675 : :
676 : : The Stack:
677 : :
678 : : Entry Exit
679 : :
680 : : <- Ptr
681 : : +------------+
682 : : Ptr -> | ProcSym |
683 : : +------------+ |------------|
684 : : | Name | | Name |
685 : : |------------| |------------|
686 : : */
687 : :
688 : 2941398 : extern "C" void P3SymBuild_StartBuildProcedure (void)
689 : : {
690 : 2941398 : unsigned int tok;
691 : 2941398 : NameKey_Name name;
692 : 2941398 : unsigned int ProcSym;
693 : :
694 : 2941398 : M2Quads_PopTtok (&name, &tok);
695 : 2941398 : M2Quads_PushTtok (name, tok); /* Name saved for the EndBuildProcedure name check */
696 : 2941398 : ProcSym = SymbolTable_RequestSym (tok, name); /* Name saved for the EndBuildProcedure name check */
697 : 2941398 : M2Debug_Assert (SymbolTable_IsProcedure (ProcSym));
698 : 2941398 : M2Quads_PushTtok (ProcSym, tok);
699 : 2941398 : SymbolTable_StartScope (ProcSym);
700 : 2941398 : M2Error_EnterProcedureScope (name);
701 : 2941398 : }
702 : :
703 : :
704 : : /*
705 : : EndBuildProcedure - Ends building a Procedure.
706 : : It checks the start procedure name matches the end
707 : : procedure name.
708 : :
709 : : The Stack:
710 : :
711 : : (Procedure Not Defined in definition module)
712 : :
713 : : Entry Exit
714 : :
715 : : Ptr ->
716 : : +------------+
717 : : | NameEnd |
718 : : |------------|
719 : : | ProcSym |
720 : : |------------|
721 : : | NameStart |
722 : : |------------|
723 : : Empty
724 : : */
725 : :
726 : 945433 : extern "C" void P3SymBuild_EndBuildProcedure (void)
727 : : {
728 : 945433 : unsigned int ProcSym;
729 : 945433 : NameKey_Name NameEnd;
730 : 945433 : NameKey_Name NameStart;
731 : :
732 : 945433 : M2Quads_PopT (&NameEnd);
733 : 945433 : M2Quads_PopT (&ProcSym);
734 : 945433 : M2Quads_PopT (&NameStart);
735 : 945433 : if (NameEnd != NameStart)
736 : : {
737 : : /* we dont issue an error based around incorrect module names this would be done in P1 and P2.
738 : : If we get here then something has gone wrong with our error recovery in P3, so we bail out.
739 : : */
740 : 0 : M2Error_WriteFormat0 ((const char *) "too many errors in pass 3", 25);
741 : 0 : M2Error_FlushErrors ();
742 : : }
743 : 945433 : SymbolTable_EndScope ();
744 : 945433 : M2Error_LeaveErrorScope ();
745 : 945433 : }
746 : :
747 : :
748 : : /*
749 : : EndBuildForward -
750 : : */
751 : :
752 : 24 : extern "C" void P3SymBuild_EndBuildForward (void)
753 : : {
754 : 24 : M2Quads_PopN (2);
755 : 24 : SymbolTable_EndScope ();
756 : 24 : M2Error_LeaveErrorScope ();
757 : 24 : }
758 : :
759 : :
760 : : /*
761 : : BuildSubrange - Builds a Subrange type Symbol.
762 : :
763 : :
764 : : Stack
765 : :
766 : : Entry Exit
767 : :
768 : : Ptr ->
769 : : +------------+
770 : : | High |
771 : : |------------|
772 : : | Low | <- Ptr
773 : : |------------|
774 : : */
775 : :
776 : 82592 : extern "C" void P3SymBuild_BuildSubrange (void)
777 : : {
778 : 82592 : unsigned int Base;
779 : 82592 : unsigned int Type;
780 : 82592 : unsigned int Low;
781 : 82592 : unsigned int High;
782 : :
783 : 82592 : M2Quads_PopT (&High);
784 : 82592 : M2Quads_PopT (&Low);
785 : 82592 : FifoQueue_GetSubrangeFromFifoQueue (&Type); /* Collect subrange type from pass 2 and fill in */
786 : : /* bounds. */
787 : 82592 : FifoQueue_GetSubrangeFromFifoQueue (&Base); /* Get base of subrange (maybe NulSym) */
788 : : /* worked out later in M2GCCDeclare */
789 : 82592 : SymbolTable_PutSubrange (Type, Low, High, Base);
790 : 82592 : }
791 : :
792 : :
793 : : /*
794 : : BuildNulName - Pushes a NulKey onto the top of the stack.
795 : : The Stack:
796 : :
797 : :
798 : : Entry Exit
799 : :
800 : : <- Ptr
801 : : Empty +------------+
802 : : | NulKey |
803 : : |------------|
804 : : */
805 : :
806 : 0 : extern "C" void P3SymBuild_BuildNulName (void)
807 : : {
808 : 0 : M2Quads_PushT (static_cast<unsigned int> (NameKey_NulName));
809 : 0 : }
810 : :
811 : :
812 : : /*
813 : : BuildConst - builds a constant.
814 : : Stack
815 : :
816 : : Entry Exit
817 : :
818 : : Ptr -> <- Ptr
819 : : +------------+ +------------+
820 : : | Name | | Sym |
821 : : |------------+ |------------|
822 : : */
823 : :
824 : 243701 : extern "C" void P3SymBuild_BuildConst (void)
825 : : {
826 : 243701 : NameKey_Name name;
827 : 243701 : unsigned int tok;
828 : 243701 : unsigned int Sym;
829 : :
830 : 243701 : M2Quads_PopTtok (&name, &tok);
831 : 243701 : Sym = SymbolTable_RequestSym (tok, name);
832 : 243701 : M2Quads_PushTtok (Sym, tok);
833 : 243701 : }
834 : :
835 : :
836 : : /*
837 : : BuildVarAtAddress - updates the symbol table entry of, variable sym, to be declared
838 : : at address, address.
839 : :
840 : : Stack
841 : :
842 : : Entry Exit
843 : :
844 : : Ptr ->
845 : : +--------------+
846 : : | Expr | EType | <- Ptr
847 : : |--------------+ +--------------+
848 : : | name | SType | | name | SType |
849 : : |--------------+ |--------------|
850 : : */
851 : :
852 : 54 : extern "C" void P3SymBuild_BuildVarAtAddress (void)
853 : : {
854 : 54 : unsigned int nametok;
855 : 54 : NameKey_Name name;
856 : 54 : unsigned int Sym;
857 : 54 : unsigned int SType;
858 : 54 : unsigned int Exp;
859 : 54 : unsigned int EType;
860 : :
861 : 54 : M2Quads_PopTF (&Exp, &EType);
862 : 54 : M2Quads_PopTFtok (&name, &SType, &nametok);
863 : 54 : M2Quads_PushTF (name, SType);
864 : 54 : Sym = SymbolTable_RequestSym (nametok, name);
865 : 54 : if ((SymbolTable_GetMode (Sym)) == SymbolTable_LeftValue)
866 : : {
867 : 54 : SymbolTable_PutVariableAtAddress (Sym, Exp);
868 : : }
869 : : else
870 : : {
871 : 0 : M2Error_InternalError ((const char *) "expecting lvalue for this variable which is declared at an explicit address", 75);
872 : : }
873 : 54 : }
874 : :
875 : :
876 : : /*
877 : : BuildOptArgInitializer - assigns the constant value symbol, const, to be the
878 : : initial value of the optional parameter should it be
879 : : absent.
880 : :
881 : : Ptr ->
882 : : +------------+
883 : : | const |
884 : : |------------| <- Ptr
885 : : */
886 : :
887 : 15143 : extern "C" void P3SymBuild_BuildOptArgInitializer (void)
888 : : {
889 : 15143 : unsigned int tok;
890 : 15143 : unsigned int const_;
891 : 15143 : unsigned int ProcSym;
892 : :
893 : 15143 : M2Quads_PopT (&const_);
894 : 15143 : M2Quads_PopTtok (&ProcSym, &tok);
895 : 15143 : M2Debug_Assert (SymbolTable_IsProcedure (ProcSym));
896 : 15143 : M2Quads_PushTtok (ProcSym, tok);
897 : 15143 : SymbolTable_PutOptArgInit (SymbolTable_GetCurrentScope (), const_);
898 : 15143 : }
899 : :
900 : 15392 : extern "C" void _M2_P3SymBuild_init (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
901 : : {
902 : 15392 : }
903 : :
904 : 0 : extern "C" void _M2_P3SymBuild_fini (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
905 : : {
906 : 0 : }
|