aboutsummaryrefslogtreecommitdiff
path: root/gcc/m2/gm2-compiler/P1SymBuild.mod
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/m2/gm2-compiler/P1SymBuild.mod')
-rw-r--r--gcc/m2/gm2-compiler/P1SymBuild.mod75
1 files changed, 73 insertions, 2 deletions
diff --git a/gcc/m2/gm2-compiler/P1SymBuild.mod b/gcc/m2/gm2-compiler/P1SymBuild.mod
index 37caebd9bf2..a659c1fc8bd 100644
--- a/gcc/m2/gm2-compiler/P1SymBuild.mod
+++ b/gcc/m2/gm2-compiler/P1SymBuild.mod
@@ -39,6 +39,10 @@ FROM P0SymBuild IMPORT EnterBlock, LeaveBlock ;
FROM SymbolTable IMPORT NulSym,
ModeOfAddr,
+ AppendModuleOnImportStatement,
+ AppendModuleImportStatement,
+ MakeImportStatement, MakeImport,
+
StartScope, EndScope, PseudoScope,
GetScope, GetCurrentScope,
IsDeclaredIn,
@@ -49,7 +53,7 @@ FROM SymbolTable IMPORT NulSym,
MakeHiddenType,
PutMode,
PutFieldEnumeration, PutSubrange, PutVar,
- IsDefImp, IsModule, IsType,
+ IsDefImp, IsModule, IsInnerModule, IsType,
GetCurrentModule,
AddSymToModuleScope,
AddNameToImportList,
@@ -96,6 +100,9 @@ FROM M2Comp IMPORT CompilingDefinitionModule,
CONST
Debugging = FALSE ;
+VAR
+ importStatementCount: CARDINAL ;
+
(*
CheckFileName - checks to see that the module name matches the file name.
@@ -155,6 +162,7 @@ VAR
language,
ModuleSym: CARDINAL ;
BEGIN
+ importStatementCount := 0 ;
PopT(name) ;
(* CheckFileName(name, 'definition') ; *)
ModuleSym := MakeDefinitionSource(GetTokenNo(), name) ;
@@ -242,6 +250,7 @@ VAR
name : Name ;
ModuleSym: CARDINAL ;
BEGIN
+ importStatementCount := 0 ;
PopTtok (name, tok) ;
(* CheckFileName(name, 'implementation') ; *)
ModuleSym := MakeImplementationSource (tok, name) ;
@@ -315,6 +324,7 @@ VAR
name : Name ;
ModuleSym: CARDINAL ;
BEGIN
+ importStatementCount := 0 ;
PopTtok(name, tok) ;
(* CheckFileName(name, 'main') ; *)
ModuleSym := MakeProgramSource(tok, name) ;
@@ -1087,8 +1097,69 @@ VAR
Type: CARDINAL ;
name: Name ;
BEGIN
- PopTF(Type, name)
+ PopTF (Type, name)
END BuildTypeEnd ;
+(*
+ BuildImportStatement - create a new import statement in the current module.
+ It ignores local modules.
+
+ The quadruple stack is not used.
+*)
+
+PROCEDURE BuildImportStatement (tok: CARDINAL) ;
+VAR
+ scope: CARDINAL ;
+BEGIN
+ scope := GetCurrentScope () ;
+ IF IsDefImp (scope) OR (IsModule (scope) AND (NOT IsInnerModule (scope)))
+ THEN
+ IF CompilingDefinitionModule () AND (NOT IsDefImp (scope))
+ THEN
+ MetaError1 ('module scope should be a definition module rather than {%1EDa}', scope)
+ ELSE
+ INC (importStatementCount) ;
+ AppendModuleImportStatement (scope, MakeImportStatement (tok, importStatementCount))
+ END
+ END
+END BuildImportStatement ;
+
+
+(*
+ AddImportToImportStatement - the top of stack is expected to be a module name.
+ This is looked up from the module universe and
+ wrapped in an import symbol and placed into the
+ current import statement.
+
+ The quadruple stack is unchanged.
+
+ Entry Exit
+
+
+ Ptr -> <- Ptr
+ +---------------------+ +---------------------+
+ | ImportedModuleName | | ImportedModuleName |
+ |---------------------| |---------------------|
+*)
+
+PROCEDURE AddImportToImportStatement (qualified: BOOLEAN) ;
+VAR
+ scope: CARDINAL ;
+BEGIN
+ scope := GetCurrentScope () ;
+ IF IsDefImp (scope) OR (IsModule (scope) AND (NOT IsInnerModule (scope)))
+ THEN
+ IF CompilingDefinitionModule () AND (NOT IsDefImp (scope))
+ THEN
+ MetaError1 ('module scope should be a definition module rather than {%1EDa}', scope) ;
+ ELSE
+ AppendModuleOnImportStatement (scope, MakeImport (OperandTok (1),
+ LookupModule (OperandTok (1), OperandT (1)),
+ importStatementCount, qualified))
+ END
+ END
+END AddImportToImportStatement ;
+
+
END P1SymBuild.