LCOV - code coverage report
Current view: top level - /mnt/build/buildbot/bld/build-lcov/gcc/m2/gm2-compiler-boot - P1SymBuild.c (source / functions) Coverage Total Hit
Test: gcc.info Lines: 90.0 % 361 325
Test Date: 2026-02-28 14:20:25 Functions: 92.3 % 26 24
Legend: Lines:     hit not hit

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

Generated by: LCOV version 2.4-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.