From 25d99fd36af45b9d33d65f97784e6075dff0151d Mon Sep 17 00:00:00 2001 From: David Brown Date: Wed, 28 Sep 2016 18:48:56 +0100 Subject: [PATCH] Add SYSTEM.SET32 and 64 types. Fix 32 bit build. --- makefile | 10 ++++++++-- src/compiler/Compiler.Mod | 8 +++++++- src/compiler/OPC.Mod | 6 ++++-- src/compiler/OPT.Mod | 28 +++++++++++++++++++--------- src/compiler/OPV.Mod | 2 ++ src/runtime/Files.Mod | 5 +++-- src/runtime/Platformunix.Mod | 2 +- src/tools/make/oberon.mk | 16 +++++++--------- 8 files changed, 51 insertions(+), 26 deletions(-) diff --git a/makefile b/makefile index 5202abb7..fc481183 100644 --- a/makefile +++ b/makefile @@ -157,7 +157,7 @@ full: configuration @make -f src/tools/make/oberon.mk -s browsercmd MODEL=2 @printf "\n\n--- Library build started ---\n\n" @make -f src/tools/make/oberon.mk -s O2library - @make -f src/tools/make/oberon.mk -s OakwoodLibrary MODEL=C + @make -f src/tools/make/oberon.mk -s runtime MODEL=C @printf "\n\n--- Library build successfull ---\n\n" @make -f src/tools/make/oberon.mk -s sourcechanges @make -f src/tools/make/oberon.mk -s install @@ -192,7 +192,13 @@ browsercmd: configuration # library: build all directories under src/library library: configuration @make -f src/tools/make/oberon.mk -s O2library - @make -f src/tools/make/oberon.mk -s OakwoodLibrary MODEL=C + @make -f src/tools/make/oberon.mk -s runtime MODEL=C + +runtime: configuration + @make -f src/tools/make/oberon.mk -s runtime MODEL=C + + + # Individual library components v4: configuration diff --git a/src/compiler/Compiler.Mod b/src/compiler/Compiler.Mod index e5acdac7..f21ef95d 100644 --- a/src/compiler/Compiler.Mod +++ b/src/compiler/Compiler.Mod @@ -55,7 +55,6 @@ MODULE Compiler; (* J. Templ 3.2.95 *) BEGIN OPT.sysptrtyp.size := OPM.AddressSize; OPT.adrtyp.size := OPM.AddressSize; - OPT.settyp.size := OPM.SetSize; adrinttyp := OPT.IntType(OPM.AddressSize); OPT.adrtyp.strobj := adrinttyp.strobj; @@ -68,6 +67,13 @@ MODULE Compiler; (* J. Templ 3.2.95 *) OPT.intobj.typ := OPT.inttyp; OPT.lintobj.typ := OPT.linttyp; + (*OPT.settyp.size := OPM.SetSize;*) + CASE OPM.LongintSize OF + |4: OPT.settyp := OPT.set32typ + ELSE OPT.settyp := OPT.set64typ + END; + OPT.setobj.typ := OPT.settyp; + (* Enable or disable (non-system) BYTE type *) IF OPM.Model = "C" THEN OPT.cpbytetyp.strobj.name[4] := 0X (* Enable Component Pascal non-system BYTE type *) diff --git a/src/compiler/OPC.Mod b/src/compiler/OPC.Mod index e0313bbe..e601db3a 100644 --- a/src/compiler/OPC.Mod +++ b/src/compiler/OPC.Mod @@ -111,9 +111,11 @@ MODULE OPC; (* copyright (c) J. Templ 12.7.95 / 3.7.96 *) IF hashtab[h] >= 0 THEN IF keytab[hashtab[h]] = obj^.name THEN OPM.Write('_') END END - ELSIF (mode = OPT.Typ) & (obj.typ.form = OPT.Int) THEN + ELSIF (mode = OPT.Typ) & (obj.typ.form IN {OPT.Int, OPT.Set}) THEN IF obj.typ = OPT.adrtyp THEN OPM.WriteString("address") - ELSE OPM.WriteString("int"); OPM.WriteInt(obj.typ.size*8) + ELSE + IF obj.typ.form = OPT.Int THEN OPM.WriteString("int") ELSE OPM.WriteString("uint") END; + OPM.WriteInt(obj.typ.size*8) END ELSE IF (mode # OPT.Typ) OR (obj^.linkadr # PredefinedType) THEN diff --git a/src/compiler/OPT.Mod b/src/compiler/OPT.Mod index 3732b2cb..ac134c9c 100644 --- a/src/compiler/OPT.Mod +++ b/src/compiler/OPT.Mod @@ -155,10 +155,11 @@ VAR bytetyp*, cpbytetyp*, booltyp*, chartyp*, sinttyp*, inttyp*, linttyp*, hinttyp*, int8typ*, int16typ*, int32typ*, int64typ*, - realtyp*, lrltyp*, settyp*, stringtyp*, + settyp*, set32typ*, set64typ*, + realtyp*, lrltyp*, stringtyp*, adrtyp*, sysptrtyp*: Struct; - sintobj*, intobj*, lintobj*: Object; + sintobj*, intobj*, lintobj*, setobj*: Object; nofGmod*: SHORTINT; (*nof imports*) GlbMod*: ARRAY maxImps OF Object; (* ^.right = first object, ^.name = module import name (not alias) *) @@ -229,6 +230,12 @@ BEGIN RETURN int64typ END IntType; +PROCEDURE SetType*(size: LONGINT): Struct; +BEGIN + IF size = set32typ.size THEN RETURN set32typ END; + RETURN set64typ +END SetType; + PROCEDURE ShorterOrLongerType*(x: Struct; dir: INTEGER): Struct; VAR i: INTEGER; BEGIN @@ -803,10 +810,9 @@ END InTProc; PROCEDURE InTyp(tag: LONGINT): Struct; BEGIN - IF tag = Int THEN - RETURN IntType(OPM.SymRInt()) - ELSE - RETURN impCtxt.ref[tag] + IF tag = Int THEN RETURN IntType(OPM.SymRInt()) + ELSIF tag = Set THEN RETURN SetType(OPM.SymRInt()) + ELSE RETURN impCtxt.ref[tag] END END InTyp; @@ -1124,7 +1130,7 @@ END Import; VAR strobj: Object; BEGIN IF (typ^.ref < expCtxt.ref) THEN OPM.SymWInt(-typ^.ref); - IF typ.ref = Int THEN OPM.SymWInt(typ.size) END + IF typ.ref IN {Int, Set} THEN OPM.SymWInt(typ.size) END ELSE OPM.SymWInt(Sstruct); typ^.ref := expCtxt.ref; INC(expCtxt.ref); @@ -1170,7 +1176,7 @@ END Import; | Bool, Char: OPM.SymWCh(CHR(obj^.conval^.intval)) | Int: OPM.SymWInt(obj^.conval^.intval); OPM.SymWInt(obj.typ.size) - | Set: OPM.SymWSet(obj^.conval^.setval) + | Set: OPM.SymWSet(obj^.conval^.setval); OPM.SymWInt(obj.typ.size) | Real: rval := SHORT(obj^.conval^.realval); OPM.SymWReal(rval) | LReal: OPM.SymWLReal(obj^.conval^.realval) | String: OutName(obj^.conval^.ext^) @@ -1301,6 +1307,8 @@ BEGIN topScope := NIL; OpenScope(0, NIL); OPM.errpos := 0; EnterTyp("INT16", Int, 2, int16typ); EnterTyp("INT32", Int, 4, int32typ); EnterTyp("INT64", Int, 8, int64typ); + EnterTyp("SET32", Set, 4, set32typ); + EnterTyp("SET64", Set, 8, set64typ); EnterProc("ADR", adrfn); EnterProc("CC", ccfn); @@ -1321,7 +1329,7 @@ BEGIN topScope := NIL; OpenScope(0, NIL); OPM.errpos := 0; EnterTyp("BOOLEAN", Bool, 1, booltyp); EnterTyp("CHAR", Char, 1, chartyp); - EnterTyp("SET", Set, -1, settyp); (* Size set in Compiler.PropagateElementaryTypeSize *) +(*EnterTyp("SET", Set, -1, settyp);*) (* Size set in Compiler.PropagateElementaryTypeSize *) EnterTyp("REAL", Real, 4, realtyp); EnterTyp("LONGREAL", LReal, 8, lrltyp); EnterTyp("HUGEINT", Int, 8, hinttyp); @@ -1330,6 +1338,8 @@ BEGIN topScope := NIL; OpenScope(0, NIL); OPM.errpos := 0; EnterTypeAlias("SHORTINT", sintobj); EnterTypeAlias("INTEGER", intobj); EnterTypeAlias("LONGINT", lintobj); + EnterTypeAlias("SET", setobj); + EnterBoolConst("FALSE", 0); (* 0 and 1 are compiler internal representation only *) EnterBoolConst("TRUE", 1); diff --git a/src/compiler/OPV.Mod b/src/compiler/OPV.Mod index 39bfeded..0d29d56d 100644 --- a/src/compiler/OPV.Mod +++ b/src/compiler/OPV.Mod @@ -145,6 +145,8 @@ MODULE OPV; (* J. Templ 16.2.95 / 3.7.96 OPT.int16typ^.strobj^.linkadr := PredefinedType; OPT.int32typ^.strobj^.linkadr := PredefinedType; OPT.int64typ^.strobj^.linkadr := PredefinedType; + OPT.set32typ^.strobj^.linkadr := PredefinedType; + OPT.set64typ^.strobj^.linkadr := PredefinedType; OPT.hinttyp.strobj.linkadr := PredefinedType; OPT.lrltyp^.strobj^.linkadr := PredefinedType; OPT.booltyp^.strobj^.linkadr := PredefinedType; diff --git a/src/runtime/Files.Mod b/src/runtime/Files.Mod index 7e497627..46f16c85 100644 --- a/src/runtime/Files.Mod +++ b/src/runtime/Files.Mod @@ -73,6 +73,7 @@ MODULE Files; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix files PROCEDURE -IdxTrap "__HALT(-1)"; + PROCEDURE -ToAdr(x: SYSTEM.INT64): SYSTEM.ADDRESS "(address)x"; PROCEDURE^ Finalize(o: SYSTEM.PTR); @@ -427,7 +428,7 @@ MODULE Files; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix files restInBuf := buf.size - offset; IF restInBuf = 0 THEN r.res := n; r.eof := TRUE; RETURN ELSIF n > restInBuf THEN min := restInBuf ELSE min := n END; - SYSTEM.MOVE(SYSTEM.ADR(buf.data) + offset, SYSTEM.ADR(x) + xpos, min); + SYSTEM.MOVE(SYSTEM.ADR(buf.data) + ToAdr(offset), SYSTEM.ADR(x) + ToAdr(xpos), min); INC(offset, min); r.offset := offset; INC(xpos, min); DEC(n, min) END; r.res := 0; r.eof := FALSE @@ -465,7 +466,7 @@ MODULE Files; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix files END; restInBuf := bufsize - offset; IF n > restInBuf THEN min := restInBuf ELSE min := n END; - SYSTEM.MOVE(SYSTEM.ADR(x) + xpos, SYSTEM.ADR(buf.data) + offset, min); + SYSTEM.MOVE(SYSTEM.ADR(x) + ToAdr(xpos), SYSTEM.ADR(buf.data) + ToAdr(offset), min); INC(offset, min); r.offset := offset; IF offset > buf.size THEN INC(buf.f.len, offset - buf.size); buf.size := offset END; INC(xpos, min); DEC(n, min); buf.chg := TRUE diff --git a/src/runtime/Platformunix.Mod b/src/runtime/Platformunix.Mod index 034906bd..3db3f2d7 100644 --- a/src/runtime/Platformunix.Mod +++ b/src/runtime/Platformunix.Mod @@ -389,7 +389,7 @@ END ReadBuf; -PROCEDURE -writefile(fd: LONGINT; p: SYSTEM.ADDRESS; l: SYSTEM.ADDRESS): SYSTEM.ADDRESS +PROCEDURE -writefile(fd: LONGINT; p: SYSTEM.ADDRESS; l: LONGINT): SYSTEM.ADDRESS "write(fd, (void*)(address)(p), l)"; PROCEDURE Write*(h: FileHandle; p: SYSTEM.ADDRESS; l: LONGINT): ErrorCode; diff --git a/src/tools/make/oberon.mk b/src/tools/make/oberon.mk index 862ee483..af0cbe2c 100644 --- a/src/tools/make/oberon.mk +++ b/src/tools/make/oberon.mk @@ -189,7 +189,9 @@ uninstall: runtime: - @printf "\nMaking v4 library for -O$(MODEL)\n" + @printf "\nMaking run time library for -O$(MODEL)\n" + mkdir -p $(BUILDDIR)/$(MODEL) + cp src/system/*.[ch] $(BUILDDIR)/$(MODEL) cd $(BUILDDIR)/$(MODEL) && $(COMPILE) -c SYSTEM.c cd $(BUILDDIR)/$(MODEL); $(ROOTDIR)/$(OBECOMP) -Ffs -O$(MODEL) ../../../src/runtime/Platform$(PLATFORM).Mod cd $(BUILDDIR)/$(MODEL); $(ROOTDIR)/$(OBECOMP) -Ffs -O$(MODEL) ../../../src/runtime/Heap.Mod @@ -204,6 +206,10 @@ runtime: # cd $(BUILDDIR)/$(MODEL); $(ROOTDIR)/$(OBECOMP) -Ffs -O$(MODEL) ../../../src/runtime/MathL.Mod cd $(BUILDDIR)/$(MODEL); $(ROOTDIR)/$(OBECOMP) -Ffs -O$(MODEL) ../../../src/runtime/Texts.Mod cd $(BUILDDIR)/$(MODEL); $(ROOTDIR)/$(OBECOMP) -Ffs -O$(MODEL) ../../../src/runtime/Oberon.Mod + @printf "\nMaking lib$(ONAME)$(MODEL)\n" + ar rcs "$(BUILDDIR)/$(MODEL)/lib$(ONAME)$(MODEL).a" $(BUILDDIR)/$(MODEL)/*.o + @cd $(BUILDDIR)/$(MODEL) && $(COMPILE) -shared -o lib$(ONAME)$(MODEL).so *.o + v4: @@ -369,14 +375,6 @@ O2library: v4 ooc2 ooc ulm pow32 misc s3 -OakwoodLibrary: - @printf "\nMaking lib$(ONAME)$(MODEL)\n" - mkdir -p $(BUILDDIR)/$(MODEL) - cp src/system/*.[ch] $(BUILDDIR)/$(MODEL) - @make -f src/tools/make/oberon.mk -s runtime MODEL=$(MODEL) - ar rcs "$(BUILDDIR)/$(MODEL)/lib$(ONAME)$(MODEL).a" $(BUILDDIR)/$(MODEL)/*.o - @cd $(BUILDDIR)/$(MODEL) && $(COMPILE) -shared -o lib$(ONAME)$(MODEL).so *.o -