From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1499) id 9C1843858D33; Tue, 2 Aug 2022 22:57:06 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9C1843858D33 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Gaius Mulley To: gcc-cvs@gcc.gnu.org Subject: [gcc/devel/modula-2] Shared library scaffold fixes. X-Act-Checkin: gcc X-Git-Author: Gaius Mulley X-Git-Refname: refs/heads/devel/modula-2 X-Git-Oldrev: 8ea7cdc1d01f6eaf887417487388cd47f0b8b403 X-Git-Newrev: a3192a7ec42b700ecd7bc37cb879713ef581afe2 Message-Id: <20220802225706.9C1843858D33@sourceware.org> Date: Tue, 2 Aug 2022 22:57:06 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 02 Aug 2022 22:57:06 -0000 https://gcc.gnu.org/g:a3192a7ec42b700ecd7bc37cb879713ef581afe2 commit a3192a7ec42b700ecd7bc37cb879713ef581afe2 Author: Gaius Mulley Date: Tue Aug 2 20:27:11 2022 +0100 Shared library scaffold fixes. These changes allow the module scaffold to be activated from within a shared library as a ctor. The changes also correct the dtor names of wrapsock.c, wraptime.c, Selective.cc and wrapc.c. ChangeLog: * Makefile.tpl (BUILD_EXPORTS): GM2FLAGS added. gcc/m2/ChangeLog: * gm2-compiler/M2Graph.mod (Graph): Tidied up indent. (KillNode) Assign deps to result of KillIndex. * gm2-compiler/M2Options.def (GetUseList): Spelling corrected. (SharedFlag) exported. (SetShared) New procedure. * gm2-compiler/M2Options.mod (SetShared): New procedure. (SharedFlag) Assigned to FALSE. * gm2-compiler/M2Scaffold.mod (SafeRequestSym): New procedure. (BuildM2MainFunction) Use SharedFlag to determine whether to generate main and if not produce ctors for the shared library. Use SafeRequest to access argc, argv, envp parameters. * gm2-compiler/M2Quads.mod (SymbolTable): Import list inserted identifiers IsCtor, IsExtern and IsPublic. (DisplayProcedureAttributes) New procedure. (BuildM2InitFunction): Use SafeRequest to access argc, argv, envp parameters. (BuildM2FiniFunction): Use SafeRequest to access argc, argv, envp parameters. * gm2-gcc/m2options.h: (SetShared): New function. * gm2-lang.cc (gm2_langhook_handle_option): Call SetShared. libgm2/ChangeLog: * libm2iso/wrapsock.c: Replaced _finish with _fini. * libm2iso/wraptime.c: Replaced _finish with _fini. * libm2pim/Selective.cc: Replaced _finish with _fini. * libm2pim/wrapc.c: Replaced _finish with _fini. Signed-off-by: Gaius Mulley Diff: --- Makefile.tpl | 1 + gcc/m2/gm2-compiler/M2Graph.mod | 4 +- gcc/m2/gm2-compiler/M2Options.def | 15 ++++++- gcc/m2/gm2-compiler/M2Options.mod | 13 +++++- gcc/m2/gm2-compiler/M2Quads.mod | 83 +++++++++++++++++++++++++++++++------- gcc/m2/gm2-compiler/M2Scaffold.mod | 36 ++++++++++------- gcc/m2/gm2-gcc/m2options.h | 1 + gcc/m2/gm2-lang.cc | 2 +- libgm2/libm2iso/wrapsock.c | 2 +- libgm2/libm2iso/wraptime.c | 2 +- libgm2/libm2pim/Selective.cc | 4 +- libgm2/libm2pim/wrapc.c | 2 +- 12 files changed, 124 insertions(+), 41 deletions(-) diff --git a/Makefile.tpl b/Makefile.tpl index ae5e9c4c67f..0cbdb270e64 100644 --- a/Makefile.tpl +++ b/Makefile.tpl @@ -167,6 +167,7 @@ BUILD_EXPORTS = \ GDC="$(GDC_FOR_BUILD)"; export GDC; \ GDCFLAGS="$(GDCFLAGS_FOR_BUILD)"; export GDCFLAGS; \ GM2="$(GM2_FOR_BUILD)"; export GM2; \ + GM2FLAGS="$(GM2FLAGS_FOR_BUILD)"; export GM2FLAGS; \ DLLTOOL="$(DLLTOOL_FOR_BUILD)"; export DLLTOOL; \ DSYMUTIL="$(DSYMUTIL_FOR_BUILD)"; export DSYMUTIL; \ LD="$(LD_FOR_BUILD)"; export LD; \ diff --git a/gcc/m2/gm2-compiler/M2Graph.mod b/gcc/m2/gm2-compiler/M2Graph.mod index 3f8f299ea8f..489186a4b3b 100644 --- a/gcc/m2/gm2-compiler/M2Graph.mod +++ b/gcc/m2/gm2-compiler/M2Graph.mod @@ -46,7 +46,7 @@ TYPE END ; Graph = POINTER TO RECORD - nodes : Index ; + nodes: Index ; END ; @@ -70,7 +70,7 @@ END InitGraph ; PROCEDURE KillNode (nptr: node) ; BEGIN - KillIndex (nptr^.deps) + nptr^.deps := KillIndex (nptr^.deps) END KillNode ; diff --git a/gcc/m2/gm2-compiler/M2Options.def b/gcc/m2/gm2-compiler/M2Options.def index 0a60b7194a3..250e45fa386 100644 --- a/gcc/m2/gm2-compiler/M2Options.def +++ b/gcc/m2/gm2-compiler/M2Options.def @@ -52,7 +52,8 @@ EXPORT QUALIFIED SetReturnCheck, SetNilCheck, SetCaseCheck, SetWholeValueCheck, GetWholeValueCheck, SetLowerCaseKeywords, SetIndex, SetRange, SetWholeDiv, SetStrictTypeChecking, - Setc, Getc, SetUselist, GetUselist, GetUselisrFilename, + Setc, Getc, SetUselist, GetUselist, GetUselistFilename, + SetShared, Iso, Pim, Pim2, Pim3, Pim4, cflag, @@ -89,7 +90,7 @@ EXPORT QUALIFIED SetReturnCheck, SetNilCheck, SetCaseCheck, SetScaffoldDynamic, SetScaffoldStatic, SetScaffoldMain, ScaffoldMain, SetRuntimeModuleOverride, GetRuntimeModuleOverride, - SetGenModuleList, GetGenModuleFilename ; + SetGenModuleList, GetGenModuleFilename, SharedFlag ; VAR @@ -161,6 +162,9 @@ VAR ScaffoldMain, (* Should we generate a main function? *) GenModuleList, (* Should the compiler generate a list of *) (* all modules used? *) + SharedFlag, (* -fshared indicating this module needs *) + (* the shared library version of the *) + (* scaffold. *) ForcedLocation, DebugFunctionLineNumbers, GenerateStatementNote, @@ -787,6 +791,13 @@ PROCEDURE SetGenModuleList (value: BOOLEAN; filename: ADDRESS) ; PROCEDURE GetGenModuleFilename () : String ; +(* + SetShared - sets the SharedFlag to value. +*) + +PROCEDURE SetShared (value: BOOLEAN) ; + + (* FinaliseOptions - once all options have been parsed we set any inferred values. diff --git a/gcc/m2/gm2-compiler/M2Options.mod b/gcc/m2/gm2-compiler/M2Options.mod index 5c0fb179c5e..a35412accd9 100644 --- a/gcc/m2/gm2-compiler/M2Options.mod +++ b/gcc/m2/gm2-compiler/M2Options.mod @@ -1184,6 +1184,16 @@ BEGIN END GetGenModuleFilename ; +(* + SetShared - sets the SharedFlag to value. +*) + +PROCEDURE SetShared (value: BOOLEAN) ; +BEGIN + SharedFlag := value +END SetShared ; + + BEGIN cflag := FALSE ; (* -c. *) RuntimeModuleOverride := NIL ; @@ -1247,5 +1257,6 @@ BEGIN ScaffoldMain := FALSE ; UselistFilename := NIL ; GenModuleList := FALSE ; - GenModuleListFilename := NIL + GenModuleListFilename := NIL ; + SharedFlag := FALSE END M2Options. diff --git a/gcc/m2/gm2-compiler/M2Quads.mod b/gcc/m2/gm2-compiler/M2Quads.mod index 3cd9801fbee..73f6b93d483 100644 --- a/gcc/m2/gm2-compiler/M2Quads.mod +++ b/gcc/m2/gm2-compiler/M2Quads.mod @@ -115,6 +115,7 @@ FROM SymbolTable IMPORT ModeOfAddr, GetMode, PutMode, GetSymName, IsUnknown, IsImportStatement, IsImport, GetImportModule, GetImportDeclared, GetImportStatementList, GetModuleDefImportStatementList, GetModuleModImportStatementList, + IsCtor, IsPublic, IsExtern, GetUnboundedRecordType, GetUnboundedAddressOffset, @@ -204,7 +205,7 @@ FROM M2Options IMPORT NilChecking, Pedantic, CompilerDebugging, GenerateDebugging, GenerateLineDebug, Exceptions, Profiling, Coding, Optimizing, - ScaffoldDynamic, ScaffoldStatic, cflag, ScaffoldMain ; + ScaffoldDynamic, ScaffoldStatic, cflag, ScaffoldMain, SharedFlag ; FROM M2Pass IMPORT IsPassCodeGeneration, IsNoPass ; @@ -2232,6 +2233,34 @@ BEGIN END BuildRetry ; +(* + SafeRequestSym - only used during scaffold to get argc, argv, envp. + It attempts to get symbol name from the current scope(s) and if + it fails then it falls back onto default constants. +*) + +PROCEDURE SafeRequestSym (procedure: CARDINAL; tok: CARDINAL; name: Name) : CARDINAL ; +VAR + sym: CARDINAL ; +BEGIN + sym := GetSym (name) ; + IF sym = NulSym + THEN + IF name = MakeKey ('argc') + THEN + RETURN MakeConstLit (tok, MakeKey ('0'), ZType) + ELSIF (name = MakeKey ('argv')) OR (name = MakeKey ('envp')) + THEN + RETURN Nil + ELSE + InternalError ('not expecting this parameter name') ; + RETURN Nil + END + END ; + RETURN sym +END SafeRequestSym ; + + (* callRequestDependant - create a call: RequestDependant (GetSymName (modulesym), GetSymName (depModuleSym)); @@ -2389,7 +2418,7 @@ END BuildM2LinkFunction ; PROCEDURE BuildM2MainFunction (tokno: CARDINAL; modulesym: CARDINAL) ; BEGIN - IF ScaffoldDynamic OR ScaffoldStatic + IF (ScaffoldDynamic OR ScaffoldStatic) AND (NOT SharedFlag) THEN (* Scaffold required and main should be produced. *) (* @@ -2475,18 +2504,18 @@ BEGIN PushT(1) ; BuildAdrFunction ; - PushTtok (RequestSym (tok, MakeKey ("argc")), tok) ; - PushTtok (RequestSym (tok, MakeKey ("argv")), tok) ; - PushTtok (RequestSym (tok, MakeKey ("envp")), tok) ; + PushTtok (SafeRequestSym (initFunction, tok, MakeKey ("argc")), tok) ; + PushTtok (SafeRequestSym (initFunction, tok, MakeKey ("argv")), tok) ; + PushTtok (SafeRequestSym (initFunction, tok, MakeKey ("envp")), tok) ; PushT (4) ; BuildProcedureCall (tok) ; END ELSIF ScaffoldStatic THEN ForeachModuleCallInit (tok, - RequestSym (tok, MakeKey ("argc")), - RequestSym (tok, MakeKey ("argv")), - RequestSym (tok, MakeKey ("envp"))) + SafeRequestSym (initFunction, tok, MakeKey ("argc")), + SafeRequestSym (initFunction, tok, MakeKey ("argv")), + SafeRequestSym (initFunction, tok, MakeKey ("envp"))) END ; EndScope ; BuildProcedureEnd ; @@ -2530,18 +2559,18 @@ BEGIN PushT(1) ; BuildAdrFunction ; - PushTtok (RequestSym (tok, MakeKey ("argc")), tok) ; - PushTtok (RequestSym (tok, MakeKey ("argv")), tok) ; - PushTtok (RequestSym (tok, MakeKey ("envp")), tok) ; + PushTtok (SafeRequestSym (finiFunction, tok, MakeKey ("argc")), tok) ; + PushTtok (SafeRequestSym (finiFunction, tok, MakeKey ("argv")), tok) ; + PushTtok (SafeRequestSym (finiFunction, tok, MakeKey ("envp")), tok) ; PushT (4) ; BuildProcedureCall (tok) END ELSIF ScaffoldStatic THEN ForeachModuleCallFinish (tok, - RequestSym (tok, MakeKey ("argc")), - RequestSym (tok, MakeKey ("argv")), - RequestSym (tok, MakeKey ("envp"))) + SafeRequestSym (finiFunction, tok, MakeKey ("argc")), + SafeRequestSym (finiFunction, tok, MakeKey ("argv")), + SafeRequestSym (finiFunction, tok, MakeKey ("envp"))) END ; EndScope ; BuildProcedureEnd ; @@ -13041,6 +13070,27 @@ BEGIN END DisplayQuad ; +(* + DisplayProcedureAttributes - +*) + +PROCEDURE DisplayProcedureAttributes (proc: CARDINAL) ; +BEGIN + IF IsCtor (proc) + THEN + printf0 (" (ctor)") + END ; + IF IsPublic (proc) + THEN + printf0 (" (public)") + END ; + IF IsExtern (proc) + THEN + printf0 (" (extern)") + END +END DisplayProcedureAttributes ; + + (* WriteQuad - Writes out the Quad BufferQuad. *) @@ -13107,7 +13157,10 @@ BEGIN CallOp, KillLocalVarOp : WriteOperand(Operand3) | - ProcedureScopeOp, + ProcedureScopeOp : n1 := GetSymName(Operand2) ; + n2 := GetSymName(Operand3) ; + printf3(' %4d %a %a', Operand1, n1, n2) ; + DisplayProcedureAttributes (Operand3) | NewLocalVarOp, FinallyStartOp, FinallyEndOp, diff --git a/gcc/m2/gm2-compiler/M2Scaffold.mod b/gcc/m2/gm2-compiler/M2Scaffold.mod index 4064c431541..dc228184d80 100644 --- a/gcc/m2/gm2-compiler/M2Scaffold.mod +++ b/gcc/m2/gm2-compiler/M2Scaffold.mod @@ -48,7 +48,8 @@ FROM SFIO IMPORT OpenToWrite, WriteS, ReadS, OpenToRead, Exists ; FROM FIO IMPORT File, EOF, IsNoError, Close ; FROM M2Options IMPORT GetUselist, ScaffoldStatic, ScaffoldDynamic, GenModuleList, - GetGenModuleFilename, GetUselistFilename, GetUselist, cflag ; + GetGenModuleFilename, GetUselistFilename, GetUselist, cflag, + SharedFlag ; FROM M2Base IMPORT Proc ; @@ -85,7 +86,7 @@ static void _M2_init (int argc, char *argv[], char *envp[]) } -static void _M2_finish (int argc, char *argv[], char *envp[]) +static void _M2_fini (int argc, char *argv[], char *envp[]) { M2RTS_Terminate (); M2RTS_DeconstructModules (module_name, argc, argv, envp); @@ -96,7 +97,7 @@ int main (int argc, char *argv[], char *envp[]) { init (argc, argv, envp); - finish (); + fini (argc, argv, envp); return (0); } *) @@ -180,7 +181,7 @@ END ForeachModuleCallInit ; (* ForeachModuleCallFinish - precondition: the module list will be ordered. postcondition: foreach module in the application universe - call _M2_module_finish (argc, argv, envp); + call _M2_module_fini (argc, argv, envp); *) PROCEDURE ForeachModuleCallFinish (tok: CARDINAL; argc, argv, envp: CARDINAL) ; @@ -554,18 +555,23 @@ BEGIN '{%O}dynamic linking enabled but no module ctor list has been created, hint use -fuse-list=filename or -fgen-module-list=-') END ; - mainFunction := MakeProcedure (tokenno, MakeKey ("main")) ; - StartScope (mainFunction) ; - PutFunction (mainFunction, Integer) ; - DeclareArgEnvParams (tokenno, mainFunction) ; - PutPublic (mainFunction, TRUE) ; - EndScope ; - initFunction := MakeProcedure (tokenno, MakeKey ("_M2_init")) ; - DeclareArgEnvParams (tokenno, initFunction) ; - - finiFunction := MakeProcedure (tokenno, MakeKey ("_M2_finish")) ; - DeclareArgEnvParams (tokenno, finiFunction) + finiFunction := MakeProcedure (tokenno, MakeKey ("_M2_fini")) ; + IF SharedFlag + THEN + PutCtor (initFunction, TRUE) ; + PutCtor (finiFunction, TRUE) + ELSE + DeclareArgEnvParams (tokenno, initFunction) ; + DeclareArgEnvParams (tokenno, finiFunction) ; + + mainFunction := MakeProcedure (tokenno, MakeKey ("main")) ; + StartScope (mainFunction) ; + PutFunction (mainFunction, Integer) ; + DeclareArgEnvParams (tokenno, mainFunction) ; + PutPublic (mainFunction, TRUE) ; + EndScope + END END DeclareScaffoldFunctions ; diff --git a/gcc/m2/gm2-gcc/m2options.h b/gcc/m2/gm2-gcc/m2options.h index 34f28976b8c..2962bb21eea 100644 --- a/gcc/m2/gm2-gcc/m2options.h +++ b/gcc/m2/gm2-gcc/m2options.h @@ -119,6 +119,7 @@ EXTERN void M2Options_SetScaffoldDynamic (int value); EXTERN void M2Options_SetScaffoldMain (int value); EXTERN void M2Options_SetRuntimeModuleOverride (const char *override); EXTERN void M2Options_SetGenModuleList (int value, const char *filename); +EXTERN void M2Options_SetShared (int value); #undef EXTERN #endif /* m2options_h. */ diff --git a/gcc/m2/gm2-lang.cc b/gcc/m2/gm2-lang.cc index 07ae5ed5860..e17f7a513b6 100644 --- a/gcc/m2/gm2-lang.cc +++ b/gcc/m2/gm2-lang.cc @@ -377,7 +377,7 @@ gm2_langhook_handle_option ( M2Options_SetSwig (value); return 1; case OPT_fshared: - /* handled by the linker. */ + M2Options_SetShared (value); return 1; case OPT_fm2_statistics: M2Options_SetStatistics (value); diff --git a/libgm2/libm2iso/wrapsock.c b/libgm2/libm2iso/wrapsock.c index d0948ac92bc..79c2d89ddd3 100644 --- a/libgm2/libm2iso/wrapsock.c +++ b/libgm2/libm2iso/wrapsock.c @@ -245,6 +245,6 @@ _M2_wrapsock_init (void) } void -_M2_wrapsock_finish (void) +_M2_wrapsock_fini (void) { } diff --git a/libgm2/libm2iso/wraptime.c b/libgm2/libm2iso/wraptime.c index bdaa7589a14..6d6929b3c89 100644 --- a/libgm2/libm2iso/wraptime.c +++ b/libgm2/libm2iso/wraptime.c @@ -403,6 +403,6 @@ _M2_wraptime_init () { } void -_M2_wraptime_finish () +_M2_wraptime_fini () { } diff --git a/libgm2/libm2pim/Selective.cc b/libgm2/libm2pim/Selective.cc index e168e3181a5..a71c6577946 100644 --- a/libgm2/libm2pim/Selective.cc +++ b/libgm2/libm2pim/Selective.cc @@ -301,7 +301,7 @@ _M2_Selective_init (int argc, char *argv[], char *envp[]) } extern "C" void -_M2_Selective_finish (int argc, char *argv[], char *envp[]) +_M2_Selective_fini (int argc, char *argv[], char *envp[]) { } @@ -314,6 +314,6 @@ struct _M2_Selective_ctor { _M2_Selective_ctor (); } _M2_Selective_ctor; _M2_Selective_ctor::_M2_Selective_ctor (void) { - M2RTS_RegisterModule ("Selective", _M2_Selective_init, _M2_Selective_finish, + M2RTS_RegisterModule ("Selective", _M2_Selective_init, _M2_Selective_fini, _M2_Selective_dep); } diff --git a/libgm2/libm2pim/wrapc.c b/libgm2/libm2pim/wrapc.c index e5e0357c565..6269155b62b 100644 --- a/libgm2/libm2pim/wrapc.c +++ b/libgm2/libm2pim/wrapc.c @@ -283,7 +283,7 @@ _M2_wrapc_init () } void -_M2_wrapc_finish () +_M2_wrapc_fini () { }