Static scaffold fixes, gm2l tidyup.
This patch fixes many static scaffold bugs and contains a re-implementation of UnixArgs.cc and termios.cc. gm2l contains new options --exlude=, --include= and -flibs=. 2022-07-04 Gaius Mulley <gaius.mulley@southwales.ac.uk> gcc/ChangeLog: * doc/gm2.texi (-fscaffold-c): Removed. (-fscaffold-c++) Removed. (-fmodules) Removed. (-fonlylink) Removed. gcc/m2/ChangLog: * Make-lang.in (UnixArgs.o): Use UnixArgs.cc. (gm2-pge-boot/Gtermsios.o) Use mc-boot-ch/Gtermios.cc. * bnf/gm2l.bnf: Partial re-write and introduced --include=, --exclude= and -flibs=. (AddUserInclude) New procedure. (ScanSources) Remove IncludeM2RTS filter. (MakeModule) Return a boolean if a new module is seen. (source) New field userInclude. (source) New field userExclude. (DisplaySources) test for userExclude and userInclude and produce appropriate diagnostic. (DisplayUsage) Remove --M2RTS. Add -flibs=, --include-list= and --exclude-list=. (PopulateList) New procedure. (addInclude) New procedure. (SetLibs) New procedure. (SetExclude) New procedure. (ScanArgs) Remove IncludeM2RTS. Remove --M2RTS. Add --include=, --exclude= and -flibs=. Detect if multiple source files are given and detect any unrecognized option. * bnf/gm2m.bnf (main): Renamed as mainModule. * gm2-compiler/M2Options.mod (SetScaffoldDynamic): Ensure that ScaffoldStatic is not also set. (SetScaffoldStatic) Ensure that ScaffoldDynamic is not also set. * gm2-compiler/M2Quads.mod (BuildM2FiniFunction): Add ForeachModuleCallFinish for the static clause. (BuildM2InitFunction) Add ForeachModuleCallInit for the static clause. * gm2-compiler/M2Scaffold.def (ForeachModuleCallInit): New procedure. (ForeachModuleCallFinish) New Procedure. * gm2-compiler/M2Scaffold.mod (ForeachModuleCallInit): New procedure implemented. (ForeachModuleCallFinish) New Procedure implemented. (LookupModuleSym) New procedure. (ReadModules) Addition parameter tok and populate uselistModules. (DeclareModuleExtern) Renamed from DeclareCtorModuleExtern. * gm2-compiler/M2Swig.mod (main): Renamed as mainModule. * gm2-compiler/SymbolTable.def (PutModuleCtorExtern): Exported and declared. (MakeModuleCtor) Pass extra boolean public true. (InitCtorFields) pub new parameter. (PutProcedureExternPublic) New procedure. (PutCtorExtern) New procedure. (PutModuleCtorExtern) New procedure. * gm2-gcc/init.cc: Rewritten to pass envp to call init and fini functions. * gm2-gcc/m2expr.def: FOR "C" removed. * gm2-libs-ch/RTcodummy.c: Undo removal of _init and _finish functions. * gm2-libs-ch/pthdummy.c (Removed). * m2/gm2spec.cc (seen_scaffold_static): New boolean. (seen_scaffold_dynamic) New boolean. (scaffold_static) New boolean. (scaffold_dynamic) New boolean. (get_libexec) Removed. (add_exec_dir) Rewritten comment. (lang_specific_driver) Check that dynamic scaffold and static scaffold are not both enabled. * mc-boot-ch/Gpth.c (Removed). * mc-boot-ch/Gtermios.c (Removed). * mc-boot-ch/Gtermios.cc (Added). Converted from Gtermios.c. gm2tools/ChangeLog: * gm2l.1 (--M2RTS) Removed. (-M2RTS) Removed. (--include=) Added. (--exclude=) Added. (-flibs=) Added. libgm2/ChangeLog: * libm2iso/ErrnoCategory.cc (_finish): Changed to _fini. * libm2iso/RTco.cc (_finish): Changed to _fini. * libm2pim/SysExceptions.cc (_finish): Changed to _fini. * libm2pim/errno.cc (_finish): Changed to _fini. * libm2pim/termios.cc (_finish): Changed to _fini. Signed-off-by: Gaius Mulley <gaius.mulley@southwales.ac.uk>
This commit is contained in:
parent
b3ba35e9f8
commit
33abd43d4c
@ -538,8 +538,8 @@ You can compile and link it by: @samp{gm2 -g hello.mod}.
|
||||
The result will be an @samp{a.out} file created in your directory.
|
||||
|
||||
You can split this command into two steps if you prefer. The compile
|
||||
step can be achieved by: @samp{gm2 -g -c hello.mod} and the link via:
|
||||
@samp{gm2 -g -fonlylink hello.mod}.
|
||||
step can be achieved by: @samp{gm2 -g -c -fscaffold-main hello.mod}
|
||||
and the link via: @samp{gm2 -g hello.o}.
|
||||
|
||||
@footnote{To see all the compile actions taken by @samp{gm2} users can also
|
||||
add the @samp{-v} flag at the command line, for example:
|
||||
@ -606,11 +606,11 @@ generate a shared library from the module.
|
||||
@item -fruntime-modules=
|
||||
specify, using a comma separated list, the runtime modules and their
|
||||
order. These modules will initialized first before any other modules
|
||||
in the application dependancy. By default the runtime modules list is
|
||||
in the application dependency. By default the runtime modules list is
|
||||
set to @code{Storage,SYSTEM,M2RTS,RTExceptions,IOLink}. Note that
|
||||
these modules will only be linked into your executable if they are
|
||||
required. So adding a long list of dependant modules will not effect
|
||||
the size of the executable it merely states the initialisation order
|
||||
the size of the executable it merely states the initialization order
|
||||
should they be required.
|
||||
|
||||
@item -fnil
|
||||
@ -737,16 +737,6 @@ infastructure when compiling implementation and program modules.
|
||||
By default this option is on. Use @samp{-fno-scaffold-dynamic}
|
||||
to turn it off or select @samp{-fno-scaffold-dynamic}.
|
||||
|
||||
@item -fscaffold-c
|
||||
this option generates a C source scaffold file for the program module.
|
||||
This file can be compiled and linked with the module objects to
|
||||
produce the application.
|
||||
|
||||
@item -fscaffold-c++
|
||||
this option generates a C++ source scaffold file for the program module.
|
||||
This file can be compiled and linked with the module objects to
|
||||
produce the application.
|
||||
|
||||
@item -fcpp
|
||||
preprocess the source with @samp{cpp -lang-asm -traditional-cpp}
|
||||
For further details about these options @xref{Invocation, , ,cpp}.
|
||||
@ -814,11 +804,6 @@ displays the path to the source of each module. This option
|
||||
can be used at compile time to check the correct definition module
|
||||
is being used.
|
||||
|
||||
@item -fmodules
|
||||
displays the path to each modules object file. This option
|
||||
can only be invoked with the @code{-c} option.
|
||||
It is used to see the location of objects when linking occurs.
|
||||
|
||||
@item -fdef=
|
||||
recognise the specified suffix as a definition module filename.
|
||||
The default implmentation and module filename suffix is @file{.def}.
|
||||
@ -835,10 +820,6 @@ suffixed filename does not exist.
|
||||
@item -fxcode
|
||||
issues all errors and warnings in the @file{Xcode} format.
|
||||
|
||||
@item -fonlylink
|
||||
only link the modula-2 application, do not compile the program module
|
||||
beforehand.
|
||||
|
||||
@item -funbounded-by-reference
|
||||
enable optimization of unbounded parameters by attempting to pass non
|
||||
@code{VAR} unbounded parameters by reference. This optimization
|
||||
|
@ -2092,7 +2092,7 @@ m2/gm2-pge-boot/$(SRC_PREFIX)UnixArgs.o: $(srcdir)/m2/mc-boot-ch/GUnixArgs.cc
|
||||
m2/gm2-pge-boot/$(SRC_PREFIX)Selective.o: $(srcdir)/m2/mc-boot-ch/GSelective.c m2/gm2-libs/gm2-libs-host.h
|
||||
$(CXX) -I. -I$(srcdir)/../include -I$(srcdir) -I$(srcdir)/m2/mc-boot-ch $(INCLUDES) -Im2/gm2-libs -g -c $< -o $@
|
||||
|
||||
m2/gm2-pge-boot/$(SRC_PREFIX)termios.o: $(srcdir)/m2/mc-boot-ch/Gtermios.c m2/gm2-libs/gm2-libs-host.h
|
||||
m2/gm2-pge-boot/$(SRC_PREFIX)termios.o: $(srcdir)/m2/mc-boot-ch/Gtermios.cc m2/gm2-libs/gm2-libs-host.h
|
||||
$(CXX) -I. -I$(srcdir)/../include -I$(srcdir) -I$(srcdir)/m2/mc-boot-ch -Im2/gm2-libs $(INCLUDES) -g -c $< -o $@
|
||||
|
||||
m2/gm2-pge-boot/$(SRC_PREFIX)SysExceptions.o: $(srcdir)/m2/mc-boot-ch/GSysExceptions.c m2/gm2-libs/gm2-libs-host.h
|
||||
|
@ -24,7 +24,6 @@
|
||||
are the top two lines in the file.
|
||||
|
||||
Copyright (C) 2001-2022 Free Software Foundation, Inc.
|
||||
Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
|
||||
|
||||
This file is part of GNU Modula-2.
|
||||
|
||||
@ -44,22 +43,6 @@ see <https://www.gnu.org/licenses/>. *)
|
||||
|
||||
MODULE gm2l ;
|
||||
|
||||
(*
|
||||
Author : Gaius Mulley
|
||||
Title : gm2l
|
||||
Date : Date: Sat 16-09-1989 Time: 17:49:34.18
|
||||
: [$Date: 2013/07/20 12:33:01 $]
|
||||
SYSTEM : UNIX (GNU Modula-2)
|
||||
Description: generates the list of initialization order for the modules.
|
||||
The initialization module list is used for two purposes.
|
||||
(i) for linking all the objects or archives
|
||||
(ii) for creating the initialization call sequence for each module.
|
||||
If a definition module contains EXPORT UNQUALIFIED and there is no
|
||||
implementation module found then we assume this definition module
|
||||
will match a foreign language, therefore we do not create an
|
||||
initialization call but we do link this object/archive.
|
||||
This allows us to write definition modules for C libraries.
|
||||
*)
|
||||
|
||||
IMPORT Break ;
|
||||
IMPORT M2Search ;
|
||||
@ -87,10 +70,12 @@ IMPORT m2flex ;
|
||||
FROM SYSTEM IMPORT ADDRESS ;
|
||||
FROM M2DriverOptions IMPORT ScanCppArgs ;
|
||||
FROM DynamicStrings IMPORT String, InitString, KillString, Slice, InitStringCharStar,
|
||||
Mark, EqualArray, string, ConCat, ConCatChar, Dup ;
|
||||
Mark, EqualArray, string, ConCat, ConCatChar, Dup, Length,
|
||||
char ;
|
||||
FROM Lists IMPORT List, InitList, KillList, IncludeItemIntoList, GetItemFromList,
|
||||
RemoveItemFromList, NoOfItemsInList, IsItemInList ;
|
||||
FROM M2Options IMPORT SetVerbose, Verbose ;
|
||||
(* FROM GccInstall IMPORT GetInstalledIncludeDir, GetDirSeparator ; *)
|
||||
|
||||
|
||||
CONST
|
||||
@ -103,6 +88,8 @@ TYPE
|
||||
name : Name ;
|
||||
fullpath : String ;
|
||||
Depth : CARDINAL ;
|
||||
userExclude,
|
||||
userInclude,
|
||||
OnlyDef ,
|
||||
ForC : BOOLEAN ;
|
||||
next : Source ;
|
||||
@ -121,10 +108,11 @@ VAR
|
||||
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 *)
|
||||
CommentChar : CHAR ;
|
||||
pBlock : BlockInfoPtr ;
|
||||
includeModules,
|
||||
excludeModules : List ;
|
||||
|
||||
|
||||
(*
|
||||
@ -187,7 +175,9 @@ BEGIN
|
||||
n := NoOfItemsInList (ImportedModules) ;
|
||||
WHILE i<=n DO
|
||||
modname := GetItemFromList (ImportedModules, i) ;
|
||||
MakeModule (modname) ;
|
||||
IF MakeModule (modname)
|
||||
THEN
|
||||
END ;
|
||||
MakeDependant (pSource^.name, modname) ;
|
||||
INC (i)
|
||||
END ;
|
||||
@ -229,6 +219,31 @@ BEGIN
|
||||
END RegisterImport ;
|
||||
|
||||
|
||||
(*
|
||||
AddUserInclude - if any module in includeModules does not exist in the graph
|
||||
add it as a dependant to the mainName.
|
||||
*)
|
||||
|
||||
PROCEDURE AddUserInclude (mainName: Name) ;
|
||||
VAR
|
||||
i, n: CARDINAL ;
|
||||
name: Name ;
|
||||
BEGIN
|
||||
i := 1 ;
|
||||
n := NoOfItemsInList (includeModules) ;
|
||||
WHILE i <= n DO
|
||||
name := GetItemFromList (includeModules, i) ;
|
||||
IF MakeModule (name)
|
||||
THEN
|
||||
Tail^.userInclude := TRUE ;
|
||||
(* Not seen this module therefore add it as a dependant to the mainName. *)
|
||||
MakeDependant (mainName, name)
|
||||
END ;
|
||||
INC (i)
|
||||
END
|
||||
END AddUserInclude ;
|
||||
|
||||
|
||||
(*
|
||||
ScanSources - scans all the source files for IMPORTs and places all
|
||||
imports into the Sources array.
|
||||
@ -250,14 +265,8 @@ BEGIN
|
||||
ExamineCompilationUnit (MainName, isdefimp) ;
|
||||
CloseSource ;
|
||||
ReInitialize ;
|
||||
MakeModule (MainName) ; (* Head now contains a reference to MainName. *)
|
||||
IF IncludeM2RTS
|
||||
IF MakeModule (MainName) (* Head now contains a reference to MainName. *)
|
||||
THEN
|
||||
(*
|
||||
we should include M2RTS as a dependant module otherwise it simply wont link
|
||||
*)
|
||||
MakeModule (MakeKey ('M2RTS')) ; (* Tail now contains a reference to M2RTS. *)
|
||||
MakeDependant (MainName, MakeKey ('M2RTS'))
|
||||
END ;
|
||||
pSource := Head ;
|
||||
WHILE pSource # NIL DO
|
||||
@ -597,10 +606,11 @@ END Real ;
|
||||
|
||||
% module gm2l end
|
||||
(*
|
||||
MakeModule - makes a module for ModuleName.
|
||||
MakeModule - makes a module for ModuleName. It returns TRUE if a new
|
||||
module entry is created.
|
||||
*)
|
||||
|
||||
PROCEDURE MakeModule (ModuleName: Name) ;
|
||||
PROCEDURE MakeModule (ModuleName: Name) : BOOLEAN ;
|
||||
VAR
|
||||
s: Source ;
|
||||
BEGIN
|
||||
@ -609,7 +619,7 @@ BEGIN
|
||||
WITH s^ DO
|
||||
IF name = ModuleName
|
||||
THEN
|
||||
RETURN
|
||||
RETURN FALSE
|
||||
ELSE
|
||||
s := s^.next
|
||||
END
|
||||
@ -630,8 +640,11 @@ BEGIN
|
||||
Depth := 0 ;
|
||||
ForC := FALSE ;
|
||||
OnlyDef := FALSE ;
|
||||
userExclude := FALSE ;
|
||||
userInclude := FALSE ;
|
||||
next := NIL
|
||||
END
|
||||
END ;
|
||||
RETURN TRUE
|
||||
END MakeModule ;
|
||||
|
||||
|
||||
@ -761,7 +774,14 @@ BEGIN
|
||||
WHILE p # NIL DO
|
||||
WITH p^ DO
|
||||
fprintf3 (fo, '%c %a %4d ', CommentChar, name, Depth) ;
|
||||
IF p^.fullpath = NIL
|
||||
IF IsItemInList (excludeModules, name)
|
||||
THEN
|
||||
fprintf0 (fo, 'excluded via command line\n') ;
|
||||
userExclude := TRUE
|
||||
ELSIF p^.userInclude
|
||||
THEN
|
||||
fprintf0 (fo, 'included via command line\n')
|
||||
ELSIF p^.fullpath = NIL
|
||||
THEN
|
||||
fprintf1 (fo, 'no source file found for module %a\n', p^.name) ;
|
||||
fprintf1 (StdErr, 'no source file found for module %a\n', p^.name) ;
|
||||
@ -778,17 +798,15 @@ BEGIN
|
||||
END ;
|
||||
p := p^.next
|
||||
END ;
|
||||
fprintf3 (fo, '%c\n%c Initialization order\n%c\n', CommentChar, CommentChar, CommentChar) ;
|
||||
fprintf3 (fo, '%c\n%c Initialization order\n%c\n',
|
||||
CommentChar, CommentChar, CommentChar) ;
|
||||
p := Head ;
|
||||
WHILE p # NIL DO
|
||||
WITH p^ DO
|
||||
(*
|
||||
do not automatically link ForC modules,
|
||||
the user must specify them either as -lmodule or module.o
|
||||
*)
|
||||
IF (NOT ForC) OR (name = MakeKey ('SYSTEM'))
|
||||
(* Do not automatically include ForC modules. *)
|
||||
IF (NOT ForC) AND (NOT userExclude)
|
||||
THEN
|
||||
fprintf1(fo, '%a\n', name)
|
||||
fprintf1 (fo, '%a\n', name)
|
||||
END
|
||||
END ;
|
||||
p := p^.next
|
||||
@ -818,13 +836,126 @@ END OpenOutputFile ;
|
||||
|
||||
PROCEDURE DisplayUsage ;
|
||||
BEGIN
|
||||
printf0 ('Usage: gm2l [-fdef=extension][-fmod=extension][-h][--help]\n');
|
||||
printf0 (' [-Isearchpath][--M2RTS][-M2RTS][-v][--verbose]\n');
|
||||
printf0 ('Usage: gm2l [-fdef=extension][-flibs=list][-fmod=extension][-h][--help]\n');
|
||||
printf0 (' [-Isearchpath][--exclude=list][--include=list][-v][--verbose]\n');
|
||||
printf0 (' [-o outputfile] modulefile\n');
|
||||
exit (0)
|
||||
END DisplayUsage ;
|
||||
|
||||
|
||||
(*
|
||||
PopulateList - creates a list of namekey entries from a comma separated string s.
|
||||
*)
|
||||
|
||||
PROCEDURE PopulateList (VAR list: List; s: String) ;
|
||||
VAR
|
||||
word : String ;
|
||||
start,
|
||||
i, n : INTEGER ;
|
||||
BEGIN
|
||||
n := Length (s) ;
|
||||
i := 0 ;
|
||||
start := 0 ;
|
||||
WHILE i < n DO
|
||||
IF char (s, i) = ','
|
||||
THEN
|
||||
IF i > start
|
||||
THEN
|
||||
word := Slice (s, start, i) ;
|
||||
IncludeItemIntoList (list, makekey (string (word))) ;
|
||||
word := KillString (word) ;
|
||||
start := i + 1
|
||||
END
|
||||
END ;
|
||||
INC (i)
|
||||
END ;
|
||||
IF i > start
|
||||
THEN
|
||||
word := Slice (s, start, 0) ;
|
||||
IncludeItemIntoList (list, makekey (string (word))) ;
|
||||
word := KillString (word)
|
||||
END
|
||||
END PopulateList ;
|
||||
|
||||
|
||||
(*
|
||||
addInclude - adds include path for
|
||||
*)
|
||||
|
||||
PROCEDURE addInclude (name: Name) ;
|
||||
VAR
|
||||
s: String ;
|
||||
BEGIN
|
||||
(*
|
||||
s := ConCat (InitStringCharStar (GetInstalledIncludeDir ()),
|
||||
InitStringCharStar (GetDirSeparator ())) ;
|
||||
s := ConCat (s, Mark (InitStringCharStar (KeyToCharStar (name)))) ;
|
||||
PrependSearchPath (s)
|
||||
*)
|
||||
END addInclude ;
|
||||
|
||||
|
||||
(*
|
||||
SetLibs - configures the include paths from the libraries shortcuts.
|
||||
*)
|
||||
|
||||
PROCEDURE SetLibs (s: String) ;
|
||||
VAR
|
||||
libs: List ;
|
||||
n, i: CARDINAL ;
|
||||
name: Name ;
|
||||
BEGIN
|
||||
InitList (libs) ;
|
||||
PopulateList (libs, s) ;
|
||||
n := NoOfItemsInList (libs) ;
|
||||
i := 1 ;
|
||||
WHILE i <= n DO
|
||||
name := GetItemFromList (libs, i) ;
|
||||
IF name = MakeKey ('pim')
|
||||
THEN
|
||||
addInclude (MakeKey ('m2pim'))
|
||||
ELSIF name = MakeKey ('min')
|
||||
THEN
|
||||
addInclude (MakeKey ('m2min'))
|
||||
ELSIF name = MakeKey ('iso')
|
||||
THEN
|
||||
addInclude (MakeKey ('m2iso'))
|
||||
ELSIF name = MakeKey ('log')
|
||||
THEN
|
||||
addInclude (MakeKey ('m2log'))
|
||||
ELSIF name = MakeKey ('cor')
|
||||
THEN
|
||||
addInclude (MakeKey ('m2cor'))
|
||||
ELSE
|
||||
(* Third party library. *)
|
||||
addInclude (name)
|
||||
END ;
|
||||
INC (i)
|
||||
END ;
|
||||
KillList (libs)
|
||||
END SetLibs ;
|
||||
|
||||
|
||||
(*
|
||||
SetExclude - populates the excludeModules with the list specified in s.
|
||||
*)
|
||||
|
||||
PROCEDURE SetExclude (s: String) ;
|
||||
BEGIN
|
||||
PopulateList (excludeModules, s)
|
||||
END SetExclude ;
|
||||
|
||||
|
||||
(*
|
||||
SetInclude - populates the includeModules with the list specified in s.
|
||||
*)
|
||||
|
||||
PROCEDURE SetInclude (s: String) ;
|
||||
BEGIN
|
||||
PopulateList (includeModules, s)
|
||||
END SetInclude ;
|
||||
|
||||
|
||||
(*
|
||||
ScanArgs - scans the argument list and returns TRUE if the main source
|
||||
module is found.
|
||||
@ -835,7 +966,6 @@ VAR
|
||||
i, n: CARDINAL ;
|
||||
s : String ;
|
||||
BEGIN
|
||||
IncludeM2RTS := TRUE ;
|
||||
MainName := NulName ;
|
||||
n := SArgs.Narg () ;
|
||||
IF n=1
|
||||
@ -867,13 +997,18 @@ BEGIN
|
||||
ELSIF EqualArray(Mark (Slice (s, 0, 6)), '-fmod=')
|
||||
THEN
|
||||
SetModExtension (Slice (s, 6, 0))
|
||||
ELSIF EqualArray(Mark (Slice (s, 0, 6)), '-flibs=')
|
||||
THEN
|
||||
SetLibs (Slice (s, 7, 0))
|
||||
ELSIF EqualArray (s, '-fcpp-begin')
|
||||
THEN
|
||||
i := ScanCppArgs (i)
|
||||
ELSIF EqualArray (s, '--M2RTS') OR EqualArray (s, '-M2RTS')
|
||||
ELSIF EqualArray(Mark (Slice (s, 0, 10)), '--exclude=')
|
||||
THEN
|
||||
(* no M2RTS to be automatically linked imported from the main module *)
|
||||
IncludeM2RTS := FALSE
|
||||
SetExclude (Slice (s, 10, 0))
|
||||
ELSIF EqualArray(Mark (Slice (s, 0, 10)), '--include=')
|
||||
THEN
|
||||
SetInclude (Slice (s, 10, 0))
|
||||
ELSIF EqualArray (s, '-h') OR EqualArray (s, '--help')
|
||||
THEN
|
||||
DisplayUsage
|
||||
@ -884,8 +1019,20 @@ BEGIN
|
||||
THEN
|
||||
OpenOutputFile (s)
|
||||
END
|
||||
ELSIF MainSrc = NulName
|
||||
THEN
|
||||
IF (Length (s) > 0) AND (char (s, 0) = '-')
|
||||
THEN
|
||||
fprintf1 (StdErr, 'unknown option: %s\n', s) ;
|
||||
exit (1)
|
||||
ELSE
|
||||
MainSrc := makekey (string (s))
|
||||
END
|
||||
ELSE
|
||||
MainSrc := makekey (string (s))
|
||||
fprintf2 (StdErr,
|
||||
'only one application module can be specified, application module was set to %a it is now being set to %s\n',
|
||||
MainSrc, s) ;
|
||||
exit (1)
|
||||
END
|
||||
END ;
|
||||
INC (i)
|
||||
@ -897,9 +1044,12 @@ END ScanArgs ;
|
||||
|
||||
BEGIN
|
||||
fo := StdOut ;
|
||||
InitList (includeModules) ;
|
||||
InitList (excludeModules) ;
|
||||
IF ScanArgs ()
|
||||
THEN
|
||||
ScanSources (MainSrc) ;
|
||||
AddUserInclude (MainSrc) ;
|
||||
CalculateDepth ;
|
||||
SortSources ;
|
||||
DisplaySources
|
||||
|
@ -118,7 +118,7 @@ TYPE
|
||||
|
||||
VAR
|
||||
Verbose : BOOLEAN ;
|
||||
main : PtrToNode ;
|
||||
mainModule : PtrToNode ;
|
||||
DefExistsTree : SymbolTree ; (* Table of definition modules found or not *)
|
||||
ModExistsTree : SymbolTree ; (* Table of imp/program modules found or not *)
|
||||
Files : PtrToSource ;
|
||||
@ -390,7 +390,8 @@ BEGIN
|
||||
using a tree strategy. We must ensure that the objects are
|
||||
also included.
|
||||
*)
|
||||
MakeObject(son^.Source^.ModName, main, 1) ; (* attach the object to the executable. *)
|
||||
MakeObject(son^.Source^.ModName, mainModule, 1) ;
|
||||
(* attach the object to the executable. *)
|
||||
|
||||
name := KillString(name) ;
|
||||
IF Debugging
|
||||
@ -1882,20 +1883,20 @@ BEGIN
|
||||
CloseSource ;
|
||||
ReInitialize ;
|
||||
|
||||
main := NewNode() ;
|
||||
main^.Father := NIL ;
|
||||
main^.Source := NewSource() ;
|
||||
Files := main^.Source ;
|
||||
WITH main^.Source^ DO
|
||||
SourceNode := main ;
|
||||
mainModule := NewNode() ;
|
||||
mainModule^.Father := NIL ;
|
||||
mainModule^.Source := NewSource() ;
|
||||
Files := mainModule^.Source ;
|
||||
WITH mainModule^.Source^ DO
|
||||
SourceNode := mainModule ;
|
||||
ModName := MainName ;
|
||||
|
||||
main^.Source^.Ext := ExeExtn ;
|
||||
Ext := ExeExtn ;
|
||||
(* .exe is never written out, it is just a unique extension
|
||||
representing not matching .o .mod or .def *)
|
||||
e := CalculateFileName(s, Mark(InitString('exe'))) ;
|
||||
MakeExe(ModName, main, 0) ;
|
||||
UnixMake(main) ;
|
||||
MakeExe(ModName, mainModule, 0) ;
|
||||
UnixMake(mainModule) ;
|
||||
IF EnableRuntimeDebugging
|
||||
THEN
|
||||
DisplaySource
|
||||
|
@ -37,7 +37,7 @@ EXPORT QUALIFIED MakeDefinitionSource,
|
||||
MakeProgramSource,
|
||||
GetSource, GetModuleNo, IsModuleKnown,
|
||||
AssociateDefinition, GetDefinitionModuleFile,
|
||||
AssociateModule, GetModuleFile,
|
||||
AssociateModule, GetModuleFile, Get,
|
||||
ForeachSourceModuleDo, IsSourceSeen, IsModuleSeen,
|
||||
LookupModule, LookupOuterModule, DisplayModules ;
|
||||
|
||||
@ -177,6 +177,13 @@ PROCEDURE LookupModule (tok: CARDINAL; n: Name) : CARDINAL ;
|
||||
PROCEDURE LookupOuterModule (tok: CARDINAL; n: Name) : CARDINAL ;
|
||||
|
||||
|
||||
(*
|
||||
Get - returns the module symbol matching name, n.
|
||||
*)
|
||||
|
||||
PROCEDURE Get (n: Name) : CARDINAL ;
|
||||
|
||||
|
||||
(*
|
||||
DisplayModules - a debugging routine to textually emit the names of modules in the DoneQ.
|
||||
*)
|
||||
|
@ -1064,7 +1064,11 @@ END SetSaveTempsDir ;
|
||||
|
||||
PROCEDURE SetScaffoldDynamic (value: BOOLEAN) ;
|
||||
BEGIN
|
||||
ScaffoldDynamic := value
|
||||
ScaffoldDynamic := value ;
|
||||
IF ScaffoldDynamic
|
||||
THEN
|
||||
ScaffoldStatic := FALSE
|
||||
END
|
||||
END SetScaffoldDynamic ;
|
||||
|
||||
|
||||
@ -1074,7 +1078,11 @@ END SetScaffoldDynamic ;
|
||||
|
||||
PROCEDURE SetScaffoldStatic (value: BOOLEAN) ;
|
||||
BEGIN
|
||||
ScaffoldStatic := value
|
||||
ScaffoldStatic := value ;
|
||||
IF ScaffoldStatic
|
||||
THEN
|
||||
ScaffoldDynamic := FALSE
|
||||
END
|
||||
END SetScaffoldStatic ;
|
||||
|
||||
|
||||
|
@ -28,7 +28,8 @@ FROM NameKey IMPORT Name, NulName, MakeKey, GetKey, makekey, KeyToCharStar, Writ
|
||||
FROM FormatStrings IMPORT Sprintf0, Sprintf1, Sprintf2, Sprintf3 ;
|
||||
FROM M2DebugStack IMPORT DebugStack ;
|
||||
FROM M2Scaffold IMPORT DeclareScaffold, mainFunction, initFunction,
|
||||
finiFunction, linkFunction, PopulateCtorArray ;
|
||||
finiFunction, linkFunction, PopulateCtorArray,
|
||||
ForeachModuleCallInit, ForeachModuleCallFinish ;
|
||||
|
||||
FROM M2MetaError IMPORT MetaError0, MetaError1, MetaError2, MetaError3,
|
||||
MetaErrors1, MetaErrors2, MetaErrors3,
|
||||
@ -2479,7 +2480,10 @@ BEGIN
|
||||
END
|
||||
ELSIF ScaffoldStatic
|
||||
THEN
|
||||
|
||||
ForeachModuleCallInit (tok,
|
||||
RequestSym (tok, MakeKey ("argc")),
|
||||
RequestSym (tok, MakeKey ("argv")),
|
||||
RequestSym (tok, MakeKey ("envp")))
|
||||
END ;
|
||||
EndScope ;
|
||||
BuildProcedureEnd ;
|
||||
@ -2531,7 +2535,10 @@ BEGIN
|
||||
END
|
||||
ELSIF ScaffoldStatic
|
||||
THEN
|
||||
|
||||
ForeachModuleCallFinish (tok,
|
||||
RequestSym (tok, MakeKey ("argc")),
|
||||
RequestSym (tok, MakeKey ("argv")),
|
||||
RequestSym (tok, MakeKey ("envp")))
|
||||
END ;
|
||||
EndScope ;
|
||||
BuildProcedureEnd ;
|
||||
|
@ -52,4 +52,22 @@ PROCEDURE DeclareArgEnvParams (tokno: CARDINAL; proc: CARDINAL) ;
|
||||
PROCEDURE PopulateCtorArray (tok: CARDINAL) ;
|
||||
|
||||
|
||||
(*
|
||||
ForeachModuleCallInit - precondition: the module list will be ordered.
|
||||
postcondition: foreach module in the application universe
|
||||
call _M2_module_init (argc, argv, envp);
|
||||
*)
|
||||
|
||||
PROCEDURE ForeachModuleCallInit (tok: CARDINAL; argc, argv, envp: CARDINAL) ;
|
||||
|
||||
|
||||
(*
|
||||
ForeachModuleCallFinish - precondition: the module list will be ordered.
|
||||
postcondition: foreach module in the application universe
|
||||
call _M2_module_finish (argc, argv, envp);
|
||||
*)
|
||||
|
||||
PROCEDURE ForeachModuleCallFinish (tok: CARDINAL; argc, argv, envp: CARDINAL) ;
|
||||
|
||||
|
||||
END M2Scaffold.
|
||||
|
@ -27,7 +27,8 @@ FROM SymbolTable IMPORT NulSym, MakeProcedure, PutFunction,
|
||||
MakeSubrange, PutSubrange,
|
||||
MakeSubscript, PutSubscript, PutArraySubscript,
|
||||
MakeVar, PutVar, MakeProcedureCtorExtern,
|
||||
GetMainModule,
|
||||
GetMainModule, GetModuleCtors, MakeDefImp,
|
||||
PutModuleCtorExtern,
|
||||
GetSymName, StartScope, EndScope ;
|
||||
|
||||
FROM NameKey IMPORT NulName, Name, MakeKey, makekey, KeyToCharStar ;
|
||||
@ -40,9 +41,13 @@ FROM M2MetaError IMPORT MetaErrorT0 ;
|
||||
|
||||
FROM SFIO IMPORT OpenToWrite, WriteS, ReadS, OpenToRead, Exists ;
|
||||
FROM FIO IMPORT File, EOF, IsNoError, Close ;
|
||||
FROM M2Options IMPORT GetUselist ;
|
||||
FROM M2Options IMPORT GetUselist, ScaffoldStatic ;
|
||||
FROM M2Base IMPORT Proc ;
|
||||
FROM M2Quads IMPORT PushTFtok, PushTtok, BuildDesignatorArray, BuildAssignment ;
|
||||
|
||||
FROM M2Quads IMPORT PushTFtok, PushTtok, PushT, BuildDesignatorArray, BuildAssignment,
|
||||
BuildProcedureCall ;
|
||||
|
||||
FROM M2Batch IMPORT IsModuleKnown, Get ;
|
||||
|
||||
FROM DynamicStrings IMPORT String, InitString, KillString, ConCat, RemoveWhitePrefix,
|
||||
EqualArray, Mark, Assign, Fin, InitStringChar, Length, Slice, Equal,
|
||||
@ -52,10 +57,11 @@ CONST
|
||||
Comment = '#' ; (* Comment leader *)
|
||||
|
||||
VAR
|
||||
uselistModules,
|
||||
ctorModules,
|
||||
ctorGlobals : List ;
|
||||
ctorGlobals : List ;
|
||||
ctorArray,
|
||||
ctorArrayType: CARDINAL ;
|
||||
ctorArrayType : CARDINAL ;
|
||||
|
||||
|
||||
(* The dynamic scaffold takes the form:
|
||||
@ -122,6 +128,76 @@ BEGIN
|
||||
END DeclareCtorGlobal ;
|
||||
|
||||
|
||||
(*
|
||||
ForeachModuleCallInit - is only called when -fscaffold-static is enabled.
|
||||
precondition: the module list will be ordered.
|
||||
postcondition: foreach module in the application universe
|
||||
call _M2_module_init (argc, argv, envp);
|
||||
*)
|
||||
|
||||
PROCEDURE ForeachModuleCallInit (tok: CARDINAL; argc, argv, envp: CARDINAL) ;
|
||||
VAR
|
||||
module : CARDINAL ;
|
||||
i, n : CARDINAL ;
|
||||
ctor, init,
|
||||
fini, dep : CARDINAL ;
|
||||
BEGIN
|
||||
i := 1 ;
|
||||
n := NoOfItemsInList (uselistModules) ;
|
||||
WHILE i <= n DO
|
||||
module := GetItemFromList (uselistModules, i) ;
|
||||
IF module # NulSym
|
||||
THEN
|
||||
GetModuleCtors (module, ctor, init, fini, dep) ;
|
||||
IF init # NulSym
|
||||
THEN
|
||||
PushTtok (init, tok) ;
|
||||
PushTtok (argc, tok) ;
|
||||
PushTtok (argv, tok) ;
|
||||
PushTtok (envp, tok) ;
|
||||
PushT (3) ;
|
||||
BuildProcedureCall (tok)
|
||||
END
|
||||
END ;
|
||||
INC (i)
|
||||
END
|
||||
END ForeachModuleCallInit ;
|
||||
|
||||
|
||||
(*
|
||||
ForeachModuleCallFinish - precondition: the module list will be ordered.
|
||||
postcondition: foreach module in the application universe
|
||||
call _M2_module_finish (argc, argv, envp);
|
||||
*)
|
||||
|
||||
PROCEDURE ForeachModuleCallFinish (tok: CARDINAL; argc, argv, envp: CARDINAL) ;
|
||||
VAR
|
||||
module : CARDINAL ;
|
||||
i : CARDINAL ;
|
||||
ctor, init,
|
||||
fini, dep : CARDINAL ;
|
||||
BEGIN
|
||||
i := NoOfItemsInList (uselistModules) ;
|
||||
WHILE i >= 1 DO
|
||||
module := GetItemFromList (uselistModules, i) ;
|
||||
IF module # NulSym
|
||||
THEN
|
||||
GetModuleCtors (module, ctor, init, fini, dep) ;
|
||||
IF fini # NulSym
|
||||
THEN
|
||||
PushTtok (fini, tok) ;
|
||||
PushTtok (argc, tok) ;
|
||||
PushTtok (argv, tok) ;
|
||||
PushTtok (envp, tok) ;
|
||||
PushT (3) ;
|
||||
BuildProcedureCall (tok)
|
||||
END
|
||||
END ;
|
||||
DEC (i)
|
||||
END
|
||||
END ForeachModuleCallFinish ;
|
||||
|
||||
|
||||
(*
|
||||
PopulateCtorArray - assign each element of the ctorArray to the external module ctor.
|
||||
This is only used to force the linker to pull in the ctors from
|
||||
@ -145,16 +221,40 @@ BEGIN
|
||||
END PopulateCtorArray ;
|
||||
|
||||
|
||||
(*
|
||||
LookupModuleSym - returns a defimp module. It looks up an existing
|
||||
module and if this does not exist creates a new one.
|
||||
*)
|
||||
|
||||
PROCEDURE LookupModuleSym (tok: CARDINAL; name: Name) : CARDINAL ;
|
||||
VAR
|
||||
sym: CARDINAL ;
|
||||
BEGIN
|
||||
sym := Get (name) ;
|
||||
IF sym = NulSym
|
||||
THEN
|
||||
sym := MakeDefImp (tok, name)
|
||||
END ;
|
||||
IF sym # GetMainModule ()
|
||||
THEN
|
||||
PutModuleCtorExtern (tok, sym)
|
||||
END ;
|
||||
RETURN sym
|
||||
END LookupModuleSym ;
|
||||
|
||||
|
||||
(*
|
||||
ReadModules - populate ctorGlobals with the modules specified by -fuselist=filename.
|
||||
*)
|
||||
|
||||
PROCEDURE ReadModules (filename: String) ;
|
||||
PROCEDURE ReadModules (tok: CARDINAL; filename: String) ;
|
||||
VAR
|
||||
f: File ;
|
||||
s: String ;
|
||||
f : File ;
|
||||
s : String ;
|
||||
name: Name ;
|
||||
BEGIN
|
||||
InitList (ctorGlobals) ;
|
||||
InitList (uselistModules) ;
|
||||
f := OpenToRead (filename) ;
|
||||
WHILE NOT EOF (f) DO
|
||||
s := ReadS (f) ;
|
||||
@ -163,7 +263,9 @@ BEGIN
|
||||
Mark (Slice (s, 0, Length (Mark (InitStringChar (Comment)))-1)))) AND
|
||||
(NOT EqualArray (s, ''))
|
||||
THEN
|
||||
IncludeItemIntoList (ctorGlobals, makekey (string (s)))
|
||||
name := makekey (string (s)) ;
|
||||
IncludeItemIntoList (ctorGlobals, name) ;
|
||||
IncludeItemIntoList (uselistModules, LookupModuleSym (tok, name))
|
||||
END ;
|
||||
s := KillString (s)
|
||||
END ;
|
||||
@ -186,7 +288,7 @@ BEGIN
|
||||
ELSE
|
||||
IF Exists (filename)
|
||||
THEN
|
||||
ReadModules (filename)
|
||||
ReadModules (tok, filename)
|
||||
ELSE
|
||||
MetaErrorT0 (tok,
|
||||
'{%E}the filename specified by the -fuselist= option does not exist') ;
|
||||
@ -198,26 +300,33 @@ END CreateCtorList ;
|
||||
|
||||
|
||||
(*
|
||||
DeclareCtorModuleExtern - declare an extern _M2_modulename_ctor procedure for each module.
|
||||
DeclareModuleExtern - declare the extern _M2_modulename_ctor, _M2_modulename_init,
|
||||
_M2_modulename_fini, _M2_modulename_dep for each external module.
|
||||
*)
|
||||
|
||||
PROCEDURE DeclareCtorModuleExtern (tokenno: CARDINAL) ;
|
||||
PROCEDURE DeclareModuleExtern (tokenno: CARDINAL) ;
|
||||
VAR
|
||||
name: Name ;
|
||||
n, i: CARDINAL ;
|
||||
init,
|
||||
fini,
|
||||
dep,
|
||||
ctor,
|
||||
module: CARDINAL ;
|
||||
n, i : CARDINAL ;
|
||||
BEGIN
|
||||
InitList (ctorModules) ;
|
||||
i := 1 ;
|
||||
n := NoOfItemsInList (ctorGlobals) ;
|
||||
n := NoOfItemsInList (uselistModules) ;
|
||||
WHILE i <= n DO
|
||||
name := GetItemFromList (ctorGlobals, i) ;
|
||||
IF name # GetSymName (GetMainModule ())
|
||||
module := GetItemFromList (uselistModules, i) ;
|
||||
IF module # GetMainModule ()
|
||||
THEN
|
||||
IncludeItemIntoList (ctorModules, MakeProcedureCtorExtern (tokenno, name))
|
||||
PutModuleCtorExtern (tokenno, module)
|
||||
END ;
|
||||
GetModuleCtors (module, ctor, init, fini, dep) ;
|
||||
IncludeItemIntoList (ctorModules, ctor) ;
|
||||
INC (i)
|
||||
END
|
||||
END DeclareCtorModuleExtern ;
|
||||
END DeclareModuleExtern ;
|
||||
|
||||
|
||||
(*
|
||||
@ -231,7 +340,7 @@ BEGIN
|
||||
IF CreateCtorList (tokenno)
|
||||
THEN
|
||||
DeclareCtorGlobal (tokenno) ;
|
||||
DeclareCtorModuleExtern (tokenno) ;
|
||||
DeclareModuleExtern (tokenno) ;
|
||||
linkFunction := MakeProcedure (tokenno, MakeKey ("_M2_link"))
|
||||
END ;
|
||||
|
||||
@ -281,5 +390,6 @@ BEGIN
|
||||
mainFunction := NulSym ;
|
||||
linkFunction := NulSym ;
|
||||
ctorGlobals := NIL ;
|
||||
ctorModules := NIL
|
||||
ctorModules := NIL ;
|
||||
uselistModules := NIL
|
||||
END M2Scaffold.
|
||||
|
@ -69,7 +69,7 @@ TYPE
|
||||
VAR
|
||||
includedArray: BOOLEAN ;
|
||||
uKey : Index ;
|
||||
main : CARDINAL ;
|
||||
mainModule : CARDINAL ;
|
||||
Done,
|
||||
ToDo : List ;
|
||||
f : File ;
|
||||
@ -793,7 +793,7 @@ END DoWriteSymbol ;
|
||||
|
||||
PROCEDURE DoCheckExported (sym: WORD) ;
|
||||
BEGIN
|
||||
IF IsExported(main, sym)
|
||||
IF IsExported(mainModule, sym)
|
||||
THEN
|
||||
DoWriteSymbol(sym)
|
||||
END
|
||||
@ -901,7 +901,7 @@ PROCEDURE DoWriteFile (sym: CARDINAL) ;
|
||||
VAR
|
||||
n: Name ;
|
||||
BEGIN
|
||||
main := sym ;
|
||||
mainModule := sym ;
|
||||
n := GetSymName(sym) ;
|
||||
fprintf0(f, '/* automatically generated by gm2 -fswig */\n') ;
|
||||
fprintf0(f, '%') ;
|
||||
|
@ -55,7 +55,7 @@ EXPORT QUALIFIED NulSym,
|
||||
SetMainModule,
|
||||
SetFileModule,
|
||||
MakeModule, MakeDefImp,
|
||||
MakeInnerModule, MakeModuleCtor,
|
||||
MakeInnerModule, MakeModuleCtor, PutModuleCtorExtern,
|
||||
MakeProcedure,
|
||||
MakeProcedureCtorExtern,
|
||||
MakeConstant,
|
||||
@ -641,6 +641,16 @@ PROCEDURE MakeModuleCtor (moduleTok, beginTok, finallyTok: CARDINAL;
|
||||
moduleSym: CARDINAL) ;
|
||||
|
||||
|
||||
(*
|
||||
PutModuleCtorExtern - for every ctor related procedure in module sym.
|
||||
Make it external. It will create any missing
|
||||
init/fini procedures but not any missing dep/ctor
|
||||
procedures.
|
||||
*)
|
||||
|
||||
PROCEDURE PutModuleCtorExtern (tok: CARDINAL; sym: CARDINAL) ;
|
||||
|
||||
|
||||
(*
|
||||
MakeVar - creates a variable sym with VarName. It returns the
|
||||
symbol index.
|
||||
|
@ -3073,11 +3073,12 @@ BEGIN
|
||||
IF IsDefImp (moduleSym)
|
||||
THEN
|
||||
InitCtorFields (moduleTok, beginTok, finallyTok,
|
||||
pSym^.DefImp.ctors, GetSymName (moduleSym), FALSE)
|
||||
pSym^.DefImp.ctors, GetSymName (moduleSym),
|
||||
FALSE, TRUE)
|
||||
ELSE
|
||||
InitCtorFields (moduleTok, beginTok, finallyTok,
|
||||
pSym^.Module.ctors, GetSymName (moduleSym),
|
||||
IsInnerModule (moduleSym))
|
||||
IsInnerModule (moduleSym), TRUE)
|
||||
END
|
||||
END MakeModuleCtor ;
|
||||
|
||||
@ -3088,14 +3089,16 @@ END MakeModuleCtor ;
|
||||
*)
|
||||
|
||||
PROCEDURE InitCtorFields (moduleTok, beginTok, finallyTok: CARDINAL;
|
||||
VAR ctor: ModuleCtor; name: Name; inner: BOOLEAN) ;
|
||||
VAR ctor: ModuleCtor; name: Name;
|
||||
inner, pub: BOOLEAN) ;
|
||||
BEGIN
|
||||
IF ScaffoldDynamic AND (NOT inner)
|
||||
THEN
|
||||
(* The ctor procedure must be public. *)
|
||||
ctor.ctor := MakeProcedure (moduleTok, GenName ("_M2_", name, "_ctor")) ;
|
||||
PutCtor (ctor.ctor, TRUE) ;
|
||||
PutPublic (ctor.ctor, TRUE) ;
|
||||
PutCtor (ctor.ctor, pub) ;
|
||||
PutPublic (ctor.ctor, pub) ;
|
||||
PutExtern (ctor.ctor, NOT pub) ;
|
||||
(* The dep procedure is local to the module. *)
|
||||
ctor.dep := MakeProcedure (moduleTok, GenName ("_M2_", name, "_dep")) ;
|
||||
ELSE
|
||||
@ -3104,10 +3107,12 @@ BEGIN
|
||||
END ;
|
||||
(* The init/fini procedures must be public. *)
|
||||
ctor.init := MakeProcedure (beginTok, GenName ("_M2_", name, "_init")) ;
|
||||
PutPublic (ctor.init, TRUE) ;
|
||||
PutPublic (ctor.init, pub) ;
|
||||
PutExtern (ctor.init, NOT pub) ;
|
||||
DeclareArgEnvParams (beginTok, ctor.init) ;
|
||||
ctor.fini := MakeProcedure (finallyTok, GenName ("_M2_", name, "_fini")) ;
|
||||
PutPublic (ctor.fini, TRUE) ;
|
||||
PutPublic (ctor.fini, pub) ;
|
||||
PutExtern (ctor.fini, NOT pub) ;
|
||||
DeclareArgEnvParams (beginTok, ctor.fini)
|
||||
END InitCtorFields ;
|
||||
|
||||
@ -3139,7 +3144,7 @@ BEGIN
|
||||
InternalError ('expecting Module or DefImp symbol')
|
||||
END
|
||||
END
|
||||
END GetModCtors ;
|
||||
END GetModuleCtors ;
|
||||
|
||||
|
||||
(*
|
||||
@ -3465,8 +3470,8 @@ BEGIN
|
||||
InitList(ListOfProcs) ; (* List of all procedures *)
|
||||
(* declared within this module. *)
|
||||
InitList(ListOfModules) ; (* List of all inner modules. *)
|
||||
InitWhereDeclaredTok(tok, At) ; (* Where symbol declared. *)
|
||||
InitWhereFirstUsedTok(tok, At) ; (* Where symbol first used. *)
|
||||
InitWhereDeclaredTok(tok, At) ; (* Where symbol declared. *)
|
||||
InitWhereFirstUsedTok(tok, At) ; (* Where symbol first used. *)
|
||||
errorScope := GetCurrentErrorScope () ; (* Title error scope. *)
|
||||
END
|
||||
END ;
|
||||
@ -3475,6 +3480,83 @@ BEGIN
|
||||
END MakeDefImp ;
|
||||
|
||||
|
||||
(*
|
||||
PutProcedureExternPublic - if procedure is not NulSym set extern
|
||||
and public booleans.
|
||||
*)
|
||||
|
||||
PROCEDURE PutProcedureExternPublic (procedure: CARDINAL; extern, pub: BOOLEAN) ;
|
||||
BEGIN
|
||||
IF procedure # NulSym
|
||||
THEN
|
||||
PutExtern (procedure, extern) ;
|
||||
PutPublic (procedure, pub)
|
||||
END
|
||||
END PutProcedureExternPublic ;
|
||||
|
||||
|
||||
(*
|
||||
PutCtorExtern -
|
||||
*)
|
||||
|
||||
PROCEDURE PutCtorExtern (tok: CARDINAL; sym: CARDINAL;
|
||||
VAR ctor: ModuleCtor; extern: BOOLEAN) ;
|
||||
BEGIN
|
||||
(* If the ctor does not exist then make it extern/ (~extern) public. *)
|
||||
IF ctor.ctor = NulSym
|
||||
THEN
|
||||
ctor.ctor := MakeProcedure (tok, GenName ("_M2_", GetSymName (sym), "_ctor"))
|
||||
END ;
|
||||
PutProcedureExternPublic (ctor.ctor, extern, NOT extern) ;
|
||||
PutCtor (ctor.ctor, NOT extern) ;
|
||||
(* If the ctor does not exist then make it extern/ (~extern) public. *)
|
||||
IF ctor.dep = NulSym
|
||||
THEN
|
||||
ctor.dep := MakeProcedure (tok, GenName ("_M2_", GetSymName (sym), "_dep"))
|
||||
END ;
|
||||
PutProcedureExternPublic (ctor.dep, extern, NOT extern) ;
|
||||
(* If init/fini do not exist then create them. *)
|
||||
IF ctor.init = NulSym
|
||||
THEN
|
||||
ctor.init := MakeProcedure (tok, GenName ("_M2_", GetSymName (sym), "_init")) ;
|
||||
DeclareArgEnvParams (tok, ctor.init)
|
||||
END ;
|
||||
PutProcedureExternPublic (ctor.init, extern, NOT extern) ;
|
||||
IF ctor.fini = NulSym
|
||||
THEN
|
||||
ctor.fini := MakeProcedure (tok, GenName ("_M2_", GetSymName (sym), "_fini")) ;
|
||||
DeclareArgEnvParams (tok, ctor.fini)
|
||||
END ;
|
||||
PutProcedureExternPublic (ctor.fini, extern, NOT extern)
|
||||
END PutCtorExtern ;
|
||||
|
||||
|
||||
(*
|
||||
PutModuleCtorExtern - for every ctor related procedure in module sym.
|
||||
Make it external. It will create any missing
|
||||
init/fini procedures but not any missing dep/ctor
|
||||
procedures.
|
||||
*)
|
||||
|
||||
PROCEDURE PutModuleCtorExtern (tok: CARDINAL; sym: CARDINAL) ;
|
||||
VAR
|
||||
pSym: PtrToSymbol ;
|
||||
BEGIN
|
||||
Assert (IsModule (sym) OR IsDefImp (sym)) ;
|
||||
pSym := GetPsym (sym) ;
|
||||
WITH pSym^ DO
|
||||
CASE SymbolType OF
|
||||
|
||||
DefImpSym: PutCtorExtern (tok, sym, DefImp.ctors, TRUE) |
|
||||
ModuleSym: PutCtorExtern (tok, sym, Module.ctors, TRUE)
|
||||
|
||||
ELSE
|
||||
InternalError ('expecting DefImp or Module symbol')
|
||||
END
|
||||
END
|
||||
END PutModuleCtorExtern ;
|
||||
|
||||
|
||||
(*
|
||||
MakeProcedure - creates a procedure sym with name. It returns
|
||||
the symbol index.
|
||||
|
@ -29,82 +29,86 @@ along with GNU Modula-2; see the file COPYING3. If not see
|
||||
#define EXTERN extern
|
||||
#endif /* !__GNUG__ */
|
||||
|
||||
EXTERN void _M2_M2Bitset_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_Debug_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2Defaults_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_Environment_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_RTExceptions_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2EXCEPTION_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2RTS_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_SysExceptions_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_DynamicStrings_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_Assertion_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_FormatStrings_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_FIO_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_SFIO_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_SArgs_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_Lists_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_UnixArgs_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_Args_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_wrapc_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_TimeString_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_IO_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_StdIO_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_CmdArgs_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2Preprocess_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2Error_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2Search_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_Indexing_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_NameKey_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_NumberIO_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_FpuIO_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_SysStorage_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_Storage_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_StrIO_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2Debug_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2Batch_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_StrLib_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2ALU_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2Options_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2Comp_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2LexBuf_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_SymbolTable_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2Base_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2Quads_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_SymbolKey_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_FifoQueue_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2Reserved_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2Const_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_P1SymBuild_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_P2SymBuild_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_P3SymBuild_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2System_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2BasicBlock_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2Pass_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2Code_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2AsmUtil_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2FileName_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2Version_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2Students_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_StrCase_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_SymbolConversion_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2GCCDeclare_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2GenGCC_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2Range_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2Swig_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2MetaError_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2CaseList_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_PCSymBuild_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_PCBuild_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_Sets_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_dtoa_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_ldtoa_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2Check_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2SSA_init (int argc, char *argv[]);
|
||||
EXTERN void _M2_M2Bitset_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_Debug_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2Defaults_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_Environment_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_RTExceptions_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2EXCEPTION_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2RTS_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2Dependent_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_SysExceptions_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_DynamicStrings_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_Assertion_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_FormatStrings_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_FIO_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_SFIO_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_SArgs_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_Lists_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_UnixArgs_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_Args_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_wrapc_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_TimeString_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_IO_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_StdIO_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_CmdArgs_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2Preprocess_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2Error_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2Search_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_Indexing_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_NameKey_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_NumberIO_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_FpuIO_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_SysStorage_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_Storage_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_StrIO_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2Debug_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2Batch_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_StrLib_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2ALU_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2Options_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2Comp_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2LexBuf_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_SymbolTable_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2Base_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2Quads_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_SymbolKey_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_FifoQueue_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2Reserved_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2Const_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_P1SymBuild_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_P2SymBuild_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_P3SymBuild_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2System_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2BasicBlock_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2Pass_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2Code_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2AsmUtil_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2FileName_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2Version_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2Students_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_StrCase_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_SymbolConversion_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2GCCDeclare_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2GenGCC_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2Range_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2Swig_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2MetaError_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2CaseList_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_PCSymBuild_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_PCBuild_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_Sets_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_dtoa_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_ldtoa_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2Check_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void _M2_M2SSA_init (int argc, char *argv[], char *envp[]);
|
||||
EXTERN void exit (int);
|
||||
EXTERN void M2Comp_compile (const char *filename);
|
||||
EXTERN void RTExceptions_DefaultErrorCatch (void);
|
||||
|
||||
int StaticInitialization = 1;
|
||||
char *ForcedModuleInitOrder = NULL;
|
||||
|
||||
|
||||
/* FrontEndInit - initialise the modules, this is a global
|
||||
initialisation. This is called once. */
|
||||
@ -112,36 +116,37 @@ EXTERN void RTExceptions_DefaultErrorCatch (void);
|
||||
void
|
||||
init_FrontEndInit (void)
|
||||
{
|
||||
_M2_Debug_init (0, NULL);
|
||||
_M2_RTExceptions_init (0, NULL);
|
||||
_M2_M2Defaults_init (0, NULL);
|
||||
_M2_Environment_init (0, NULL);
|
||||
_M2_M2EXCEPTION_init (0, NULL);
|
||||
_M2_M2RTS_init (0, NULL);
|
||||
_M2_SysExceptions_init (0, NULL);
|
||||
_M2_DynamicStrings_init (0, NULL);
|
||||
_M2_Assertion_init (0, NULL);
|
||||
_M2_FormatStrings_init (0, NULL);
|
||||
_M2_FIO_init (0, NULL);
|
||||
_M2_SFIO_init (0, NULL);
|
||||
_M2_SArgs_init (0, NULL);
|
||||
_M2_Lists_init (0, NULL);
|
||||
_M2_UnixArgs_init (0, NULL);
|
||||
_M2_Args_init (0, NULL);
|
||||
_M2_wrapc_init (0, NULL);
|
||||
_M2_TimeString_init (0, NULL);
|
||||
_M2_IO_init (0, NULL);
|
||||
_M2_StdIO_init (0, NULL);
|
||||
_M2_CmdArgs_init (0, NULL);
|
||||
_M2_FpuIO_init (0, NULL);
|
||||
_M2_SysStorage_init (0, NULL);
|
||||
_M2_Storage_init (0, NULL);
|
||||
_M2_StrIO_init (0, NULL);
|
||||
_M2_StrLib_init (0, NULL);
|
||||
_M2_dtoa_init (0, NULL);
|
||||
_M2_ldtoa_init (0, NULL);
|
||||
_M2_M2Search_init (0, NULL);
|
||||
_M2_M2Options_init (0, NULL);
|
||||
_M2_Debug_init (0, NULL, NULL);
|
||||
_M2_RTExceptions_init (0, NULL, NULL);
|
||||
_M2_M2Defaults_init (0, NULL, NULL);
|
||||
_M2_Environment_init (0, NULL, NULL);
|
||||
_M2_M2EXCEPTION_init (0, NULL, NULL);
|
||||
_M2_M2Dependent_init (0, NULL, NULL);
|
||||
_M2_M2RTS_init (0, NULL, NULL);
|
||||
_M2_SysExceptions_init (0, NULL, NULL);
|
||||
_M2_DynamicStrings_init (0, NULL, NULL);
|
||||
_M2_Assertion_init (0, NULL, NULL);
|
||||
_M2_FormatStrings_init (0, NULL, NULL);
|
||||
_M2_FIO_init (0, NULL, NULL);
|
||||
_M2_SFIO_init (0, NULL, NULL);
|
||||
_M2_SArgs_init (0, NULL, NULL);
|
||||
_M2_Lists_init (0, NULL, NULL);
|
||||
_M2_UnixArgs_init (0, NULL, NULL);
|
||||
_M2_Args_init (0, NULL, NULL);
|
||||
_M2_wrapc_init (0, NULL, NULL);
|
||||
_M2_TimeString_init (0, NULL, NULL);
|
||||
_M2_IO_init (0, NULL, NULL);
|
||||
_M2_StdIO_init (0, NULL, NULL);
|
||||
_M2_CmdArgs_init (0, NULL, NULL);
|
||||
_M2_FpuIO_init (0, NULL, NULL);
|
||||
_M2_SysStorage_init (0, NULL, NULL);
|
||||
_M2_Storage_init (0, NULL, NULL);
|
||||
_M2_StrIO_init (0, NULL, NULL);
|
||||
_M2_StrLib_init (0, NULL, NULL);
|
||||
_M2_dtoa_init (0, NULL, NULL);
|
||||
_M2_ldtoa_init (0, NULL, NULL);
|
||||
_M2_M2Search_init (0, NULL, NULL);
|
||||
_M2_M2Options_init (0, NULL, NULL);
|
||||
}
|
||||
|
||||
/* PerCompilationInit - initialise the modules before compiling,
|
||||
@ -150,47 +155,47 @@ init_FrontEndInit (void)
|
||||
void
|
||||
init_PerCompilationInit (const char *filename)
|
||||
{
|
||||
_M2_M2Bitset_init (0, NULL);
|
||||
_M2_M2Preprocess_init (0, NULL);
|
||||
_M2_M2Error_init (0, NULL);
|
||||
_M2_Indexing_init (0, NULL);
|
||||
_M2_NameKey_init (0, NULL);
|
||||
_M2_NumberIO_init (0, NULL);
|
||||
_M2_M2Debug_init (0, NULL);
|
||||
_M2_M2Batch_init (0, NULL);
|
||||
_M2_M2ALU_init (0, NULL);
|
||||
_M2_M2Comp_init (0, NULL);
|
||||
_M2_M2LexBuf_init (0, NULL);
|
||||
_M2_SymbolTable_init (0, NULL);
|
||||
_M2_M2Base_init (0, NULL);
|
||||
_M2_M2Quads_init (0, NULL);
|
||||
_M2_SymbolKey_init (0, NULL);
|
||||
_M2_FifoQueue_init (0, NULL);
|
||||
_M2_M2Reserved_init (0, NULL);
|
||||
_M2_M2Const_init (0, NULL);
|
||||
_M2_P1SymBuild_init (0, NULL);
|
||||
_M2_P2SymBuild_init (0, NULL);
|
||||
_M2_P3SymBuild_init (0, NULL);
|
||||
_M2_M2System_init (0, NULL);
|
||||
_M2_M2BasicBlock_init (0, NULL);
|
||||
_M2_M2Pass_init (0, NULL);
|
||||
_M2_M2Code_init (0, NULL);
|
||||
_M2_M2AsmUtil_init (0, NULL);
|
||||
_M2_M2FileName_init (0, NULL);
|
||||
_M2_M2Version_init (0, NULL);
|
||||
_M2_M2Students_init (0, NULL);
|
||||
_M2_StrCase_init (0, NULL);
|
||||
_M2_SymbolConversion_init (0, NULL);
|
||||
_M2_M2GCCDeclare_init (0, NULL);
|
||||
_M2_M2GenGCC_init (0, NULL);
|
||||
_M2_M2Range_init (0, NULL);
|
||||
_M2_M2Swig_init (0, NULL);
|
||||
_M2_M2MetaError_init (0, NULL);
|
||||
_M2_M2CaseList_init (0, NULL);
|
||||
_M2_PCSymBuild_init (0, NULL);
|
||||
_M2_PCBuild_init (0, NULL);
|
||||
_M2_Sets_init (0, NULL);
|
||||
_M2_M2SSA_init (0, NULL);
|
||||
_M2_M2Check_init (0, NULL);
|
||||
_M2_M2Bitset_init (0, NULL, NULL);
|
||||
_M2_M2Preprocess_init (0, NULL, NULL);
|
||||
_M2_M2Error_init (0, NULL, NULL);
|
||||
_M2_Indexing_init (0, NULL, NULL);
|
||||
_M2_NameKey_init (0, NULL, NULL);
|
||||
_M2_NumberIO_init (0, NULL, NULL);
|
||||
_M2_M2Debug_init (0, NULL, NULL);
|
||||
_M2_M2Batch_init (0, NULL, NULL);
|
||||
_M2_M2ALU_init (0, NULL, NULL);
|
||||
_M2_M2Comp_init (0, NULL, NULL);
|
||||
_M2_M2LexBuf_init (0, NULL, NULL);
|
||||
_M2_SymbolTable_init (0, NULL, NULL);
|
||||
_M2_M2Base_init (0, NULL, NULL);
|
||||
_M2_M2Quads_init (0, NULL, NULL);
|
||||
_M2_SymbolKey_init (0, NULL, NULL);
|
||||
_M2_FifoQueue_init (0, NULL, NULL);
|
||||
_M2_M2Reserved_init (0, NULL, NULL);
|
||||
_M2_M2Const_init (0, NULL, NULL);
|
||||
_M2_P1SymBuild_init (0, NULL, NULL);
|
||||
_M2_P2SymBuild_init (0, NULL, NULL);
|
||||
_M2_P3SymBuild_init (0, NULL, NULL);
|
||||
_M2_M2System_init (0, NULL, NULL);
|
||||
_M2_M2BasicBlock_init (0, NULL, NULL);
|
||||
_M2_M2Pass_init (0, NULL, NULL);
|
||||
_M2_M2Code_init (0, NULL, NULL);
|
||||
_M2_M2AsmUtil_init (0, NULL, NULL);
|
||||
_M2_M2FileName_init (0, NULL, NULL);
|
||||
_M2_M2Version_init (0, NULL, NULL);
|
||||
_M2_M2Students_init (0, NULL, NULL);
|
||||
_M2_StrCase_init (0, NULL, NULL);
|
||||
_M2_SymbolConversion_init (0, NULL, NULL);
|
||||
_M2_M2GCCDeclare_init (0, NULL, NULL);
|
||||
_M2_M2GenGCC_init (0, NULL, NULL);
|
||||
_M2_M2Range_init (0, NULL, NULL);
|
||||
_M2_M2Swig_init (0, NULL, NULL);
|
||||
_M2_M2MetaError_init (0, NULL, NULL);
|
||||
_M2_M2CaseList_init (0, NULL, NULL);
|
||||
_M2_PCSymBuild_init (0, NULL, NULL);
|
||||
_M2_PCBuild_init (0, NULL, NULL);
|
||||
_M2_Sets_init (0, NULL, NULL);
|
||||
_M2_M2SSA_init (0, NULL, NULL);
|
||||
_M2_M2Check_init (0, NULL, NULL);
|
||||
M2Comp_compile (filename);
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ 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/>. *)
|
||||
|
||||
DEFINITION MODULE FOR "C" m2expr ;
|
||||
DEFINITION MODULE m2expr ;
|
||||
|
||||
FROM SYSTEM IMPORT ADDRESS ;
|
||||
FROM m2tree IMPORT Tree ;
|
||||
|
@ -120,7 +120,6 @@ RTco_turnInterrupts (unsigned int newLevel)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
void
|
||||
_M2_RTco_init (void)
|
||||
{
|
||||
@ -130,7 +129,6 @@ void
|
||||
_M2_RTco_finish (void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -1,50 +0,0 @@
|
||||
/* pthdummy.c provide dummy stubs to satisy bootstrap requirements.
|
||||
|
||||
Copyright (C) 2018-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.
|
||||
|
||||
Under Section 7 of GPL version 3, you are granted additional
|
||||
permissions described in the GCC Runtime Library Exception, version
|
||||
3.1, as published by the Free Software Foundation.
|
||||
|
||||
You should have received a copy of the GNU General Public License and
|
||||
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
|
||||
pth_select (__attribute__ ((unused)) int p1,
|
||||
__attribute__ ((unused)) void *p2,
|
||||
__attribute__ ((unused)) void *p3,
|
||||
__attribute__ ((unused)) void *p4,
|
||||
__attribute__ ((unused)) void *p5)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
pth_uctx_create (__attribute__ ((unused)) void *p)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
pth_init (void)
|
||||
{
|
||||
return 0;
|
||||
}
|
@ -66,10 +66,6 @@ along with GNU Modula-2; see the file COPYING3. If not see
|
||||
#define LIBRARY_PATH_ENV "LIBRARY_PATH"
|
||||
#endif
|
||||
|
||||
#ifndef GM2_LIBEXEC_ENV
|
||||
#define GM2_LIBEXEC_ENV "GM2_LIBEXEC"
|
||||
#endif
|
||||
|
||||
int lang_specific_extra_outfiles = 0;
|
||||
|
||||
/* DEBUGGING will print all the options at various stages with their
|
||||
@ -119,8 +115,11 @@ static void insert_option (unsigned int *in_decoded_options_count,
|
||||
static const char *gen_link_path (const char *libpath, const char *dialect);
|
||||
static const char *add_exec_dir (int argc, const char *argv[]);
|
||||
static const char *gen_gm2_libexec (const char *path);
|
||||
static const char *get_libexec (void);
|
||||
|
||||
static bool seen_scaffold_static = false;
|
||||
static bool seen_scaffold_dynamic = false;
|
||||
static bool scaffold_static = false;
|
||||
static bool scaffold_dynamic = true; // Default uses -fscaffold-dynamic.
|
||||
static bool seen_B = false;
|
||||
static const char *B_path = NULL;
|
||||
static const char *multilib_dir = NULL;
|
||||
@ -133,17 +132,6 @@ static const char *multilib_dir = NULL;
|
||||
#endif
|
||||
|
||||
|
||||
static const char *
|
||||
get_libexec (void)
|
||||
{
|
||||
const char *libexec = getenv (GM2_LIBEXEC_ENV);
|
||||
|
||||
if (libexec == NULL || (strcmp (libexec, "") == 0))
|
||||
return STANDARD_LIBEXEC_PREFIX;
|
||||
else
|
||||
return libexec;
|
||||
}
|
||||
|
||||
/* gen_gm2_libexec, return a libexec string. */
|
||||
|
||||
static const char *
|
||||
@ -165,7 +153,7 @@ gen_gm2_libexec (const char *libexec)
|
||||
return s;
|
||||
}
|
||||
|
||||
/* add_exec_dir prepends the exec path to the given executable filename. */
|
||||
/* add_exec_dir wraps the exec path with the -fcpp-prog= option. */
|
||||
|
||||
static const char *
|
||||
add_exec_dir (int argc, const char *argv[])
|
||||
@ -177,7 +165,7 @@ add_exec_dir (int argc, const char *argv[])
|
||||
if (seen_B)
|
||||
path = xstrdup (B_path);
|
||||
else
|
||||
path = gen_gm2_libexec (get_libexec ());
|
||||
path = gen_gm2_libexec (STANDARD_LIBEXEC_PREFIX);
|
||||
|
||||
if (path != NULL)
|
||||
{
|
||||
@ -241,7 +229,7 @@ add_lib (size_t opt_index, const char *lib, int joined)
|
||||
fe_generate_option (opt_index, lib, joined);
|
||||
}
|
||||
|
||||
/* insert_option inserts an option at position on the command line. */
|
||||
/* insert_option inserts an option at position index on the command line. */
|
||||
|
||||
static void
|
||||
insert_option (unsigned int *in_decoded_options_count,
|
||||
@ -267,8 +255,8 @@ insert_option (unsigned int *in_decoded_options_count,
|
||||
*in_decoded_options = new_decoded_options;
|
||||
}
|
||||
|
||||
/* add_library adds a library to the command line at arg position.
|
||||
It returns the number of arguments added. If libraryname is NULL or
|
||||
/* add_library adds a library to the command line at arg position. It
|
||||
returns the number of arguments added. If libraryname is NULL or
|
||||
empty then zero is returned. */
|
||||
|
||||
static int
|
||||
@ -290,8 +278,7 @@ add_library (const char *libraryname, unsigned int *in_decoded_options_count,
|
||||
generate_option (OPT_l, libraryname, 1, CL_DRIVER,
|
||||
&(*in_decoded_options)[position]);
|
||||
|
||||
#if 0
|
||||
// defined(DEBUGGING)
|
||||
#if defined(DEBUGGING)
|
||||
print_options ("after add_library", *in_decoded_options_count, *in_decoded_options);
|
||||
#endif
|
||||
return 1;
|
||||
@ -717,6 +704,14 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
|
||||
case OPT_fno_m2_plugin:
|
||||
need_plugin = false;
|
||||
break;
|
||||
case OPT_fscaffold_dynamic:
|
||||
seen_scaffold_dynamic = true;
|
||||
scaffold_dynamic = (*in_decoded_options)[i].value;
|
||||
break;
|
||||
case OPT_fscaffold_static:
|
||||
seen_scaffold_static = true;
|
||||
scaffold_static = (*in_decoded_options)[i].value;
|
||||
break;
|
||||
default:
|
||||
if (((*in_decoded_options)[i].orig_option_with_args_text != NULL)
|
||||
&& (strncmp ((*in_decoded_options)[i].orig_option_with_args_text,
|
||||
@ -726,12 +721,20 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
|
||||
}
|
||||
}
|
||||
|
||||
if (scaffold_static && scaffold_dynamic)
|
||||
{
|
||||
if (! seen_scaffold_dynamic)
|
||||
scaffold_dynamic = false;
|
||||
if (scaffold_dynamic && scaffold_static)
|
||||
error ("%qs and %qs cannot both be enabled",
|
||||
"-fscaffold-dynamic", "-fscaffold-static");
|
||||
}
|
||||
libpath = fe_getenv (LIBRARY_PATH_ENV);
|
||||
if (libpath == NULL || (strcmp (libpath, "") == 0))
|
||||
libpath = LIBSUBDIR;
|
||||
|
||||
#if defined(DEBUGGING)
|
||||
print_options ("at beginning", *in_decoded_options_count, *in_decoded_options);
|
||||
print_options ("after scaffold checking", *in_decoded_options_count, *in_decoded_options);
|
||||
#endif
|
||||
i = 1;
|
||||
for (i = 1; i < *in_decoded_options_count; i++)
|
||||
@ -774,7 +777,7 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
|
||||
if (language != NULL && (strcmp (language, "modula-2") != 0))
|
||||
return;
|
||||
#if defined(DEBUGGING)
|
||||
print_options ("in the middle", *in_decoded_options_count, *in_decoded_options);
|
||||
print_options ("after dialect detection", *in_decoded_options_count, *in_decoded_options);
|
||||
#endif
|
||||
|
||||
/* If the libraries have not been specified by the user and the
|
||||
@ -785,7 +788,7 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
|
||||
if (strcmp (dialect, "iso") == 0)
|
||||
libraries = xstrdup ("m2iso,m2pim");
|
||||
else
|
||||
libraries = xstrdup ("m2pim"); /* Always require m2pim for dynamic scaffold. */
|
||||
libraries = xstrdup ("m2pim"); /* Default to pim libraries if none specified. */
|
||||
}
|
||||
|
||||
libraries = convert_abbreviations (libraries);
|
||||
@ -802,6 +805,7 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
|
||||
if (linking)
|
||||
{
|
||||
if (strcmp (dialect, "iso") == 0)
|
||||
/* We need the pim libraries even if using iso. */
|
||||
(*in_added_libraries)
|
||||
+= add_library ("m2pim", in_decoded_options_count,
|
||||
in_decoded_options, *in_decoded_options_count);
|
||||
@ -839,16 +843,16 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
|
||||
}
|
||||
}
|
||||
#if defined(DEBUGGING)
|
||||
print_options ("before include purge", *in_decoded_options_count, *in_decoded_options);
|
||||
print_options ("before include options purge", *in_decoded_options_count, *in_decoded_options);
|
||||
#endif
|
||||
purge_include_options (in_decoded_options_count, in_decoded_options);
|
||||
#if defined(DEBUGGING)
|
||||
print_options ("after include purge", *in_decoded_options_count, *in_decoded_options);
|
||||
print_options ("after include options purge", *in_decoded_options_count, *in_decoded_options);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* lang_specific_pre_link - does nothing. */
|
||||
|
||||
// --fixme-- remove lang_specific_pre_link here and all other drivers.
|
||||
int
|
||||
lang_specific_pre_link (void)
|
||||
{
|
||||
|
@ -1,53 +0,0 @@
|
||||
/* Gpth.c provides access to pth_select for Modula-2.
|
||||
|
||||
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/>. */
|
||||
|
||||
int
|
||||
pth_pth_select (int p1, int p2, int p3, int p4, int p5)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
pth_pth_uctx_create (void *p)
|
||||
{
|
||||
}
|
||||
|
||||
int
|
||||
pth_pth_uctx_make (void *p1, void *p2, unsigned int p3, void *p4, void *p5,
|
||||
void *p6, void *p7)
|
||||
{
|
||||
}
|
||||
|
||||
int
|
||||
pth_pth_uctx_save (void *p1)
|
||||
{
|
||||
}
|
||||
|
||||
int
|
||||
pth_pth_uctx_switch (void *p1, void *p2)
|
||||
{
|
||||
}
|
||||
|
||||
int
|
||||
pth_pth_init (void)
|
||||
{
|
||||
return 0;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -9,6 +9,6 @@ VAR
|
||||
ptr: ADDRESS ;
|
||||
num: CARDINAL ;
|
||||
BEGIN
|
||||
ptr := ArgV ;
|
||||
num := ArgC
|
||||
ptr := GetArgV () ;
|
||||
num := GetArgC ()
|
||||
END testunixargs.
|
@ -1,15 +1,15 @@
|
||||
.TH gm2l "1" "June 2021" "Modula-2" "User Commands"
|
||||
.TH gm2l "1" "July 2022" "Modula-2" "User Commands"
|
||||
.SH NAME
|
||||
gm2l \- generate an initialization sequence by analyzing module imports.
|
||||
.SH SYNOPSIS
|
||||
.B gm2l
|
||||
.RB [ -fdef= extension ]
|
||||
.RB [ -flibs= list ]
|
||||
.RB [ -fmod= extension ]
|
||||
.RB [ -h ]
|
||||
.RB [ --help ]
|
||||
.RB [ -I searchpath ]
|
||||
.RB [ --M2RTS ]
|
||||
.RB [ -M2RTS ]
|
||||
.RB [ --exclude= list ]
|
||||
.RB [ -v ]
|
||||
.RB [ --verbose ]
|
||||
.RB [ -o " outputfile" ]
|
||||
@ -17,19 +17,14 @@ gm2l \- generate an initialization sequence by analyzing module imports.
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
A tool for generating a static initialization sequence by analyzing
|
||||
module imports. This tool will generate a textual list of modules in
|
||||
an order which satisfies a topological order of an import graph. The
|
||||
textual list of modules can be manipulated and used by the other
|
||||
Modula-2 link tools:
|
||||
module imports from source files. It also generates a list of all
|
||||
dependent modules for an application. This tool will generate a
|
||||
textual list of modules in an order which satisfies a topological
|
||||
order of an import graph. The textual list of modules can be used by
|
||||
the other Modula-2 tools:
|
||||
.IR gm2lcc (1)
|
||||
.IR gm2lgen (1)
|
||||
.IR gm2lorder (1).
|
||||
The command line program
|
||||
.IR gm2
|
||||
can be instructed to automatically invoke
|
||||
.IR gm2l (1)
|
||||
and the above programs to construct a C++ scaffold for a Modula-2
|
||||
application.
|
||||
and
|
||||
.IR gm2 (1).
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B -fdef= extension
|
||||
@ -38,6 +33,22 @@ this option is not specified then an extension of
|
||||
.B .def
|
||||
is assumed.
|
||||
.TP
|
||||
.B -flibs= list
|
||||
add include paths for the named libraries in the list.
|
||||
The shorthand names
|
||||
.B pim ,
|
||||
.B iso ,
|
||||
.B cor ,
|
||||
.B log ,
|
||||
expand to the installed library paths:
|
||||
.B m2pim ,
|
||||
.B m2iso ,
|
||||
.B m2cor
|
||||
and
|
||||
.B m2log .
|
||||
Any other names in the list
|
||||
are treated as the base directory name in the installed library path.
|
||||
.TP
|
||||
.B -fmod= extension
|
||||
assume that program and implementation modules have the posfix
|
||||
\fIextension\fP. If this option is not specified then an extension of
|
||||
@ -55,12 +66,18 @@ equivalent to
|
||||
specifies the search path used to find definition, implementation and
|
||||
program modules.
|
||||
.TP
|
||||
.B --M2RTS
|
||||
do not include the module M2RTS even if it is a dependant module.
|
||||
.TP
|
||||
.B -M2RTS
|
||||
equivalent to
|
||||
.B --M2RTS\fR.
|
||||
.B --exclude= module1,module2
|
||||
do not include module1 and module2 in the textual list output.
|
||||
The string after the
|
||||
.B --exclude=
|
||||
should be a comma separated list of module names.
|
||||
.B --include= module1,module2
|
||||
include module1 and module2 in the textual list output.
|
||||
The string after the
|
||||
.B --include=
|
||||
should be a comma separated list of module names. Any included
|
||||
modules which are not found by traversing the import graph are added
|
||||
as dependants to the main program.
|
||||
.TP
|
||||
.B -v
|
||||
turn on the verbose flag. This will display the module name and
|
||||
@ -71,7 +88,5 @@ equivalent to
|
||||
.B -v\fR.
|
||||
.SH "SEE ALSO"
|
||||
.IR gm2lcc (1),
|
||||
.IR gm2lgen (1),
|
||||
.IR gm2lorder (1)
|
||||
and
|
||||
.IR gm2 (1).
|
||||
|
@ -162,7 +162,7 @@ _M2_ErrnoCategory_init (int, char *argv[], char *env[])
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
_M2_ErrnoCategory_finish (int, char *argv[], char *env[])
|
||||
_M2_ErrnoCategory_fini (int, char *argv[], char *env[])
|
||||
{
|
||||
}
|
||||
|
||||
@ -175,6 +175,6 @@ struct _M2_ErrnoCategory_ctor { _M2_ErrnoCategory_ctor (); } _M2_ErrnoCategory_c
|
||||
|
||||
_M2_ErrnoCategory_ctor::_M2_ErrnoCategory_ctor (void)
|
||||
{
|
||||
M2RTS_RegisterModule ("ErrnoCategory", _M2_ErrnoCategory_init, _M2_ErrnoCategory_finish,
|
||||
M2RTS_RegisterModule ("ErrnoCategory", _M2_ErrnoCategory_init, _M2_ErrnoCategory_fini,
|
||||
_M2_ErrnoCategory_dep);
|
||||
}
|
||||
|
@ -106,7 +106,7 @@ _M2_RTco_init (int argc, char *argv[], char *envp[])
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
_M2_RTco_finish (int argc, char *argv[], char *envp[])
|
||||
_M2_RTco_fini (int argc, char *argv[], char *envp[])
|
||||
{
|
||||
}
|
||||
|
||||
@ -462,6 +462,6 @@ struct _M2_RTco_ctor { _M2_RTco_ctor (); } _M2_RTco_ctor;
|
||||
|
||||
_M2_RTco_ctor::_M2_RTco_ctor (void)
|
||||
{
|
||||
M2RTS_RegisterModule ("RTco", _M2_RTco_init, _M2_RTco_finish,
|
||||
M2RTS_RegisterModule ("RTco", _M2_RTco_init, _M2_RTco_fini,
|
||||
_M2_RTco_dep);
|
||||
}
|
||||
|
@ -241,7 +241,7 @@ _M2_SysExceptions_init (int, char *[], char *[])
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
_M2_SysExceptions_finish (int, char *[], char *[])
|
||||
_M2_SysExceptions_fini (int, char *[], char *[])
|
||||
{
|
||||
}
|
||||
|
||||
@ -254,6 +254,6 @@ struct _M2_SysExceptions_ctor { _M2_SysExceptions_ctor (); } _M2_SysExceptions_c
|
||||
|
||||
_M2_SysExceptions_ctor::_M2_SysExceptions_ctor (void)
|
||||
{
|
||||
M2RTS_RegisterModule ("SysExceptions", _M2_SysExceptions_init, _M2_SysExceptions_finish,
|
||||
M2RTS_RegisterModule ("SysExceptions", _M2_SysExceptions_init, _M2_SysExceptions_fini,
|
||||
_M2_SysExceptions_dep);
|
||||
}
|
||||
|
@ -52,7 +52,7 @@ _M2_errno_init (int, char *[], char *[])
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
_M2_errno_finish (int, char *[], char *[])
|
||||
_M2_errno_fini (int, char *[], char *[])
|
||||
{
|
||||
}
|
||||
|
||||
@ -65,6 +65,6 @@ struct _M2_errno_ctor { _M2_errno_ctor (); } _M2_errno_ctor;
|
||||
|
||||
_M2_errno_ctor::_M2_errno_ctor (void)
|
||||
{
|
||||
M2RTS_RegisterModule ("errno", _M2_errno_init, _M2_errno_finish,
|
||||
M2RTS_RegisterModule ("errno", _M2_errno_init, _M2_errno_fini,
|
||||
_M2_errno_dep);
|
||||
}
|
||||
|
@ -1969,7 +1969,7 @@ _M2_termios_init (int, char *[], char *[])
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
_M2_termios_finish (int, char *[], char *[])
|
||||
_M2_termios_fini (int, char *[], char *[])
|
||||
{
|
||||
}
|
||||
|
||||
@ -1982,6 +1982,6 @@ struct _M2_termios_ctor { _M2_termios_ctor (); } _M2_termios_ctor;
|
||||
|
||||
_M2_termios_ctor::_M2_termios_ctor (void)
|
||||
{
|
||||
M2RTS_RegisterModule ("termios", _M2_termios_init, _M2_termios_finish,
|
||||
M2RTS_RegisterModule ("termios", _M2_termios_init, _M2_termios_fini,
|
||||
_M2_termios_dep);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user