Simplify parameterisable memory model variables.

This commit is contained in:
David Brown 2016-09-21 14:28:53 +01:00
parent 20a97bb570
commit 1c94abedc6
201 changed files with 607 additions and 763 deletions

View file

@ -1053,7 +1053,7 @@ MODULE OPB; (* RC 6.3.89 / 21.2.94 *) (* object model 17.1.93 *)
OPT.movefn: (*SYSTEM.GET, SYSTEM.PUT, SYSTEM.BIT, SYSTEM.MOVE*)
IF (x^.class = OPT.Ntype) OR (x^.class = OPT.Nproc) THEN err(126)
ELSIF (x^.class = OPT.Nconst) & (f = OPT.Int) & (x.typ.size < OPT.linttyp.size) THEN Convert(x, OPT.linttyp)
ELSIF ~((x.typ.form IN {OPT.Pointer, OPT.Int}) & (x.typ.size = OPM.PointerSize)) THEN err(111); x^.typ := OPT.linttyp
ELSIF ~((x.typ.form IN {OPT.Pointer, OPT.Int}) & (x.typ.size = OPM.AddressSize)) THEN err(111); x^.typ := OPT.linttyp
END
|OPT.getrfn,
OPT.putrfn: (*SYSTEM.GETREG, SYSTEM.PUTREG*)
@ -1230,7 +1230,7 @@ MODULE OPB; (* RC 6.3.89 / 21.2.94 *) (* object model 17.1.93 *)
|OPT.movefn: (*SYSTEM.MOVE*)
IF (x^.class = OPT.Ntype) OR (x^.class = OPT.Nproc) THEN err(126)
ELSIF (x^.class = OPT.Nconst) & (f = OPT.Int) & (x.typ.size < OPT.linttyp.size) THEN Convert(x, OPT.linttyp)
ELSIF ~((x.typ.form IN {OPT.Pointer, OPT.Int}) & (x.typ.size = OPM.PointerSize)) THEN err(111); x^.typ := OPT.linttyp
ELSIF ~((x.typ.form IN {OPT.Pointer, OPT.Int}) & (x.typ.size = OPM.AddressSize)) THEN err(111); x^.typ := OPT.linttyp
END;
p^.link := x
|OPT.assertfn: (*ASSERT*)

View file

@ -552,7 +552,7 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
IF typ^.strobj # NIL THEN OPM.WriteStringVar(typ^.strobj^.name) END ;
OPM.Write(DoubleQuote);
Str1(', #), {', typ^.size);
nofptrs := 0; PutPtrOffsets(typ, 0, nofptrs); Str1("#}}", -(nofptrs + 1) * OPM.PointerSize);
nofptrs := 0; PutPtrOffsets(typ, 0, nofptrs); Str1("#}}", -(nofptrs + 1) * OPM.AddressSize);
EndStat
END TDescDecl;
@ -1303,7 +1303,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.PointerSize) END
IF ansi THEN OPM.WriteInt(array.n) ELSE IntLiteral(array.n, OPM.AddressSize) END
END
END Len;

View file

