mirror of
https://github.com/vishapoberon/compiler.git
synced 2026-04-06 12:12:25 +00:00
Define integer sizes before including SYSTEM.h
This commit is contained in:
parent
682fa59e42
commit
ebfc60f49d
208 changed files with 1164 additions and 787 deletions
|
|
@ -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*)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
// ----------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue