LCOV - code coverage report
Current view: top level - /mnt/build/buildbot/bld/build-lcov/gcc/m2/gm2-compiler-boot - P3SymBuild.c (source / functions) Coverage Total Hit
Test: gcc.info Lines: 91.9 % 235 216
Test Date: 2026-02-28 14:20:25 Functions: 90.5 % 21 19
Legend: Lines:     hit not hit

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