@ -88,10 +88,11 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
VAR
SourceFileName : ARRAY 256 OF CHAR;
Alignment*: INTEGER;
(* Parameter selectable sizes *)
Alignment*,
AddressSize*, SetSize*,
ShortintSize*, IntegerSize*, LongintSize*: INTEGER;
ByteSize*, CharSize*, BoolSize*, SIntSize*, IntSize*,
LIntSize*, SetSize*, RealSize*, LRealSize*, PointerSize*, ProcSize*, RecSize*,
MaxSet*: INTEGER;
MaxIndex*: SYSTEM.INT64;
@ -161,13 +162,21 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
| "t": opt := opt / {typchk}
| "x": opt := opt / {inxchk}
| "B": IF s[i+1] # 0X THEN INC(i); IntSize := ORD(s[i]) - ORD('0') END;
IF s[i+1] # 0X THEN INC(i); PointerSize := ORD(s[i]) - ORD('0') END;
| "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;
ASSERT((IntSize = 2) OR (IntSize = 4));
ASSERT((PointerSize = 4) OR (PointerSize = 8));
ASSERT((IntegerSize = 2) OR (IntegerSize = 4));
ASSERT((AddressSize = 4) OR (AddressSize = 8));
ASSERT((Alignment = 4) OR (Alignment = 8));
IF IntegerSize = 2 THEN
LongintSize := 4;
SetSize := 4;
ELSE
LongintSize := 8;
SetSize := 8;
END;
Files.SetSearchPath("")
| "F": opt := opt / {forcenewsym}
| "M": opt := opt / {mainlinkstat}
| "S": opt := opt / {dontasm}
@ -529,20 +538,24 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
PROCEDURE VerboseListSizes;
BEGIN
LogWLn;
LogWStr("Type Size Alignement"); LogWLn;
(*LogWStr("Type Size Alignement"); LogWLn;*)
LogWStr("Type Size"); LogWLn;
(*
LogWStr("CHAR "); LogWNum(CharSize, 4); (* LogWNum(CharAlign, 5); *) LogWLn;
LogWStr("BOOLEAN "); LogWNum(BoolSize, 4); (* LogWNum(BoolAlign, 5); *) LogWLn;
LogWStr("SHORTINT "); LogWNum(SIntSize, 4); (* LogWNum(SIntAlign, 5); *) LogWLn;
LogWStr("INTEGER "); LogWNum(IntSize, 4); (* LogWNum(IntAlign, 5); *) LogWLn;
LogWStr("LONGINT "); LogWNum(LIntSize, 4); (* LogWNum(LIntAlign, 5); *) LogWLn;
LogWStr("SET "); LogWNum(SetSize, 4); (* LogWNum(SetAlign, 5); *) LogWLn;
LogWStr("REAL "); LogWNum(RealSize, 4); (* LogWNum(RealAlign, 5); *) LogWLn;
LogWStr("LONGREAL "); LogWNum(LRealSize, 4); (* LogWNum(LRealAlign, 5); *) LogWLn;
LogWStr("PTR "); LogWNum(PointerSize, 4); (* LogWNum(PointerAlign, 5); *) LogWLn;
LogWStr("PROC "); LogWNum(ProcSize, 4); (* LogWNum(ProcAlign, 5); *) LogWLn;
LogWStr("RECORD "); LogWNum(RecSize, 4); (* LogWNum(RecAlign, 5); *) LogWLn;
(*LogWStr("ENDIAN "); LogWNum(ByteOrder, 4); LogWNum(BitOrder, 5); LogWLn;*)
LogWStr("PROC "); LogWNum(ProcSize, 4); (* LogWNum(ProcAlign, 5); *) LogWLn;
LogWStr("ENDIAN "); LogWNum(ByteOrder, 4); LogWNum(BitOrder, 5); LogWLn;
*)
LogWStr("SHORTINT "); LogWNum(ShortintSize, 4); (* LogWNum(SIntAlign, 5); *) LogWLn;
LogWStr("INTEGER "); LogWNum(IntegerSize, 4); (* LogWNum(IntAlign, 5); *) LogWLn;
LogWStr("LONGINT "); LogWNum(LongintSize, 4); (* LogWNum(LIntAlign, 5); *) LogWLn;
LogWStr("SET "); LogWNum(SetSize, 4); (* LogWNum(SetAlign, 5); *) LogWLn;
LogWStr("ADDRESS "); LogWNum(AddressSize, 4); (* LogWNum(PointerAlign, 5); *) LogWLn;
LogWLn;
LogWStr("Alignment: "); LogWNum(Alignment, 4); LogWLn;
(*
LogWStr("Min shortint "); LogWNum(MinSInt, 4); LogWLn;
LogWStr("Max shortint "); LogWNum(MaxSInt, 4); LogWLn;
@ -582,25 +595,14 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
the module startup code, and maybe overridden by the -Bnnn bootstrap
parameter *)
(* Derived sizes *)
ProcSize := PointerSize;
LIntSize := IntSize * 2;
SetSize := LIntSize;
IF RealSize = 4 THEN MaxReal := 3.40282346D38
ELSIF RealSize = 8 THEN MaxReal := 1.7976931348623157D307 * 9.999999
MaxReal := 3.40282346D38; (* REAL is 4 bytes *)
MaxLReal := 1.7976931348623157D307 * 9.999999; (* LONGREAL is 8 bytes *)
(*should be 1.7976931348623157D308 *)
END ;
IF LRealSize = 4 THEN MaxLReal := 3.40282346D38
ELSIF LRealSize = 8 THEN MaxLReal := 1.7976931348623157D307 * 9.999999
(*should be 1.7976931348623157D308 *)
END ;
MinReal := -MaxReal;
MinLReal := -MaxLReal;
MaxSet := SetSize * 8 - 1;
MaxIndex := SignedMaximum(PointerSize);
MaxIndex := SignedMaximum(AddressSize);
IF Verbose THEN VerboseListSizes END;
END GetProperties;
@ -734,9 +736,7 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
PROCEDURE WriteInt* (i: SYSTEM.INT64);
VAR s: ARRAY 24 OF CHAR; i1, k: SYSTEM.INT64;
BEGIN
IF (i = SignedMinimum(IntSize))
OR (i = SignedMinimum(LIntSize))
OR (i = SignedMinimum(8)) THEN
IF (i = SignedMinimum(2)) OR (i = SignedMinimum(4)) OR (i = SignedMinimum(8)) THEN
(* abs(minint) is one more than maxint, causing problems representing the value as a minus sign
followed by absoute value. Therefore represent as -maxint - 1. For INTEGER this avoids a
compiler warning 'this decimal constant is unsigned only in ISO C90', for LONGINT it is the
@ -754,7 +754,7 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
VAR W: Texts.Writer; T: Texts.Text; R: Texts.Reader; s: ARRAY 32 OF CHAR; ch: CHAR; i: INTEGER;
BEGIN
(*should be improved *)
IF (r < SignedMaximum(LIntSize)) & (r > SignedMinimum(LIntSize)) & (r = ENTIER(r)) THEN
IF (r < SignedMaximum(LongintSize)) & (r > SignedMinimum(LongintSize)) & (r = ENTIER(r)) THEN
IF suffx = "f" THEN WriteString("(REAL)") ELSE WriteString("(LONGREAL)") END ;
WriteInt(ENTIER(r))
ELSE
@ -839,13 +839,19 @@ BEGIN
Files.SetSearchPath(OBERON);
(* Fixed type sizes *)
CharSize := 1; BoolSize := 1; SIntSize := 1; RecSize := 1; ByteSize := 1;
RealSize := 4; LRealSize := 8;
(* type sizes with configuration based defaults *)
PointerSize := Configuration.addressSize;
Alignment := Configuration.alignment;
IntSize := Configuration.intsize;
AddressSize := Configuration.addressSize;
Alignment := Configuration.alignment;
ShortintSize := 1;
IF Configuration.intsize = 2 THEN
IntegerSize := 2;
LongintSize := 4;
SetSize := 4;
ELSE
IntegerSize := 4;
LongintSize := 8;
SetSize := 8;
END;
END OPM.

View file

@ -154,7 +154,7 @@ VAR
undftyp*,
bytetyp*, booltyp*, chartyp*,
sinttyp*, inttyp*, linttyp*,
sinttyp*, inttyp*, linttyp*, hinttyp*,
adrtyp*,
int8typ*, int16typ*, int32typ*, int64typ*,
realtyp*, lrltyp*, settyp*, stringtyp*,
@ -762,7 +762,7 @@ BEGIN
tag := OPM.SymRInt();
IF tag = Ssys THEN typ^.sysflag := SHORT(OPM.SymRInt()); tag := OPM.SymRInt() END;
CASE tag OF
| Sptr: typ^.form := Pointer; typ^.size := OPM.PointerSize;
| Sptr: typ^.form := Pointer; typ^.size := OPM.AddressSize;
typ^.n := 0; InStruct(typ^.BaseTyp)
| Sarr: typ^.form := Comp; typ^.comp := Array;
InStruct(typ^.BaseTyp); typ^.n := OPM.SymRInt();
@ -796,7 +796,7 @@ BEGIN
InsertImport(fld, typ^.link, dummy);
impCtxt.nextTag := OPM.SymRInt()
END
| Spro: typ^.form := ProcTyp; typ^.size := OPM.ProcSize;
| Spro: typ^.form := ProcTyp; typ^.size := OPM.AddressSize;
InSign(mno, typ^.BaseTyp, typ^.link)
ELSE OPM.LogWStr("unhandled case at InStruct, tag = "); OPM.LogWNum(tag, 0); OPM.LogWLn;
END;
@ -1163,7 +1163,7 @@ END Import;
PROCEDURE InitStruct(VAR typ: Struct; form: SHORTINT);
BEGIN
typ := NewStr(form, Basic); typ^.ref := form; typ^.size := OPM.ByteSize; typ^.allocated := TRUE;
typ := NewStr(form, Basic); typ^.ref := form; typ^.size := 1; typ^.allocated := TRUE;
typ^.strobj := NewObj(); typ^.pbfp := form; typ^.pvfp := form; typ^.fpdone := TRUE;
typ^.idfp := form; typ^.idfpdone := TRUE
END InitStruct;
@ -1207,36 +1207,37 @@ BEGIN topScope := NIL; OpenScope(0, NIL); OPM.errpos := 0;
InitStruct(niltyp, NilTyp);
(*initialization of module SYSTEM*)
EnterTyp("BYTE", Byte, OPM.ByteSize, bytetyp);
EnterTyp("PTR", Pointer, OPM.PointerSize, sysptrtyp);
EnterTyp("ADDRESS", Int, OPM.PointerSize, adrtyp);
EnterTyp("INT8", Int, 1, int8typ);
EnterTyp("INT16", Int, 2, int16typ);
EnterTyp("INT32", Int, 4, int32typ);
EnterTyp("INT64", Int, 8, int64typ);
EnterTyp("BYTE", Byte, 1, bytetyp);
EnterTyp("PTR", Pointer, -1, sysptrtyp); (* Size set in Vishap.PropagateElementaryTypeSize *)
EnterTyp("ADDRESS", Int, -1, adrtyp); (* Size set in Vishap.PropagateElementaryTypeSize *)
EnterTyp("INT8", Int, 1, int8typ);
EnterTyp("INT16", Int, 2, int16typ);
EnterTyp("INT32", Int, 4, int32typ);
EnterTyp("INT64", Int, 8, int64typ);
EnterProc("ADR", adrfn);
EnterProc("CC", ccfn);
EnterProc("LSH", lshfn);
EnterProc("ROT", rotfn);
EnterProc("GET", getfn);
EnterProc("PUT", putfn);
EnterProc("ADR", adrfn);
EnterProc("CC", ccfn);
EnterProc("LSH", lshfn);
EnterProc("ROT", rotfn);
EnterProc("GET", getfn);
EnterProc("PUT", putfn);
EnterProc("GETREG", getrfn);
EnterProc("PUTREG", putrfn);
EnterProc("BIT", bitfn);
EnterProc("VAL", valfn);
EnterProc("NEW", sysnewfn);
EnterProc("MOVE", movefn);
EnterProc("BIT", bitfn);
EnterProc("VAL", valfn);
EnterProc("NEW", sysnewfn);
EnterProc("MOVE", movefn);
syslink := topScope^.right;
universe := topScope; topScope^.right := NIL;
EnterTyp("BOOLEAN", Bool, OPM.BoolSize, booltyp);
EnterTyp("CHAR", Char, OPM.CharSize, chartyp);
EnterTyp("SET", Set, OPM.SetSize, settyp);
EnterTyp("REAL", Real, OPM.RealSize, realtyp);
EnterTyp("LONGREAL", LReal, OPM.LRealSize, lrltyp);
EnterTyp("BOOLEAN", Bool, 1, booltyp);
EnterTyp("CHAR", Char, 1, chartyp);
EnterTyp("SET", Set, -1, settyp); (* Size set in Vishap.PropagateElementaryTypeSize *)
EnterTyp("REAL", Real, 4, realtyp);
EnterTyp("LONGREAL", LReal, 8, lrltyp);
EnterTyp("HUGEINT", Int, 8, hinttyp);
EnterTypeAlias("SHORTINT", sintobj);
EnterTypeAlias("INTEGER", intobj);

View file

@ -62,7 +62,7 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96
ELSIF typ^.size = -1 THEN
f := typ^.form; c := typ^.comp;
IF c = OPT.Record THEN btyp := typ^.BaseTyp;
IF btyp = NIL THEN offset := 0; base := (*OPM.RecAlign*)OPC.SizeAlignment(OPM.RecSize);
IF btyp = NIL THEN offset := 0; base := 1;
ELSE TypSize(btyp); offset := btyp^.size - btyp^.sysflag DIV 100H; base := btyp^.align;
END;
fld := typ^.link;
@ -86,12 +86,12 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96
TypSize(typ^.BaseTyp);
typ^.size := typ^.n * typ^.BaseTyp^.size;
ELSIF f = OPT.Pointer THEN
typ^.size := OPM.PointerSize;
typ^.size := OPM.AddressSize;
IF typ^.BaseTyp = OPT.undftyp THEN OPM.Mark(128, typ^.n)
ELSE TypSize(typ^.BaseTyp)
END
ELSIF f = OPT.ProcTyp THEN
typ^.size := OPM.ProcSize;
typ^.size := OPM.AddressSize;
ELSIF c = OPT.DynArr THEN
btyp := typ^.BaseTyp; TypSize(btyp);
IF btyp^.comp = OPT.DynArr THEN typ^.size := btyp^.size + 4 (* describes dim not size *)
@ -187,21 +187,17 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96
topScope^.leaf := TRUE;
Traverse(topScope^.right, topScope, TRUE); (* first pass only on exported types and procedures *)
Traverse(topScope^.right, topScope, FALSE); (* second pass *)
(* mark basic types as predefined, OPC.Ident can avoid qualification*)
OPT.chartyp^.strobj^.linkadr := PredefinedType;
OPT.settyp^.strobj^.linkadr := PredefinedType;
OPT.realtyp^.strobj^.linkadr := PredefinedType;
(* SHORTINT, INTEGER and LONGINT are alternate names for INT8, INT16, INT32 and INT64 and have not been set up yet.
OPT.sinttyp^.strobj^.linkadr := PredefinedType;
OPT.inttyp^.strobj^.linkadr := PredefinedType;
OPT.linttyp^.strobj^.linkadr := PredefinedType;
*)
OPT.adrtyp^.strobj^.linkadr := PredefinedType;
OPT.int8typ^.strobj^.linkadr := PredefinedType;
OPT.int16typ^.strobj^.linkadr := PredefinedType;
OPT.int32typ^.strobj^.linkadr := PredefinedType;
OPT.int64typ^.strobj^.linkadr := PredefinedType;
OPT.hinttyp.strobj.linkadr := PredefinedType;
OPT.lrltyp^.strobj^.linkadr := PredefinedType;
OPT.booltyp^.strobj^.linkadr := PredefinedType;
OPT.bytetyp^.strobj^.linkadr := PredefinedType;
@ -482,7 +478,7 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96
OPM.WriteString(", "); TypeOf(n)
ELSIF comp = OPT.DynArr THEN
IF n^.class = OPT.Nconst THEN (* ap is string constant *)
OPM.WriteString(Comma); ParIntLiteral(n.conval.intval2, OPM.PointerSize)
OPM.WriteString(Comma); ParIntLiteral(n.conval.intval2, OPM.AddressSize)
ELSE
aptyp := n^.typ; dim := 0;
WHILE (typ^.comp = OPT.DynArr) & (typ^.BaseTyp^.form # OPT.Byte) DO
@ -495,7 +491,7 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96
Len(n, dim); OPM.WriteString(" * "); INC(dim); aptyp := aptyp^.BaseTyp
END ;
(*OPM.WriteString("((LONGINT)("); OPM.WriteInt(aptyp^.size); OPM.WriteString("))");*)
ParIntLiteral(aptyp.size, OPM.PointerSize)
ParIntLiteral(aptyp.size, OPM.AddressSize)
END
END
END ;
@ -791,12 +787,12 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96
OPM.WriteString(", ");
IF typ^.comp = OPT.DynArr THEN
IF x^.class = OPT.Nconst THEN
OPC.IntLiteral(x.conval.intval, OPM.PointerSize)
OPC.IntLiteral(x.conval.intval, OPM.AddressSize)
ELSE OPM.WriteString("((address)("); expr(x, 10); OPM.WriteString("))")
END ;
x := x^.link
ELSE
OPC.IntLiteral(typ.n, OPM.PointerSize)
OPC.IntLiteral(typ.n, OPM.AddressSize)
END ;
typ := typ^.BaseTyp
END ;

View file

@ -51,23 +51,14 @@ MODULE Vishap; (* J. Templ 3.2.95 *)
PROCEDURE PropagateElementaryTypeSizes;
BEGIN
OPT.bytetyp.size := OPM.ByteSize;
OPT.sysptrtyp.size := OPM.PointerSize;
OPT.chartyp.size := OPM.CharSize;
OPT.sysptrtyp.size := OPM.AddressSize;
OPT.adrtyp.size := OPM.AddressSize;
OPT.settyp.size := OPM.SetSize;
OPT.realtyp.size := OPM.RealSize;
OPT.adrtyp.size := OPM.PointerSize;
OPT.lrltyp.size := OPM.LRealSize;
OPT.booltyp.size := OPM.BoolSize;
OPT.sinttyp := OPT.int8typ;
IF OPM.IntSize = 2 THEN
OPT.inttyp := OPT.int16typ;
OPT.linttyp := OPT.int32typ
ELSE
OPT.inttyp := OPT.int32typ;
OPT.linttyp := OPT.int64typ
END;
OPT.sinttyp := OPT.IntType(OPM.ShortintSize);
OPT.inttyp := OPT.IntType(OPM.IntegerSize);
OPT.linttyp := OPT.IntType(OPM.LongintSize);
OPT.sintobj.typ := OPT.sinttyp;
OPT.intobj.typ := OPT.inttyp;
OPT.lintobj.typ := OPT.linttyp