Branch data Line data Source code
1 : : /* do not edit automatically generated by mc from P1SymBuild. */
2 : : /* P1SymBuild.mod pass 1 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 : : # if !defined (FALSE)
35 : : # define FALSE (1==0)
36 : : # endif
37 : :
38 : : #define _P1SymBuild_C
39 : :
40 : : #include "GP1SymBuild.h"
41 : : # include "GASCII.h"
42 : : # include "GNameKey.h"
43 : : # include "GM2Debug.h"
44 : : # include "GM2LexBuf.h"
45 : : # include "GM2MetaError.h"
46 : : # include "GDynamicStrings.h"
47 : : # include "GM2Printf.h"
48 : : # include "GM2Options.h"
49 : : # include "GM2Reserved.h"
50 : : # include "GFifoQueue.h"
51 : : # include "GP0SymBuild.h"
52 : : # include "GSymbolTable.h"
53 : : # include "GM2Batch.h"
54 : : # include "GM2Quads.h"
55 : : # include "GM2Comp.h"
56 : :
57 : : # define Debugging false
58 : : static unsigned int importStatementCount;
59 : : extern "C" void P1SymBuild_P1StartBuildDefinitionModule (void);
60 : : extern "C" void P1SymBuild_P1EndBuildDefinitionModule (void);
61 : : extern "C" void P1SymBuild_P1StartBuildImplementationModule (void);
62 : : extern "C" void P1SymBuild_P1EndBuildImplementationModule (void);
63 : : extern "C" void P1SymBuild_P1StartBuildProgramModule (void);
64 : : extern "C" void P1SymBuild_P1EndBuildProgramModule (void);
65 : :
66 : : /*
67 : : StartBuildInnerModule - Creates an Inner module and starts
68 : : a new scope.
69 : :
70 : : The Stack is expected:
71 : :
72 : : Entry Exit
73 : :
74 : : Ptr -> <- Ptr
75 : : +------------+ +-----------+
76 : : | NameStart | | NameStart |
77 : : |------------| |-----------|
78 : :
79 : : */
80 : :
81 : : extern "C" void P1SymBuild_StartBuildInnerModule (void);
82 : :
83 : : /*
84 : : EndBuildInnerModule - Destroys the Inner module scope and
85 : : checks for correct name.
86 : :
87 : : The Stack is expected:
88 : :
89 : : Entry Exit
90 : :
91 : : Ptr ->
92 : : +------------+ +-----------+
93 : : | NameEnd | | |
94 : : |------------| |-----------|
95 : : | NameStart | | | <- Ptr
96 : : |------------| |-----------|
97 : : */
98 : :
99 : : extern "C" void P1SymBuild_EndBuildInnerModule (void);
100 : :
101 : : /*
102 : : BuildImportOuterModule - Builds imported identifiers into an outer module
103 : : from a definition module.
104 : :
105 : : The Stack is expected:
106 : :
107 : : Entry OR Entry
108 : :
109 : : Ptr -> Ptr ->
110 : : +------------+ +-----------+
111 : : | # | | # |
112 : : |------------| |-----------|
113 : : | Id1 | | Id1 |
114 : : |------------| |-----------|
115 : : . . . .
116 : : . . . .
117 : : . . . .
118 : : |------------| |-----------|
119 : : | Id# | | Id# |
120 : : |------------| |-----------|
121 : : | ImportTok | | Ident |
122 : : |------------| |-----------|
123 : :
124 : : IMPORT Id1, .. Id# ; FROM Ident IMPORT Id1 .. Id# ;
125 : :
126 : :
127 : : Exit
128 : :
129 : : All above stack discarded
130 : : */
131 : :
132 : : extern "C" void P1SymBuild_BuildImportOuterModule (bool definition);
133 : :
134 : : /*
135 : : BuildExportOuterModule - Builds exported identifiers from an outer module
136 : : to the outside world of library modules.
137 : :
138 : : The Stack is expected:
139 : :
140 : : Entry OR Entry
141 : :
142 : : Ptr -> Ptr ->
143 : : +------------+ +--------------+
144 : : | # | | # |
145 : : |------------| |--------------|
146 : : | Id1 | | Id1 |
147 : : |------------| |--------------|
148 : : . . . .
149 : : . . . .
150 : : . . . .
151 : : |------------| |--------------|
152 : : | Id# | | Id# |
153 : : |------------| |--------------|
154 : : | ExportTok | | QualifiedTok |
155 : : |------------| |--------------|
156 : :
157 : : EXPORT Id1, .. Id# ; EXPORT QUALIFIED Id1 .. Id# ;
158 : :
159 : : Error Condition
160 : :
161 : :
162 : : Exit
163 : :
164 : : All above stack discarded
165 : : */
166 : :
167 : : extern "C" void P1SymBuild_BuildExportOuterModule (void);
168 : :
169 : : /*
170 : : CheckExplicitExported - checks to see whether we are compiling
171 : : a definition module and whether the ident
172 : : is implicitly export qualified or unqualified.
173 : :
174 : :
175 : : The Stack is expected:
176 : :
177 : : Entry Exit
178 : :
179 : : Ptr -> Ptr ->
180 : : +------------+ +-----------+
181 : : | Identname | | Identname |
182 : : |------------| |-----------|
183 : :
184 : : */
185 : :
186 : : extern "C" void P1SymBuild_CheckExplicitExported (void);
187 : :
188 : : /*
189 : : BuildImportInnerModule - Builds imported identifiers into an inner module
190 : : from the last level of module.
191 : :
192 : : The Stack is expected:
193 : :
194 : : Entry OR Entry
195 : :
196 : : Ptr -> Ptr ->
197 : : +------------+ +-----------+
198 : : | # | | # |
199 : : |------------| |-----------|
200 : : | Id1 | | Id1 |
201 : : |------------| |-----------|
202 : : . . . .
203 : : . . . .
204 : : . . . .
205 : : |------------| |-----------|
206 : : | Id# | | Id# |
207 : : |------------| |-----------|
208 : : | ImportTok | | Ident |
209 : : |------------| |-----------|
210 : :
211 : : IMPORT Id1, .. Id# ; FROM Ident IMPORT Id1 .. Id# ;
212 : :
213 : : Exit
214 : :
215 : : All above stack discarded
216 : : */
217 : :
218 : : extern "C" void P1SymBuild_BuildImportInnerModule (void);
219 : :
220 : : /*
221 : : BuildExportInnerModule - Builds exported identifiers from an inner module
222 : : to the next layer module.
223 : :
224 : : The Stack is expected:
225 : :
226 : : Entry OR Entry
227 : :
228 : : Ptr -> Ptr ->
229 : : +------------+ +--------------+
230 : : | # | | # |
231 : : |------------| |--------------|
232 : : | Id1 | | Id1 |
233 : : |------------| |--------------|
234 : : . . . .
235 : : . . . .
236 : : . . . .
237 : : |------------| |--------------|
238 : : | Id# | | Id# |
239 : : |------------| |--------------|
240 : : | ExportTok | | QualifiedTok |
241 : : |------------| |--------------|
242 : :
243 : : EXPORT Id1, .. Id# ; EXPORT QUALIFIED Id1 .. Id# ;
244 : :
245 : :
246 : : Exit
247 : :
248 : :
249 : : All above stack discarded
250 : : */
251 : :
252 : : extern "C" void P1SymBuild_BuildExportInnerModule (void);
253 : :
254 : : /*
255 : : StartBuildEnumeration - Builds an Enumeration type Type.
256 : :
257 : :
258 : : Stack
259 : :
260 : : Entry Exit
261 : :
262 : : Ptr ->
263 : : +------------+
264 : : | # |
265 : : |------------|
266 : : | en 1 |
267 : : |------------|
268 : : | en 2 |
269 : : |------------|
270 : : . .
271 : : . .
272 : : . . <- Ptr
273 : : |------------| +------------+
274 : : | en # | | Type |
275 : : |------------| |------------|
276 : : | Name | | Name |
277 : : |------------| |------------|
278 : : */
279 : :
280 : : extern "C" void P1SymBuild_StartBuildEnumeration (void);
281 : :
282 : : /*
283 : : EndBuildEnumeration - completes the construction of the enumeration type.
284 : :
285 : :
286 : : Stack
287 : :
288 : : Entry Exit
289 : :
290 : : Ptr ->
291 : : +------------+
292 : : | Type | <- Ptr
293 : : |------------| +---------------+
294 : : | Name | | Type | Name |
295 : : |------------| |---------------|
296 : :
297 : : Empty
298 : : */
299 : :
300 : : extern "C" void P1SymBuild_EndBuildEnumeration (void);
301 : :
302 : : /*
303 : : BuildHiddenType - Builds a Hidden Type.
304 : :
305 : :
306 : : Stack
307 : :
308 : : Entry Exit
309 : :
310 : : Ptr ->
311 : : +------------+
312 : : | Name | <- Ptr
313 : : |------------| Empty
314 : : */
315 : :
316 : : extern "C" void P1SymBuild_BuildHiddenType (void);
317 : :
318 : : /*
319 : : StartBuildProcedure - Builds a Procedure.
320 : :
321 : : The Stack:
322 : :
323 : : Entry Exit
324 : :
325 : : Ptr -> <- Ptr
326 : : +------------+ +------------+
327 : : | Name | | ProcSym |
328 : : |------------| |------------|
329 : : | inlinetok | | |
330 : : | or | | |
331 : : | builtintok | | |
332 : : | or name or | | Name |
333 : : | NulTok | | |
334 : : |------------| |------------|
335 : : */
336 : :
337 : : extern "C" void P1SymBuild_StartBuildProcedure (void);
338 : :
339 : : /*
340 : : EndBuildProcedure - Ends building a Procedure.
341 : : It checks the start procedure name matches the end
342 : : procedure name.
343 : :
344 : : The Stack:
345 : :
346 : : (Procedure Not Defined in definition module)
347 : :
348 : : Entry Exit
349 : :
350 : : Ptr ->
351 : : +------------+
352 : : | NameEnd |
353 : : |------------|
354 : : | ProcSym |
355 : : |------------|
356 : : | NameStart |
357 : : |------------|
358 : : Empty
359 : : */
360 : :
361 : : extern "C" void P1SymBuild_EndBuildProcedure (void);
362 : :
363 : : /*
364 : : BuildProcedureHeading - Builds a procedure heading for the definition
365 : : module procedures.
366 : :
367 : : Operation only performed if compiling a
368 : : definition module.
369 : :
370 : : The Stack:
371 : :
372 : : Entry Exit
373 : :
374 : : Ptr ->
375 : : +------------+
376 : : | ProcSym |
377 : : |------------|
378 : : | NameStart |
379 : : |------------|
380 : : Empty
381 : :
382 : : */
383 : :
384 : : extern "C" void P1SymBuild_BuildProcedureHeading (void);
385 : :
386 : : /*
387 : : EndBuildForward - Ends building a forward procedure declaration.
388 : :
389 : : The Stack:
390 : :
391 : : (This procedure is not defined in definition module)
392 : :
393 : : Entry Exit
394 : :
395 : : Ptr ->
396 : : +------------+
397 : : | ProcSym |
398 : : |------------|
399 : : | NameStart |
400 : : |------------|
401 : : Empty
402 : : */
403 : :
404 : : extern "C" void P1SymBuild_EndBuildForward (unsigned int forwardPos);
405 : :
406 : : /*
407 : : BuildNulName - Pushes a NulName onto the top of the stack.
408 : : The Stack:
409 : :
410 : :
411 : : Entry Exit
412 : :
413 : : <- Ptr
414 : : Empty +------------+
415 : : | NulName |
416 : : |------------|
417 : : */
418 : :
419 : : extern "C" void P1SymBuild_BuildNulName (void);
420 : :
421 : : /*
422 : : BuildTypeEnd - Pops the type Type and Name.
423 : : The Stack:
424 : :
425 : :
426 : : Entry Exit
427 : :
428 : :
429 : : Ptr ->
430 : : +-------------+
431 : : | Type | Name | Empty
432 : : |-------------|
433 : : */
434 : :
435 : : extern "C" void P1SymBuild_BuildTypeEnd (void);
436 : :
437 : : /*
438 : : BuildImportStatement - create a new import statement in the current module.
439 : : It ignores local modules.
440 : :
441 : : The quadruple stack is not used.
442 : : */
443 : :
444 : : extern "C" void P1SymBuild_BuildImportStatement (unsigned int tok);
445 : :
446 : : /*
447 : : AddImportToImportStatement - the top of stack is expected to be a module name.
448 : : This is looked up from the module universe and
449 : : wrapped in an import symbol and placed into the
450 : : current import statement.
451 : :
452 : : The quadruple stack is unchanged.
453 : :
454 : : Entry Exit
455 : :
456 : :
457 : : Ptr -> <- Ptr
458 : : +---------------------+ +---------------------+
459 : : | ImportedModuleName | | ImportedModuleName |
460 : : |---------------------| |---------------------|
461 : : */
462 : :
463 : : extern "C" void P1SymBuild_AddImportToImportStatement (bool qualified);
464 : :
465 : 115120 : extern "C" void P1SymBuild_P1StartBuildDefinitionModule (void)
466 : : {
467 : 115120 : NameKey_Name name;
468 : 115120 : unsigned int language;
469 : 115120 : unsigned int ModuleSym;
470 : :
471 : : /*
472 : : StartBuildDefinitionModule - Creates a definition module and starts
473 : : a new scope.
474 : :
475 : : he Stack is expected:
476 : :
477 : : Entry Exit
478 : :
479 : : Ptr ->
480 : : +------------+
481 : : | NameStart | <- Ptr
482 : : |------------| +------------+
483 : : | NulName/"C"| | NameStart |
484 : : |------------| |------------|
485 : : */
486 : 115120 : importStatementCount = 0;
487 : 115120 : M2Quads_PopT (&name);
488 : : /* CheckFileName(name, 'definition') ; */
489 : 115120 : ModuleSym = M2Batch_MakeDefinitionSource (M2LexBuf_GetTokenNo (), name);
490 : 115120 : SymbolTable_PutDoesNotNeedExportList (ModuleSym);
491 : 115120 : SymbolTable_SetCurrentModule (ModuleSym);
492 : 115120 : SymbolTable_SetFileModule (ModuleSym);
493 : 115120 : SymbolTable_StartScope (ModuleSym);
494 : 115120 : M2Debug_Assert (SymbolTable_IsDefImp (ModuleSym));
495 : 115120 : M2Debug_Assert (M2Comp_CompilingDefinitionModule ());
496 : 115120 : M2Quads_PopT (&language);
497 : 115120 : if ((language != SymbolTable_NulSym) && (SymbolTable_IsConstString (language)))
498 : : {
499 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
500 : 7764 : if ((SymbolTable_GetSymName (language)) == (NameKey_MakeKey ((const char *) "C", 1)))
501 : : {
502 : 7764 : SymbolTable_PutDefinitionForC (ModuleSym);
503 : : }
504 : 0 : else if ((SymbolTable_GetSymName (language)) == NameKey_NulName)
505 : : {
506 : : /* avoid dangling else. */
507 : 0 : M2MetaError_MetaError0 ((const char *) "{%E}currently a non modula-2 definition module can only be declared as DEFINITION FOR {%k\"C\"}", 93);
508 : : }
509 : : else
510 : : {
511 : : /* avoid dangling else. */
512 : 0 : M2MetaError_MetaError1 ((const char *) "unknown definition module language {%1Ea}, currently a non modula-2 definition module can only be declared as DEFINITION FOR {%k\"C\"}", 132, language);
513 : : }
514 : : }
515 : 115120 : M2Quads_PushT (name);
516 : 115120 : P0SymBuild_EnterBlock (name);
517 : 115120 : }
518 : :
519 : 115120 : extern "C" void P1SymBuild_P1EndBuildDefinitionModule (void)
520 : : {
521 : 115120 : unsigned int start;
522 : 115120 : NameKey_Name NameStart;
523 : 115120 : NameKey_Name NameEnd;
524 : :
525 : : /*
526 : : EndBuildDefinitionModule - Destroys the definition module scope and
527 : : checks for correct name.
528 : :
529 : : The Stack is expected:
530 : :
531 : : Entry Exit
532 : :
533 : : Ptr ->
534 : : +------------+ +-----------+
535 : : | NameEnd | | |
536 : : |------------| |-----------|
537 : : | NameStart | | | <- Ptr
538 : : |------------| |-----------|
539 : : */
540 : 115120 : M2Debug_Assert (M2Comp_CompilingDefinitionModule ());
541 : 115120 : SymbolTable_EndScope ();
542 : 115120 : M2Quads_PopTtok (&NameStart, &start);
543 : 115120 : M2Quads_PopT (&NameEnd);
544 : 115120 : if (Debugging)
545 : : {
546 : : M2Printf_printf0 ((const char *) "pass 1: ", 8);
547 : : SymbolTable_DisplayTrees (SymbolTable_GetCurrentModule ());
548 : : }
549 : 115120 : if (NameStart != NameEnd)
550 : : {
551 : 0 : M2MetaError_MetaError1 ((const char *) "inconsistant definition module name {%1Wa}", 42, SymbolTable_MakeError (start, NameStart));
552 : : }
553 : 115120 : P0SymBuild_LeaveBlock ();
554 : 115120 : }
555 : :
556 : 52237 : extern "C" void P1SymBuild_P1StartBuildImplementationModule (void)
557 : : {
558 : 52237 : unsigned int tok;
559 : 52237 : NameKey_Name name;
560 : 52237 : unsigned int ModuleSym;
561 : :
562 : : /*
563 : : StartBuildImplementationModule - Creates an implementation module and starts
564 : : a new scope.
565 : :
566 : : The Stack is expected:
567 : :
568 : : Entry Exit
569 : :
570 : : Ptr -> <- Ptr
571 : : +------------+ +-----------+
572 : : | NameStart | | NameStart |
573 : : |------------| |-----------|
574 : :
575 : : */
576 : 52237 : importStatementCount = 0;
577 : 52237 : M2Quads_PopTtok (&name, &tok);
578 : : /* CheckFileName(name, 'implementation') ; */
579 : 52237 : ModuleSym = M2Batch_MakeImplementationSource (tok, name);
580 : 52237 : SymbolTable_SetCurrentModule (ModuleSym);
581 : 52237 : SymbolTable_SetFileModule (ModuleSym);
582 : 52237 : SymbolTable_StartScope (ModuleSym);
583 : 52237 : if (! (SymbolTable_IsDefImp (ModuleSym)))
584 : : {
585 : 0 : M2MetaError_MetaError1 ((const char *) "cannot find corresponding definition module for {%1Ea}", 54, ModuleSym);
586 : : }
587 : 52237 : M2Debug_Assert (M2Comp_CompilingImplementationModule ());
588 : 52237 : M2Quads_PushTtok (name, tok);
589 : 52237 : P0SymBuild_EnterBlock (name);
590 : 52237 : }
591 : :
592 : 52237 : extern "C" void P1SymBuild_P1EndBuildImplementationModule (void)
593 : : {
594 : 52237 : unsigned int start;
595 : 52237 : unsigned int end;
596 : 52237 : NameKey_Name NameStart;
597 : 52237 : NameKey_Name NameEnd;
598 : :
599 : : /*
600 : : EndBuildImplementationModule - Destroys the implementation module scope and
601 : : checks for correct name.
602 : :
603 : : The Stack is expected:
604 : :
605 : : Entry Exit
606 : :
607 : : Ptr ->
608 : : +------------+ +-----------+
609 : : | NameEnd | | |
610 : : |------------| |-----------|
611 : : | NameStart | | | <- Ptr
612 : : |------------| |-----------|
613 : : */
614 : 52237 : SymbolTable_ResolveImports ();
615 : 52237 : M2Debug_Assert (M2Comp_CompilingImplementationModule ());
616 : 52237 : SymbolTable_EndScope ();
617 : 52237 : M2Quads_PopTtok (&NameStart, &start);
618 : 52237 : M2Quads_PopTtok (&NameEnd, &end);
619 : 52237 : if (NameStart != NameEnd)
620 : : {
621 : 0 : M2MetaError_MetaErrorT1 (end, (const char *) "inconsistant implementation module name {%1Wa}", 46, SymbolTable_MakeError (start, NameStart));
622 : : }
623 : 52237 : P0SymBuild_LeaveBlock ();
624 : 52237 : }
625 : :
626 : 11140 : extern "C" void P1SymBuild_P1StartBuildProgramModule (void)
627 : : {
628 : 11140 : unsigned int tok;
629 : 11140 : NameKey_Name name;
630 : 11140 : unsigned int ModuleSym;
631 : :
632 : : /*
633 : : StartBuildProgramModule - Creates a program module and starts
634 : : a new scope.
635 : :
636 : : The Stack is expected:
637 : :
638 : : Entry Exit
639 : :
640 : : Ptr -> <- Ptr
641 : : +------------+ +-----------+
642 : : | NameStart | | NameStart |
643 : : |------------| |-----------|
644 : :
645 : : */
646 : 11140 : importStatementCount = 0;
647 : 11140 : M2Quads_PopTtok (&name, &tok);
648 : : /* CheckFileName(name, 'main') ; */
649 : 11140 : ModuleSym = M2Batch_MakeProgramSource (tok, name);
650 : 11140 : SymbolTable_SetCurrentModule (ModuleSym);
651 : 11140 : SymbolTable_SetFileModule (ModuleSym);
652 : 11140 : SymbolTable_StartScope (ModuleSym);
653 : 11140 : if ((! (M2Comp_CompilingProgramModule ())) || (SymbolTable_IsDefImp (ModuleSym)))
654 : : {
655 : 6 : M2MetaError_MetaErrorT1 (tok, (const char *) "module {%1Ea} has a corresponding DEFINITION MODULE but no IMPLEMENTATION keyword in the main module", 100, ModuleSym);
656 : : }
657 : 11140 : M2Quads_PushTtok (name, tok);
658 : 11140 : P0SymBuild_EnterBlock (name);
659 : 11140 : }
660 : :
661 : 11140 : extern "C" void P1SymBuild_P1EndBuildProgramModule (void)
662 : : {
663 : 11140 : unsigned int start;
664 : 11140 : unsigned int end;
665 : 11140 : NameKey_Name NameStart;
666 : 11140 : NameKey_Name NameEnd;
667 : :
668 : : /*
669 : : EndBuildProgramModule - Destroys the program module scope and
670 : : checks for correct name.
671 : :
672 : : The Stack is expected:
673 : :
674 : : Entry Exit
675 : :
676 : : Ptr ->
677 : : +------------+ +-----------+
678 : : | NameEnd | | |
679 : : |------------| |-----------|
680 : : | NameStart | | | <- Ptr
681 : : |------------| |-----------|
682 : : */
683 : 11140 : SymbolTable_ResolveImports ();
684 : 11140 : M2Debug_Assert (M2Comp_CompilingProgramModule ());
685 : 11134 : SymbolTable_EndScope ();
686 : 11134 : M2Quads_PopTtok (&NameStart, &start);
687 : 11134 : M2Quads_PopTtok (&NameEnd, &end);
688 : 11134 : if (Debugging)
689 : : {
690 : : M2Printf_printf0 ((const char *) "pass 1: ", 8);
691 : : SymbolTable_DisplayTrees (SymbolTable_GetCurrentModule ());
692 : : }
693 : 11134 : if (NameStart != NameEnd)
694 : : {
695 : 0 : M2MetaError_MetaErrorT1 (end, (const char *) "inconsistant program module name {%1Wa}", 39, SymbolTable_MakeError (start, NameStart));
696 : : }
697 : 11134 : P0SymBuild_LeaveBlock ();
698 : 11134 : }
699 : :
700 : :
701 : : /*
702 : : StartBuildInnerModule - Creates an Inner module and starts
703 : : a new scope.
704 : :
705 : : The Stack is expected:
706 : :
707 : : Entry Exit
708 : :
709 : : Ptr -> <- Ptr
710 : : +------------+ +-----------+
711 : : | NameStart | | NameStart |
712 : : |------------| |-----------|
713 : :
714 : : */
715 : :
716 : 420 : extern "C" void P1SymBuild_StartBuildInnerModule (void)
717 : : {
718 : 420 : unsigned int tok;
719 : 420 : NameKey_Name name;
720 : 420 : unsigned int ModuleSym;
721 : :
722 : 420 : M2Quads_PopTtok (&name, &tok);
723 : 420 : ModuleSym = SymbolTable_GetSym (name);
724 : 420 : M2Debug_Assert (ModuleSym != SymbolTable_NulSym);
725 : 420 : SymbolTable_StartScope (ModuleSym);
726 : 420 : M2Debug_Assert (! (SymbolTable_IsDefImp (ModuleSym)));
727 : 420 : M2Quads_PushTtok (name, tok);
728 : 420 : P0SymBuild_EnterBlock (name);
729 : 420 : }
730 : :
731 : :
732 : : /*
733 : : EndBuildInnerModule - Destroys the Inner module scope and
734 : : checks for correct name.
735 : :
736 : : The Stack is expected:
737 : :
738 : : Entry Exit
739 : :
740 : : Ptr ->
741 : : +------------+ +-----------+
742 : : | NameEnd | | |
743 : : |------------| |-----------|
744 : : | NameStart | | | <- Ptr
745 : : |------------| |-----------|
746 : : */
747 : :
748 : 420 : extern "C" void P1SymBuild_EndBuildInnerModule (void)
749 : : {
750 : 420 : unsigned int start;
751 : 420 : unsigned int end;
752 : 420 : NameKey_Name NameStart;
753 : 420 : NameKey_Name NameEnd;
754 : :
755 : 420 : SymbolTable_EndScope ();
756 : 420 : M2Quads_PopTtok (&NameStart, &start);
757 : 420 : M2Quads_PopTtok (&NameEnd, &end);
758 : 420 : if (NameStart != NameEnd)
759 : : {
760 : 0 : M2MetaError_MetaErrorT1 (end, (const char *) "inconsistant inner module name {%1Wa}", 37, SymbolTable_MakeError (start, NameStart));
761 : : }
762 : 420 : P0SymBuild_LeaveBlock ();
763 : 420 : }
764 : :
765 : :
766 : : /*
767 : : BuildImportOuterModule - Builds imported identifiers into an outer module
768 : : from a definition module.
769 : :
770 : : The Stack is expected:
771 : :
772 : : Entry OR Entry
773 : :
774 : : Ptr -> Ptr ->
775 : : +------------+ +-----------+
776 : : | # | | # |
777 : : |------------| |-----------|
778 : : | Id1 | | Id1 |
779 : : |------------| |-----------|
780 : : . . . .
781 : : . . . .
782 : : . . . .
783 : : |------------| |-----------|
784 : : | Id# | | Id# |
785 : : |------------| |-----------|
786 : : | ImportTok | | Ident |
787 : : |------------| |-----------|
788 : :
789 : : IMPORT Id1, .. Id# ; FROM Ident IMPORT Id1 .. Id# ;
790 : :
791 : :
792 : : Exit
793 : :
794 : : All above stack discarded
795 : : */
796 : :
797 : 279496 : extern "C" void P1SymBuild_BuildImportOuterModule (bool definition)
798 : : {
799 : 279496 : unsigned int Sym;
800 : 279496 : unsigned int ModSym;
801 : 279496 : unsigned int i;
802 : 279496 : unsigned int n;
803 : :
804 : 279496 : M2Quads_PopT (&n); /* n = # of the Ident List */
805 : 279496 : if ((M2Quads_OperandT (n+1)) == M2Reserved_ImportTok)
806 : : {
807 : : /* Ident list contains Module Names */
808 : : i = 1;
809 : 76094 : while (i <= n)
810 : : {
811 : 42472 : ModSym = M2Batch_LookupModule (M2Quads_OperandTok ((n+1)-i), M2Quads_OperandT ((n+1)-i));
812 : 42472 : SymbolTable_PutImported (ModSym);
813 : 42472 : if (definition)
814 : : {
815 : 9166 : SymbolTable_PutIncludedByDefinition (ModSym);
816 : : }
817 : 42472 : i += 1;
818 : : }
819 : : }
820 : : else
821 : : {
822 : : /* Ident List contains list of objects */
823 : 245874 : ModSym = M2Batch_LookupModule (M2Quads_OperandTok (n+1), M2Quads_OperandT (n+1));
824 : 245874 : i = 1;
825 : : /*
826 : : WriteString('Importing ') ; WriteKey(Operand(j)) ; WriteString(' from ') ; WriteKey(GetSymName(ModSym)) ; WriteLn ;
827 : : */
828 : 1083066 : while (i <= n)
829 : : {
830 : 591318 : Sym = SymbolTable_GetExported (M2Quads_OperandTok ((n+1)-i), ModSym, M2Quads_OperandT ((n+1)-i));
831 : 591318 : SymbolTable_PutImported (Sym);
832 : 591318 : i += 1;
833 : : }
834 : : }
835 : 279496 : M2Quads_PopN (n+1); /* clear stack */
836 : 279496 : }
837 : :
838 : :
839 : : /*
840 : : BuildExportOuterModule - Builds exported identifiers from an outer module
841 : : to the outside world of library modules.
842 : :
843 : : The Stack is expected:
844 : :
845 : : Entry OR Entry
846 : :
847 : : Ptr -> Ptr ->
848 : : +------------+ +--------------+
849 : : | # | | # |
850 : : |------------| |--------------|
851 : : | Id1 | | Id1 |
852 : : |------------| |--------------|
853 : : . . . .
854 : : . . . .
855 : : . . . .
856 : : |------------| |--------------|
857 : : | Id# | | Id# |
858 : : |------------| |--------------|
859 : : | ExportTok | | QualifiedTok |
860 : : |------------| |--------------|
861 : :
862 : : EXPORT Id1, .. Id# ; EXPORT QUALIFIED Id1 .. Id# ;
863 : :
864 : : Error Condition
865 : :
866 : :
867 : : Exit
868 : :
869 : : All above stack discarded
870 : : */
871 : :
872 : 67330 : extern "C" void P1SymBuild_BuildExportOuterModule (void)
873 : : {
874 : 67330 : unsigned int i;
875 : 67330 : unsigned int n;
876 : :
877 : 67330 : M2Quads_PopT (&n); /* n = # of the Ident List */
878 : 67330 : if (((M2Quads_OperandT (n+1)) == M2Reserved_QualifiedTok) && (M2Comp_CompilingDefinitionModule ())) /* n = # of the Ident List */
879 : : {
880 : 60940 : SymbolTable_PutDoesNeedExportList (SymbolTable_GetCurrentModule ());
881 : : /* Ident List contains list of export qualified objects */
882 : 60940 : i = 1;
883 : 1398766 : while (i <= n)
884 : : {
885 : 1276886 : SymbolTable_PutExportQualified (M2Quads_OperandTok (i), M2Quads_OperandT (i));
886 : 1276886 : i += 1;
887 : : }
888 : : }
889 : 6390 : else if (((M2Quads_OperandT (n+1)) == M2Reserved_UnQualifiedTok) && (M2Comp_CompilingDefinitionModule ()))
890 : : {
891 : : /* avoid dangling else. */
892 : 6390 : SymbolTable_PutDoesNeedExportList (SymbolTable_GetCurrentModule ());
893 : : /* Ident List contains list of export unqualified objects */
894 : 6390 : i = 1;
895 : 404100 : while (i <= n)
896 : : {
897 : 391320 : SymbolTable_PutExportUnQualified (M2Quads_OperandTok (i), M2Quads_OperandT (i));
898 : 391320 : i += 1;
899 : : }
900 : : }
901 : 0 : else if (M2Comp_CompilingDefinitionModule ())
902 : : {
903 : : /* avoid dangling else. */
904 : 0 : M2MetaError_MetaError0 ((const char *) "the {%EkEXPORT} must be either {%kQUALIFIED} or {%kUNQUALIFIED} in a definition module", 86);
905 : : }
906 : : else
907 : : {
908 : : /* avoid dangling else. */
909 : 0 : M2MetaError_MetaError0 ((const char *) "{%E}only allowed inter module exports in a definition module", 60);
910 : : }
911 : 67330 : M2Quads_PopN (n+1); /* clear stack */
912 : 67330 : }
913 : :
914 : :
915 : : /*
916 : : CheckExplicitExported - checks to see whether we are compiling
917 : : a definition module and whether the ident
918 : : is implicitly export qualified or unqualified.
919 : :
920 : :
921 : : The Stack is expected:
922 : :
923 : : Entry Exit
924 : :
925 : : Ptr -> Ptr ->
926 : : +------------+ +-----------+
927 : : | Identname | | Identname |
928 : : |------------| |-----------|
929 : :
930 : : */
931 : :
932 : 4582988 : extern "C" void P1SymBuild_CheckExplicitExported (void)
933 : : {
934 : 4582988 : if ((M2Comp_CompilingDefinitionModule ()) && (SymbolTable_DoesNotNeedExportList (SymbolTable_GetCurrentModule ())))
935 : : {
936 : : /* printf1('exporting identifier %a
937 : : ', OperandT(1)) ; */
938 : 1311224 : SymbolTable_PutExportQualified (M2Quads_OperandTok (1), M2Quads_OperandT (1));
939 : : }
940 : 4582988 : }
941 : :
942 : :
943 : : /*
944 : : BuildImportInnerModule - Builds imported identifiers into an inner module
945 : : from the last level of module.
946 : :
947 : : The Stack is expected:
948 : :
949 : : Entry OR Entry
950 : :
951 : : Ptr -> Ptr ->
952 : : +------------+ +-----------+
953 : : | # | | # |
954 : : |------------| |-----------|
955 : : | Id1 | | Id1 |
956 : : |------------| |-----------|
957 : : . . . .
958 : : . . . .
959 : : . . . .
960 : : |------------| |-----------|
961 : : | Id# | | Id# |
962 : : |------------| |-----------|
963 : : | ImportTok | | Ident |
964 : : |------------| |-----------|
965 : :
966 : : IMPORT Id1, .. Id# ; FROM Ident IMPORT Id1 .. Id# ;
967 : :
968 : : Exit
969 : :
970 : : All above stack discarded
971 : : */
972 : :
973 : 222 : extern "C" void P1SymBuild_BuildImportInnerModule (void)
974 : : {
975 : 222 : unsigned int Sym;
976 : 222 : unsigned int ModSym;
977 : 222 : unsigned int i;
978 : 222 : unsigned int n;
979 : :
980 : 222 : M2Quads_PopT (&n); /* n = # of the Ident List */
981 : 222 : if ((M2Quads_OperandT (n+1)) == M2Reserved_ImportTok)
982 : : {
983 : : /* Ident List contains list of objects */
984 : : i = 1;
985 : 318 : while (i <= n)
986 : : {
987 : 162 : SymbolTable_AddNameToImportList (M2Quads_OperandT (i));
988 : 162 : i += 1;
989 : : }
990 : : }
991 : : else
992 : : {
993 : : /* Ident List contains list of objects */
994 : 66 : ModSym = M2Batch_LookupOuterModule (M2Quads_OperandTok (n+1), M2Quads_OperandT (n+1));
995 : 66 : i = 1;
996 : 198 : while (i <= n)
997 : : {
998 : 66 : Sym = SymbolTable_GetExported (M2Quads_OperandTok ((n+1)-i), ModSym, M2Quads_OperandT ((n+1)-i));
999 : 66 : SymbolTable_PutImported (Sym);
1000 : 66 : i += 1;
1001 : : }
1002 : : }
1003 : 222 : M2Quads_PopN (n+1); /* clear stack */
1004 : 222 : }
1005 : :
1006 : :
1007 : : /*
1008 : : BuildExportInnerModule - Builds exported identifiers from an inner module
1009 : : to the next layer module.
1010 : :
1011 : : The Stack is expected:
1012 : :
1013 : : Entry OR Entry
1014 : :
1015 : : Ptr -> Ptr ->
1016 : : +------------+ +--------------+
1017 : : | # | | # |
1018 : : |------------| |--------------|
1019 : : | Id1 | | Id1 |
1020 : : |------------| |--------------|
1021 : : . . . .
1022 : : . . . .
1023 : : . . . .
1024 : : |------------| |--------------|
1025 : : | Id# | | Id# |
1026 : : |------------| |--------------|
1027 : : | ExportTok | | QualifiedTok |
1028 : : |------------| |--------------|
1029 : :
1030 : : EXPORT Id1, .. Id# ; EXPORT QUALIFIED Id1 .. Id# ;
1031 : :
1032 : :
1033 : : Exit
1034 : :
1035 : :
1036 : : All above stack discarded
1037 : : */
1038 : :
1039 : 282 : extern "C" void P1SymBuild_BuildExportInnerModule (void)
1040 : : {
1041 : 282 : unsigned int tok;
1042 : 282 : unsigned int PrevMod;
1043 : 282 : unsigned int Sym;
1044 : 282 : unsigned int i;
1045 : 282 : unsigned int n;
1046 : :
1047 : 282 : M2Quads_PopT (&n); /* n = # of the Ident List */
1048 : 282 : if ((M2Quads_OperandT (n+1)) == M2Reserved_ExportTok)
1049 : : {
1050 : : /* Ident List contains list of objects */
1051 : 282 : i = 1;
1052 : 282 : PrevMod = SymbolTable_GetScope (SymbolTable_GetCurrentScope ());
1053 : 870 : while (i <= n)
1054 : : {
1055 : 306 : tok = static_cast<unsigned int> (M2Quads_OperandTok (i));
1056 : 306 : if ((PrevMod != SymbolTable_NulSym) && ((SymbolTable_IsModule (PrevMod)) || (SymbolTable_IsDefImp (PrevMod))))
1057 : : {
1058 : 246 : Sym = SymbolTable_GetLocalSym (PrevMod, M2Quads_OperandT (i));
1059 : 246 : if (Sym == SymbolTable_NulSym)
1060 : : {
1061 : : /* avoid dangling else. */
1062 : 234 : Sym = SymbolTable_TryMoveUndeclaredSymToInnerModule (PrevMod, SymbolTable_GetCurrentScope (), M2Quads_OperandT (i));
1063 : 234 : if (Sym == SymbolTable_NulSym)
1064 : : {
1065 : 216 : Sym = SymbolTable_RequestSym (tok, M2Quads_OperandT (i));
1066 : 216 : SymbolTable_PutExported (Sym);
1067 : : }
1068 : : }
1069 : : else
1070 : : {
1071 : : /* use Sym which has already been created in outer scope */
1072 : 12 : SymbolTable_AddSymToModuleScope (SymbolTable_GetCurrentScope (), Sym);
1073 : : }
1074 : : }
1075 : : else
1076 : : {
1077 : 60 : Sym = SymbolTable_RequestSym (tok, M2Quads_OperandT (i));
1078 : 60 : SymbolTable_PutExported (Sym);
1079 : : }
1080 : 306 : i += 1;
1081 : : }
1082 : : }
1083 : : else
1084 : : {
1085 : 0 : M2MetaError_MetaError0 ((const char *) "{%EkQUALIFIED} not allowed in an inner module", 45);
1086 : : }
1087 : 282 : M2Quads_PopN (n+1); /* clear stack */
1088 : 282 : }
1089 : :
1090 : :
1091 : : /*
1092 : : StartBuildEnumeration - Builds an Enumeration type Type.
1093 : :
1094 : :
1095 : : Stack
1096 : :
1097 : : Entry Exit
1098 : :
1099 : : Ptr ->
1100 : : +------------+
1101 : : | # |
1102 : : |------------|
1103 : : | en 1 |
1104 : : |------------|
1105 : : | en 2 |
1106 : : |------------|
1107 : : . .
1108 : : . .
1109 : : . . <- Ptr
1110 : : |------------| +------------+
1111 : : | en # | | Type |
1112 : : |------------| |------------|
1113 : : | Name | | Name |
1114 : : |------------| |------------|
1115 : : */
1116 : :
1117 : 22728 : extern "C" void P1SymBuild_StartBuildEnumeration (void)
1118 : : {
1119 : 22728 : NameKey_Name name;
1120 : 22728 : unsigned int n;
1121 : 22728 : unsigned int i;
1122 : 22728 : unsigned int Type;
1123 : 22728 : unsigned int tokno;
1124 : :
1125 : 22728 : M2Quads_PopT (&n); /* No := # */
1126 : 22728 : name = static_cast<NameKey_Name> (M2Quads_OperandT (n+1)); /* No := # */
1127 : 22728 : tokno = static_cast<unsigned int> (M2Quads_OperandTok (n+1));
1128 : 22728 : Type = SymbolTable_MakeEnumeration (tokno, name);
1129 : 22728 : i = 1;
1130 : 458090 : while (i <= n)
1131 : : {
1132 : 412634 : SymbolTable_PutFieldEnumeration (M2Quads_OperandTok ((n-i)+1), Type, M2Quads_OperandT ((n-i)+1));
1133 : 412634 : i += 1;
1134 : : }
1135 : 22728 : FifoQueue_PutEnumerationIntoFifoQueue (Type); /* store enumeration away for pass 2 */
1136 : 22728 : M2Quads_PopN (n+1); /* store enumeration away for pass 2 */
1137 : 22728 : M2Quads_PushTtok (name, tokno);
1138 : 22728 : M2Quads_PushTtok (Type, tokno);
1139 : 22728 : }
1140 : :
1141 : :
1142 : : /*
1143 : : EndBuildEnumeration - completes the construction of the enumeration type.
1144 : :
1145 : :
1146 : : Stack
1147 : :
1148 : : Entry Exit
1149 : :
1150 : : Ptr ->
1151 : : +------------+
1152 : : | Type | <- Ptr
1153 : : |------------| +---------------+
1154 : : | Name | | Type | Name |
1155 : : |------------| |---------------|
1156 : :
1157 : : Empty
1158 : : */
1159 : :
1160 : 22728 : extern "C" void P1SymBuild_EndBuildEnumeration (void)
1161 : : {
1162 : 22728 : unsigned int tokno;
1163 : 22728 : unsigned int Sym;
1164 : 22728 : unsigned int Type;
1165 : 22728 : NameKey_Name n1;
1166 : 22728 : NameKey_Name n2;
1167 : 22728 : NameKey_Name name;
1168 : :
1169 : : /*
1170 : : Two cases
1171 : :
1172 : : - the type name the same as Name, or the name is nul. - do nothing.
1173 : : - when type with a name that is different to Name. In which case
1174 : : we create a new type.
1175 : : */
1176 : 22728 : M2Quads_PopTtok (&Type, &tokno);
1177 : 22728 : M2Quads_PopT (&name);
1178 : 22728 : if (Debugging)
1179 : : {
1180 : : n1 = SymbolTable_GetSymName (SymbolTable_GetCurrentModule ());
1181 : : M2Printf_printf2 ((const char *) "inside module %a declaring type name %a\\n", 41, (const unsigned char *) &n1, (sizeof (n1)-1), (const unsigned char *) &name, (sizeof (name)-1));
1182 : : if (! (SymbolTable_IsUnknown (Type)))
1183 : : {
1184 : : n1 = SymbolTable_GetSymName (SymbolTable_GetScope (Type));
1185 : : n2 = SymbolTable_GetSymName (Type);
1186 : : M2Printf_printf2 ((const char *) "type was created inside scope %a as name %a\\n", 45, (const unsigned char *) &n1, (sizeof (n1)-1), (const unsigned char *) &n2, (sizeof (n2)-1));
1187 : : }
1188 : : }
1189 : 22728 : if ((name == NameKey_NulName) || ((SymbolTable_GetSymName (Type)) == name))
1190 : : {
1191 : : /*
1192 : : Typically the declaration that causes this case is:
1193 : :
1194 : : VAR
1195 : : a: (blue, green, red) ;
1196 : : ^
1197 : : |
1198 : : +---- type has no name.
1199 : :
1200 : : in which case the constructed from StartBuildEnumeration is complete
1201 : : */
1202 : 22728 : M2Quads_PushTFtok (Type, name, tokno);
1203 : : }
1204 : : else
1205 : : {
1206 : : /* in this case we are seeing:
1207 : :
1208 : : TYPE
1209 : : name = (blue, green, red)
1210 : :
1211 : : so we construct the type name and define it to have the previously
1212 : : created enumeration type
1213 : : */
1214 : 0 : Sym = SymbolTable_MakeType (tokno, name);
1215 : 0 : SymbolTable_PutType (Sym, Type);
1216 : 0 : M2Quads_PushTFtok (Sym, name, tokno);
1217 : : }
1218 : 22728 : }
1219 : :
1220 : :
1221 : : /*
1222 : : BuildHiddenType - Builds a Hidden Type.
1223 : :
1224 : :
1225 : : Stack
1226 : :
1227 : : Entry Exit
1228 : :
1229 : : Ptr ->
1230 : : +------------+
1231 : : | Name | <- Ptr
1232 : : |------------| Empty
1233 : : */
1234 : :
1235 : 22061 : extern "C" void P1SymBuild_BuildHiddenType (void)
1236 : : {
1237 : 22061 : NameKey_Name name;
1238 : 22061 : unsigned int tokno;
1239 : :
1240 : 22061 : M2Quads_PopTtok (&name, &tokno);
1241 : : /* WriteKey(Name) ; WriteLn ; */
1242 : 22061 : M2Debug_Assert ((SymbolTable_MakeHiddenType (tokno, name)) != SymbolTable_NulSym);
1243 : 22061 : }
1244 : :
1245 : :
1246 : : /*
1247 : : StartBuildProcedure - Builds a Procedure.
1248 : :
1249 : : The Stack:
1250 : :
1251 : : Entry Exit
1252 : :
1253 : : Ptr -> <- Ptr
1254 : : +------------+ +------------+
1255 : : | Name | | ProcSym |
1256 : : |------------| |------------|
1257 : : | inlinetok | | |
1258 : : | or | | |
1259 : : | builtintok | | |
1260 : : | or name or | | Name |
1261 : : | NulTok | | |
1262 : : |------------| |------------|
1263 : : */
1264 : :
1265 : 2874718 : extern "C" void P1SymBuild_StartBuildProcedure (void)
1266 : : {
1267 : 2874718 : unsigned int tokno;
1268 : 2874718 : NameKey_Name builtin;
1269 : 2874718 : NameKey_Name name;
1270 : 2874718 : unsigned int ProcSym;
1271 : :
1272 : 2874718 : M2Quads_PopTtok (&name, &tokno);
1273 : 2874718 : M2Quads_PopT (&builtin); /* was this procedure defined as a builtin? */
1274 : 2874718 : M2Quads_PushTtok (name, tokno); /* Name saved for the EndBuildProcedure name check */
1275 : 2874718 : ProcSym = SymbolTable_RequestSym (tokno, name); /* Name saved for the EndBuildProcedure name check */
1276 : 2874718 : if (SymbolTable_IsUnknown (ProcSym))
1277 : : {
1278 : : /* A procedure may be created in a definition or implementation module, remember
1279 : : that an implementation module maybe compiled before the corresponding
1280 : : definition module.
1281 : :
1282 : : The procedure can also be created during a forward declaration.
1283 : : We record the forward declaration as the token of creation and adjust this
1284 : : later when we see the proper procedure declaration. Likwwise when the forward
1285 : : keyword is seen we assign the procedure forward token location. */
1286 : 2270585 : ProcSym = SymbolTable_MakeProcedure (tokno, name);
1287 : : }
1288 : 604133 : else if (SymbolTable_IsProcedure (ProcSym))
1289 : : {
1290 : : /* avoid dangling else. */
1291 : : /* Declared in the other module or it could have been declared by a forward decl,
1292 : : we overwrite the declaration to tokno. The forward location is assigned in
1293 : : EndBuildForward. */
1294 : 604133 : SymbolTable_PutDeclared (tokno, ProcSym);
1295 : : }
1296 : : else
1297 : : {
1298 : : /* avoid dangling else. */
1299 : 0 : M2MetaError_MetaError1 ((const char *) "expecting a procedure name and symbol {%1Ea} has been declared as a {%1d}", 73, ProcSym);
1300 : 0 : M2Quads_PushT (ProcSym);
1301 : 0 : return;
1302 : : }
1303 : 2874718 : if (builtin != M2Reserved_NulTok)
1304 : : {
1305 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
1306 : 101452 : if (builtin == M2Reserved_BuiltinTok)
1307 : : {
1308 : 50500 : SymbolTable_PutProcedureBuiltin (ProcSym, name);
1309 : : }
1310 : 50952 : else if (builtin == M2Reserved_InlineTok)
1311 : : {
1312 : : /* avoid dangling else. */
1313 : 0 : SymbolTable_PutProcedureInline (ProcSym);
1314 : : }
1315 : : else
1316 : : {
1317 : : /* avoid dangling else. */
1318 : 50952 : SymbolTable_PutProcedureBuiltin (ProcSym, builtin);
1319 : : }
1320 : : }
1321 : 2874718 : M2Quads_PushTtok (ProcSym, tokno);
1322 : 2874718 : SymbolTable_StartScope (ProcSym);
1323 : 2874718 : if (M2Comp_CompilingDefinitionModule ())
1324 : : {
1325 : 1930099 : if (SymbolTable_GetProcedureDefined (ProcSym, SymbolTable_DefProcedure))
1326 : : {
1327 : 6 : M2MetaError_MetaErrorT1 (SymbolTable_GetProcedureDeclaredTok (ProcSym, SymbolTable_DefProcedure), (const char *) "first declaration of procedure {%1Ea} in the definition module", 62, ProcSym);
1328 : 6 : M2MetaError_MetaErrorT1 (tokno, (const char *) "duplicate declaration of procedure {%1Ea} in the definition module", 66, ProcSym);
1329 : : }
1330 : : else
1331 : : {
1332 : 1930093 : SymbolTable_PutProcedureDeclaredTok (ProcSym, SymbolTable_DefProcedure, tokno);
1333 : 1930093 : SymbolTable_PutProcedureDefined (ProcSym, SymbolTable_DefProcedure);
1334 : : }
1335 : : }
1336 : : else
1337 : : {
1338 : 944619 : P0SymBuild_EnterBlock (name);
1339 : : }
1340 : : }
1341 : :
1342 : :
1343 : : /*
1344 : : EndBuildProcedure - Ends building a Procedure.
1345 : : It checks the start procedure name matches the end
1346 : : procedure name.
1347 : :
1348 : : The Stack:
1349 : :
1350 : : (Procedure Not Defined in definition module)
1351 : :
1352 : : Entry Exit
1353 : :
1354 : : Ptr ->
1355 : : +------------+
1356 : : | NameEnd |
1357 : : |------------|
1358 : : | ProcSym |
1359 : : |------------|
1360 : : | NameStart |
1361 : : |------------|
1362 : : Empty
1363 : : */
1364 : :
1365 : 944559 : extern "C" void P1SymBuild_EndBuildProcedure (void)
1366 : : {
1367 : 944559 : unsigned int tok;
1368 : 944559 : unsigned int start;
1369 : 944559 : unsigned int end;
1370 : 944559 : unsigned int ProcSym;
1371 : 944559 : NameKey_Name NameEnd;
1372 : 944559 : NameKey_Name NameStart;
1373 : :
1374 : 944559 : M2Quads_PopTtok (&NameEnd, &end);
1375 : 944559 : M2Quads_PopTtok (&ProcSym, &tok);
1376 : 944559 : M2Quads_PopTtok (&NameStart, &start);
1377 : 944559 : if (NameEnd != NameStart)
1378 : : {
1379 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
1380 : 0 : if (end != M2LexBuf_UnknownTokenNo)
1381 : : {
1382 : 0 : M2MetaError_MetaErrorT1 (end, (const char *) "procedure name at end does not match name at beginning {%1EDa}", 62, ProcSym);
1383 : : }
1384 : 0 : else if (start != M2LexBuf_UnknownTokenNo)
1385 : : {
1386 : : /* avoid dangling else. */
1387 : 0 : M2MetaError_MetaErrorT2 (start, (const char *) "procedure name at end {%1EDa} does not match name at beginning {%2a}", 68, SymbolTable_MakeError (end, NameEnd), ProcSym);
1388 : : }
1389 : : else
1390 : : {
1391 : : /* avoid dangling else. */
1392 : 0 : M2MetaError_MetaError1 ((const char *) "procedure name at end does not match name at beginning {%1EDa}", 62, ProcSym);
1393 : : }
1394 : : }
1395 : 944559 : SymbolTable_EndScope ();
1396 : 944559 : if (SymbolTable_GetProcedureDefined (ProcSym, SymbolTable_ProperProcedure))
1397 : : {
1398 : 0 : M2MetaError_MetaErrorT1 (SymbolTable_GetProcedureDeclaredTok (ProcSym, SymbolTable_ProperProcedure), (const char *) "first proper declaration of procedure {%1Ea}", 44, ProcSym);
1399 : 0 : M2MetaError_MetaErrorT1 (tok, (const char *) "procedure {%1Ea} has already been declared", 42, ProcSym);
1400 : : }
1401 : : else
1402 : : {
1403 : 944559 : SymbolTable_PutProcedureDeclaredTok (ProcSym, SymbolTable_ProperProcedure, tok);
1404 : : }
1405 : 944559 : M2Debug_Assert (! (M2Comp_CompilingDefinitionModule ()));
1406 : 944559 : P0SymBuild_LeaveBlock ();
1407 : 944559 : }
1408 : :
1409 : :
1410 : : /*
1411 : : BuildProcedureHeading - Builds a procedure heading for the definition
1412 : : module procedures.
1413 : :
1414 : : Operation only performed if compiling a
1415 : : definition module.
1416 : :
1417 : : The Stack:
1418 : :
1419 : : Entry Exit
1420 : :
1421 : : Ptr ->
1422 : : +------------+
1423 : : | ProcSym |
1424 : : |------------|
1425 : : | NameStart |
1426 : : |------------|
1427 : : Empty
1428 : :
1429 : : */
1430 : :
1431 : 2874718 : extern "C" void P1SymBuild_BuildProcedureHeading (void)
1432 : : {
1433 : 2874718 : unsigned int ProcSym;
1434 : 2874718 : NameKey_Name NameStart;
1435 : :
1436 : 2874718 : if (M2Comp_CompilingDefinitionModule ())
1437 : : {
1438 : 1930099 : M2Quads_PopT (&ProcSym);
1439 : 1930099 : M2Quads_PopT (&NameStart);
1440 : 1930099 : SymbolTable_EndScope ();
1441 : : }
1442 : 2874718 : }
1443 : :
1444 : :
1445 : : /*
1446 : : EndBuildForward - Ends building a forward procedure declaration.
1447 : :
1448 : : The Stack:
1449 : :
1450 : : (This procedure is not defined in definition module)
1451 : :
1452 : : Entry Exit
1453 : :
1454 : : Ptr ->
1455 : : +------------+
1456 : : | ProcSym |
1457 : : |------------|
1458 : : | NameStart |
1459 : : |------------|
1460 : : Empty
1461 : : */
1462 : :
1463 : 60 : extern "C" void P1SymBuild_EndBuildForward (unsigned int forwardPos)
1464 : : {
1465 : 60 : unsigned int ProcSym;
1466 : 60 : unsigned int tok;
1467 : :
1468 : 60 : ProcSym = static_cast<unsigned int> (M2Quads_OperandT (1));
1469 : 60 : tok = static_cast<unsigned int> (M2Quads_OperandTok (1));
1470 : 60 : if (! (M2Options_GetEnableForward ()))
1471 : : {
1472 : 0 : M2MetaError_MetaErrorT0 (forwardPos, (const char *) "forward declaration has not been enabled, use -fiso or -fenable-forward to enable forward procedure declarations", 112);
1473 : : }
1474 : 60 : if (SymbolTable_GetProcedureDefined (ProcSym, SymbolTable_ForwardProcedure))
1475 : : {
1476 : 6 : M2MetaError_MetaErrorT1 (SymbolTable_GetProcedureDeclaredTok (ProcSym, SymbolTable_ForwardProcedure), (const char *) "first forward declaration of {%1Ea}", 35, ProcSym);
1477 : 6 : M2MetaError_MetaErrorT1 (tok, (const char *) "forward declaration of procedure {%1Ea} has already occurred", 60, ProcSym);
1478 : : }
1479 : : else
1480 : : {
1481 : 54 : SymbolTable_PutProcedureDeclaredTok (ProcSym, SymbolTable_ForwardProcedure, tok);
1482 : 54 : SymbolTable_PutProcedureDefined (ProcSym, SymbolTable_ForwardProcedure);
1483 : : }
1484 : 60 : M2Quads_PopN (2);
1485 : 60 : SymbolTable_EndScope ();
1486 : 60 : M2Debug_Assert (! (M2Comp_CompilingDefinitionModule ()));
1487 : 60 : P0SymBuild_LeaveBlock ();
1488 : 60 : }
1489 : :
1490 : :
1491 : : /*
1492 : : BuildNulName - Pushes a NulName onto the top of the stack.
1493 : : The Stack:
1494 : :
1495 : :
1496 : : Entry Exit
1497 : :
1498 : : <- Ptr
1499 : : Empty +------------+
1500 : : | NulName |
1501 : : |------------|
1502 : : */
1503 : :
1504 : 1084810 : extern "C" void P1SymBuild_BuildNulName (void)
1505 : : {
1506 : 1084810 : M2Quads_PushT (static_cast<unsigned int> (NameKey_NulName));
1507 : 1084810 : }
1508 : :
1509 : :
1510 : : /*
1511 : : BuildTypeEnd - Pops the type Type and Name.
1512 : : The Stack:
1513 : :
1514 : :
1515 : : Entry Exit
1516 : :
1517 : :
1518 : : Ptr ->
1519 : : +-------------+
1520 : : | Type | Name | Empty
1521 : : |-------------|
1522 : : */
1523 : :
1524 : 0 : extern "C" void P1SymBuild_BuildTypeEnd (void)
1525 : : {
1526 : 0 : unsigned int Type;
1527 : 0 : NameKey_Name name;
1528 : :
1529 : 0 : M2Quads_PopTF (&Type, &name);
1530 : 0 : }
1531 : :
1532 : :
1533 : : /*
1534 : : BuildImportStatement - create a new import statement in the current module.
1535 : : It ignores local modules.
1536 : :
1537 : : The quadruple stack is not used.
1538 : : */
1539 : :
1540 : 279718 : extern "C" void P1SymBuild_BuildImportStatement (unsigned int tok)
1541 : : {
1542 : 279718 : unsigned int scope;
1543 : :
1544 : 279718 : scope = SymbolTable_GetCurrentScope ();
1545 : 279718 : if ((SymbolTable_IsDefImp (scope)) || ((SymbolTable_IsModule (scope)) && (! (SymbolTable_IsInnerModule (scope)))))
1546 : : {
1547 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
1548 : 279496 : if ((M2Comp_CompilingDefinitionModule ()) && (! (SymbolTable_IsDefImp (scope))))
1549 : : {
1550 : 0 : M2MetaError_MetaError1 ((const char *) "module scope should be a definition module rather than {%1EDa}", 62, scope);
1551 : : }
1552 : : else
1553 : : {
1554 : 279496 : importStatementCount += 1;
1555 : 279496 : SymbolTable_AppendModuleImportStatement (scope, SymbolTable_MakeImportStatement (tok, importStatementCount));
1556 : : }
1557 : : }
1558 : 279718 : }
1559 : :
1560 : :
1561 : : /*
1562 : : AddImportToImportStatement - the top of stack is expected to be a module name.
1563 : : This is looked up from the module universe and
1564 : : wrapped in an import symbol and placed into the
1565 : : current import statement.
1566 : :
1567 : : The quadruple stack is unchanged.
1568 : :
1569 : : Entry Exit
1570 : :
1571 : :
1572 : : Ptr -> <- Ptr
1573 : : +---------------------+ +---------------------+
1574 : : | ImportedModuleName | | ImportedModuleName |
1575 : : |---------------------| |---------------------|
1576 : : */
1577 : :
1578 : 288574 : extern "C" void P1SymBuild_AddImportToImportStatement (bool qualified)
1579 : : {
1580 : 288574 : unsigned int scope;
1581 : :
1582 : 288574 : scope = SymbolTable_GetCurrentScope ();
1583 : 288574 : if ((SymbolTable_IsDefImp (scope)) || ((SymbolTable_IsModule (scope)) && (! (SymbolTable_IsInnerModule (scope)))))
1584 : : {
1585 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
1586 : 288346 : if ((M2Comp_CompilingDefinitionModule ()) && (! (SymbolTable_IsDefImp (scope))))
1587 : : {
1588 : 0 : M2MetaError_MetaError1 ((const char *) "module scope should be a definition module rather than {%1EDa}", 62, scope);
1589 : : }
1590 : : else
1591 : : {
1592 : 288346 : SymbolTable_AppendModuleOnImportStatement (scope, SymbolTable_MakeImport (M2Quads_OperandTok (1), M2Batch_LookupModule (M2Quads_OperandTok (1), M2Quads_OperandT (1)), importStatementCount, qualified));
1593 : : }
1594 : : }
1595 : 288574 : }
1596 : :
1597 : 14232 : extern "C" void _M2_P1SymBuild_init (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
1598 : : {
1599 : 14232 : }
1600 : :
1601 : 0 : extern "C" void _M2_P1SymBuild_fini (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
1602 : : {
1603 : 0 : }
|