mirror of
https://github.com/AntKrotov/oberon-07-compiler.git
synced 2026-10-05 09:45:47 +00:00
Windows, Linux: выравнивание глобальных объектов по границе 16 байт
This commit is contained in:
1 parent
89e91c7798
commit
e5b0dc2f14
12 files changed
+87
-44
No files matched your search
Binary file not shown.
+2
-1
@@ -1,7 +1,7 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2019-2021, Anton Krotov
|
||||
Copyright (c) 2019-2021, 2023, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
@@ -12,6 +12,7 @@ IMPORT SYSTEM;
|
||||
|
||||
CONST
|
||||
|
||||
OS* = "LINUX";
|
||||
eol* = 0AX;
|
||||
|
||||
BIT_DEPTH* = (ORD(LSL(1, 31) > 0) + 1) * 32;
|
||||
|
||||
+7
-7
@@ -1,7 +1,7 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2021, Anton Krotov
|
||||
Copyright (c) 2018-2021, 2023, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
@@ -176,8 +176,8 @@ PROCEDURE [oberon] _new* (t, size: INTEGER; VAR ptr: INTEGER);
|
||||
BEGIN
|
||||
ptr := API._NEW(size);
|
||||
IF ptr # 0 THEN
|
||||
SYSTEM.PUT(ptr, t);
|
||||
INC(ptr, WORD)
|
||||
SYSTEM.PUT(ptr + 8, t);
|
||||
INC(ptr, 16)
|
||||
END
|
||||
END _new;
|
||||
|
||||
@@ -185,7 +185,7 @@ END _new;
|
||||
PROCEDURE [oberon] _dispose* (VAR ptr: INTEGER);
|
||||
BEGIN
|
||||
IF ptr # 0 THEN
|
||||
ptr := API._DISPOSE(ptr - WORD)
|
||||
ptr := API._DISPOSE(ptr - 16)
|
||||
END
|
||||
END _dispose;
|
||||
|
||||
@@ -701,8 +701,8 @@ PROCEDURE [stdcall] _new* (t, size: INTEGER; VAR ptr: INTEGER);
|
||||
BEGIN
|
||||
ptr := API._NEW(size);
|
||||
IF ptr # 0 THEN
|
||||
SYSTEM.PUT(ptr, t);
|
||||
INC(ptr, WORD)
|
||||
SYSTEM.PUT(ptr + ORD(API.OS = "LINUX")*12, t);
|
||||
INC(ptr, 4 + ORD(API.OS = "LINUX")*12)
|
||||
END
|
||||
END _new;
|
||||
|
||||
@@ -710,7 +710,7 @@ END _new;
|
||||
PROCEDURE [stdcall] _dispose* (VAR ptr: INTEGER);
|
||||
BEGIN
|
||||
IF ptr # 0 THEN
|
||||
ptr := API._DISPOSE(ptr - WORD)
|
||||
ptr := API._DISPOSE(ptr - (4 + ORD(API.OS = "LINUX")*12))
|
||||
END
|
||||
END _dispose;
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2021, Anton Krotov
|
||||
Copyright (c) 2018-2021, 2023, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
@@ -12,6 +12,7 @@ IMPORT SYSTEM;
|
||||
|
||||
CONST
|
||||
|
||||
OS* = "WINDOWS";
|
||||
eol* = 0DX + 0AX;
|
||||
BIT_DEPTH* = (ORD(LSL(1, 31) > 0) + 1) * 32;
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2021, Anton Krotov
|
||||
Copyright (c) 2018-2021, 2023, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
@@ -176,8 +176,8 @@ PROCEDURE [oberon] _new* (t, size: INTEGER; VAR ptr: INTEGER);
|
||||
BEGIN
|
||||
ptr := API._NEW(size);
|
||||
IF ptr # 0 THEN
|
||||
SYSTEM.PUT(ptr, t);
|
||||
INC(ptr, WORD)
|
||||
SYSTEM.PUT(ptr + 8, t);
|
||||
INC(ptr, 16)
|
||||
END
|
||||
END _new;
|
||||
|
||||
@@ -185,7 +185,7 @@ END _new;
|
||||
PROCEDURE [oberon] _dispose* (VAR ptr: INTEGER);
|
||||
BEGIN
|
||||
IF ptr # 0 THEN
|
||||
ptr := API._DISPOSE(ptr - WORD)
|
||||
ptr := API._DISPOSE(ptr - 16)
|
||||
END
|
||||
END _dispose;
|
||||
|
||||
@@ -701,8 +701,8 @@ PROCEDURE [stdcall] _new* (t, size: INTEGER; VAR ptr: INTEGER);
|
||||
BEGIN
|
||||
ptr := API._NEW(size);
|
||||
IF ptr # 0 THEN
|
||||
SYSTEM.PUT(ptr, t);
|
||||
INC(ptr, WORD)
|
||||
SYSTEM.PUT(ptr + ORD(API.OS = "LINUX")*12, t);
|
||||
INC(ptr, 4 + ORD(API.OS = "LINUX")*12)
|
||||
END
|
||||
END _new;
|
||||
|
||||
@@ -710,7 +710,7 @@ END _new;
|
||||
PROCEDURE [stdcall] _dispose* (VAR ptr: INTEGER);
|
||||
BEGIN
|
||||
IF ptr # 0 THEN
|
||||
ptr := API._DISPOSE(ptr - WORD)
|
||||
ptr := API._DISPOSE(ptr - (4 + ORD(API.OS = "LINUX")*12))
|
||||
END
|
||||
END _dispose;
|
||||
|
||||
|
||||
+4
-3
@@ -1,7 +1,7 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2022, Anton Krotov
|
||||
Copyright (c) 2018-2023, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
@@ -1343,8 +1343,8 @@ BEGIN
|
||||
|
||||
|IL.opNEW:
|
||||
PushAll(1);
|
||||
n := param2 + 8;
|
||||
ASSERT(UTILS.Align(n, 8));
|
||||
n := param2 + 16;
|
||||
ASSERT(UTILS.Align(n, 16));
|
||||
pushc(n);
|
||||
pushc(param1);
|
||||
CallRTL(IL._new)
|
||||
@@ -2371,6 +2371,7 @@ VAR
|
||||
|
||||
BEGIN
|
||||
Xmm[0] := 0;
|
||||
X86.align16(TRUE);
|
||||
tcount := CHL.Length(IL.codes.types);
|
||||
|
||||
Win64RegPar[0] := rcx;
|
||||
|
||||
+25
-12
@@ -1,7 +1,7 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2022, Anton Krotov
|
||||
Copyright (c) 2018-2023, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
@@ -265,12 +265,22 @@ BEGIN
|
||||
END PutByte;
|
||||
|
||||
|
||||
PROCEDURE AlignData (n: INTEGER);
|
||||
BEGIN
|
||||
WHILE CHL.Length(codes.data) MOD n # 0 DO
|
||||
PutByte(0)
|
||||
END
|
||||
END AlignData;
|
||||
|
||||
|
||||
PROCEDURE putstr* (s: ARRAY OF CHAR): INTEGER;
|
||||
VAR
|
||||
i, n, res: INTEGER;
|
||||
BEGIN
|
||||
IF TARGETS.WinLin THEN
|
||||
AlignData(16)
|
||||
END;
|
||||
res := CHL.Length(codes.data);
|
||||
|
||||
i := 0;
|
||||
n := LENGTH(s);
|
||||
WHILE i < n DO
|
||||
@@ -290,6 +300,9 @@ VAR
|
||||
|
||||
BEGIN
|
||||
IF codes.charoffs[c] = -1 THEN
|
||||
IF TARGETS.WinLin THEN
|
||||
AlignData(16)
|
||||
END;
|
||||
res := CHL.Length(codes.data);
|
||||
PutByte(c);
|
||||
PutByte(0);
|
||||
@@ -307,12 +320,12 @@ VAR
|
||||
i, n, res: INTEGER;
|
||||
|
||||
BEGIN
|
||||
res := CHL.Length(codes.data);
|
||||
|
||||
IF ODD(res) THEN
|
||||
PutByte(0);
|
||||
INC(res)
|
||||
IF TARGETS.WinLin THEN
|
||||
AlignData(16)
|
||||
ELSE
|
||||
AlignData(2)
|
||||
END;
|
||||
res := CHL.Length(codes.data);
|
||||
|
||||
n := STRINGS.Utf8To16(s, codes.wstr);
|
||||
|
||||
@@ -341,12 +354,12 @@ VAR
|
||||
|
||||
BEGIN
|
||||
IF codes.wcharoffs[c] = -1 THEN
|
||||
res := CHL.Length(codes.data);
|
||||
|
||||
IF ODD(res) THEN
|
||||
PutByte(0);
|
||||
INC(res)
|
||||
IF TARGETS.WinLin THEN
|
||||
AlignData(16)
|
||||
ELSE
|
||||
AlignData(2)
|
||||
END;
|
||||
res := CHL.Length(codes.data);
|
||||
|
||||
IF TARGETS.LittleEndian THEN
|
||||
PutByte(c MOD 256);
|
||||
|
||||
+8
-3
@@ -1,7 +1,7 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2022, Anton Krotov
|
||||
Copyright (c) 2018-2023, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
@@ -240,13 +240,18 @@ END NewIdent;
|
||||
|
||||
PROCEDURE getOffset* (varIdent: IDENT): INTEGER;
|
||||
VAR
|
||||
size: INTEGER;
|
||||
size, glob_align: INTEGER;
|
||||
|
||||
BEGIN
|
||||
IF varIdent.offset = -1 THEN
|
||||
size := varIdent._type.size;
|
||||
IF varIdent.global THEN
|
||||
IF UTILS.Align(program.bss, varIdent._type.align) THEN
|
||||
IF TARGETS.WinLin THEN
|
||||
glob_align := 16
|
||||
ELSE
|
||||
glob_align := varIdent._type.align
|
||||
END;
|
||||
IF UTILS.Align(program.bss, glob_align) THEN
|
||||
IF UTILS.maxint - program.bss >= size THEN
|
||||
varIdent.offset := program.bss;
|
||||
INC(program.bss, size)
|
||||
|
||||
+3
-2
@@ -1,7 +1,7 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2019-2021, Anton Krotov
|
||||
Copyright (c) 2019-2021, 2023, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
@@ -67,7 +67,7 @@ VAR
|
||||
|
||||
target*, CPU*, BitDepth*, OS*, RealSize*, WordSize*, AdrSize*, InstrSize*: INTEGER;
|
||||
ComLinePar*, LibDir*, FileExt*: STRING;
|
||||
Import*, Dispose*, RTL*, Dll*, LittleEndian*: BOOLEAN;
|
||||
Import*, Dispose*, RTL*, Dll*, LittleEndian*, WinLin*: BOOLEAN;
|
||||
|
||||
|
||||
PROCEDURE Enter (idx, CPU, RealSize, OS: INTEGER; ComLinePar, LibDir, FileExt: STRING);
|
||||
@@ -110,6 +110,7 @@ BEGIN
|
||||
Dispose := ~(target IN noDISPOSE);
|
||||
RTL := ~(target IN noRTL);
|
||||
Dll := target IN {Linux32SO, Linux64SO, Win32DLL, Win64DLL, KolibriOSDLL};
|
||||
WinLin := OS IN {osWIN32, osLINUX32, osWIN64, osLINUX64};
|
||||
WordSize := BitDepth DIV 8;
|
||||
AdrSize := WordSize
|
||||
END
|
||||
|
||||
+3
-3
@@ -1,7 +1,7 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2022, Anton Krotov
|
||||
Copyright (c) 2018-2023, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
@@ -23,8 +23,8 @@ CONST
|
||||
max32* = 2147483647;
|
||||
|
||||
vMajor* = 1;
|
||||
vMinor* = 60;
|
||||
Date* = "20-sep-2022";
|
||||
vMinor* = 61;
|
||||
Date* = "08-jan-2023";
|
||||
|
||||
FILE_EXT* = ".ob07";
|
||||
RTL_NAME* = "RTL";
|
||||
|
||||
+26
-5
@@ -1,7 +1,7 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2022, Anton Krotov
|
||||
Copyright (c) 2018-2023, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
@@ -1814,8 +1814,17 @@ BEGIN
|
||||
|
||||
|IL.opNEW:
|
||||
PushAll(1);
|
||||
n := param2 + 8;
|
||||
ASSERT(UTILS.Align(n, 32));
|
||||
CASE TARGETS.OS OF
|
||||
|TARGETS.osWIN32:
|
||||
n := param2 + 4;
|
||||
ASSERT(UTILS.Align(n, 4))
|
||||
|TARGETS.osLINUX32:
|
||||
n := param2 + 16;
|
||||
ASSERT(UTILS.Align(n, 16))
|
||||
|TARGETS.osKOS:
|
||||
n := param2 + 8;
|
||||
ASSERT(UTILS.Align(n, 32))
|
||||
END;
|
||||
pushc(n);
|
||||
pushc(param1);
|
||||
CallRTL(pic, IL._new)
|
||||
@@ -2430,6 +2439,19 @@ BEGIN
|
||||
END epilog;
|
||||
|
||||
|
||||
PROCEDURE align16* (bit64: BOOLEAN);
|
||||
BEGIN
|
||||
IF TARGETS.WinLin THEN
|
||||
WHILE CHL.Length(IL.codes.data) MOD 16 # 0 DO
|
||||
CHL.PushByte(IL.codes.data, 0)
|
||||
END;
|
||||
WHILE CHL.Length(IL.codes.types) MOD (4 - 2*ORD(bit64)) # 0 DO
|
||||
CHL.PushInt(IL.codes.types, 0)
|
||||
END
|
||||
END
|
||||
END align16;
|
||||
|
||||
|
||||
PROCEDURE CodeGen* (outname: ARRAY OF CHAR; target: INTEGER; options: PROG.OPTIONS);
|
||||
VAR
|
||||
dllret, dllinit, sofinit: INTEGER;
|
||||
@@ -2437,6 +2459,7 @@ VAR
|
||||
|
||||
BEGIN
|
||||
FR[0] := 0;
|
||||
align16(FALSE);
|
||||
tcount := CHL.Length(IL.codes.types);
|
||||
|
||||
opt := options;
|
||||
@@ -2462,7 +2485,6 @@ BEGIN
|
||||
epilog(opt.pic, outname, target, opt.stack, opt.version, dllinit, dllret, sofinit);
|
||||
|
||||
BIN.fixup(program);
|
||||
|
||||
IF TARGETS.OS = TARGETS.osWIN32 THEN
|
||||
PE32.write(program, outname, target = TARGETS.Win32C, target = TARGETS.Win32DLL, FALSE)
|
||||
ELSIF target = TARGETS.KolibriOS THEN
|
||||
@@ -2472,7 +2494,6 @@ BEGIN
|
||||
ELSIF TARGETS.OS = TARGETS.osLINUX32 THEN
|
||||
ELF.write(program, outname, sofinit, target = TARGETS.Linux32SO, FALSE)
|
||||
END
|
||||
|
||||
END CodeGen;
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user