Clean option handling and add size model and target machine options.

This commit is contained in:
David Brown 2016-09-21 18:28:17 +01:00
parent 1c94abedc6
commit 76b6a8fc23
202 changed files with 1178 additions and 1313 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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 ------------------------- *)

View 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

View file

@ -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;

View file

@ -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

View file

@ -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;