diff options
author | Gaius Mulley <gaiusmod2@gmail.com> | 2022-11-15 14:11:04 +0000 |
---|---|---|
committer | Gaius Mulley <gaiusmod2@gmail.com> | 2022-11-15 14:11:04 +0000 |
commit | 0c1fe5e2aad3fedcd7b7543b51361fa1c85cd050 (patch) | |
tree | 321e9451ceed32f95a2dfbc5917aad05449b75dd /gcc | |
parent | d1eed6043121a0f546b60b89b8d508c3f1adb0ac (diff) | |
download | gcc-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.mod | 40 |
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); |