]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Bugfix for tiny modules importing from definition for "C".
authorGaius Mulley <gaiusmod2@gmail.com>
Tue, 15 Nov 2022 14:11:04 +0000 (14:11 +0000)
committerGaius Mulley <gaiusmod2@gmail.com>
Tue, 15 Nov 2022 14:11:04 +0000 (14:11 +0000)
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>
gcc/m2/gm2-libs/M2Dependent.mod

index a37d68924061fb0ef05fe332f31a843decafa4aa..bdfebcf51ef1fa09f82f0ffe3227cc0391a58f1c 100644 (file)
@@ -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);