diff options
author | Gaius Mulley <gaius.mulley@southwales.ac.uk> | 2022-06-29 01:02:40 +0100 |
---|---|---|
committer | Gaius Mulley <gaius.mulley@southwales.ac.uk> | 2022-06-29 01:02:40 +0100 |
commit | 56ec5f3245333e2dea1afc721bf2c8bd4a8bb27e (patch) | |
tree | af5fc34f6bef5797bba4162d16428c7308066060 | |
parent | 3a560fb4fa5b52ba9b5118892080338d61b2f0c9 (diff) | |
download | gcc-56ec5f3245333e2dea1afc721bf2c8bd4a8bb27e.zip gcc-56ec5f3245333e2dea1afc721bf2c8bd4a8bb27e.tar.gz gcc-56ec5f3245333e2dea1afc721bf2c8bd4a8bb27e.tar.bz2 |
Support library C files changed to C++ with dynamic scaffold signature.
This patch moves more of the C support files in the modula-2 library
into C++ files with a dynamic scaffold signature. It also tidied
up the interface to UnixArgs and required a rebuild of the bootstrap
tool mc.
2022-06-29 Gaius Mulley <gaius.mulley@southwales.ac.uk>
gcc/m2/ChangeLog:
* bnf/gm2l.bnf (BlockInfoPtr): Capitalized comment starts.
* gm2-libs-ch/UnixArgs.cc: Rewritten from UnixArgs.c in C++
with ctor scaffold.
* gm2-libs-ch/dtoa.cc (M2_dtoa_init): Added correct argc,
argv, envp parameters. (M2_dtoa_finish) Added correct argc,
argv, envp parameters. (M2_dtoa_dep) New function.
(M2_dtoa_ctor) New function.
* gm2-libs-ch/ldtoa.cc (M2_ldtoa_init): Added correct argc,
argv, envp parameters. (M2_ldtoa_finish) Added correct argc,
argv, envp parameters. (M2_ldtoa_dep) New function.
(M2_ldtoa_ctor) New function.
* gm2-libs-iso/ProgramArgs.mod: Changed to use GetArgC and
GetArgV.
* gm2-libs/Args.def: Renamed parameter name from i to n.
* gm2-libs/Args.mod: Changed to use GetArgC and
GetArgV.
* gm2-libs/SArgs.def: Renamed parameter name from i to n.
* gm2-libs/SArgs.mod: Changed to use GetArgC and
GetArgV.
* gm2-libs/UnixArgs.def: Rewritten to export GetArgC, GetArgV
and GetEnvV.
* init/mcinit: Commented out M2Dependent.
* mc-boot-ch/GM2LINK.c: Include cstddef.h and declare
ForcedModuleInitOrder.
* mc-boot-ch/GUnixArgs.cc: Rewritten in C++ from GUnixArgs.c.
* mc-boot/GArgs.c: Rebuilt.
* mc-boot/GArgs.h: Rebuilt.
* mc-boot/GM2RTS.c: Rebuilt.
* mc-boot/GM2RTS.h: Rebuilt.
* mc-boot/GSArgs.c: Rebuilt.
* mc-boot/GSArgs.h: Rebuilt.
* mc-boot/GUnixArgs.h: Rebuilt.
* mc-boot/Gdecl.c: Rebuilt.
* mc/mc.flex: Rebuilt.
libgm2/ChangeLog:
* libm2pim/Makefile.am (libm2pim_la_SOURCES): UnixArgs.c
removed UnixArgs.cc added. (libm2pim_la_SOURCES) sckt.c
removed sckt.cc added. (libm2pim_la_SOURCES) dtoa.c
removed dtoa.cc added. (libm2pim_la_SOURCES) ldtoa.c
removed ldtoa.cc added. (libm2pim_la_SOURCES) Selective.c
removed Selective.cc added.
* libm2pim/UnixArgs.cc: Rewritten in C++.
* libm2pim/dtoa.cc: Rewritten in C++.
* libm2pim/ldtoa.cc: Rewritten in C++.
* libm2pim/sckt.cc: Rewritten in C++.
Signed-off-by: Gaius Mulley <gaius.mulley@southwales.ac.uk>
28 files changed, 431 insertions, 971 deletions
diff --git a/gcc/m2/bnf/gm2l.bnf b/gcc/m2/bnf/gm2l.bnf index 88cbb1d..633a85c 100644 --- a/gcc/m2/bnf/gm2l.bnf +++ b/gcc/m2/bnf/gm2l.bnf @@ -109,8 +109,8 @@ TYPE END ; BlockInfoPtr = POINTER TO RECORD - LocalModules, (* locally declared modules at the current level *) - ImportedModules: List ; (* current list of imports for the scanned module *) + LocalModules, (* Locally declared modules at the current level *) + ImportedModules: List ; (* Current list of imports for the scanned module *) Prev : BlockInfoPtr ; END ; @@ -120,9 +120,9 @@ VAR LastIdent, MainSrc, MainName : Name ; - Head, Tail : Source ; (* head source list *) - IncludeM2RTS : BOOLEAN ; (* do we automatically include M2RTS into the top module? *) - pSource : Source ; (* current module being parsed *) + Head, Tail : Source ; (* Head source list *) + IncludeM2RTS : BOOLEAN ; (* Do we automatically include M2RTS into the top module? *) + pSource : Source ; (* Current module being parsed *) CommentChar : CHAR ; pBlock : BlockInfoPtr ; @@ -134,7 +134,7 @@ VAR PROCEDURE ExamineCompilationUnit (VAR name: Name; VAR isdefimp: BOOLEAN) ; BEGIN isdefimp := FALSE ; (* default to program module *) - (* stop if we see eof, ';' or '[' *) + (* Stop if we see eof, ';' or '[' *) WHILE (currenttoken # eoftok) AND (currenttoken # semicolontok) AND (currenttoken # lsbratok) DO IF (currenttoken = implementationtok) OR (currenttoken = definitiontok) THEN diff --git a/gcc/m2/gm2-libs-ch/UnixArgs.c b/gcc/m2/gm2-libs-ch/UnixArgs.c index 137df05..1180f35 100644 --- a/gcc/m2/gm2-libs-ch/UnixArgs.c +++ b/gcc/m2/gm2-libs-ch/UnixArgs.c @@ -1,7 +1,7 @@ -/* UnixArgs.c provide access to the underlying argv, argc. +/* UnixArgs.cc record argc, argv as global variables. -Copyright (C) 2010-2022 Free Software Foundation, Inc. -Contributed by Gaius Mulley <gaius@glam.ac.uk>. +Copyright (C) 2009-2022 Free Software Foundation, Inc. +Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>. This file is part of GNU Modula-2. @@ -24,25 +24,68 @@ a copy of the GCC Runtime Library Exception along with this program; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see <http://www.gnu.org/licenses/>. */ -#ifdef __cplusplus -extern "C" { -#endif +#include <config.h> +#include "m2rts.h" -int UnixArgs_ArgC; -char **UnixArgs_ArgV; -void -_M2_UnixArgs_init (int argc, char *argv[]) +extern "C" int UnixArgs_GetArgC (void); +extern "C" char **UnixArgs_GetArgV (void); +extern "C" char **UnixArgs_GetEnvV (void); + +static int UnixArgs_ArgC; +static char **UnixArgs_ArgV; +static char **UnixArgs_EnvV; + + +/* GetArgC returns argc. */ + +extern "C" int +UnixArgs_GetArgC (void) +{ + return UnixArgs_ArgC; +} + + +/* GetArgV returns argv. */ + +extern "C" char ** +UnixArgs_GetArgV (void) +{ + return UnixArgs_ArgV; +} + + +/* GetEnvV returns envv. */ + +extern "C" char ** +UnixArgs_GetEnvV (void) +{ + return UnixArgs_EnvV; +} + + +extern "C" void +_M2_UnixArgs_init (int argc, char *argv[], char *envp[]) { UnixArgs_ArgC = argc; UnixArgs_ArgV = argv; + UnixArgs_EnvV = envp; } -void -_M2_UnixArgs_finish (int argc, char *argv[]) +extern "C" void +_M2_UnixArgs_finish (int argc, char *argv[], char *envp[]) { } -#ifdef __cplusplus +extern "C" void +_M2_UnixArgs_dep (void) +{ +} + +struct _M2_UnixArgs_ctor { _M2_UnixArgs_ctor (); } _M2_UnixArgs_ctor; + +_M2_UnixArgs_ctor::_M2_UnixArgs_ctor (void) +{ + M2RTS_RegisterModule ("UnixArgs", _M2_UnixArgs_init, _M2_UnixArgs_finish, + _M2_UnixArgs_dep); } -#endif diff --git a/gcc/m2/gm2-libs-ch/dtoa.c b/gcc/m2/gm2-libs-ch/dtoa.c index 193aed9..5731758 100644 --- a/gcc/m2/gm2-libs-ch/dtoa.c +++ b/gcc/m2/gm2-libs-ch/dtoa.c @@ -29,7 +29,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "ansidecl.h" #include "gm2-libs-host.h" - +#include "m2rts.h" #ifdef __cplusplus extern "C" { @@ -172,14 +172,35 @@ dtoa_dtoa (double d, int mode, int ndigits, int *decpt, int *sign) /* GNU Modula-2 hooks */ void -_M2_dtoa_init (void) +_M2_dtoa_init (int, char **, char **) { } void -_M2_dtoa_finish (void) +_M2_dtoa_finish (int, char **, char **) { } -# ifdef __cplusplus + +void +_M2_dtoa_dep (void) +{ } -# endif + +#ifdef __cplusplus +} + +struct _M2_dtoa_ctor { _M2_dtoa_ctor (); } _M2_dtoa_ctor; + +_M2_dtoa_ctor::_M2_dtoa_ctor (void) +{ + M2RTS_RegisterModule ("dtoa", _M2_dtoa_init, _M2_dtoa_finish, + _M2_dtoa_dep); +} + +#else +void +_M2_dtoa_ctor (void) +{ +} + +#endif diff --git a/gcc/m2/gm2-libs-ch/ldtoa.c b/gcc/m2/gm2-libs-ch/ldtoa.c index 6209f1b..ac14297 100644 --- a/gcc/m2/gm2-libs-ch/ldtoa.c +++ b/gcc/m2/gm2-libs-ch/ldtoa.c @@ -29,6 +29,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "ansidecl.h" #include "gm2-libs-host.h" +#include "m2rts.h" # ifdef __cplusplus extern "C" { @@ -100,15 +101,35 @@ ldtoa_ldtoa (long double d, int mode, int ndigits, int *decpt, int *sign) /* GNU Modula-2 hooks */ void -_M2_ldtoa_init (void) +_M2_ldtoa_init (int, char **, char **) { } void -_M2_ldtoa_finish (void) +_M2_ldtoa_finish (int, char **, char **) +{ +} + +void +_M2_ldtoa_dep (void) { } # ifdef __cplusplus } + +struct _M2_ldtoa_ctor { _M2_ldtoa_ctor (); } _M2_ldtoa_ctor; + +_M2_ldtoa_ctor::_M2_ldtoa_ctor (void) +{ + M2RTS_RegisterModule ("ldtoa", _M2_ldtoa_init, _M2_ldtoa_finish, + _M2_ldtoa_dep); +} + +#else +void +_M2_ldtoa_ctor (void) +{ +} + # endif diff --git a/gcc/m2/gm2-libs-iso/ProgramArgs.mod b/gcc/m2/gm2-libs-iso/ProgramArgs.mod index cc27016..f25e1e9 100644 --- a/gcc/m2/gm2-libs-iso/ProgramArgs.mod +++ b/gcc/m2/gm2-libs-iso/ProgramArgs.mod @@ -30,7 +30,7 @@ FROM RTgen IMPORT ChanDev, InitChanDev, DeviceType, doLook, doSkip, doSkipLook, doReadText, doReadLocs ; FROM SYSTEM IMPORT ADDRESS, ADR ; -FROM UnixArgs IMPORT ArgC, ArgV ; +FROM UnixArgs IMPORT GetArgC, GetArgV ; FROM RTgenif IMPORT GenDevIF, InitGenDevIF ; FROM RTdata IMPORT ModuleId, MakeModuleId, InitData, GetData ; FROM IOLink IMPORT DeviceId, DeviceTablePtr, DeviceTablePtrValue, AllocateDeviceId, MakeChan, RAISEdevException ; @@ -127,7 +127,7 @@ BEGIN currentPos := 0 ; currentArg := 0 ; argLength := strlen(currentPtr)+1 ; - argc := ArgC + argc := GetArgC () END END reset ; @@ -382,15 +382,16 @@ END NextArg ; PROCEDURE collectArgs ; VAR - i, n: CARDINAL ; + i : INTEGER ; + n : CARDINAL ; pp : POINTER TO PtrToChar ; p, q: PtrToChar ; BEGIN (* count the number of bytes necessary to remember all arg data *) n := 0 ; i := 0 ; - pp := ArgV ; - WHILE i<ArgC DO + pp := GetArgV () ; + WHILE i < GetArgC () DO p := pp^ ; WHILE p^#nul DO INC(p) ; @@ -404,9 +405,9 @@ BEGIN (* now allocate correct amount of memory and copy the data *) ALLOCATE(ArgData, ArgLength) ; i := 0 ; - pp := ArgV ; + pp := GetArgV () ; q := ArgData ; - WHILE i<ArgC DO + WHILE i < GetArgC () DO p := pp^ ; WHILE p^#nul DO q^ := p^ ; @@ -450,7 +451,7 @@ BEGIN currentPos := 0 ; currentArg := 0 ; argLength := strlen(currentPtr)+1 ; - argc := ArgC + argc := GetArgC () END ; d := DeviceTablePtrValue(cid, did) ; InitData(d, mid, a, freeData) ; diff --git a/gcc/m2/gm2-libs/Args.def b/gcc/m2/gm2-libs/Args.def index e576670..b252d42 100644 --- a/gcc/m2/gm2-libs/Args.def +++ b/gcc/m2/gm2-libs/Args.def @@ -34,7 +34,7 @@ EXPORT QUALIFIED GetArg, Narg ; The success of the operation is returned. *) -PROCEDURE GetArg (VAR a: ARRAY OF CHAR; i: CARDINAL) : BOOLEAN ; +PROCEDURE GetArg (VAR a: ARRAY OF CHAR; n: CARDINAL) : BOOLEAN ; (* diff --git a/gcc/m2/gm2-libs/Args.mod b/gcc/m2/gm2-libs/Args.mod index 62d8a37..2b8dc03 100644 --- a/gcc/m2/gm2-libs/Args.mod +++ b/gcc/m2/gm2-libs/Args.mod @@ -27,7 +27,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see IMPLEMENTATION MODULE Args ; -FROM UnixArgs IMPORT ArgC, ArgV ; +FROM UnixArgs IMPORT GetArgC, GetArgV ; FROM ASCII IMPORT nul ; @@ -50,16 +50,18 @@ VAR The success of the operation is returned. *) -PROCEDURE GetArg (VAR a: ARRAY OF CHAR; i: CARDINAL) : BOOLEAN ; +PROCEDURE GetArg (VAR a: ARRAY OF CHAR; n: CARDINAL) : BOOLEAN ; VAR + i : INTEGER ; High, j : CARDINAL ; BEGIN + i := VAL (INTEGER, n) ; j := 0 ; High := HIGH(a) ; - IF i<ArgC + IF i < GetArgC () THEN - Source := ArgV ; + Source := GetArgV () ; WHILE (Source^[i]^[j]#nul) AND (j<High) DO a[j] := Source^[i]^[j] ; INC(j) @@ -69,7 +71,7 @@ BEGIN THEN a[j] := nul END ; - RETURN( i<ArgC ) + RETURN i < GetArgC () END GetArg ; @@ -80,7 +82,7 @@ END GetArg ; PROCEDURE Narg () : CARDINAL ; BEGIN - RETURN( ArgC ) + RETURN GetArgC () END Narg ; diff --git a/gcc/m2/gm2-libs/SArgs.def b/gcc/m2/gm2-libs/SArgs.def index 404bee3..cf8164f 100644 --- a/gcc/m2/gm2-libs/SArgs.def +++ b/gcc/m2/gm2-libs/SArgs.def @@ -37,7 +37,7 @@ EXPORT QUALIFIED GetArg, Narg ; new string, otherwise s is set to NIL. *) -PROCEDURE GetArg (VAR s: String ; i: CARDINAL) : BOOLEAN ; +PROCEDURE GetArg (VAR s: String ; n: CARDINAL) : BOOLEAN ; (* diff --git a/gcc/m2/gm2-libs/SArgs.mod b/gcc/m2/gm2-libs/SArgs.mod index 3f8bcae..3e167bf 100644 --- a/gcc/m2/gm2-libs/SArgs.mod +++ b/gcc/m2/gm2-libs/SArgs.mod @@ -27,7 +27,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see IMPLEMENTATION MODULE SArgs ; FROM SYSTEM IMPORT TSIZE, ADDRESS ; -FROM UnixArgs IMPORT ArgC, ArgV ; +FROM UnixArgs IMPORT GetArgC, GetArgV ; FROM DynamicStrings IMPORT InitStringCharStar, InitStringDB, InitStringCharStarDB, @@ -57,14 +57,16 @@ if defined(GM2_DEBUG_SARGS) new string, otherwise s is set to NIL. *) -PROCEDURE GetArg (VAR s: String; i: CARDINAL) : BOOLEAN ; +PROCEDURE GetArg (VAR s: String; n: CARDINAL) : BOOLEAN ; VAR + i : INTEGER ; ppc: PtrToPtrToChar ; BEGIN - IF i < ArgC + i := VAL (INTEGER, n) ; + IF i < GetArgC () THEN (* ppc := ADDRESS (VAL (PtrToPtrToChar, ArgV) + (i * CARDINAL (TSIZE(PtrToChar)))) ; *) - ppc := ADDRESS (PtrToChar (ArgV) + (i * TSIZE (PtrToChar))) ; + ppc := ADDRESS (PtrToChar (GetArgV ()) + (n * TSIZE (PtrToChar))) ; s := InitStringCharStar (ppc^) ; RETURN TRUE @@ -82,7 +84,7 @@ END GetArg ; PROCEDURE Narg () : CARDINAL ; BEGIN - RETURN( ArgC ) + RETURN GetArgC () END Narg ; diff --git a/gcc/m2/gm2-libs/UnixArgs.def b/gcc/m2/gm2-libs/UnixArgs.def index e1cd3f6..23a21b8 100644 --- a/gcc/m2/gm2-libs/UnixArgs.def +++ b/gcc/m2/gm2-libs/UnixArgs.def @@ -1,4 +1,4 @@ -(* UnixArgs.def Implements access to the C arguments argc and argv. +(* UnixArgs.def Implements access to the arguments argc, argv, envp. Copyright (C) 2001-2021 Free Software Foundation, Inc. Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>. @@ -28,12 +28,11 @@ DEFINITION MODULE UnixArgs ; FROM SYSTEM IMPORT ADDRESS ; -EXPORT QUALIFIED ArgC, ArgV ; +EXPORT QUALIFIED GetArgC, GetArgV, GetEnvV ; - -VAR - ArgC: CARDINAL ; - ArgV: ADDRESS ; +PROCEDURE GetArgC () : INTEGER ; +PROCEDURE GetArgV () : ADDRESS ; +PROCEDURE GetEnvV () : ADDRESS ; END UnixArgs. diff --git a/gcc/m2/init/mcinit b/gcc/m2/init/mcinit index 88120fd..2473039 100644 --- a/gcc/m2/init/mcinit +++ b/gcc/m2/init/mcinit @@ -20,6 +20,7 @@ # Storage SYSTEM +# M2Dependent M2RTS RTExceptions # SYSTEM 9 /opt/gm2/lib/gcc/x86_64-linux-gnu/4.7.4/m2/pim/SYSTEM.mod diff --git a/gcc/m2/mc-boot-ch/GM2LINK.c b/gcc/m2/mc-boot-ch/GM2LINK.c index 2d293fd..302f219 100644 --- a/gcc/m2/mc-boot-ch/GM2LINK.c +++ b/gcc/m2/mc-boot-ch/GM2LINK.c @@ -21,4 +21,7 @@ along with GNU Modula-2; see the file COPYING3. If not see /* mc currently is built using a static scaffold. */ +#include <cstddef> + int M2LINK_StaticInitialization = 1; +char *M2LINK_ForcedModuleInitOrder = NULL; diff --git a/gcc/m2/mc-boot-ch/GUnixArgs.c b/gcc/m2/mc-boot-ch/GUnixArgs.c deleted file mode 100644 index 1f1304c..0000000 --- a/gcc/m2/mc-boot-ch/GUnixArgs.c +++ /dev/null @@ -1,44 +0,0 @@ -/* GUnixArgs.c handwritten module for mc. - -Copyright (C) 2016-2022 Free Software Foundation, Inc. -Contributed by Gaius Mulley <gaius@glam.ac.uk>. - -This file is part of GNU Modula-2. - -GNU Modula-2 is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 3, or (at your option) -any later version. - -GNU Modula-2 is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Modula-2; see the file COPYING3. If not see -<http://www.gnu.org/licenses/>. */ - -#if defined(__cplusplus) -extern "C" { -#endif - -int UnixArgs_ArgC; - -char **UnixArgs_ArgV; - -void -_M2_UnixArgs_init (int argc, char *argv[]) -{ - UnixArgs_ArgC = argc; - UnixArgs_ArgV = argv; -} - -void -_M2_UnixArgs_finish (int argc, char *argv[]) -{ -} - -#if defined(__cplusplus) -} -#endif diff --git a/gcc/m2/mc-boot/GArgs.c b/gcc/m2/mc-boot/GArgs.c index d517fac..919182c 100644 --- a/gcc/m2/mc-boot/GArgs.c +++ b/gcc/m2/mc-boot/GArgs.c @@ -56,7 +56,7 @@ static _T1 Source; The success of the operation is returned. */ -extern "C" unsigned int Args_GetArg (char *a, unsigned int _a_high, unsigned int i); +extern "C" unsigned int Args_GetArg (char *a, unsigned int _a_high, unsigned int n); /* Narg - returns the number of arguments available from @@ -71,16 +71,18 @@ extern "C" unsigned int Args_Narg (void); The success of the operation is returned. */ -extern "C" unsigned int Args_GetArg (char *a, unsigned int _a_high, unsigned int i) +extern "C" unsigned int Args_GetArg (char *a, unsigned int _a_high, unsigned int n) { + int i; unsigned int High; unsigned int j; + i = (int ) (n); j = 0; High = _a_high; - if (i < UnixArgs_ArgC) + if (i < (UnixArgs_GetArgC ())) { - Source = static_cast<_T1> (UnixArgs_ArgV); + Source = static_cast<_T1> (UnixArgs_GetArgV ()); while (((*(*Source).array[i]).array[j] != ASCII_nul) && (j < High)) { a[j] = (*(*Source).array[i]).array[j]; @@ -91,7 +93,7 @@ extern "C" unsigned int Args_GetArg (char *a, unsigned int _a_high, unsigned int { a[j] = ASCII_nul; } - return i < UnixArgs_ArgC; + return i < (UnixArgs_GetArgC ()); /* static analysis guarentees a RETURN statement will be used before here. */ __builtin_unreachable (); } @@ -104,7 +106,7 @@ extern "C" unsigned int Args_GetArg (char *a, unsigned int _a_high, unsigned int extern "C" unsigned int Args_Narg (void) { - return UnixArgs_ArgC; + return UnixArgs_GetArgC (); /* static analysis guarentees a RETURN statement will be used before here. */ __builtin_unreachable (); } diff --git a/gcc/m2/mc-boot/GArgs.h b/gcc/m2/mc-boot/GArgs.h index 1a15de2..166a49e 100644 --- a/gcc/m2/mc-boot/GArgs.h +++ b/gcc/m2/mc-boot/GArgs.h @@ -53,7 +53,7 @@ extern "C" { The success of the operation is returned. */ -EXTERN unsigned int Args_GetArg (char *a, unsigned int _a_high, unsigned int i); +EXTERN unsigned int Args_GetArg (char *a, unsigned int _a_high, unsigned int n); /* Narg - returns the number of arguments available from diff --git a/gcc/m2/mc-boot/GM2RTS.c b/gcc/m2/mc-boot/GM2RTS.c index 4c4dc74..9566201 100644 --- a/gcc/m2/mc-boot/GM2RTS.c +++ b/gcc/m2/mc-boot/GM2RTS.c @@ -50,7 +50,6 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define _M2RTS_C # include "Glibc.h" -# include "GM2LINK.h" # include "GNumberIO.h" # include "GStrLib.h" # include "GSYSTEM.h" @@ -58,6 +57,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see # include "GStorage.h" # include "GRTExceptions.h" # include "GM2EXCEPTION.h" +# include "GM2Dependent.h" typedef struct M2RTS_ArgCVEnvP_p M2RTS_ArgCVEnvP; @@ -65,19 +65,9 @@ typedef struct ProcedureList_r ProcedureList; typedef char *PtrToChar; -typedef struct DependencyList_r DependencyList; +typedef struct _T1_r _T1; -typedef struct _T2_r _T2; - -typedef _T2 *ProcedureChain; - -typedef struct _T3_r _T3; - -typedef _T3 *ModuleChain; - -typedef struct _T4_a _T4; - -typedef enum {unregistered, unordered, started, ordered} DependencyState; +typedef _T1 *ProcedureChain; typedef void (*M2RTS_ArgCVEnvP_t) (int, void *, void *); struct M2RTS_ArgCVEnvP_p { M2RTS_ArgCVEnvP_t proc; }; @@ -87,40 +77,18 @@ struct ProcedureList_r { ProcedureChain tail; }; -struct DependencyList_r { - PROC proc; - unsigned int forced; - unsigned int forc; - DependencyState state; - }; - -struct _T2_r { +struct _T1_r { PROC p; ProcedureChain prev; ProcedureChain next; }; -struct _T4_a { ModuleChain array[ordered-unregistered+1]; }; -struct _T3_r { - void *name; - M2RTS_ArgCVEnvP init; - M2RTS_ArgCVEnvP fini; - DependencyList dependency; - ModuleChain prev; - ModuleChain next; - }; - static ProcedureList InitialProc; static ProcedureList TerminateProc; static int ExitValue; -static _T4 Modules; static unsigned int isHalting; static unsigned int CallExit; -static unsigned int ModuleTrace; -static unsigned int DependencyTrace; -static unsigned int PreTrace; -static unsigned int PostTrace; -static unsigned int ForceTrace; +static unsigned int Initialized; /* ConstructModules - resolve dependencies and then call each @@ -146,20 +114,12 @@ extern "C" void M2RTS_RegisterModule (void * name, M2RTS_ArgCVEnvP init, M2RTS_A /* RequestDependant - used to specify that modulename is dependant upon - module dependantmodule. It only takes effect - if we are not using StaticInitialization. + module dependantmodule. */ extern "C" void M2RTS_RequestDependant (void * modulename, void * dependantmodule); /* - ExecuteTerminationProcedures - calls each installed termination procedure - in reverse order. -*/ - -extern "C" void M2RTS_ExecuteTerminationProcedures (void); - -/* InstallTerminationProcedure - installs a procedure, p, which will be called when the procedure ExecuteTerminationProcedures @@ -185,7 +145,14 @@ extern "C" void M2RTS_ExecuteInitialProcedures (void); extern "C" unsigned int M2RTS_InstallInitialProcedure (PROC p); /* - Terminate - provides compatibility for pim. It call exit with + ExecuteTerminationProcedures - calls each installed termination procedure + in reverse order. +*/ + +extern "C" void M2RTS_ExecuteTerminationProcedures (void); + +/* + Terminate - provides compatibility for pim. It calls exit with the exitcode provided in a prior call to ExitOnHalt (or zero if ExitOnHalt was never called). It does not call ExecuteTerminationProcedures. @@ -258,117 +225,6 @@ extern "C" void M2RTS_ParameterException (void * filename, unsigned int line, un extern "C" void M2RTS_NoException (void * filename, unsigned int line, unsigned int column, void * scope, void * message); /* - CreateModule - creates a new module entry and returns the - ModuleChain. -*/ - -static ModuleChain CreateModule (void * name, M2RTS_ArgCVEnvP init, M2RTS_ArgCVEnvP fini, PROC dependencies); - -/* - AppendModule - append chain to head. -*/ - -static void AppendModule (ModuleChain *head, ModuleChain chain); - -/* - RemoveModule - remove chain from double linked list head. -*/ - -static void RemoveModule (ModuleChain *head, ModuleChain chain); - -/* - onChain - returns TRUE if mptr is on the Modules[state] list. -*/ - -static unsigned int onChain (DependencyState state, ModuleChain mptr); - -/* - LookupModule - lookup and return the ModuleChain pointer containing - module name from a particular list. -*/ - -static ModuleChain LookupModule (DependencyState state, void * name); - -/* - toCString - replace any character sequence - into a newline. -*/ - -static void toCString (char *str, unsigned int _str_high); - -/* - strcmp - return 1 if both strings are equal. - We cannot use Builtins.def during bootstrap. -*/ - -static int strcmp (PtrToChar a, PtrToChar b); - -/* - strncmp - return 1 if both strings are equal. - We cannot use Builtins.def during bootstrap. -*/ - -static int strncmp (PtrToChar a, PtrToChar b, unsigned int n); - -/* - traceprintf - wrap printf with a boolean flag. -*/ - -static void traceprintf (unsigned int flag, const char *str_, unsigned int _str_high); - -/* - traceprintf2 - wrap printf with a boolean flag. -*/ - -static void traceprintf2 (unsigned int flag, const char *str_, unsigned int _str_high, void * arg); - -/* - moveTo - moves mptr to the new list determined by newstate. - It updates the mptr state appropriately. -*/ - -static void moveTo (DependencyState newstate, ModuleChain mptr); - -/* - ResolveDependant - -*/ - -static void ResolveDependant (ModuleChain mptr, void * currentmodule); - -/* - PerformRequestDependant - the current modulename has a dependancy upon - dependantmodule. If dependantmodule is NIL then - modulename has no further dependants and it can be - resolved. -*/ - -static void PerformRequestDependant (void * modulename, void * dependantmodule); - -/* - ResolveDependencies - -*/ - -static void ResolveDependencies (void * currentmodule); - -/* - DisplayModuleInfo - displays all module in the state. -*/ - -static void DisplayModuleInfo (DependencyState state, const char *name_, unsigned int _name_high); - -/* - DumpModuleData - -*/ - -static void DumpModuleData (unsigned int flag); - -/* - ForceDependencies - -*/ - -static void ForceDependencies (void); - -/* ExecuteReverse - execute the procedure associated with procptr and then proceed to try and execute all previous procedures in the chain. @@ -396,464 +252,19 @@ static void ErrorString (const char *a_, unsigned int _a_high); static void InitProcList (ProcedureList *p); /* - equal - return TRUE if C string cstr is equal to str. -*/ - -static unsigned int equal (void * cstr, const char *str_, unsigned int _str_high); - -/* - SetupDebugFlags - By default assigns ModuleTrace, DependencyTrace, - DumpPostInit to FALSE. It checks the environment - GCC_M2LINK_RTFLAG which can contain - "all,module,pre,post,dep,force". all turns them all on. - The flag meanings are as follows and flags the are in - execution order. - - module generate trace info as the modules are registered. - pre generate a list of all modules seen prior to having - their dependancies resolved. - dep display a trace as the modules are resolved. - post generate a list of all modules seen after having - their dependancies resolved. - force generate a list of all modules seen after having - their dependancies resolved and forced. -*/ - -static void SetupDebugFlags (void); - - -/* - CreateModule - creates a new module entry and returns the - ModuleChain. -*/ - -static ModuleChain CreateModule (void * name, M2RTS_ArgCVEnvP init, M2RTS_ArgCVEnvP fini, PROC dependencies) -{ - ModuleChain mptr; - - Storage_ALLOCATE ((void **) &mptr, sizeof (_T3)); - mptr->name = name; - mptr->init = init; - mptr->fini = fini; - mptr->dependency.proc = dependencies; - mptr->dependency.state = unregistered; - mptr->prev = NULL; - mptr->next = NULL; - return mptr; - /* static analysis guarentees a RETURN statement will be used before here. */ - __builtin_unreachable (); -} - - -/* - AppendModule - append chain to head. -*/ - -static void AppendModule (ModuleChain *head, ModuleChain chain) -{ - if ((*head) == NULL) - { - (*head) = chain; - chain->prev = chain; - chain->next = chain; - } - else - { - chain->next = (*head); /* Add Item to the end of queue */ - chain->prev = (*head)->prev; /* Add Item to the end of queue */ - (*head)->prev->next = chain; - (*head)->prev = chain; - } -} - - -/* - RemoveModule - remove chain from double linked list head. -*/ - -static void RemoveModule (ModuleChain *head, ModuleChain chain) -{ - if ((chain->next == (*head)) && (chain == (*head))) - { - (*head) = NULL; - } - else - { - if ((*head) == chain) - { - (*head) = (*head)->next; - } - chain->prev->next = chain->next; - chain->next->prev = chain->prev; - } -} - - -/* - onChain - returns TRUE if mptr is on the Modules[state] list. -*/ - -static unsigned int onChain (DependencyState state, ModuleChain mptr) -{ - ModuleChain ptr; - - if (Modules.array[state-unregistered] != NULL) - { - ptr = Modules.array[state-unregistered]; - do { - if (ptr == mptr) - { - return TRUE; - } - ptr = ptr->next; - } while (! (ptr == Modules.array[state-unregistered])); - } - return FALSE; - /* static analysis guarentees a RETURN statement will be used before here. */ - __builtin_unreachable (); -} - - -/* - LookupModule - lookup and return the ModuleChain pointer containing - module name from a particular list. -*/ - -static ModuleChain LookupModule (DependencyState state, void * name) -{ - ModuleChain ptr; - - if (Modules.array[state-unregistered] != NULL) - { - ptr = Modules.array[state-unregistered]; - do { - if ((strcmp (reinterpret_cast<PtrToChar> (ptr->name), reinterpret_cast<PtrToChar> (name))) == 0) - { - return ptr; - } - ptr = ptr->next; - } while (! (ptr == Modules.array[state-unregistered])); - } - return NULL; - /* static analysis guarentees a RETURN statement will be used before here. */ - __builtin_unreachable (); -} - - -/* - toCString - replace any character sequence - into a newline. -*/ - -static void toCString (char *str, unsigned int _str_high) -{ - unsigned int high; - unsigned int i; - unsigned int j; - - i = 0; - high = _str_high; - while (i < high) - { - if ((str[i] == '\\') && (i < high)) - { - if (str[i+1] == 'n') - { - str[i] = ASCII_nl; - j = i+1; - while (j < high) - { - str[j] = str[j+1]; - j += 1; - } - } - } - i += 1; - } -} - - -/* - strcmp - return 1 if both strings are equal. - We cannot use Builtins.def during bootstrap. -*/ - -static int strcmp (PtrToChar a, PtrToChar b) -{ - if ((a != NULL) && (b != NULL)) - { - /* avoid gcc warning by using compound statement even if not strictly necessary. */ - if (a == b) - { - return 1; - } - else - { - while ((*a) == (*b)) - { - if ((*a) == ASCII_nul) - { - return 1; - } - a += 1; - b += 1; - } - } - } - return 0; - /* static analysis guarentees a RETURN statement will be used before here. */ - __builtin_unreachable (); -} - - -/* - strncmp - return 1 if both strings are equal. - We cannot use Builtins.def during bootstrap. -*/ - -static int strncmp (PtrToChar a, PtrToChar b, unsigned int n) -{ - if (((a != NULL) && (b != NULL)) && (n > 0)) - { - /* avoid gcc warning by using compound statement even if not strictly necessary. */ - if (a == b) - { - return 1; - } - else - { - while (((*a) == (*b)) && (n > 0)) - { - if ((*a) == ASCII_nul) - { - return 1; - } - a += 1; - b += 1; - n -= 1; - } - } - } - return 0; - /* static analysis guarentees a RETURN statement will be used before here. */ - __builtin_unreachable (); -} - - -/* - traceprintf - wrap printf with a boolean flag. -*/ - -static void traceprintf (unsigned int flag, const char *str_, unsigned int _str_high) -{ - char str[_str_high+1]; - - /* make a local copy of each unbounded array. */ - memcpy (str, str_, _str_high+1); - - if (flag) - { - toCString ((char *) str, _str_high); - libc_printf ((const char *) str, _str_high); - } -} - - -/* - traceprintf2 - wrap printf with a boolean flag. -*/ - -static void traceprintf2 (unsigned int flag, const char *str_, unsigned int _str_high, void * arg) -{ - char str[_str_high+1]; - - /* make a local copy of each unbounded array. */ - memcpy (str, str_, _str_high+1); - - if (flag) - { - toCString ((char *) str, _str_high); - libc_printf ((const char *) str, _str_high, arg); - } -} - - -/* - moveTo - moves mptr to the new list determined by newstate. - It updates the mptr state appropriately. + Init - initialize the initial, terminate procedure lists and booleans. */ -static void moveTo (DependencyState newstate, ModuleChain mptr) -{ - if (onChain (mptr->dependency.state, mptr)) - { - RemoveModule (&Modules.array[mptr->dependency.state-unregistered], mptr); - } - mptr->dependency.state = newstate; - AppendModule (&Modules.array[mptr->dependency.state-unregistered], mptr); -} - +static void Init (void); /* - ResolveDependant - + CheckInitialized - checks to see if this module has been initialized + and if it has not it calls Init. We need this + approach as this module is called by module ctors + before we reach main. */ -static void ResolveDependant (ModuleChain mptr, void * currentmodule) -{ - if (mptr == NULL) - { - traceprintf (DependencyTrace, (const char *) " module has not been registered via a global constructor\\n", 60); - } - else - { - if (onChain (started, mptr)) - { - traceprintf (DependencyTrace, (const char *) " processing...\\n", 18); - } - else - { - moveTo (started, mptr); - traceprintf2 (DependencyTrace, (const char *) " starting: %s\\n", 17, currentmodule); - (*mptr->dependency.proc.proc) (); /* Invoke and process the dependency graph. */ - traceprintf2 (DependencyTrace, (const char *) " finished: %s\\n", 17, currentmodule); /* Invoke and process the dependency graph. */ - } - } -} - - -/* - PerformRequestDependant - the current modulename has a dependancy upon - dependantmodule. If dependantmodule is NIL then - modulename has no further dependants and it can be - resolved. -*/ - -static void PerformRequestDependant (void * modulename, void * dependantmodule) -{ - ModuleChain mptr; - - if (dependantmodule == NULL) - { - mptr = LookupModule (unordered, modulename); - if (mptr == NULL) - { - traceprintf2 (DependencyTrace, (const char *) "internal error module %s is not in the list of unordered modules\\n", 66, modulename); - } - else - { - traceprintf2 (DependencyTrace, (const char *) " module %s dependants all complete\\n", 37, modulename); - moveTo (ordered, mptr); - } - } - else - { - mptr = LookupModule (ordered, dependantmodule); - if (mptr == NULL) - { - traceprintf2 (DependencyTrace, (const char *) " module %s ", 13, dependantmodule); - mptr = LookupModule (unordered, dependantmodule); - if (mptr == NULL) - { - mptr = LookupModule (started, dependantmodule); - if (mptr == NULL) - { - traceprintf2 (DependencyTrace, (const char *) " unknown dependancies in module %s ", 37, modulename); - } - else - { - traceprintf2 (DependencyTrace, (const char *) " dependant %s started\\n", 25, dependantmodule); - } - } - else - { - ResolveDependant (mptr, dependantmodule); - } - } - else - { - traceprintf2 (DependencyTrace, (const char *) " module %s ", 13, modulename); - traceprintf2 (DependencyTrace, (const char *) " dependant upon %s completed\\n", 30, dependantmodule); - } - } -} - - -/* - ResolveDependencies - -*/ - -static void ResolveDependencies (void * currentmodule) -{ - ModuleChain mptr; - - mptr = LookupModule (unordered, currentmodule); - while (mptr != NULL) - { - traceprintf2 (DependencyTrace, (const char *) " attempting to resolve the dependants for %s\\n", 48, currentmodule); - ResolveDependant (mptr, currentmodule); - mptr = Modules.array[unordered-unregistered]; - } -} - - -/* - DisplayModuleInfo - displays all module in the state. -*/ - -static void DisplayModuleInfo (DependencyState state, const char *name_, unsigned int _name_high) -{ - ModuleChain mptr; - char name[_name_high+1]; - - /* make a local copy of each unbounded array. */ - memcpy (name, name_, _name_high+1); - - if (Modules.array[state-unregistered] != NULL) - { - libc_printf ((const char *) "%s modules\\n", 12, &name); - mptr = Modules.array[state-unregistered]; - do { - libc_printf ((const char *) " %s", 4, mptr->name); - if (mptr->dependency.forc) - { - libc_printf ((const char *) " for C", 6); - } - if (mptr->dependency.forced) - { - libc_printf ((const char *) " forced ordering", 16); - } - libc_printf ((const char *) "\\n", 2); - mptr = mptr->next; - } while (! (mptr == Modules.array[state-unregistered])); - } -} - - -/* - DumpModuleData - -*/ - -static void DumpModuleData (unsigned int flag) -{ - ModuleChain mptr; - - if (flag) - { - DisplayModuleInfo (unregistered, (const char *) "unregistered", 12); - DisplayModuleInfo (unordered, (const char *) "unordered", 9); - DisplayModuleInfo (started, (const char *) "started", 7); - DisplayModuleInfo (ordered, (const char *) "ordered", 7); - } -} - - -/* - ForceDependencies - -*/ - -static void ForceDependencies (void) -{ -} +static void CheckInitialized (void); /* @@ -881,7 +292,7 @@ static unsigned int AppendProc (ProcedureList *proclist, PROC proc) { ProcedureChain pdes; - Storage_ALLOCATE ((void **) &pdes, sizeof (_T2)); + Storage_ALLOCATE ((void **) &pdes, sizeof (_T1)); pdes->p = proc; pdes->prev = (*proclist).tail; pdes->next = NULL; @@ -924,96 +335,32 @@ static void InitProcList (ProcedureList *p) /* - equal - return TRUE if C string cstr is equal to str. + Init - initialize the initial, terminate procedure lists and booleans. */ -static unsigned int equal (void * cstr, const char *str_, unsigned int _str_high) +static void Init (void) { - char str[_str_high+1]; - - /* make a local copy of each unbounded array. */ - memcpy (str, str_, _str_high+1); - - return (strncmp (reinterpret_cast<PtrToChar> (cstr), reinterpret_cast<PtrToChar> (&str), StrLib_StrLen ((const char *) str, _str_high))) == 0; - /* static analysis guarentees a RETURN statement will be used before here. */ - __builtin_unreachable (); + InitProcList (&InitialProc); + InitProcList (&TerminateProc); + ExitValue = 0; + isHalting = FALSE; + CallExit = FALSE; /* default by calling abort */ } /* - SetupDebugFlags - By default assigns ModuleTrace, DependencyTrace, - DumpPostInit to FALSE. It checks the environment - GCC_M2LINK_RTFLAG which can contain - "all,module,pre,post,dep,force". all turns them all on. - The flag meanings are as follows and flags the are in - execution order. - - module generate trace info as the modules are registered. - pre generate a list of all modules seen prior to having - their dependancies resolved. - dep display a trace as the modules are resolved. - post generate a list of all modules seen after having - their dependancies resolved. - force generate a list of all modules seen after having - their dependancies resolved and forced. + CheckInitialized - checks to see if this module has been initialized + and if it has not it calls Init. We need this + approach as this module is called by module ctors + before we reach main. */ -static void SetupDebugFlags (void) +static void CheckInitialized (void) { - typedef char *_T1; - - _T1 pc; - - ModuleTrace = FALSE; - DependencyTrace = FALSE; - PostTrace = FALSE; - PreTrace = FALSE; - pc = static_cast<_T1> (libc_getenv (const_cast<void*> (reinterpret_cast<const void*>("GCC_M2LINK_RTFLAG")))); - while ((pc != NULL) && ((*pc) != ASCII_nul)) + if (! Initialized) { - if (equal (reinterpret_cast<void *> (pc), (const char *) "all", 3)) - { - ModuleTrace = TRUE; - DependencyTrace = TRUE; - PreTrace = TRUE; - PostTrace = TRUE; - pc += 3; - } - else if (equal (reinterpret_cast<void *> (pc), (const char *) "module", 6)) - { - /* avoid dangling else. */ - ModuleTrace = TRUE; - pc += 6; - } - else if (equal (reinterpret_cast<void *> (pc), (const char *) "dep", 3)) - { - /* avoid dangling else. */ - DependencyTrace = TRUE; - pc += 3; - } - else if (equal (reinterpret_cast<void *> (pc), (const char *) "pre", 3)) - { - /* avoid dangling else. */ - PreTrace = TRUE; - pc += 3; - } - else if (equal (reinterpret_cast<void *> (pc), (const char *) "post", 4)) - { - /* avoid dangling else. */ - PostTrace = TRUE; - pc += 4; - } - else if (equal (reinterpret_cast<void *> (pc), (const char *) "force", 5)) - { - /* avoid dangling else. */ - ForceTrace = TRUE; - pc += 5; - } - else - { - /* avoid dangling else. */ - pc += 1; - } + Initialized = TRUE; + Init (); } } @@ -1025,49 +372,7 @@ static void SetupDebugFlags (void) extern "C" void M2RTS_ConstructModules (void * applicationmodule, int argc, void * argv, void * envp) { - ModuleChain mptr; - M2RTS_ArgCVEnvP nulp; - - SetupDebugFlags (); - traceprintf2 (ModuleTrace, (const char *) "application module: %s\\n", 24, applicationmodule); - DumpModuleData (PreTrace); - ResolveDependencies (applicationmodule); - DumpModuleData (PostTrace); - ForceDependencies (); - DumpModuleData (ForceTrace); - if (Modules.array[ordered-unregistered] == NULL) - { - traceprintf2 (ModuleTrace, (const char *) " module: %s has not registered itself using a global constructor\\n", 67, applicationmodule); - traceprintf2 (ModuleTrace, (const char *) " hint try compile and linking using: gm2 %s.mod\\n", 50, applicationmodule); - traceprintf2 (ModuleTrace, (const char *) " or try using: gm2 -fscaffold-static %s.mod\\n", 46, applicationmodule); - } - else - { - mptr = Modules.array[ordered-unregistered]; - do { - if (mptr->dependency.forc) - { - traceprintf2 (ModuleTrace, (const char *) "initializing module: %s for C\\n", 31, mptr->name); - } - else - { - traceprintf2 (ModuleTrace, (const char *) "initializing module: %s\\n", 25, mptr->name); - } - /* - nulp := NIL ; - IF mptr^.init = nulp - THEN - traceprintf (ModuleTrace, " no initialization section, skipping... - ") - ELSE - */ - (*mptr->init.proc) (argc, argv, envp); - /* - END ; - */ - mptr = mptr->prev; - } while (! (mptr == Modules.array[ordered-unregistered])); - } + M2Dependent_ConstructModules (applicationmodule, argc, argv, envp); } @@ -1078,6 +383,7 @@ extern "C" void M2RTS_ConstructModules (void * applicationmodule, int argc, void extern "C" void M2RTS_DeconstructModules (void * applicationmodule, int argc, void * argv, void * envp) { + M2Dependent_DeconstructModules (applicationmodule, argc, argv, envp); } @@ -1089,37 +395,18 @@ extern "C" void M2RTS_DeconstructModules (void * applicationmodule, int argc, vo extern "C" void M2RTS_RegisterModule (void * name, M2RTS_ArgCVEnvP init, M2RTS_ArgCVEnvP fini, PROC dependencies) { - if (! M2LINK_StaticInitialization) - { - traceprintf2 (ModuleTrace, (const char *) "module: %s registering\\n", 24, name); - moveTo (unordered, CreateModule (name, init, fini, dependencies)); - } + M2Dependent_RegisterModule (name, (M2Dependent_ArgCVEnvP) {(M2Dependent_ArgCVEnvP_t) init.proc}, (M2Dependent_ArgCVEnvP) {(M2Dependent_ArgCVEnvP_t) fini.proc}, dependencies); } /* RequestDependant - used to specify that modulename is dependant upon - module dependantmodule. It only takes effect - if we are not using StaticInitialization. + module dependantmodule. */ extern "C" void M2RTS_RequestDependant (void * modulename, void * dependantmodule) { - if (! M2LINK_StaticInitialization) - { - PerformRequestDependant (modulename, dependantmodule); - } -} - - -/* - ExecuteTerminationProcedures - calls each installed termination procedure - in reverse order. -*/ - -extern "C" void M2RTS_ExecuteTerminationProcedures (void) -{ - ExecuteReverse (TerminateProc.tail); + M2Dependent_RequestDependant (modulename, dependantmodule); } @@ -1165,7 +452,18 @@ extern "C" unsigned int M2RTS_InstallInitialProcedure (PROC p) /* - Terminate - provides compatibility for pim. It call exit with + ExecuteTerminationProcedures - calls each installed termination procedure + in reverse order. +*/ + +extern "C" void M2RTS_ExecuteTerminationProcedures (void) +{ + ExecuteReverse (TerminateProc.tail); +} + + +/* + Terminate - provides compatibility for pim. It calls exit with the exitcode provided in a prior call to ExitOnHalt (or zero if ExitOnHalt was never called). It does not call ExecuteTerminationProcedures. @@ -1255,10 +553,10 @@ extern "C" void M2RTS_ExitOnHalt (int e) extern "C" void M2RTS_ErrorMessage (const char *message_, unsigned int _message_high, const char *file_, unsigned int _file_high, unsigned int line, const char *function_, unsigned int _function_high) { - typedef struct _T5_a _T5; + typedef struct _T2_a _T2; - struct _T5_a { char array[10+1]; }; - _T5 LineNo; + struct _T2_a { char array[10+1]; }; + _T2 LineNo; char message[_message_high+1]; char file[_file_high+1]; char function[_function_high+1]; @@ -1438,11 +736,7 @@ extern "C" void M2RTS_NoException (void * filename, unsigned int line, unsigned extern "C" void _M2_M2RTS_init (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[]) { - InitProcList (&InitialProc); - InitProcList (&TerminateProc); - ExitValue = 0; - isHalting = FALSE; - CallExit = FALSE; /* default by calling abort */ + CheckInitialized (); } extern "C" void _M2_M2RTS_finish (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[]) diff --git a/gcc/m2/mc-boot/GM2RTS.h b/gcc/m2/mc-boot/GM2RTS.h index b8c950a..fd0ffa4 100644 --- a/gcc/m2/mc-boot/GM2RTS.h +++ b/gcc/m2/mc-boot/GM2RTS.h @@ -72,13 +72,6 @@ EXTERN void M2RTS_RegisterModule (void * name, M2RTS_ArgCVEnvP init, M2RTS_ArgCV EXTERN void M2RTS_RequestDependant (void * modulename, void * dependantmodule); /* - ExecuteTerminationProcedures - calls each installed termination - procedure in reverse order. -*/ - -EXTERN void M2RTS_ExecuteTerminationProcedures (void); - -/* InstallTerminationProcedure - installs a procedure, p, which will be called when the procedure ExecuteTerminationProcedures @@ -104,6 +97,13 @@ EXTERN void M2RTS_ExecuteInitialProcedures (void); EXTERN unsigned int M2RTS_InstallInitialProcedure (PROC p); /* + ExecuteTerminationProcedures - calls each installed termination procedure + in reverse order. +*/ + +EXTERN void M2RTS_ExecuteTerminationProcedures (void); + +/* Terminate - provides compatibility for pim. It call exit with the exitcode provided in a prior call to ExitOnHalt (or zero if ExitOnHalt was never called). It does diff --git a/gcc/m2/mc-boot/GSArgs.c b/gcc/m2/mc-boot/GSArgs.c index d5ed816..c2612d6 100644 --- a/gcc/m2/mc-boot/GSArgs.c +++ b/gcc/m2/mc-boot/GSArgs.c @@ -64,7 +64,7 @@ typedef PtrToChar *PtrToPtrToChar; new string, otherwise s is set to NIL. */ -extern "C" unsigned int SArgs_GetArg (DynamicStrings_String *s, unsigned int i); +extern "C" unsigned int SArgs_GetArg (DynamicStrings_String *s, unsigned int n); /* Narg - returns the number of arguments available from @@ -81,14 +81,16 @@ extern "C" unsigned int SArgs_Narg (void); new string, otherwise s is set to NIL. */ -extern "C" unsigned int SArgs_GetArg (DynamicStrings_String *s, unsigned int i) +extern "C" unsigned int SArgs_GetArg (DynamicStrings_String *s, unsigned int n) { + int i; PtrToPtrToChar ppc; - if (i < UnixArgs_ArgC) + i = (int ) (n); + if (i < (UnixArgs_GetArgC ())) { /* ppc := ADDRESS (VAL (PtrToPtrToChar, ArgV) + (i * CARDINAL (TSIZE(PtrToChar)))) ; */ - ppc = static_cast<PtrToPtrToChar> ((void *) (((PtrToChar) (UnixArgs_ArgV))+(i*sizeof (PtrToChar)))); + ppc = static_cast<PtrToPtrToChar> ((void *) (((PtrToChar) (UnixArgs_GetArgV ()))+(n*sizeof (PtrToChar)))); (*s) = DynamicStrings_InitStringCharStar (reinterpret_cast<void *> ((*ppc))); return TRUE; } @@ -109,7 +111,7 @@ extern "C" unsigned int SArgs_GetArg (DynamicStrings_String *s, unsigned int i) extern "C" unsigned int SArgs_Narg (void) { - return UnixArgs_ArgC; + return UnixArgs_GetArgC (); /* static analysis guarentees a RETURN statement will be used before here. */ __builtin_unreachable (); } diff --git a/gcc/m2/mc-boot/GSArgs.h b/gcc/m2/mc-boot/GSArgs.h index 8492719..d0fcc37 100644 --- a/gcc/m2/mc-boot/GSArgs.h +++ b/gcc/m2/mc-boot/GSArgs.h @@ -56,7 +56,7 @@ extern "C" { new string, otherwise s is set to NIL. */ -EXTERN unsigned int SArgs_GetArg (DynamicStrings_String *s, unsigned int i); +EXTERN unsigned int SArgs_GetArg (DynamicStrings_String *s, unsigned int n); /* Narg - returns the number of arguments available from diff --git a/gcc/m2/mc-boot/GUnixArgs.h b/gcc/m2/mc-boot/GUnixArgs.h index 6c67ea9..4960ba0 100644 --- a/gcc/m2/mc-boot/GUnixArgs.h +++ b/gcc/m2/mc-boot/GUnixArgs.h @@ -1,5 +1,5 @@ /* do not edit automatically generated by mc from UnixArgs. */ -/* UnixArgs.def Implements access to the C arguments argc and argv. +/* UnixArgs.def Implements access to the arguments argc, argv, envp. Copyright (C) 2001-2021 Free Software Foundation, Inc. Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>. @@ -48,8 +48,9 @@ extern "C" { # define EXTERN extern # endif -EXTERN unsigned int UnixArgs_ArgC; -EXTERN void * UnixArgs_ArgV; +EXTERN int UnixArgs_GetArgC (void); +EXTERN void * UnixArgs_GetArgV (void); +EXTERN void * UnixArgs_GetEnvV (void); # ifdef __cplusplus } # endif diff --git a/gcc/m2/mc-boot/Gdecl.c b/gcc/m2/mc-boot/Gdecl.c index 9ce86b0..0da940b 100644 --- a/gcc/m2/mc-boot/Gdecl.c +++ b/gcc/m2/mc-boot/Gdecl.c @@ -1026,10 +1026,10 @@ extern "C" void M2RTS_ConstructModules (void * applicationmodule, int argc, void extern "C" void M2RTS_DeconstructModules (void * applicationmodule, int argc, void * argv, void * envp); extern "C" void M2RTS_RegisterModule (void * name, M2RTS_ArgCVEnvP init, M2RTS_ArgCVEnvP fini, PROC dependencies); extern "C" void M2RTS_RequestDependant (void * modulename, void * dependantmodule); -extern "C" void M2RTS_ExecuteTerminationProcedures (void); extern "C" unsigned int M2RTS_InstallTerminationProcedure (PROC p); extern "C" void M2RTS_ExecuteInitialProcedures (void); extern "C" unsigned int M2RTS_InstallInitialProcedure (PROC p); +extern "C" void M2RTS_ExecuteTerminationProcedures (void); extern "C" void M2RTS_Terminate (void) __attribute__ ((noreturn)); extern "C" void M2RTS_HALT (int exitcode) __attribute__ ((noreturn)); extern "C" void M2RTS_Halt (const char *file_, unsigned int _file_high, unsigned int line, const char *function_, unsigned int _function_high, const char *description_, unsigned int _description_high) __attribute__ ((noreturn)); diff --git a/gcc/m2/mc/mc.flex b/gcc/m2/mc/mc.flex index 26dc60d..871dccc 100644 --- a/gcc/m2/mc/mc.flex +++ b/gcc/m2/mc/mc.flex @@ -747,3 +747,6 @@ int yywrap (void) void _M2_mcflex_init (void) {} void _M2_mcflex_finish (void) {} + +/* This is a gross hack to satisfy linking. */ +void _M2_mcflex_ctor (void) {} diff --git a/libgm2/libm2pim/Makefile.am b/libgm2/libm2pim/Makefile.am index 72cfe19..7a7acda 100644 --- a/libgm2/libm2pim/Makefile.am +++ b/libgm2/libm2pim/Makefile.am @@ -157,10 +157,10 @@ M2DEFS = Args.def ASCII.def \ cgetopt.def libm2pim_la_SOURCES = $(M2MODS) \ - UnixArgs.c \ - Selective.c sckt.c \ - errno.cc dtoa.c \ - ldtoa.c termios.cc \ + UnixArgs.cc \ + Selective.cc sckt.cc \ + errno.cc dtoa.cc \ + ldtoa.cc termios.cc \ SysExceptions.cc target.c \ wrapc.c cgetopt.c diff --git a/libgm2/libm2pim/Selective.c b/libgm2/libm2pim/Selective.cc index a08ab8e..e168e31 100644 --- a/libgm2/libm2pim/Selective.c +++ b/libgm2/libm2pim/Selective.cc @@ -25,6 +25,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> +#include <m2rts.h> #if defined(HAVE_STDDEF_H) /* Obtain a definition for NULL. */ @@ -81,14 +82,14 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see /* Select wrap a call to the C select. */ #if defined(HAVE_STRUCT_TIMEVAL) -int +extern "C" int Selective_Select (int nooffds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) { return select (nooffds, readfds, writefds, exceptfds, timeout); } #else -int +extern "C" int Selective_Select (int nooffds, void *readfds, void *writefds, void *exceptfds, void *timeout) { @@ -99,7 +100,7 @@ Selective_Select (int nooffds, void *readfds, void *writefds, void *exceptfds, /* InitTime initializes a timeval structure and returns a pointer to it. */ #if defined(HAVE_STRUCT_TIMEVAL) -struct timeval * +extern "C" struct timeval * Selective_InitTime (unsigned int sec, unsigned int usec) { struct timeval *t = (struct timeval *)malloc (sizeof (struct timeval)); @@ -109,14 +110,14 @@ Selective_InitTime (unsigned int sec, unsigned int usec) return t; } -void +extern "C" void Selective_GetTime (struct timeval *t, unsigned int *sec, unsigned int *usec) { *sec = (unsigned int)t->tv_sec; *usec = (unsigned int)t->tv_usec; } -void +extern "C" void Selective_SetTime (struct timeval *t, unsigned int sec, unsigned int usec) { t->tv_sec = sec; @@ -125,7 +126,7 @@ Selective_SetTime (struct timeval *t, unsigned int sec, unsigned int usec) /* KillTime frees the timeval structure and returns NULL. */ -struct timeval * +extern "C" struct timeval * Selective_KillTime (struct timeval *t) { #if defined(HAVE_STDLIB_H) @@ -136,7 +137,7 @@ Selective_KillTime (struct timeval *t) /* InitSet returns a pointer to a FD_SET. */ -FDSET_T * +extern "C" FDSET_T * Selective_InitSet (void) { #if defined(HAVE_STDLIB_H) @@ -150,7 +151,7 @@ Selective_InitSet (void) /* KillSet frees the FD_SET and returns NULL. */ -FDSET_T * +extern "C" FDSET_T * Selective_KillSet (FDSET_T *s) { #if defined(HAVE_STDLIB_H) @@ -161,7 +162,7 @@ Selective_KillSet (FDSET_T *s) /* FdZero generate an empty set. */ -void +extern "C" void Selective_FdZero (FDSET_T *s) { FD_ZERO (s); @@ -169,7 +170,7 @@ Selective_FdZero (FDSET_T *s) /* FS_Set include an element, fd, into set, s. */ -void +extern "C" void Selective_FdSet (int fd, FDSET_T *s) { FD_SET (fd, s); @@ -177,7 +178,7 @@ Selective_FdSet (int fd, FDSET_T *s) /* FdClr exclude an element, fd, from the set, s. */ -void +extern "C" void Selective_FdClr (int fd, FDSET_T *s) { FD_CLR (fd, s); @@ -185,7 +186,7 @@ Selective_FdClr (int fd, FDSET_T *s) /* FdIsSet return TRUE if, fd, is present in set, s. */ -int +extern "C" int Selective_FdIsSet (int fd, FDSET_T *s) { return FD_ISSET (fd, s); @@ -195,69 +196,69 @@ Selective_FdIsSet (int fd, FDSET_T *s) current system time in seconds and microseconds. It returns zero (see man 3p gettimeofday). */ -int +extern "C" int Selective_GetTimeOfDay (struct timeval *t) { return gettimeofday (t, NULL); } #else -void * +extern "C" void * Selective_InitTime (unsigned int sec, unsigned int usec) { return NULL; } -void * +extern "C" void * Selective_KillTime (void *t) { return NULL; } -void +extern "C" void Selective_GetTime (void *t, unsigned int *sec, unsigned int *usec) { } -void +extern "C" void Selective_SetTime (void *t, unsigned int sec, unsigned int usec) { } -FDSET_T * +extern "C" FDSET_T * Selective_InitSet (void) { return NULL; } -FDSET_T * +extern "C" FDSET_T * Selective_KillSet (void) { return NULL; } -void +extern "C" void Selective_FdZero (void *s) { } -void +extern "C" void Selective_FdSet (int fd, void *s) { } -void +extern "C" void Selective_FdClr (int fd, void *s) { } -int +extern "C" int Selective_FdIsSet (int fd, void *s) { return 0; } -int +extern "C" int Selective_GetTimeOfDay (void *t) { return -1; @@ -266,7 +267,7 @@ Selective_GetTimeOfDay (void *t) /* MaxFdsPlusOne returns max (a + 1, b + 1). */ -int +extern "C" int Selective_MaxFdsPlusOne (int a, int b) { if (a > b) @@ -277,7 +278,7 @@ Selective_MaxFdsPlusOne (int a, int b) /* WriteCharRaw writes a single character to the file descriptor. */ -void +extern "C" void Selective_WriteCharRaw (int fd, char ch) { write (fd, &ch, 1); @@ -285,7 +286,7 @@ Selective_WriteCharRaw (int fd, char ch) /* ReadCharRaw read and return a single char from file descriptor, fd. */ -char +extern "C" char Selective_ReadCharRaw (int fd) { char ch; @@ -294,12 +295,25 @@ Selective_ReadCharRaw (int fd) return ch; } -void -_M2_Selective_init () +extern "C" void +_M2_Selective_init (int argc, char *argv[], char *envp[]) { } -void -_M2_Selective_finish () +extern "C" void +_M2_Selective_finish (int argc, char *argv[], char *envp[]) { } + +extern "C" void +_M2_Selective_dep (void) +{ +} + +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, + _M2_Selective_dep); +} diff --git a/libgm2/libm2pim/UnixArgs.c b/libgm2/libm2pim/UnixArgs.cc index daede41..0d6c76e 100644 --- a/libgm2/libm2pim/UnixArgs.c +++ b/libgm2/libm2pim/UnixArgs.cc @@ -1,4 +1,4 @@ -/* UnixArgs.c record argc, argv as global variables. +/* UnixArgs.cc record argc, argv as global variables. Copyright (C) 2009-2022 Free Software Foundation, Inc. Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>. @@ -24,17 +24,68 @@ a copy of the GCC Runtime Library Exception along with this program; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see <http://www.gnu.org/licenses/>. */ -int UnixArgs_ArgC; -char **UnixArgs_ArgV; +#include <config.h> +#include <m2rts.h> -void -_M2_UnixArgs_init (int argc, char *argv[]) + +extern "C" int UnixArgs_GetArgC (void); +extern "C" char **UnixArgs_GetArgV (void); +extern "C" char **UnixArgs_GetEnvV (void); + +static int UnixArgs_ArgC; +static char **UnixArgs_ArgV; +static char **UnixArgs_EnvV; + + +/* GetArgC returns argc. */ + +extern "C" int +UnixArgs_GetArgC (void) +{ + return UnixArgs_ArgC; +} + + +/* GetArgV returns argv. */ + +extern "C" char ** +UnixArgs_GetArgV (void) +{ + return UnixArgs_ArgV; +} + + +/* GetEnvV returns envv. */ + +extern "C" char ** +UnixArgs_GetEnvV (void) +{ + return UnixArgs_EnvV; +} + + +extern "C" void +_M2_UnixArgs_init (int argc, char *argv[], char *envp[]) { UnixArgs_ArgC = argc; UnixArgs_ArgV = argv; + UnixArgs_EnvV = envp; } -void -_M2_UnixArgs_finish (int argc, char *argv[]) +extern "C" void +_M2_UnixArgs_finish (int argc, char *argv[], char *envp[]) +{ +} + +extern "C" void +_M2_UnixArgs_dep (void) +{ +} + +struct _M2_UnixArgs_ctor { _M2_UnixArgs_ctor (); } _M2_UnixArgs_ctor; + +_M2_UnixArgs_ctor::_M2_UnixArgs_ctor (void) { + M2RTS_RegisterModule ("UnixArgs", _M2_UnixArgs_init, _M2_UnixArgs_finish, + _M2_UnixArgs_dep); } diff --git a/libgm2/libm2pim/dtoa.c b/libgm2/libm2pim/dtoa.cc index 9038b5a..d0ca0b0 100644 --- a/libgm2/libm2pim/dtoa.c +++ b/libgm2/libm2pim/dtoa.cc @@ -1,4 +1,4 @@ -/* dtoa.c convert double to ascii and visa versa. +/* dtoa.cc convert double to ascii and visa versa. Copyright (C) 2009-2022 Free Software Foundation, Inc. Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>. @@ -27,6 +27,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define GM2 #include <config.h> +#include <m2rts.h> #if defined(HAVE_STRINGS) #include <strings.h> @@ -104,7 +105,7 @@ typedef enum Mode { maxsignicant, decimaldigits } Mode; decimaldigits: return a string produced by fcvt. The string will contain ndigits past the decimal point (ndigits may be negative). */ -double +extern "C" double dtoa_strtod (const char *s, int *error) { char *endp; @@ -128,7 +129,7 @@ dtoa_strtod (const char *s, int *error) /* dtoa_calcmaxsig calculates the position of the decimal point it also removes the decimal point and exponent from string, p. */ -int +extern "C" int dtoa_calcmaxsig (char *p, int ndigits) { char *e; @@ -159,7 +160,7 @@ dtoa_calcmaxsig (char *p, int ndigits) It truncates the digits in p accordingly to ndigits. Ie ndigits is the number of digits after the '.'. */ -int +extern "C" int dtoa_calcdecimal (char *p, int str_size, int ndigits) { char *e; @@ -193,7 +194,7 @@ dtoa_calcdecimal (char *p, int str_size, int ndigits) return x; } -int +extern "C" int dtoa_calcsign (char *p, int str_size) { if (p[0] == '-') @@ -205,7 +206,7 @@ dtoa_calcsign (char *p, int str_size) return FALSE; } -char * +extern "C" char * dtoa_dtoa (double d, int mode, int ndigits, int *decpt, int *sign) { char format[50]; @@ -216,14 +217,14 @@ dtoa_dtoa (double d, int mode, int ndigits, int *decpt, int *sign) case maxsignicant: ndigits += 20; /* Enough for exponent. */ - p = malloc (ndigits); + p = (char *) malloc (ndigits); snprintf (format, 50, "%s%d%s", "%.", ndigits - 20, "E"); snprintf (p, ndigits, format, d); *sign = dtoa_calcsign (p, ndigits); *decpt = dtoa_calcmaxsig (p, ndigits); return p; case decimaldigits: - p = malloc (MAX_FP_DIGITS + 20); + p = (char *) malloc (MAX_FP_DIGITS + 20); snprintf (format, 50, "%s%d%s", "%.", MAX_FP_DIGITS, "E"); snprintf (p, MAX_FP_DIGITS + 20, format, d); *sign = dtoa_calcsign (p, MAX_FP_DIGITS + 20); @@ -239,12 +240,26 @@ dtoa_dtoa (double d, int mode, int ndigits, int *decpt, int *sign) #if defined(GM2) /* GNU Modula-2 linking hooks. */ -void -_M2_dtoa_init (void) +extern "C" void +_M2_dtoa_init (int, char **, char **) { } -void -_M2_dtoa_finish (void) + +extern "C" void +_M2_dtoa_finish (int, char **, char **) +{ +} + +extern "C" void +_M2_dtoa_dep (void) +{ +} + +struct _M2_dtoa_ctor { _M2_dtoa_ctor (); } _M2_dtoa_ctor; + +_M2_dtoa_ctor::_M2_dtoa_ctor (void) { + M2RTS_RegisterModule ("dtoa", _M2_dtoa_init, _M2_dtoa_finish, + _M2_dtoa_dep); } #endif diff --git a/libgm2/libm2pim/ldtoa.c b/libgm2/libm2pim/ldtoa.cc index 5e2a42b..311126c 100644 --- a/libgm2/libm2pim/ldtoa.c +++ b/libgm2/libm2pim/ldtoa.cc @@ -27,6 +27,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define GM2 #include <config.h> +#include <m2rts.h> #if defined(HAVE_STRINGS) #include <strings.h> @@ -96,9 +97,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see typedef enum Mode { maxsignicant, decimaldigits } Mode; -extern int dtoa_calcmaxsig (char *p, int ndigits); -extern int dtoa_calcdecimal (char *p, int str_size, int ndigits); -extern int dtoa_calcsign (char *p, int str_size); +extern "C" int dtoa_calcmaxsig (char *p, int ndigits); +extern "C" int dtoa_calcdecimal (char *p, int str_size, int ndigits); +extern "C" int dtoa_calcsign (char *p, int str_size); /* maxsignicant return a string containing max(1,ndigits) significant digits. The return string contains the string produced by snprintf. @@ -106,7 +107,7 @@ extern int dtoa_calcsign (char *p, int str_size); decimaldigits: return a string produced by fcvt. The string will contain ndigits past the decimal point (ndigits may be negative). */ -long double +extern "C" long double ldtoa_strtold (const char *s, int *error) { char *endp; @@ -132,7 +133,7 @@ ldtoa_strtold (const char *s, int *error) return d; } -char * +extern "C" char * ldtoa_ldtoa (long double d, int mode, int ndigits, int *decpt, int *sign) { char format[50]; @@ -143,14 +144,14 @@ ldtoa_ldtoa (long double d, int mode, int ndigits, int *decpt, int *sign) case maxsignicant: ndigits += 20; /* Enough for exponent. */ - p = malloc (ndigits); + p = (char *) malloc (ndigits); snprintf (format, 50, "%s%d%s", "%.", ndigits - 20, "LE"); snprintf (p, ndigits, format, d); *sign = dtoa_calcsign (p, ndigits); *decpt = dtoa_calcmaxsig (p, ndigits); return p; case decimaldigits: - p = malloc (MAX_FP_DIGITS + 20); + p = (char *) malloc (MAX_FP_DIGITS + 20); snprintf (format, 50, "%s%d%s", "%.", MAX_FP_DIGITS, "LE"); snprintf (p, MAX_FP_DIGITS + 20, format, d); *sign = dtoa_calcsign (p, MAX_FP_DIGITS + 20); @@ -164,12 +165,26 @@ ldtoa_ldtoa (long double d, int mode, int ndigits, int *decpt, int *sign) #if defined(GM2) /* GNU Modula-2 linking hooks. */ -void -_M2_ldtoa_init (void) +extern "C" void +_M2_ldtoa_init (int, char **, char **) { } -void -_M2_ldtoa_finish (void) + +extern "C" void +_M2_ldtoa_finish (int, char **, char **) +{ +} + +extern "C" void +_M2_ldtoa_dep (void) +{ +} + +struct _M2_ldtoa_ctor { _M2_ldtoa_ctor (); } _M2_ldtoa_ctor; + +_M2_ldtoa_ctor::_M2_ldtoa_ctor (void) { + M2RTS_RegisterModule ("ldtoa", _M2_ldtoa_init, _M2_ldtoa_finish, + _M2_ldtoa_dep); } #endif diff --git a/libgm2/libm2pim/sckt.c b/libgm2/libm2pim/sckt.cc index f4a42ff..6c68525 100644 --- a/libgm2/libm2pim/sckt.c +++ b/libgm2/libm2pim/sckt.cc @@ -25,6 +25,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> +#include <m2rts.h> #if defined(HAVE_SYS_TYPES_H) #include <sys/types.h> @@ -123,7 +124,7 @@ localExit (int i) information about a socket declared to receive tcp connections. This method attempts to use the port specified by the parameter. */ -tcpServerState * +extern "C" tcpServerState * tcpServerEstablishPort (int portNo) { tcpServerState *s = (tcpServerState *)malloc (sizeof (tcpServerState)); @@ -178,7 +179,7 @@ tcpServerEstablishPort (int portNo) /* tcpServerEstablish returns a tcpServerState containing the relevant information about a socket declared to receive tcp connections. */ -tcpServerState * +extern "C" tcpServerState * tcpServerEstablish (void) { return tcpServerEstablishPort (PORTSTART); @@ -187,10 +188,10 @@ tcpServerEstablish (void) /* tcpServerAccept returns a file descriptor once a client has connected and been accepted. */ -int +extern "C" int tcpServerAccept (tcpServerState *s) { - int i = sizeof (s->isa); + socklen_t i = sizeof (s->isa); int t; #if defined(DEBUGGING) @@ -202,7 +203,7 @@ tcpServerAccept (tcpServerState *s) /* tcpServerPortNo returns the portNo from structure, s. */ -int +extern "C" int tcpServerPortNo (tcpServerState *s) { return s->portNo; @@ -210,7 +211,7 @@ tcpServerPortNo (tcpServerState *s) /* tcpServerSocketFd returns the sockFd from structure, s. */ -int +extern "C" int tcpServerSocketFd (tcpServerState *s) { return s->sockFd; @@ -218,7 +219,7 @@ tcpServerSocketFd (tcpServerState *s) /* getLocalIP returns the IP address of this machine. */ -unsigned int +extern "C" unsigned int getLocalIP (tcpServerState *s) { char hostname[1024]; @@ -260,7 +261,7 @@ getLocalIP (tcpServerState *s) /* tcpServerIP returns the IP address from structure s. */ -int +extern "C" int tcpServerIP (tcpServerState *s) { return *((int *)s->hp->h_addr_list[0]); @@ -269,7 +270,7 @@ tcpServerIP (tcpServerState *s) /* tcpServerClientIP returns the IP address of the client who has connected to server s. */ -unsigned int +extern "C" unsigned int tcpServerClientIP (tcpServerState *s) { unsigned int ip; @@ -283,7 +284,7 @@ tcpServerClientIP (tcpServerState *s) /* tcpServerClientPortNo returns the port number of the client who has connected to server s. */ -unsigned int +extern "C" unsigned int tcpServerClientPortNo (tcpServerState *s) { return s->isa.sin_port; @@ -307,7 +308,7 @@ typedef struct /* tcpClientSocket returns a file descriptor (socket) which has connected to, serverName:portNo. */ -tcpClientState * +extern "C" tcpClientState * tcpClientSocket (char *serverName, int portNo) { tcpClientState *s = (tcpClientState *)malloc (sizeof (tcpClientState)); @@ -340,7 +341,7 @@ tcpClientSocket (char *serverName, int portNo) /* tcpClientSocketIP returns a file descriptor (socket) which has connected to, ip:portNo. */ -tcpClientState * +extern "C" tcpClientState * tcpClientSocketIP (unsigned int ip, int portNo) { tcpClientState *s = (tcpClientState *)malloc (sizeof (tcpClientState)); @@ -366,7 +367,7 @@ tcpClientSocketIP (unsigned int ip, int portNo) /* tcpClientConnect returns the file descriptor associated with s, once a connect has been performed. */ -int +extern "C" int tcpClientConnect (tcpClientState *s) { if (connect (s->sockFd, (struct sockaddr *)&s->sa, sizeof (s->sa)) < 0) @@ -377,7 +378,7 @@ tcpClientConnect (tcpClientState *s) /* tcpClientPortNo returns the portNo from structure s. */ -int +extern "C" int tcpClientPortNo (tcpClientState *s) { return s->portNo; @@ -385,7 +386,7 @@ tcpClientPortNo (tcpClientState *s) /* tcpClientSocketFd returns the sockFd from structure s. */ -int +extern "C" int tcpClientSocketFd (tcpClientState *s) { return s->sockFd; @@ -393,7 +394,7 @@ tcpClientSocketFd (tcpClientState *s) /* tcpClientIP returns the sockFd from structure s. */ -int +extern "C" int tcpClientIP (tcpClientState *s) { #if defined(DEBUGGING) @@ -405,12 +406,25 @@ tcpClientIP (tcpClientState *s) /* GNU Modula-2 link fodder. */ -void -_M2_sckt_init (void) +extern "C" void +_M2_sckt_init (int, char *[], char *[]) { } -void -_M2_sckt_finish (void) +extern "C" void +_M2_sckt_finish (int, char *[], char *[]) +{ +} + +extern "C" void +_M2_sckt_dep (void) +{ +} + +struct _M2_sckt_ctor { _M2_sckt_ctor (); } _M2_sckt_ctor; + +_M2_sckt_ctor::_M2_sckt_ctor (void) { + M2RTS_RegisterModule ("sckt", _M2_sckt_init, _M2_sckt_finish, + _M2_sckt_dep); } |