aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorGaius Mulley <gaiusmod2@gmail.com>2022-11-15 14:11:04 +0000
committerGaius Mulley <gaiusmod2@gmail.com>2022-11-15 14:11:04 +0000
commit0c1fe5e2aad3fedcd7b7543b51361fa1c85cd050 (patch)
tree321e9451ceed32f95a2dfbc5917aad05449b75dd /gcc
parentd1eed6043121a0f546b60b89b8d508c3f1adb0ac (diff)
downloadgcc-0c1fe5e2aad3fedcd7b7543b51361fa1c85cd050.zip
gcc-0c1fe5e2aad3fedcd7b7543b51361fa1c85cd050.tar.gz
gcc-0c1fe5e2aad3fedcd7b7543b51361fa1c85cd050.tar.bz2
Bugfix for tiny modules importing from definition for "C".
If a tiny application module imports only from a definition for "C" the import graph will not join with the core modula-2 libraries. Thus if a range exception were to occur in the application the libraries might be uninitialized. This patch forces the application module to be initialized last. gcc/m2/ChangeLog: * gm2-libs/M2Dependent.mod (DisplayModuleInfo): Use variable count to display entry number. (CheckApplication) Check that the application is the last entry in the list and move the list head if appropriate. Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/m2/gm2-libs/M2Dependent.mod40
1 files changed, 38 insertions, 2 deletions
diff --git a/gcc/m2/gm2-libs/M2Dependent.mod b/gcc/m2/gm2-libs/M2Dependent.mod
index a37d689..bdfebcf 100644
--- a/gcc/m2/gm2-libs/M2Dependent.mod
+++ b/gcc/m2/gm2-libs/M2Dependent.mod
@@ -461,14 +461,17 @@ END ResolveDependencies ;
PROCEDURE DisplayModuleInfo (state: DependencyState; name: ARRAY OF CHAR) ;
VAR
- mptr: ModuleChain ;
+ mptr : ModuleChain ;
+ count: CARDINAL ;
BEGIN
IF Modules[state] # NIL
THEN
printf ("%s modules\n", ADR (name)) ;
mptr := Modules[state] ;
+ count := 0 ;
REPEAT
- printf (" %s", mptr^.name) ;
+ printf (" %d %s", count, mptr^.name) ;
+ INC (count) ;
IF mptr^.dependency.appl
THEN
printf (" application")
@@ -575,6 +578,36 @@ END ForceDependencies ;
(*
+ CheckApplication - check to see that the application is the last entry in the list.
+ This might happen if the application only imports FOR C modules.
+*)
+
+PROCEDURE CheckApplication ;
+VAR
+ mptr,
+ appl: ModuleChain ;
+BEGIN
+ mptr := Modules[ordered] ;
+ IF mptr # NIL
+ THEN
+ appl := NIL ;
+ REPEAT
+ IF mptr^.dependency.appl
+ THEN
+ appl := mptr
+ ELSE
+ mptr := mptr^.next
+ END
+ UNTIL (appl # NIL) OR (mptr=Modules[ordered]) ;
+ IF appl # NIL
+ THEN
+ Modules[ordered] := appl^.next
+ END
+ END
+END CheckApplication ;
+
+
+(*
ConstructModules - resolve dependencies and then call each
module constructor in turn.
*)
@@ -600,6 +633,9 @@ BEGIN
ForceDependencies ;
traceprintf (ForceTrace, "After user forcing ordering\n");
DumpModuleData (ForceTrace) ;
+ CheckApplication ;
+ traceprintf (ForceTrace, "After runtime forces application to the end\n");
+ DumpModuleData (ForceTrace) ;
IF Modules[ordered] = NIL
THEN
traceprintf2 (ModuleTrace, " module: %s has not registered itself using a global constructor\n", applicationmodule);