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