From: Gaius Mulley Date: Tue, 15 Nov 2022 14:11:04 +0000 (+0000) Subject: Bugfix for tiny modules importing from definition for "C". X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0c1fe5e2aad3fedcd7b7543b51361fa1c85cd050;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/m2/gm2-libs/M2Dependent.mod b/gcc/m2/gm2-libs/M2Dependent.mod index a37d68924061..bdfebcf51ef1 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") @@ -574,6 +577,36 @@ BEGIN 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);