Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion aeneas/src/arm64/Arm64AddrPatcher.v3
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class Arm64AddrPatcher {
// TODO
}

def patch(kind: Arm64PatchKind, posAddr: int, absAddr: int) {
def patch(kind: Arm64PatchKind, posAddr: long, absAddr: long) {
def pos = mw.pos;
match (kind) {
ABS_IMM16 => asm.patch_ABS_i16(pos, i16.view(absAddr));
Expand Down
8 changes: 4 additions & 4 deletions aeneas/src/exe/MachO.v3
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,8 @@ class MachO_LoadCmd {
}
// A load segment command
class MachO_SegmentLoad(segname: string) extends MachO_LoadCmd {
var vmaddr: int;
var vmsize: int;
var vmaddr: long;
var vmsize: long;
var fileoff: int;
var filesize: int;
var maxprot: int;
Expand All @@ -106,8 +106,8 @@ class MachO_SegmentLoad(segname: string) extends MachO_LoadCmd {
w.put_b64(fileoff);
w.put_b64(filesize);
} else {
w.put_b32(vmaddr);
w.put_b32(vmsize);
w.put_b32(int.!(vmaddr));
w.put_b32(int.!(vmsize));
w.put_b32(fileoff);
w.put_b32(filesize);
}
Expand Down
7 changes: 5 additions & 2 deletions aeneas/src/mach/MachBackend.v3
Original file line number Diff line number Diff line change
Expand Up @@ -743,17 +743,20 @@ class SsaMachGen(context: SsaContext, mach: MachProgram, regSet: MachRegSet, w:
//======================================================================
// Helper routines for emitting instructions.
//======================================================================
def matchImm(i: SsaInstr) -> bool {
return SsaConst.?(i); // may be overridden in subclasses
}
def matchAddImm(i: SsaInstr, disp: Val) -> (SsaInstr, Val) {
// TODO: check covering condition: in same block and single use
if (!SsaApplyOp.?(i)) return (i, disp);
var apply = SsaApplyOp.!(i);
if (Opcode.IntAdd.?(apply.op.opcode) || Opcode.PtrAdd.?(apply.op.opcode)) {
var x = apply.input0(), y = apply.input1();
if (SsaConst.?(x)) {
if (matchImm(x)) {
var disp2 = tryAddConsts(disp, SsaConst.!(x).val);
if (disp2 != null) return matchAddImm(y, disp2);
}
if (SsaConst.?(y)) {
if (matchImm(y)) {
var disp2 = tryAddConsts(disp, SsaConst.!(y).val);
if (disp2 != null) return matchAddImm(x, disp2);
}
Expand Down
16 changes: 8 additions & 8 deletions aeneas/src/mach/MachDataWriter.v3
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ enum PatchKind {
class MachDataWriter extends DataWriter {
def pageAlign: Alignment;
var startPos: int; // start position from which offset() is calculated
var patches: List<(PatchKind, Addr, /*posAddr:*/int, /*pos:*/int)>;
var patches: List<(PatchKind, Addr, /*posAddr:*/long, /*pos:*/int)>;

new(pageAlign, startAddr: int, initialSize: int) {
new(pageAlign, startAddr: long, initialSize: int) {
this.startAddr = u64.!(startAddr);
grow(initialSize);
}
Expand Down Expand Up @@ -49,21 +49,21 @@ class MachDataWriter extends DataWriter {
at(pos);
match (t.0) {
REL_32 => {
put_b32(absAddr - posAddr);
put_b32(int.!(absAddr - posAddr));
}
RELA_32 => {
var delta = i8.view(data[pos + 1]);
put_b32(absAddr - (posAddr + delta));
put_b32(int.!(absAddr - (posAddr + delta)));
}
ABS_32 => {
put_b32(absAddr);
put_b32(int.!(absAddr));
}
ABS_64 => {
put_b64(absAddr);

}
ABS_SLEB32 => {
overwrite_sleb32(absAddr);
overwrite_sleb32(int.!(absAddr));
}
_ => mach.prog.ERROR.fail1("unimplemented patch code: %s", kind.name);
}
Expand All @@ -76,8 +76,8 @@ class MachDataWriter extends DataWriter {
def skipPage() {
skipAddr(pageAlign.size);
}
def endPageAddr() -> int {
return pageAlign.alignDown_i32(addr_end());
def endPageAddr() -> long {
return pageAlign.alignDown_i64(addr_end());
}
def putmd(w: MachDataWriter) {
var p = this.pos;
Expand Down
12 changes: 6 additions & 6 deletions aeneas/src/mach/MachProgram.v3
Original file line number Diff line number Diff line change
Expand Up @@ -476,11 +476,11 @@ class MachProgram extends TargetProgram {
}
encodeAbs(w, space, abs);
}
def encodeAbs(w: DataWriter, space: AddressSpace, abs: int) {
def encodeAbs(w: DataWriter, space: AddressSpace, abs: long) {
match (space.addressSize) {
1 => w.putb(abs);
2 => w.put_b16(abs);
4 => w.put_b32(abs);
1 => w.putb(u8.!(abs));
2 => w.put_b16(u16.!(abs));
4 => w.put_b32(int.!(abs));
8 => w.put_b64(abs);
}
}
Expand Down Expand Up @@ -519,7 +519,7 @@ class MachProgram extends TargetProgram {
if (a == null) methodMap[m] = a = Address.new(codeRegion, m);
return a;
}
def absolute(a: Addr) -> int {
def absolute(a: Addr) -> long {
if (a == null) return 0;
if (a.base != null) return absolute(a.base) + a.offset;
if (CiRuntime_Address.?(a)) return runtime.getAddr(CiRuntime_Address.!(a));
Expand Down Expand Up @@ -682,7 +682,7 @@ class MachRtPageTable(

def encode(rt: MachRuntime, w: MachDataWriter) {
var pageTableAddr = rt.bindAddr(pageTable, w);
var maxPage = rt.codePages(), maxEntry = entries.length;
var maxPage = int.!(rt.codePages()), maxEntry = entries.length;
var tableSize = 4 * (maxPage + 1);
rt.setAddr(table, pageTableAddr + tableSize);
// encode the page table offsets
Expand Down
2 changes: 1 addition & 1 deletion aeneas/src/mach/MachRtSrcTables.v3
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ class MachRtSrcTables(mach: MachProgram, rt: MachRuntime) {
return off;
}
// set absolute addresses for addresses in ex region and return the size
def layoutExRegion(startAddr: int) -> int {
def layoutExRegion(startAddr: long) -> int {
for (l = exDests; l != null; l = l.tail) {
l.head.absolute = startAddr + l.head.offset;
}
Expand Down
36 changes: 18 additions & 18 deletions aeneas/src/mach/MachRuntime.v3
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
// Represents all runtime data structures exposed to the Virgil runtime code.
class MachRuntime(mach: MachProgram) {
def codeRegion = mach.codeRegion;
def addrs = Array<int>.new(CiRuntimeModule.max); // CiRuntime absolute addresses
def addrs = Array<long>.new(CiRuntimeModule.max); // CiRuntime absolute addresses
var typeCon: CiRuntime_TypeCon;

// Indexes in the IrModule's roots vector
Expand Down Expand Up @@ -38,41 +38,41 @@ class MachRuntime(mach: MachProgram) {
}
}

def recordStackStart(addr: int) {
def recordStackStart(addr: long) {
setAddr(CiRuntimeModule.STACK_START, addr);
}
def recordStackEnd(addr: int) {
def recordStackEnd(addr: long) {
setAddr(CiRuntimeModule.STACK_END, addr);
}
def recordCodeStart(addr: int) {
def recordCodeStart(addr: long) {
setAddr(CiRuntimeModule.CODE_START, addr);
}
def recordReservedCode(startAddr: int, size: int, fileOffset: int) {
def recordReservedCode(startAddr: long, size: long, fileOffset: int) {
setAddr(CiRuntimeModule.RESERVED_CODE_START, startAddr);
setAddr(CiRuntimeModule.RESERVED_CODE_END, startAddr + size);
setAddr(CiRuntimeModule.RESERVED_CODE_FILE_OFFSET, fileOffset);
}
def recordRuntimeCode(startAddr: int, size: int) {
def recordRuntimeCode(startAddr: long, size: long) {
setAddr(CiRuntimeModule.RUNTIME_CODE_START, startAddr);
setAddr(CiRuntimeModule.RUNTIME_CODE_END, startAddr + size);
}
def recordCodeEnd(addr: int) {
def recordCodeEnd(addr: long) {
setAddr(CiRuntimeModule.CODE_END, addr);
}
def recordDataStart(addr: int) {
def recordDataStart(addr: long) {
setAddr(CiRuntimeModule.DATA_START, addr);
}
def recordDataEnd(addr: int) {
def recordDataEnd(addr: long) {
setAddr(CiRuntimeModule.DATA_END, addr);
}
def setAddr(c: CiRuntime_Address, addr: int) {
def setAddr(c: CiRuntime_Address, addr: long) {
if (CLOptions.PRINT_BIN.get()) Terminal.put2("CiRuntime.%s=%x\n", c.name, addr);
addrs[c.index] = addr;
}
def getAddr(c: CiRuntime_Address) -> int {
def getAddr(c: CiRuntime_Address) -> long {
return addrs[c.index];
}
def bindAddr(c: CiRuntime_Address, w: DataWriter) -> int {
def bindAddr(c: CiRuntime_Address, w: DataWriter) -> long {
var addr = w.addr_end();
setAddr(c, addr);
return addr;
Expand Down Expand Up @@ -109,26 +109,26 @@ class MachRuntime(mach: MachProgram) {
bindAddr(ptr, w);
w.skipN(mach.data.addressSize);
}
def setPtr(w: MachDataWriter, ptr: CiRuntime_Address, addr: int) {
def setPtr(w: MachDataWriter, ptr: CiRuntime_Address, addr: long) {
var abs = addrs[ptr.index];
if (CLOptions.PRINT_BIN.get()) {
Terminal.put3("CiRuntime.%s @ %x = %x\n", ptr.name, abs, addr);
}
w.at(int.!(u64.view(abs) - w.startAddr)); // TODO(addr64)
match (mach.data.addressSize) {
1 => w.putb(addr);
2 => w.put_b16(addr);
4 => w.put_b32(addr);
1 => w.putb(u8.!(addr));
2 => w.put_b16(u16.!(addr));
4 => w.put_b32(int.!(addr));
8 => w.put_b64(addr);
_ => { return V3.fail("invalid data address size"); }
}
}
def codePages() -> int {
def codePages() -> long { // TODO(addr64) int is probably sufficient
var end = getAddr(CiRuntimeModule.CODE_END);
if (end == 0) mach.prog.ERROR.fail("code end not set yet");
var size = end - getAddr(CiRuntimeModule.CODE_START);
var align = codeRegion.space.pageAlign;
return align.alignUp_i32(size) >> align.shift_u5;
return align.alignUp_i64(size) >> align.shift_u6;
}
def encode(w: MachDataWriter) {
if (gc != null) gc.encode(w);
Expand Down
9 changes: 5 additions & 4 deletions aeneas/src/mach/Memory.v3
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// See LICENSE for details of Apache 2.0 license.

def pname(width: int) -> string {
return Strings.builderOf("$p").putd(width).toString();
return Strings.builderOf("#ptr").putd(width).toString();
}
class AddressSpace {
def name: string; // name of address space
Expand All @@ -22,6 +22,7 @@ class AddressSpace {
// the offsets for each allocation for later debugging.
class Region(name: string, space: AddressSpace) {
def contents = Vector<(Addr, int, int)>.new();
var refSize = space.addressSize;
var mark: int; // the current end of the allocations

// align the current allocation mark to the specified size
Expand All @@ -39,7 +40,7 @@ class Region(name: string, space: AddressSpace) {
def apply(f: (Addr, int, int) -> void) {
contents.apply(f);
}
def setStartAddr(startAddr: int) -> int {
def setStartAddr(startAddr: long) -> int {
// set all addresses
for (i < contents.length) {
var t = contents[i];
Expand All @@ -50,8 +51,8 @@ class Region(name: string, space: AddressSpace) {
}
// Addr represents any kind of address
class Addr(region: Region, base: Addr, offset: int) extends Val {
var absolute: int = -1; // absolute address if this is a base address
var size: int;
var absolute: long = -1; // absolute address if this is a base address
var size: long;

def equals(val: Val) -> bool {
if (Addr.?(val)) {
Expand Down
13 changes: 8 additions & 5 deletions aeneas/src/os/Linux.v3
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@ class LinuxTarget extends Target {
}
def configureProgram(prog: Program) {
var mach = MachProgram.new(prog, space, space, intNorm);
var vaddr_start = long.!(CLOptions.VM_START_ADDR.get()); // TODO(addr64)
if (vaddr_start == 0) vaddr_start = DEFAULT_VADDR_START;
if (vaddr_start < 3_000_000_000L) mach.codeRegion.refSize = 4;
prog.tprog = mach;
var rt = MachRuntime.new(mach);
mach.runtime = rt;
Expand Down Expand Up @@ -77,7 +80,7 @@ class LinuxTarget extends Target {

var pageAlign = mach.code.pageAlign;

var vaddr_start = int.view(CLOptions.VM_START_ADDR.get());
var vaddr_start = long.!(CLOptions.VM_START_ADDR.get()); // TODO(addr64)
if (vaddr_start == 0) vaddr_start = DEFAULT_VADDR_START;
var w = MachDataWriter.new(mach.code.pageAlign, vaddr_start, 300);

Expand All @@ -91,9 +94,9 @@ class LinuxTarget extends Target {
stack.p_memsz = stackSize;
stack.p_flags = ElfConst.PF_RW;
stack.p_vaddr = long.!(w.startAddr); // TODO(addr64)
rt.recordStackStart(int.!(w.startAddr)); // TODO(addr64)
rt.recordStackStart(long.!(w.startAddr)); // TODO(addr64)
w.skipAddr(stackSize); // TODO(addr64)
rt.recordStackEnd(int.!(w.startAddr)); // TODO(addr64)
rt.recordStackEnd(long.!(w.startAddr)); // TODO(addr64)
}

// fill out the code section
Expand Down Expand Up @@ -133,7 +136,7 @@ class LinuxTarget extends Target {

if (rtexe != null) {
// TODO: add .runtime_code symbol
var startAddr = pageAlign.alignUp_i32(w.addr_end());
var startAddr = pageAlign.alignUp_i64(w.addr_end());
rt.recordRuntimeCode(startAddr, runtimeCodeSize);
rtexe.p_type = ElfPhType.PT_LOAD;
rtexe.p_filesz = 1; // file size cannot be zero, apparently
Expand All @@ -156,7 +159,7 @@ class LinuxTarget extends Target {
if (ex != null) {
w.skipPage();
var exStart = w.endPageAddr();
var exSize = pageAlign.alignUp_i32(rt.src.layoutExRegion(exStart));
var exSize = pageAlign.alignUp_i64(rt.src.layoutExRegion(exStart));
w.skipAddr(exSize);
ex.p_vaddr = exStart;
ex.p_memsz = exSize;
Expand Down
1 change: 1 addition & 0 deletions aeneas/src/ssa/SsaOptimizer.v3
Original file line number Diff line number Diff line change
Expand Up @@ -1157,6 +1157,7 @@ class SsaInstrReducer(context: SsaContext) extends SsaInstrMatcher {
nullcheck(i);
state.kill();
}
// XXX: PtrAdd, PtrSub, PtrLt
PtrLoad => {
var ptr = nullcheck(i);
// XXX: use Fact.O_FOLDABLE to indicate a load of an immutable value
Expand Down
3 changes: 3 additions & 0 deletions aeneas/src/util/Alignment.v3
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ class Alignment(size: u31) {
def alignDown_i32(i: int) -> int {
return i & int.view(mask_u32);
}
def alignDown_i64(i: long) -> long {
return i & long.view(mask_u64);
}
def alignUp_i32(i: int) -> int {
return (i + add) & int.view(mask_u32);
}
Expand Down
4 changes: 2 additions & 2 deletions aeneas/src/wasm/WasmCodeGen.v3
Original file line number Diff line number Diff line change
Expand Up @@ -1328,7 +1328,7 @@ class WasmCodeGen extends SsaMachGen {
}
}
x: Addr => {
var abs = x.absolute;
var abs = int.!(x.absolute);
if (abs < 0) {
context.fail1("pushValue() no global for Addr of type %q", t.render);
} else {
Expand Down Expand Up @@ -1786,7 +1786,7 @@ class WasmCodeGen extends SsaMachGen {
}
}
x: Addr => {
var abs = x.absolute;
var abs = int.!(x.absolute);
if (abs < 0) {
context.fail1("genLoadConst() no global for Addr of type %q", t.render);
} else {
Expand Down
2 changes: 1 addition & 1 deletion aeneas/src/wasm/WasmGcTarget.v3
Original file line number Diff line number Diff line change
Expand Up @@ -1241,7 +1241,7 @@ class WasmGcTarget extends Target {
return size;
}
def patchAddress(mach: MachProgram, w: MachDataWriter, a: Addr, posAddr: int) {
var abs = mach.absolute(a);
var abs = int.!(mach.absolute(a));
if (CLOptions.PRINT_BIN.get()) {
TerminalBuffer.new()
.puts("patch-address @+")
Expand Down
15 changes: 0 additions & 15 deletions aeneas/src/wasm/WasmTarget.v3
Original file line number Diff line number Diff line change
Expand Up @@ -366,21 +366,6 @@ class WasmTarget extends Target {
System.fileClose(fd);
return out;
}
def patchAddress(mach: MachProgram, w: MachDataWriter, kind: PatchKind, a: Addr, posAddr: int) {
var abs = mach.absolute(a);
if (CLOptions.PRINT_BIN.get()) {
TerminalBuffer.new()
.puts("patch-address @+")
.putd(w.pos)
.puts(" <- ")
.putcv(a, null)
.puts(" = ")
.putx(abs)
.outln();
}
// TODO,XXX: address immediates are in i32.const, which is a signed LEB.
w.overwrite_sleb32(abs);
}
def emitTestWrappers(context: SsaContext, rt: MachRuntime, w: DataWriter, e: ExecuteTestCase) {
var prog = context.prog;
var fileName = context.compiler.getOutputFileName(prog.name(), "expect.js");
Expand Down
Loading
Loading