mirror of
https://github.com/vishapoberon/compiler.git
synced 2026-04-06 04:02:25 +00:00
Clean option handling and add size model and target machine options.
This commit is contained in:
parent
1c94abedc6
commit
76b6a8fc23
202 changed files with 1178 additions and 1313 deletions
|
|
@ -830,11 +830,11 @@ MODULE OPB; (* RC 6.3.89 / 21.2.94 *) (* object model 17.1.93 *)
|
|||
g: INTEGER; (* expression (source) form *)
|
||||
p, q: OPT.Struct;
|
||||
BEGIN
|
||||
IF OPM.Verbose THEN
|
||||
IF OPM.verbose IN OPM.opt THEN
|
||||
OPM.LogWLn; OPM.LogWStr("PROCEDURE CheckAssign"); OPM.LogWLn;
|
||||
END;
|
||||
y := ynode^.typ; f := x^.form; g := y^.form;
|
||||
IF OPM.Verbose THEN
|
||||
IF OPM.verbose IN OPM.opt THEN
|
||||
OPM.LogWStr("y.form = "); OPM.LogWNum(y.form, 0); OPM.LogWLn;
|
||||
OPM.LogWStr("f = "); OPM.LogWNum(f, 0); OPM.LogWLn;
|
||||
OPM.LogWStr("g = "); OPM.LogWNum(g, 0); OPM.LogWLn;
|
||||
|
|
|
|||
|
|
@ -38,7 +38,6 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
|
|||
|
||||
VAR
|
||||
indentLevel: INTEGER;
|
||||
ptrinit, mainprog, ansi: BOOLEAN;
|
||||
hashtab: ARRAY 105 OF SHORTINT;
|
||||
keytab: ARRAY 50, 9 OF CHAR;
|
||||
GlbPtrs: BOOLEAN;
|
||||
|
|
@ -48,11 +47,7 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
|
|||
PROCEDURE Init*;
|
||||
BEGIN
|
||||
indentLevel := 0;
|
||||
ptrinit := OPM.ptrinit IN OPM.opt;
|
||||
(*mainprog := OPM.mainprog IN OPM.opt;*)
|
||||
mainprog := OPM.mainProg OR OPM.mainLinkStat;
|
||||
ansi := OPM.ansi IN OPM.opt;
|
||||
IF ansi THEN BodyNameExt := "__init(void)" ELSE BodyNameExt := "__init()" END
|
||||
BodyNameExt := "__init(void)"
|
||||
END Init;
|
||||
|
||||
PROCEDURE Indent* (count: INTEGER);
|
||||
|
|
@ -189,9 +184,7 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
|
|||
ELSIF (form = OPT.ProcTyp) OR (comp IN {OPT.Array, OPT.DynArr}) THEN
|
||||
IF openClause THEN OPM.Write(')'); openClause := FALSE END ;
|
||||
IF form = OPT.ProcTyp THEN
|
||||
IF ansi THEN OPM.Write(")"); AnsiParamList(typ^.link, FALSE)
|
||||
ELSE OPM.WriteString(")()")
|
||||
END ;
|
||||
OPM.Write(")"); AnsiParamList(typ^.link, FALSE);
|
||||
EXIT
|
||||
ELSIF comp = OPT.Array THEN
|
||||
OPM.Write('['); OPM.WriteInt(typ^.n); OPM.Write(']')
|
||||
|
|
@ -373,9 +366,7 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
|
|||
VAR par: OPT.Object;
|
||||
BEGIN
|
||||
IF obj^.typ # OPT.notyp THEN DefineType(obj^.typ) END ;
|
||||
IF ansi THEN par := obj^.link;
|
||||
WHILE par # NIL DO DefineType(par^.typ); par := par^.link END
|
||||
END
|
||||
par := obj^.link; WHILE par # NIL DO DefineType(par^.typ); par := par^.link END
|
||||
END DefineTProcTypes;
|
||||
|
||||
PROCEDURE DeclareTProcs(obj: OPT.Object; VAR empty: BOOLEAN);
|
||||
|
|
@ -428,11 +419,7 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
|
|||
Str1(", #, ", obj^.adr DIV 10000H);
|
||||
IF obj^.typ = OPT.notyp THEN OPM.WriteString('void') ELSE Ident(obj^.typ^.strobj) END ;
|
||||
OPM.WriteString("(*)");
|
||||
IF ansi THEN
|
||||
AnsiParamList(obj^.link, FALSE);
|
||||
ELSE
|
||||
OPM.WriteString("()");
|
||||
END ;
|
||||
AnsiParamList(obj^.link, FALSE);
|
||||
OPM.WriteString(", ");
|
||||
DeclareParams(obj^.link, TRUE);
|
||||
OPM.Write(")"); OPM.WriteLn
|
||||
|
|
@ -713,7 +700,7 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
|
|||
EndStat; BegStat;
|
||||
OPM.WriteString("LONGINT *"); Ident(obj); OPM.WriteString(TagExt);
|
||||
base := NIL
|
||||
ELSIF ptrinit & (vis = 0) & (obj^.mnolev > 0) & (obj^.typ^.form = OPT.Pointer) THEN
|
||||
ELSIF (OPM.ptrinit IN OPM.opt) & (vis = 0) & (obj^.mnolev > 0) & (obj^.typ^.form = OPT.Pointer) THEN
|
||||
OPM.WriteString(" = NIL")
|
||||
END
|
||||
END ;
|
||||
|
|
@ -754,16 +741,9 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
|
|||
BEGIN
|
||||
IF proc^.typ = OPT.notyp THEN OPM.WriteString('void') ELSE Ident(proc^.typ^.strobj) END ;
|
||||
OPM.Write(' '); Ident(proc); OPM.Write(' ');
|
||||
IF ansi THEN
|
||||
AnsiParamList(proc^.link, TRUE);
|
||||
IF ~define THEN OPM.Write(";") END ;
|
||||
OPM.WriteLn;
|
||||
ELSIF define THEN
|
||||
DeclareParams(proc^.link, FALSE);
|
||||
OPM.WriteLn;
|
||||
Indent(1); IdentList(proc^.link, 2(* map REAL to double *)); Indent(-1)
|
||||
ELSE OPM.WriteString("();"); OPM.WriteLn
|
||||
END
|
||||
AnsiParamList(proc^.link, TRUE);
|
||||
IF ~define THEN OPM.Write(";") END ;
|
||||
OPM.WriteLn
|
||||
END ProcHeader;
|
||||
|
||||
PROCEDURE ProcPredefs (obj: OPT.Object; vis: SHORTINT); (* forward declaration of procedures *)
|
||||
|
|
@ -846,7 +826,6 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
|
|||
| OPM.typchk: OPM.Write("t")
|
||||
| OPM.newsf: OPM.Write("s")
|
||||
| OPM.ptrinit: OPM.Write("p")
|
||||
| OPM.ansi: OPM.Write("k")
|
||||
| OPM.assert: OPM.Write("a")
|
||||
| OPM.extsf: OPM.Write("e")
|
||||
| OPM.mainprog: OPM.Write("m")
|
||||
|
|
@ -932,14 +911,7 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
|
|||
typ := var^.typ;
|
||||
IF NofPtrs(typ) > 0 THEN
|
||||
IF ~GlbPtrs THEN GlbPtrs := TRUE;
|
||||
OPM.WriteString('static ');
|
||||
IF ansi THEN
|
||||
OPM.WriteString("void EnumPtrs(void (*P)(void*))")
|
||||
ELSE
|
||||
OPM.WriteString("void EnumPtrs(P)"); OPM.WriteLn;
|
||||
OPM.Write(Tab); OPM.WriteString("void (*P)();");
|
||||
END ;
|
||||
OPM.WriteLn;
|
||||
OPM.WriteString("static void EnumPtrs(void (*P)(void*))"); OPM.WriteLn;
|
||||
BegBlk
|
||||
END ;
|
||||
BegStat;
|
||||
|
|
@ -970,27 +942,22 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
|
|||
PROCEDURE EnterBody*;
|
||||
BEGIN
|
||||
OPM.WriteLn; OPM.WriteString(Export);
|
||||
IF mainprog THEN
|
||||
IF ansi THEN
|
||||
OPM.WriteString("int main(int argc, char **argv)"); OPM.WriteLn;
|
||||
ELSE
|
||||
OPM.WriteString("main(argc, argv)"); OPM.WriteLn;
|
||||
OPM.Write(Tab); OPM.WriteString("int argc; char **argv;"); OPM.WriteLn
|
||||
END
|
||||
IF OPM.mainprog IN OPM.opt THEN
|
||||
OPM.WriteString("int main(int argc, char **argv)"); OPM.WriteLn;
|
||||
ELSE
|
||||
OPM.WriteString("void *");
|
||||
OPM.WriteString(OPM.modName); OPM.WriteString(BodyNameExt); OPM.WriteLn;
|
||||
END ;
|
||||
BegBlk; BegStat;
|
||||
IF mainprog THEN OPM.WriteString("__INIT(argc, argv)") ELSE OPM.WriteString("__DEFMOD") END ;
|
||||
IF OPM.mainprog IN OPM.opt THEN OPM.WriteString("__INIT(argc, argv)") ELSE OPM.WriteString("__DEFMOD") END ;
|
||||
EndStat;
|
||||
IF mainprog & demoVersion THEN BegStat;
|
||||
IF (OPM.mainprog IN OPM.opt) & demoVersion THEN BegStat;
|
||||
OPM.WriteString('/*don`t do it!*/ printf("DEMO VERSION: DO NOT USE THIS PROGRAM FOR ANY COMMERCIAL PURPOSE\n")');
|
||||
EndStat
|
||||
END ;
|
||||
InitImports(OPT.topScope^.right);
|
||||
BegStat;
|
||||
IF mainprog THEN OPM.WriteString('__REGMAIN("') ELSE OPM.WriteString('__REGMOD("') END ;
|
||||
IF OPM.mainprog IN OPM.opt THEN OPM.WriteString('__REGMAIN("') ELSE OPM.WriteString('__REGMOD("') END ;
|
||||
OPM.WriteString(OPM.modName);
|
||||
IF GlbPtrs THEN OPM.WriteString('", EnumPtrs)') ELSE OPM.WriteString('", 0)') END ;
|
||||
EndStat;
|
||||
|
|
@ -1000,7 +967,7 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
|
|||
PROCEDURE ExitBody*;
|
||||
BEGIN
|
||||
BegStat;
|
||||
IF mainprog THEN OPM.WriteString("__FINI;") ELSE OPM.WriteString("__ENDMOD;") END ;
|
||||
IF OPM.mainprog IN OPM.opt THEN OPM.WriteString("__FINI;") ELSE OPM.WriteString("__ENDMOD;") END ;
|
||||
OPM.WriteLn; EndBlk
|
||||
END ExitBody;
|
||||
|
||||
|
|
@ -1052,17 +1019,6 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
|
|||
END ;
|
||||
var := var^.link
|
||||
END ;
|
||||
IF ~ansi THEN
|
||||
var := proc^.link;
|
||||
WHILE var # NIL DO (* "unpromote" value real parameters *)
|
||||
IF (var^.typ^.form = OPT.Real) & (var^.mode = OPT.Var) THEN
|
||||
BegStat;
|
||||
Ident(var^.typ^.strobj); OPM.Write(' '); Ident(var); OPM.WriteString(" = _"); Ident(var);
|
||||
EndStat
|
||||
END ;
|
||||
var := var^.link
|
||||
END
|
||||
END ;
|
||||
var := proc^.link;
|
||||
WHILE var # NIL DO (* copy value array parameters *)
|
||||
IF (var^.typ^.comp IN {OPT.Array, OPT.DynArr}) & (var^.mode = OPT.Var) & (var^.typ^.sysflag = 0) THEN
|
||||
|
|
@ -1303,7 +1259,7 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
|
|||
IF dim # 0 THEN OPM.WriteInt(dim) END
|
||||
ELSE (* array *)
|
||||
WHILE dim > 0 DO array := array^.BaseTyp; DEC(dim) END;
|
||||
IF ansi THEN OPM.WriteInt(array.n) ELSE IntLiteral(array.n, OPM.AddressSize) END
|
||||
OPM.WriteInt(array.n)
|
||||
END
|
||||
END Len;
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
|
|||
typchk* = 3; (* type check on *)
|
||||
newsf* = 4; (* generation of new symbol file allowed *)
|
||||
ptrinit* = 5; (* pointer initialization *)
|
||||
ansi* = 6; (* ANSI or K&R style prototypes *)
|
||||
assert* = 7; (* assert evaluation *)
|
||||
extsf* = 9; (* extension of old symbol file allowed *)
|
||||
mainprog* = 10; (* translate module body into C main function *)
|
||||
|
|
@ -25,7 +24,7 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
|
|||
notcoloroutput* = 16; (* turn off color output *)
|
||||
forcenewsym* = 17; (* force new symbol file *)
|
||||
verbose* = 18; (* verbose *)
|
||||
defopt* = {inxchk, typchk, ptrinit, ansi, assert}; (* default options *)
|
||||
defopt* = {inxchk, typchk, ptrinit, assert}; (* default options *)
|
||||
|
||||
nilval* = 0;
|
||||
|
||||
|
|
@ -122,8 +121,6 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
|
|||
|
||||
S: INTEGER;
|
||||
|
||||
dontAsm-, dontLink-, mainProg-, mainLinkStat-, notColorOutput-, forceNewSym-, Verbose-: BOOLEAN;
|
||||
|
||||
OBERON: ARRAY 1024 OF CHAR;
|
||||
MODULES: ARRAY 1024 OF CHAR;
|
||||
|
||||
|
|
@ -143,25 +140,53 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
|
|||
|
||||
(* ------------------------- parameter handling -------------------------*)
|
||||
|
||||
PROCEDURE ScanOptions(VAR s: ARRAY OF CHAR; VAR opt: SET);
|
||||
PROCEDURE ScanOptions(s: ARRAY OF CHAR; VAR opt: SET);
|
||||
VAR i: INTEGER;
|
||||
BEGIN
|
||||
i := 1; (* skip - *)
|
||||
WHILE s[i] # 0X DO
|
||||
CASE s[i] OF
|
||||
|
||||
| "a": opt := opt / {assert}
|
||||
| "c": opt := opt / {dontlink}
|
||||
| "e": opt := opt / {extsf}
|
||||
| "f": opt := opt / {notcoloroutput}
|
||||
| "k": opt := opt / {ansi} (* undocumented *)
|
||||
| "m": opt := opt / {mainprog}
|
||||
| "p": opt := opt / {ptrinit}
|
||||
| "r": opt := opt / {ranchk}
|
||||
| "s": opt := opt / {newsf}
|
||||
| "t": opt := opt / {typchk}
|
||||
| "x": opt := opt / {inxchk}
|
||||
(* Run time safety *)
|
||||
| "p": opt := opt / {ptrinit} (* Initialise pointers to NIL. *)
|
||||
| "a": opt := opt / {assert} (* Halt on assertion failures. *)
|
||||
| "r": opt := opt / {ranchk} (* Halt on range check failures. *)
|
||||
| "t": opt := opt / {typchk} (* Halt on type guad failure. *)
|
||||
| "x": opt := opt / {inxchk} (* Halt on index out of range. *)
|
||||
|
||||
(* Symbol file management *)
|
||||
| "e": opt := opt / {extsf} (* Allow extension of old symbol file. *)
|
||||
| "s": opt := opt / {newsf} (* Allow generation of new symbol file. *)
|
||||
| "F": opt := opt / {forcenewsym} (* Force generation of new symbol file. *)
|
||||
|
||||
(* C compiler and linker control *)
|
||||
| "m": opt := opt / {mainprog} (* This module is main. Link dynamically. *)
|
||||
| "M": opt := opt / {mainlinkstat} (* This module is main. Link statically. *)
|
||||
| "S": opt := opt / {dontasm} (* Don't call C compiler *)
|
||||
| "c": opt := opt / {dontlink} (* Don't link. *)
|
||||
|
||||
(* Miscellaneous *)
|
||||
| "f": opt := opt / {notcoloroutput} (* Disable vt100 control characters in status output. *)
|
||||
| "V": opt := opt / {verbose}
|
||||
|
||||
(* Elementary type size model *)
|
||||
| "O": IF i+1 >= Strings.Length(s) THEN LogWStr("-O option requires following size model character."); LogWLn ELSE
|
||||
CASE s[i+1] OF
|
||||
|'2': ShortintSize := 1; IntegerSize := 2; LongintSize := 4; SetSize := 4 (* Original Oberon / Oberon 2 *)
|
||||
|'V': ShortintSize := 1; IntegerSize := 4; LongintSize := 8; SetSize := 8 (* Vishap 64 bit *)
|
||||
|'C': ShortintSize := 2; IntegerSize := 4; LongintSize := 8; SetSize := 8 (* Component Pascal *)
|
||||
ELSE LogWStr("Unrecognised size model character following -O."); LogWLn
|
||||
END;
|
||||
INC(i)
|
||||
END
|
||||
|
||||
(* Target machine address size and alignment *)
|
||||
| "A": IF i+2 >= Strings.Length(s) THEN LogWStr("-M option requires two following digits."); LogWLn ELSE
|
||||
AddressSize := ORD(s[i+1]) - ORD('0'); Alignment := ORD(s[i+2]) - ORD('0');
|
||||
INC(i, 2)
|
||||
END
|
||||
|
||||
(* Temporary build control option - remove when makefile updated to new options. *)
|
||||
| "B": IF s[i+1] # 0X THEN INC(i); IntegerSize := ORD(s[i]) - ORD('0') END;
|
||||
IF s[i+1] # 0X THEN INC(i); AddressSize := ORD(s[i]) - ORD('0') END;
|
||||
IF s[i+1] # 0X THEN INC(i); Alignment := ORD(s[i]) - ORD('0') END;
|
||||
|
|
@ -176,11 +201,6 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
|
|||
SetSize := 8;
|
||||
END;
|
||||
Files.SetSearchPath("")
|
||||
|
||||
| "F": opt := opt / {forcenewsym}
|
||||
| "M": opt := opt / {mainlinkstat}
|
||||
| "S": opt := opt / {dontasm}
|
||||
| "V": opt := opt / {verbose}
|
||||
ELSE
|
||||
LogWStr(" warning: option ");
|
||||
LogW(OptionChar);
|
||||
|
|
@ -223,20 +243,37 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
|
|||
LogWStr(' '); LogWStr(Configuration.name); LogWStr(' options {files {options}}.'); LogWLn; LogWLn;
|
||||
LogWStr('Where options = ["-" {option} ].'); LogWLn;
|
||||
LogWLn;
|
||||
LogWStr(" m - generate code for main module"); LogWLn;
|
||||
LogWStr(" M - generate code for main module and link object statically"); LogWLn;
|
||||
LogWStr(" s - generate new symbol file"); LogWLn;
|
||||
LogWStr(" e - allow extending the module interface"); LogWLn;
|
||||
LogWStr(" r - check value ranges"); LogWLn;
|
||||
LogWStr(" x - turn off array indices check"); LogWLn;
|
||||
LogWStr(" a - don't check ASSERTs at runtime, use this option in tested production code"); LogWLn;
|
||||
LogWStr(" p - turn off automatic pointer initialization"); LogWLn;
|
||||
LogWStr(" t - don't check type guards (use in rare cases such as low-level modules where every cycle counts)"); LogWLn;
|
||||
LogWStr(" S - don't call external assembler/compiler, only generate C code"); LogWLn;
|
||||
LogWStr(" c - don't call linker"); LogWLn;
|
||||
LogWStr(" f - don't use color output"); LogWLn;
|
||||
LogWStr(" F - force writing new symbol file in current directory"); LogWLn;
|
||||
LogWStr(" V - verbose output"); LogWLn;
|
||||
LogWStr(" Run time safety"); LogWLn;
|
||||
LogWStr(" -p Initialise pointers to NIL."); LogWLn;
|
||||
LogWStr(" -a Halt on assertion failures."); LogWLn;
|
||||
LogWStr(" -r Halt on range check failures."); LogWLn;
|
||||
LogWStr(" -t Halt on type guad failure."); LogWLn;
|
||||
LogWStr(" -x Halt on index out of range."); LogWLn;
|
||||
LogWLn;
|
||||
LogWStr(" Symbol file management"); LogWLn;
|
||||
LogWStr(" -e Allow extension of old symbol file."); LogWLn;
|
||||
LogWStr(" -s Allow generation of new symbol file."); LogWLn;
|
||||
LogWStr(" -F Force generation of new symbol file."); LogWLn;
|
||||
LogWLn;
|
||||
LogWStr(" C compiler and linker control"); LogWLn;
|
||||
LogWStr(" -m This module is main. Link dynamically."); LogWLn;
|
||||
LogWStr(" -M This module is main. Link statically."); LogWLn;
|
||||
LogWStr(" -S Don't call C compiler"); LogWLn;
|
||||
LogWStr(" -c Don't link."); LogWLn;
|
||||
LogWLn;
|
||||
LogWStr(" Miscellaneous"); LogWLn;
|
||||
LogWStr(" -f Disable vt100 control characters in status output."); LogWLn;
|
||||
LogWStr(" -V Display compiler debugging messages."); LogWLn;
|
||||
LogWLn;
|
||||
LogWStr(" Size model for elementary types"); LogWLn;
|
||||
LogWStr(" -O2 Original Oberon / Oberon-2: 8 bit SHORTINT, 16 bit INTEGER, 32 bit LONGINT and SET."); LogWLn;
|
||||
LogWStr(" -OC Component Pascal: 16 bit SHORTINT, 32 bit INTEGER, 64 bit LONGINT and SET."); LogWLn;
|
||||
LogWStr(" -OV Alternate large model: 8 bit SHORTINT, 32 bit INTEGER, 64 bit LONGINT and SET."); LogWLn;
|
||||
LogWLn;
|
||||
LogWStr(" Target machine address size and alignment"); LogWLn;
|
||||
LogWStr(" -A44 32 bit addresses, 32 bit alignment (e.g. Unix/linux 32 bit on x86)."); LogWLn;
|
||||
LogWStr(" -A48 32 bit addresses, 64 bit alignment (e.g. Windows 32 bit on x86, linux 32 bit on arm)."); LogWLn;
|
||||
LogWStr(" -A88 66 bit addresses, 64 bit alignment (e.g. 64 bit platforms)."); LogWLn;
|
||||
LogWLn;
|
||||
LogWStr('Initial options specify defaults for all files.'); LogWLn;
|
||||
LogWStr('Options following a filename are specific to that file.'); LogWLn;
|
||||
|
|
@ -267,6 +304,7 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
|
|||
INC(S); s:=""; Platform.GetArg(S, s)
|
||||
END;
|
||||
|
||||
(*
|
||||
dontAsm := dontasm IN opt;
|
||||
dontLink := dontlink IN opt;
|
||||
mainProg := mainprog IN opt;
|
||||
|
|
@ -274,8 +312,9 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
|
|||
notColorOutput := notcoloroutput IN opt;
|
||||
forceNewSym := forcenewsym IN opt;
|
||||
Verbose := verbose IN opt;
|
||||
*)
|
||||
|
||||
IF mainLinkStat THEN INCL(glbopt, mainprog) END; (* sic *)
|
||||
IF mainlinkstat IN opt THEN INCL(glbopt, mainprog); INCL(opt, mainprog) END;
|
||||
|
||||
GetProperties;
|
||||
END InitOptions;
|
||||
|
|
@ -346,13 +385,13 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
|
|||
buf: ARRAY 1024 OF CHAR;
|
||||
BEGIN
|
||||
IF n >= 0 THEN
|
||||
IF ~notColorOutput THEN vt100.SetAttr(vt100.Red) END;
|
||||
IF ~(notcoloroutput IN opt) THEN vt100.SetAttr(vt100.Red) END;
|
||||
LogWStr(" err ");
|
||||
IF ~notColorOutput THEN vt100.SetAttr(vt100.ResetAll) END;
|
||||
IF ~(notcoloroutput IN opt) THEN vt100.SetAttr(vt100.ResetAll) END;
|
||||
ELSE
|
||||
IF ~notColorOutput THEN vt100.SetAttr(vt100.Magenta) END;
|
||||
IF ~(notcoloroutput IN opt) THEN vt100.SetAttr(vt100.Magenta) END;
|
||||
LogWStr(" warning "); n := -n;
|
||||
IF ~notColorOutput THEN vt100.SetAttr(vt100.ResetAll) END;
|
||||
IF ~(notcoloroutput IN opt) THEN vt100.SetAttr(vt100.ResetAll) END;
|
||||
END ;
|
||||
LogWNum(n, 1);
|
||||
LogWStr(" ");
|
||||
|
|
@ -425,9 +464,9 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
|
|||
i := SHORT(Longint(pos - ErrorLineStartPos));
|
||||
WHILE i > 0 DO LogW(" "); DEC(i) END;
|
||||
|
||||
IF ~notColorOutput THEN vt100.SetAttr(vt100.Green) END;
|
||||
IF ~(notcoloroutput IN opt) THEN vt100.SetAttr(vt100.Green) END;
|
||||
LogW("^");
|
||||
IF ~notColorOutput THEN vt100.SetAttr(vt100.ResetAll) END;
|
||||
IF ~(notcoloroutput IN opt) THEN vt100.SetAttr(vt100.ResetAll) END;
|
||||
|
||||
Files.Close(f);
|
||||
END ShowLine;
|
||||
|
|
@ -604,7 +643,7 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
|
|||
MaxSet := SetSize * 8 - 1;
|
||||
MaxIndex := SignedMaximum(AddressSize);
|
||||
|
||||
IF Verbose THEN VerboseListSizes END;
|
||||
IF verbose IN opt THEN VerboseListSizes END;
|
||||
END GetProperties;
|
||||
|
||||
(* ------------------------- Read Symbol File ------------------------- *)
|
||||
|
|
|
|||
|
|
@ -1143,10 +1143,8 @@ END Import;
|
|||
expCtxt.nofm := 1; expCtxt.locmno[0] := 0;
|
||||
i := 1; WHILE i < maxImps DO expCtxt.locmno[i] := -1; INC(i) END;
|
||||
OutObj(topScope^.right);
|
||||
ext := sfpresent & symExtended; new := ~sfpresent OR symNew;
|
||||
IF OPM.forceNewSym THEN
|
||||
new := TRUE
|
||||
END; (* for bootstrapping -- noch *)
|
||||
ext := sfpresent & symExtended;
|
||||
new := ~sfpresent OR symNew OR (OPM.forcenewsym IN OPM.opt);
|
||||
IF OPM.noerr & sfpresent & (impCtxt.reffp # expCtxt.reffp) THEN
|
||||
new := TRUE;
|
||||
IF ~extsf THEN err(155) END
|
||||
|
|
|
|||
|
|
@ -46,7 +46,6 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96
|
|||
|
||||
|
||||
VAR
|
||||
assert, inxchk, mainprog, ansi: BOOLEAN;
|
||||
stamp: INTEGER; (* unique number for nested objects *)
|
||||
recno: LONGINT; (* number of anonymous record types *)
|
||||
|
||||
|
|
@ -104,10 +103,6 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96
|
|||
PROCEDURE Init*;
|
||||
BEGIN
|
||||
stamp := 0; recno := 0; nofExitLabels := 0;
|
||||
assert := OPM.assert IN OPM.opt;
|
||||
inxchk := OPM.inxchk IN OPM.opt;
|
||||
mainprog := OPM.mainprog IN OPM.opt;
|
||||
ansi := OPM.ansi IN OPM.opt
|
||||
END Init;
|
||||
|
||||
PROCEDURE ^Traverse (obj, outerScope: OPT.Object; exported: BOOLEAN);
|
||||
|
|
@ -333,7 +328,7 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96
|
|||
|
||||
PROCEDURE Index(n, d: OPT.Node; prec, dim: INTEGER);
|
||||
BEGIN
|
||||
IF ~inxchk
|
||||
IF ~(OPM.inxchk IN OPM.opt)
|
||||
OR (n^.right^.class = OPT.Nconst) & ((n^.right^.conval^.intval = 0) OR (n^.left^.typ^.comp # OPT.DynArr)) THEN
|
||||
expr(n^.right, prec)
|
||||
ELSE
|
||||
|
|
@ -434,7 +429,7 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96
|
|||
PROCEDURE ParIntLiteral(n: SYSTEM.INT64; size: LONGINT);
|
||||
BEGIN
|
||||
(* Literal parameters (other than varargs) do not need an explicit size cast on ansi C compilers. *)
|
||||
IF ansi THEN OPM.WriteInt(n) ELSE OPC.IntLiteral(n, size) END
|
||||
OPM.WriteInt(n)
|
||||
END ParIntLiteral;
|
||||
|
||||
PROCEDURE ActualPar(n: OPT.Node; fp: OPT.Object);
|
||||
|
|
@ -448,22 +443,16 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96
|
|||
END ;
|
||||
IF ~(n^.typ^.comp IN {OPT.Array, OPT.DynArr}) THEN
|
||||
IF mode = OPT.VarPar THEN
|
||||
IF ansi & (typ # n^.typ) THEN OPM.WriteString("(void*)") END ;
|
||||
IF typ # n^.typ THEN OPM.WriteString("(void*)") END;
|
||||
OPM.Write("&"); prec := 9
|
||||
ELSIF ansi THEN
|
||||
ELSE
|
||||
IF (comp IN {OPT.Array, OPT.DynArr}) & (n^.class = OPT.Nconst) THEN
|
||||
OPM.WriteString("(CHAR*)") (* force to unsigned char *)
|
||||
ELSIF (form = OPT.Pointer) & (typ # n^.typ) & (n^.typ # OPT.niltyp) THEN
|
||||
OPM.WriteString("(void*)") (* type extension *)
|
||||
END
|
||||
ELSE
|
||||
IF (form IN {OPT.Real, OPT.LReal}) & (n^.typ^.form = OPT.Int) THEN (* real promotion *)
|
||||
OPM.WriteString("(double)"); prec := 9
|
||||
ELSIF form = OPT.Int THEN
|
||||
SizeCast(n.typ.size, typ.size)
|
||||
END
|
||||
END
|
||||
ELSIF ansi THEN
|
||||
ELSE
|
||||
(* casting of params should be simplified eventually *)
|
||||
IF (mode = OPT.VarPar) & (typ # n^.typ) & (prec = MinPrec) THEN OPM.WriteString("(void*)") END
|
||||
END;
|
||||
|
|
@ -903,7 +892,8 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96
|
|||
END ;
|
||||
ActualPar(n^.right, n^.obj)
|
||||
| OPT.Nifelse: IF n^.subcl # OPT.assertfn THEN IfStat(n, FALSE, outerProc)
|
||||
ELSIF assert THEN OPM.WriteString("__ASSERT("); expr(n^.left^.left^.left, MinPrec); OPM.WriteString(Comma);
|
||||
ELSIF OPM.assert IN OPM.opt THEN
|
||||
OPM.WriteString("__ASSERT("); expr(n^.left^.left^.left, MinPrec); OPM.WriteString(Comma);
|
||||
OPM.WriteInt(n^.left^.right^.right^.conval^.intval); OPM.Write(CloseParen); OPC.EndStat
|
||||
END
|
||||
| OPT.Ncase: INC(exit.level); CaseStat(n, outerProc); DEC(exit.level)
|
||||
|
|
@ -925,7 +915,7 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96
|
|||
OPM.WriteString("goto exit__"); OPM.WriteInt(exit.label)
|
||||
END
|
||||
| OPT.Nreturn: IF OPM.level = 0 THEN
|
||||
IF mainprog THEN OPM.WriteString("__FINI") ELSE OPM.WriteString("__ENDMOD") END
|
||||
IF OPM.mainprog IN OPM.opt THEN OPM.WriteString("__FINI") ELSE OPM.WriteString("__ENDMOD") END
|
||||
ELSE
|
||||
IF n^.left # NIL THEN
|
||||
(* Make local copy of result before ExitProc deletes dynamic vars *)
|
||||
|
|
@ -953,7 +943,7 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96
|
|||
|
||||
PROCEDURE Module*(prog: OPT.Node);
|
||||
BEGIN
|
||||
IF ~mainprog THEN OPC.GenHdr(prog^.right); OPC.GenHdrIncludes END ;
|
||||
IF ~(OPM.mainprog IN OPM.opt) THEN OPC.GenHdr(prog^.right); OPC.GenHdrIncludes END ;
|
||||
OPC.GenBdy(prog^.right); stat(prog, NIL)
|
||||
END Module;
|
||||
|
||||
|
|
|
|||
|
|
@ -22,16 +22,16 @@ MODULE Vishap; (* J. Templ 3.2.95 *)
|
|||
OPC.Init;
|
||||
OPV.Module(p);
|
||||
IF OPM.noerr THEN
|
||||
IF (OPM.mainProg OR OPM.mainLinkStat) & (OPM.modName # "SYSTEM") THEN
|
||||
IF (OPM.mainprog IN OPM.opt) & (OPM.modName # "SYSTEM") THEN
|
||||
OPM.DeleteNewSym;
|
||||
IF ~OPM.notColorOutput THEN vt100.SetAttr(vt100.Green) END;
|
||||
IF ~(OPM.notcoloroutput IN OPM.opt) THEN vt100.SetAttr(vt100.Green) END;
|
||||
OPM.LogWStr(" Main program.");
|
||||
IF ~OPM.notColorOutput THEN vt100.SetAttr(vt100.ResetAll) END;
|
||||
IF ~(OPM.notcoloroutput IN OPM.opt) THEN vt100.SetAttr(vt100.ResetAll) END;
|
||||
ELSE
|
||||
IF new THEN
|
||||
IF ~OPM.notColorOutput THEN vt100.SetAttr(vt100.Green) END;
|
||||
IF ~(OPM.notcoloroutput IN OPM.opt) THEN vt100.SetAttr(vt100.Green) END;
|
||||
OPM.LogWStr(" New symbol file.");
|
||||
IF ~OPM.notColorOutput THEN vt100.SetAttr(vt100.ResetAll) END;
|
||||
IF ~(OPM.notcoloroutput IN OPM.opt) THEN vt100.SetAttr(vt100.ResetAll) END;
|
||||
OPM.RegisterNewSym
|
||||
ELSIF ext THEN
|
||||
OPM.LogWStr(" Extended symbol file.");
|
||||
|
|
@ -90,12 +90,12 @@ MODULE Vishap; (* J. Templ 3.2.95 *)
|
|||
END;
|
||||
|
||||
(* 'assemble' (i.e. c compile) .c to object or executable. *)
|
||||
IF ~OPM.dontAsm THEN
|
||||
IF OPM.dontLink THEN
|
||||
IF ~(OPM.dontasm IN OPM.opt) THEN
|
||||
IF OPM.dontlink IN OPM.opt THEN
|
||||
(* If not linking, just assemble each module. *)
|
||||
extTools.Assemble(OPM.modName)
|
||||
ELSE
|
||||
IF ~(OPM.mainProg OR OPM.mainLinkStat) THEN
|
||||
IF ~(OPM.mainprog IN OPM.opt) THEN
|
||||
(* Assemble non main rogram and add object name to link list *)
|
||||
extTools.Assemble(OPM.modName);
|
||||
Strings.Append(" ", modulesobj);
|
||||
|
|
@ -103,7 +103,7 @@ MODULE Vishap; (* J. Templ 3.2.95 *)
|
|||
Strings.Append(Configuration.objext, modulesobj)
|
||||
ELSE
|
||||
(* Assemble and link main program *)
|
||||
extTools.LinkMain (OPM.modName, OPM.mainLinkStat, modulesobj)
|
||||
extTools.LinkMain(OPM.modName, OPM.mainlinkstat IN OPM.opt, modulesobj)
|
||||
END
|
||||
END
|
||||
END
|
||||
|
|
|
|||
|
|
@ -8,7 +8,9 @@ VAR compilationOptions, CFLAGS: ARRAY 1023 OF CHAR;
|
|||
PROCEDURE execute(title: ARRAY OF CHAR; cmd: ARRAY OF CHAR);
|
||||
VAR r, status, exitcode: INTEGER;
|
||||
BEGIN
|
||||
IF OPM.Verbose THEN Console.String(title); Console.String(cmd); Console.Ln END;
|
||||
IF OPM.verbose IN OPM.opt THEN
|
||||
Console.String(title); Console.String(cmd); Console.Ln
|
||||
END;
|
||||
r := Platform.System(cmd);
|
||||
status := r MOD 128;
|
||||
exitcode := r DIV 256;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue