Define integer sizes before including SYSTEM.h

This commit is contained in:
David Brown 2016-09-06 20:48:22 +01:00
parent 682fa59e42
commit ebfc60f49d
208 changed files with 1164 additions and 787 deletions

View file

@ -1034,7 +1034,7 @@ MODULE OPB; (* RC 6.3.89 / 21.2.94 *) (* object model 17.1.93 *)
|OPT.ashfn: (*ASH*)
IF (x^.class = OPT.Ntype) OR (x^.class = OPT.Nproc) THEN err(126)
ELSIF f = OPT.Int THEN
IF x.typ.size # OPM.LIntSize THEN Convert(x, OPT.linttyp) END
IF x.typ.size # OPT.linttyp.size THEN Convert(x, OPT.linttyp) END
ELSE err(111); x^.typ := OPT.linttyp
END
|OPT.adrfn: (*SYSTEM.ADR*)

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.LIntSize);
nofptrs := 0; PutPtrOffsets(typ, 0, nofptrs); Str1("#}}", -(nofptrs + 1) * OPM.PointerSize);
EndStat
END TDescDecl;
@ -589,6 +589,7 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
RETURN alignment
END SizeAlignment;
PROCEDURE BaseAlignment*(typ: OPT.Struct): LONGINT;
VAR alignment: LONGINT;
BEGIN
@ -606,16 +607,24 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
PROCEDURE FillGap(gap, off, align: LONGINT; VAR n, curAlign: LONGINT);
(* gap: Required gap - already calculated based on alignment requirements
off: Current offset - where gap begins
align: Containing record type alignment
n: Next ordinal to use for private field names
curAlign: Largest alignment of any field so far
*)
VAR adr: LONGINT;
BEGIN
adr := off; Align(adr, align);
IF (curAlign < align) & (gap - (adr - off) >= align) THEN (* preserve alignment of the enclosing struct! *)
DEC(gap, (adr - off) + align);
BegStat;
IF align = OPM.IntSize THEN OPM.WriteString("INTEGER")
ELSIF align = OPM.LIntSize THEN OPM.WriteString("LONGINT")
ELSIF align = OPM.LRealSize THEN OPM.WriteString("LONGREAL")
END ;
CASE align OF
|2: OPM.WriteString("int16")
|4: OPM.WriteString("int32")
|8: OPM.WriteString("int64")
ELSE OPM.LogWLn; OPM.LogWStr("Unexpected enclosing alignment in FillGap.")
END;
Str1(" _prvt#", n); INC(n); EndStat;
curAlign := align
END ;
@ -625,30 +634,44 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
PROCEDURE FieldList (typ: OPT.Struct; last: BOOLEAN; VAR off, n, curAlign: LONGINT);
VAR fld: OPT.Object; base: OPT.Struct; gap, adr, align, fldAlign: LONGINT;
BEGIN
fld := typ.link; align := typ^.align MOD 10000H;
fld := typ.link;
align := typ^.align MOD 10000H;
IF typ.BaseTyp # NIL THEN FieldList(typ.BaseTyp, FALSE, off, n, curAlign)
ELSE off := 0; n := 0; curAlign := 1
END ;
END;
(* off: Current offset into record
align: Overall (RECORD) alignment
curAlign: Current alignment - largest alignment of any field so far
n: Next ordinal to use for private field names
*)
WHILE (fld # NIL) & (fld.mode = OPT.Fld) DO
IF (OPM.currFile = OPM.HeaderFile) & (fld.vis = OPT.internal) OR
(OPM.currFile = OPM.BodyFile) & (fld.vis = OPT.internal) & (typ^.mno # 0) THEN
IF (OPM.currFile = OPM.HeaderFile) & (fld.vis = OPT.internal)
OR (OPM.currFile = OPM.BodyFile) & (fld.vis = OPT.internal) & (typ^.mno # 0) THEN
(* Skip private fields *)
fld := fld.link;
WHILE (fld # NIL) & (fld.mode = OPT.Fld) & (fld.vis = OPT.internal) DO fld := fld.link END ;
WHILE (fld # NIL) & (fld.mode = OPT.Fld) & (fld.vis = OPT.internal) DO fld := fld.link END;
ELSE
(* mimic OPV.TypSize to detect gaps caused by private fields *)
adr := off; fldAlign := BaseAlignment(fld^.typ); Align(adr, fldAlign);
adr := off;
fldAlign := BaseAlignment(fld^.typ);
Align(adr, fldAlign);
gap := fld.adr - adr;
IF fldAlign > curAlign THEN curAlign := fldAlign END ;
IF gap > 0 THEN FillGap(gap, off, align, n, curAlign) END ;
IF fldAlign > curAlign THEN curAlign := fldAlign END;
IF gap > 0 THEN
FillGap(gap, off, align, n, curAlign)
END;
BegStat; DeclareBase(fld); OPM.Write(' '); DeclareObj(fld, FALSE);
off := fld.adr + fld.typ.size; base := fld.typ; fld := fld.link;
WHILE (fld # NIL) & (fld.mode = OPT.Fld) & (fld.typ = base) & (fld.adr = off)
WHILE (fld # NIL)
& (fld.mode = OPT.Fld)
& (fld.typ = base)
& (fld.adr = off)
(* ?? *) & ((OPM.currFile = OPM.BodyFile) OR (fld.vis # OPT.internal) OR (fld.typ.strobj = NIL)) DO
OPM.WriteString(", "); DeclareObj(fld, FALSE); off := fld.adr + fld.typ.size; fld := fld.link
END ;
END;
EndStat
END
END ;
END;
IF last THEN
adr := typ.size - typ^.sysflag DIV 100H;
IF adr = 0 THEN gap := 1 (* avoid empty struct *) ELSE gap := adr - off END ;
@ -807,7 +830,7 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
OPM.WriteStringVar(OPM.modName); OPM.WriteString(BodyNameExt);
EndStat; OPM.WriteLn;
CProcDefs(OPT.topScope^.right, 1); OPM.WriteLn;
OPM.WriteString("#endif"); OPM.WriteLn
OPM.WriteString("#endif // "); OPM.WriteStringVar(OPM.modName); OPM.WriteLn
END GenHdr;
PROCEDURE GenHeaderMsg;
@ -848,7 +871,7 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
OPM.WriteString("#ifndef "); OPM.WriteStringVar(OPM.modName); OPM.WriteString(FlagExt); OPM.WriteLn;
OPM.WriteString("#define "); OPM.WriteStringVar(OPM.modName); OPM.WriteString(FlagExt); OPM.WriteLn;
OPM.WriteLn;
IF OPM.LIntSize = 8 THEN OPM.WriteString("#define LARGE"); OPM.WriteLn END;
Include(BasicIncludeFile);
IncludeImports(OPT.topScope^.right, 1); OPM.WriteLn
END GenHdrIncludes;
@ -857,7 +880,14 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
BEGIN
OPM.currFile := OPM.BodyFile;
GenHeaderMsg;
IF OPM.LIntSize = 8 THEN OPM.WriteString("#define LARGE"); OPM.WriteLn END;
OPM.WriteLn;
(* Define adjustable type sizes *)
OPM.WriteString("#define INTEGER int"); OPM.WriteInt(OPT.inttyp.size*8); OPM.WriteLn;
OPM.WriteString("#define LONGINT int"); OPM.WriteInt(OPT.linttyp.size*8); OPM.WriteLn;
OPM.WriteString("#define SET uint"); OPM.WriteInt(OPT.settyp.size*8); OPM.WriteLn;
OPM.WriteLn;
Include(BasicIncludeFile);
IncludeImports(OPT.topScope^.right, 0); OPM.WriteLn;
DefAnonRecs(n);
@ -1001,10 +1031,10 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *)
(* If there will be a result, provide a result variable. *)
IF proc^.typ # OPT.notyp THEN
BegStat;
Ident(proc^.typ^.strobj);
OPM.WriteString(" _o_result;");
OPM.WriteLn;
END;
Ident(proc^.typ^.strobj);
OPM.WriteString(" _o_result;");
OPM.WriteLn;
END;
scope := proc^.scope;
IdentList(scope^.scope, 0);

View file

@ -9,7 +9,7 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
CONST
OptionChar* = "-";
(* compiler options; don't change the encoding *)
(* compiler option flag bits; don't change the encoding *)
inxchk* = 0; (* index check on *)
ranchk* = 2; (* range check on *)
typchk* = 3; (* type check on *)
@ -49,12 +49,6 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
MaxStruct* = 255;
(* maximal number of pointer fields in a record: *)
MaxPtr* = MAX(LONGINT);
(* maximal number of global pointers per module: *)
MaxGPtr* = MAX(LONGINT);
(* maximal number of hidden fields in an exported record: *)
MaxHdFld* = 2048;

View file

@ -50,24 +50,12 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96
VAR
assert, inxchk, mainprog, ansi: BOOLEAN;
stamp: INTEGER; (* unique number for nested objects *)
(*recno: INTEGER;*) (* number of anonymous record types *)
recno: LONGINT; (* number of anonymous record types *)
exit: ExitInfo; (* to check if EXIT is simply a break *)
nofExitLabels: INTEGER;
naturalAlignment: BOOLEAN;
PROCEDURE NaturalAlignment(size, max: LONGINT): LONGINT;
VAR i: LONGINT;
BEGIN
IF size >= max THEN RETURN max
ELSE i := 1;
WHILE i < size DO INC(i, i) END ;
RETURN i
END
END NaturalAlignment;
PROCEDURE TypSize*(typ: OPT.Struct);
VAR f, c: INTEGER; offset, size, base, fbase, off0: LONGINT;
fld: OPT.Object; btyp: OPT.Struct;
@ -87,10 +75,10 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96
fld^.adr := offset; INC(offset, size);
IF fbase > base THEN base := fbase END ;
fld := fld^.link
END ;
END;
(* base is now the largest alignment of any field *)
off0 := offset;
IF offset = 0 THEN offset := 1 END ; (* 1 byte filler to avoid empty struct *)
IF OPM.RecSize = 0 THEN base := NaturalAlignment(offset, (*OPM.RecAlign*)OPC.SizeAlignment(OPM.RecSize)) END ;
OPC.Align(offset, base);
IF (typ^.strobj = NIL) & (typ^.align MOD 10000H = 0) THEN INC(recno); INC(base, recno * 10000H) END ;
typ^.size := offset; typ^.align := base;

View file

@ -499,7 +499,6 @@ BEGIN
END DisplayHaltCode;
PROCEDURE Halt*(code: LONGINT);
VAR e: ErrorCode;
BEGIN
HaltCode := code;
IF HaltHandler # NIL THEN HaltHandler(code) END;
@ -510,7 +509,6 @@ BEGIN
END Halt;
PROCEDURE AssertFail*(code: LONGINT);
VAR e: ErrorCode;
BEGIN
errstring("Assertion failure.");
IF code # 0 THEN errstring(" ASSERT code "); errint(code); errstring("."); END;

View file

@ -564,7 +564,6 @@ BEGIN
END DisplayHaltCode;
PROCEDURE Halt*(code: LONGINT);
VAR e: ErrorCode;
BEGIN
HaltCode := code;
IF HaltHandler # NIL THEN HaltHandler(code) END;
@ -575,7 +574,6 @@ BEGIN
END Halt;
PROCEDURE AssertFail*(code: LONGINT);
VAR e: ErrorCode;
BEGIN
errstring("Assertion failure.");
IF code # 0 THEN errstring(" ASSERT code "); errint(code); errstring("."); END;

View file

@ -1,6 +1,24 @@
#ifndef SYSTEM__h
#define SYSTEM__h
#ifndef LONGINT
#if (__SIZEOF_POINTER__ == 8) || defined(_WIN64)
#define INTEGER int32
#define LONGINT int64
#define SET uint64
#else
#define INTEGER int16
#define LONGINT int32
#define SET uint32
#endif
#endif
// Declare memcpy in a way compatible with C compilers intrinsic
// built in implementations.
@ -22,10 +40,12 @@ void *memcpy(void *dest, const void *source, size_t size);
// Declare fixed size versions of basic intger types
#if defined(_WIN64)
#if (__SIZEOF_POINTER__ < 8) || defined(_WIN64)
// ILP32 or LLP64
typedef long long int64;
typedef unsigned long long uint64;
#else
// LP64
typedef long int64;
typedef unsigned long uint64;
#endif
@ -67,29 +87,10 @@ typedef float REAL;
typedef double LONGREAL;
typedef void* SYSTEM_PTR;
#define uSET SET
// For 32 bit builds, the size of LONGINT depends on a make option:
#if (__SIZEOF_POINTER__ == 8) || defined(LARGE) || defined(_WIN64)
typedef int32 INTEGER;
typedef int64 LONGINT;
typedef uint64 SET;
typedef uint64 uSET;
#else
typedef int16 INTEGER;
typedef int32 LONGINT;
typedef uint32 SET;
typedef uint32 uSET;
#endif
// Temporary defs while bootstrapping
#define uLONGINT uint64
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------

View file

@ -421,6 +421,12 @@ void writeConfigurationMod() {
int main(int argc, char *argv[])
{
// Make sure SYSTEM.h has set up our core data types correctly.
assert(sizeof(int8) == 1, "sizeof(int8) is not 1.");
assert(sizeof(int16) == 2, "sizeof(int16) is not 2.");
assert(sizeof(int32) == 4, "sizeof(int32) is not 4.");
assert(sizeof(int64) == 8, "sizeof(int64) is not 8.");
oname = getenv("ONAME"); if (!oname) oname = macrotostring(O_NAME);
if (argc>1) {