Bug 114227 - InstallTerminationProcedure does not work with -fiso
Summary: InstallTerminationProcedure does not work with -fiso
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: modula2 (show other bugs)
Version: 14.0
: P3 normal
Target Milestone: ---
Assignee: Gaius Mulley
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2024-03-04 12:06 UTC by Gaius Mulley
Modified: 2024-03-04 21:50 UTC (History)
0 users

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2024-03-04 00:00:00


Attachments
Proposed fix (2.35 KB, patch)
2024-03-04 21:44 UTC, Gaius Mulley
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Gaius Mulley 2024-03-04 12:06:49 UTC
Forwarded from the gm2 mailing list.  Given a program:

MODULE glibc_test2;

FROM IOChan IMPORT
  ChanId;
FROM StdChans IMPORT
  StdOutChan;
FROM TextIO IMPORT
  WriteLn, WriteString;

FROM M2RTS IMPORT
  InstallTerminationProcedure ;

VAR
  cid_out:                      ChanId;

PROCEDURE P1();
  BEGIN                         (* PROCEDURE P1 *)
    WriteString(cid_out, 'This is P1');
    WriteLn(cid_out);
  END P1;

PROCEDURE P2();
  BEGIN                         (* PROCEDURE P2 *)
    WriteString(cid_out, 'This is P2');
    WriteLn(cid_out);
  END P2;

BEGIN                           (* MODULE glibc_test *)
   cid_out:=StdOutChan();
   IF InstallTerminationProcedure (P2)
   THEN
      P1();
   END
END glibc_test2.


$ gm2 -fiso glibc_test2.mod
$ ./a.out 
This is P1

whereas if it is compiled and linked with:


$ gm2 glibc_test2.mod
$ ./a.out 
This is P1
This is P2
Comment 1 Gaius Mulley 2024-03-04 12:16:10 UTC
Confirmed it appears that the procedure m2iso_M2RTS_ExecuteTerminationProcedures is not being called when -fiso is present.

Single stepping via gdb shows the underlying module M2Dependents calling the ExecuteTerminationProcedures procedure.  However M2Dependents is built and installed as part of the pim libraries - hence it calls the pim M2RTS (which has no termination procedures installed if -fiso is used).

The fix is to layer the termination and initial procedure functionality into M2Dependent and change both m2pim_M2RTS and m2iso_M2RTS to use M2Dependent.
Comment 2 Gaius Mulley 2024-03-04 21:44:21 UTC
Created attachment 57604 [details]
Proposed fix

Here is the proposed patch which moves the initial/termination user procedure functionality in
pim and iso versions of M2RTS into M2Dependent.  This ensures that
finalization/initialization procedures will always be invoked for both -fiso
and -fpim.  Prior to this patch M2Dependent called M2RTS for
termination procedure cleanup and always invoked the pim M2RTS.
Comment 3 GCC Commits 2024-03-04 21:47:05 UTC
The master branch has been updated by Gaius Mulley <gaius@gcc.gnu.org>:

https://gcc.gnu.org/g:d646db0e35ad9d235635b204349f5d960072f9fe

commit r14-9308-gd646db0e35ad9d235635b204349f5d960072f9fe
Author: Gaius Mulley <gaiusmod2@gmail.com>
Date:   Mon Mar 4 21:46:32 2024 +0000

    PR modula2/114227 InstallTerminationProcedure does not work with -fiso
    
    This patch moves the initial/termination user procedure functionality in
    pim and iso versions of M2RTS into M2Dependent.  This ensures that
    finalization/initialization procedures will always be invoked for both -fiso
    and -fpim.  Prior to this patch M2Dependent called M2RTS for
    termination procedure cleanup and always invoked the pim M2RTS.
    
    gcc/m2/ChangeLog:
    
            PR modula2/114227
            * gm2-libs-iso/M2RTS.mod (ProcedureChain): Remove.
            (ProcedureList): Remove.
            (ExecuteReverse): Remove.
            (ExecuteTerminationProcedures): Rewrite.
            (ExecuteInitialProcedures): Rewrite.
            (AppendProc): Remove.
            (InstallTerminationProcedure): Rewrite.
            (InstallInitialProcedure): Rewrite.
            (InitProcList): Remove.
            * gm2-libs/M2Dependent.def (InstallTerminationProcedure):
            New procedure.
            (ExecuteTerminationProcedures): New procedure.
            (InstallInitialProcedure): New procedure.
            (ExecuteInitialProcedures): New procedure.
            * gm2-libs/M2Dependent.mod (ProcedureChain): New type.
            (ProcedureList): New type.
            (ExecuteReverse): New procedure.
            (ExecuteTerminationProcedures): New procedure.
            (ExecuteInitialProcedures): New procedure.
            (AppendProc): New procedure.
            (InstallTerminationProcedure): New procedure.
            (InstallInitialProcedure): New procedure.
            (InitProcList): New procedure.
            * gm2-libs/M2RTS.mod (ProcedureChain): Remove.
            (ProcedureList): Remove.
            (ExecuteReverse): Remove.
            (ExecuteTerminationProcedures): Rewrite.
            (ExecuteInitialProcedures): Rewrite.
            (AppendProc): Remove.
            (InstallTerminationProcedure): Rewrite.
            (InstallInitialProcedure): Rewrite.
            (InitProcList): Remove.
    
    Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
Comment 4 Gaius Mulley 2024-03-04 21:50:45 UTC
Closing now that the patch has been applied.