authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-02-28 00:25:41+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-03-17 19:59:13+01:00
log7c22f4f85165965e5843a9f6bd800f0463f19122
treea69e9e2cdaa68800469bc6de9951f2ec5485214a
parent7cbdbab3765bf1eb5f213b04054b82c46d876588

zld: pass test-std and test-compiler-rt


2 files changed, 32 insertions(+), 17 deletions(-)

src/link/MachO/Zld.zig+22-16
...@@ -517,7 +517,7 @@ fn allocateSegment(self: *Zld, index: u16, offset: u64, start: u64, reverse: boo...@@ -517,7 +517,7 @@ fn allocateSegment(self: *Zld, index: u16, offset: u64, start: u64, reverse: boo
517 var count: usize = seg.sections.items.len;517 var count: usize = seg.sections.items.len;
518 while (count > 0) : (count -= 1) {518 while (count > 0) : (count -= 1) {
519 const sec = &seg.sections.items[count - 1];519 const sec = &seg.sections.items[count - 1];
520 end_off -= mem.alignForwardGeneric(u64, sec.size, @alignOf(u64)); // TODO is 8-byte aligned correct?520 end_off -= mem.alignForwardGeneric(u64, sec.size, @alignOf(u128)); // TODO is 8-byte aligned correct?
521 sec.offset = @intCast(u32, end_off);521 sec.offset = @intCast(u32, end_off);
522 sec.addr = base_vmaddr + end_off;522 sec.addr = base_vmaddr + end_off;
523 }523 }
...@@ -526,7 +526,7 @@ fn allocateSegment(self: *Zld, index: u16, offset: u64, start: u64, reverse: boo...@@ -526,7 +526,7 @@ fn allocateSegment(self: *Zld, index: u16, offset: u64, start: u64, reverse: boo
526 for (seg.sections.items) |*sect| {526 for (seg.sections.items) |*sect| {
527 sect.offset = @intCast(u32, next_off);527 sect.offset = @intCast(u32, next_off);
528 sect.addr = base_vmaddr + next_off;528 sect.addr = base_vmaddr + next_off;
529 next_off += mem.alignForwardGeneric(u64, sect.size, @alignOf(u64)); // TODO is 8-byte aligned correct?529 next_off += mem.alignForwardGeneric(u64, sect.size, @alignOf(u128)); // TODO is 8-byte aligned correct?
530 }530 }
531 }531 }
532}532}
...@@ -1120,6 +1120,11 @@ fn doRelocs(self: *Zld) !void {...@@ -1120,6 +1120,11 @@ fn doRelocs(self: *Zld) !void {
1120 const narrowed = @truncate(u12, ta);1120 const narrowed = @truncate(u12, ta);
1121 const offset: u12 = blk: {1121 const offset: u12 = blk: {
1122 if (parsed.size == 0) {1122 if (parsed.size == 0) {
1123 if (parsed.v == 1) {
1124 // 128-bit SIMD is scaled by 16.
1125 break :blk try math.divExact(u12, narrowed, 16);
1126 }
1127 // Otherwise, 8-bit SIMD or ldrb.
1123 break :blk narrowed;1128 break :blk narrowed;
1124 } else {1129 } else {
1125 const denom: u4 = try math.powi(u4, 2, parsed.size);1130 const denom: u4 = try math.powi(u4, 2, parsed.size);
...@@ -2184,25 +2189,26 @@ fn writeSymbolTable(self: *Zld) !void {...@@ -2184,25 +2189,26 @@ fn writeSymbolTable(self: *Zld) !void {
21842189
2185 for (self.locals.items()) |entries| {2190 for (self.locals.items()) |entries| {
2186 log.warn("'{s}': {} entries", .{ entries.key, entries.value.items.len });2191 log.warn("'{s}': {} entries", .{ entries.key, entries.value.items.len });
2187 var symbol: ?macho.nlist_64 = null;2192 // var symbol: ?macho.nlist_64 = null;
2188 for (entries.value.items) |entry| {2193 for (entries.value.items) |entry| {
2189 log.warn(" | {}", .{entry.inner});2194 log.warn(" | {}", .{entry.inner});
2190 log.warn(" | {}", .{entry.tt});2195 log.warn(" | {}", .{entry.tt});
2191 log.warn(" | {s}", .{entry.object.name});2196 log.warn(" | {s}", .{entry.object.name});
2192 switch (entry.tt) {2197 // switch (entry.tt) {
2193 .Global => {2198 // .Global => {
2194 symbol = entry.inner;2199 // symbol = entry.inner;
2195 break;2200 // break;
2196 },2201 // },
2197 .WeakGlobal => {2202 // .WeakGlobal => {
2198 symbol = entry.inner;2203 // symbol = entry.inner;
2199 },2204 // },
2200 .Local => {},2205 // .Local => {},
2201 }2206 // }
2202 }2207 try locals.append(entry.inner);
2203 if (symbol) |s| {
2204 try locals.append(s);
2205 }2208 }
2209 // if (symbol) |s| {
2210 // try locals.append(s);
2211 // }
2206 }2212 }
2207 const nlocals = locals.items.len;2213 const nlocals = locals.items.len;
22082214
src/link/MachO/reloc.zig+10-1
...@@ -25,7 +25,10 @@ pub const Arm64 = union(enum) {...@@ -25,7 +25,10 @@ pub const Arm64 = union(enum) {
25 rt: u5,25 rt: u5,
26 rn: u5,26 rn: u5,
27 offset: u12,27 offset: u12,
28 _1: u8 = 0b111_0_01_01,28 opc: u2,
29 _2: u2 = 0b01,
30 v: u1,
31 _1: u3 = 0b111,
29 size: u2,32 size: u2,
30 },33 },
31 LoadLiteral: packed struct {34 LoadLiteral: packed struct {
...@@ -144,6 +147,8 @@ pub const Arm64 = union(enum) {...@@ -144,6 +147,8 @@ pub const Arm64 = union(enum) {
144 .rt = rt,147 .rt = rt,
145 .rn = rn,148 .rn = rn,
146 .offset = offset,149 .offset = offset,
150 .opc = 0b01,
151 .v = 0b0,
147 .size = 0b11,152 .size = 0b11,
148 },153 },
149 };154 };
...@@ -154,6 +159,8 @@ pub const Arm64 = union(enum) {...@@ -154,6 +159,8 @@ pub const Arm64 = union(enum) {
154 .rt = rt,159 .rt = rt,
155 .rn = rn,160 .rn = rn,
156 .offset = offset,161 .offset = offset,
162 .opc = 0b01,
163 .v = 0b0,
157 .size = 0b01,164 .size = 0b01,
158 },165 },
159 };166 };
...@@ -164,6 +171,8 @@ pub const Arm64 = union(enum) {...@@ -164,6 +171,8 @@ pub const Arm64 = union(enum) {
164 .rt = rt,171 .rt = rt,
165 .rn = rn,172 .rn = rn,
166 .offset = offset,173 .offset = offset,
174 .opc = 0b01,
175 .v = 0b0,
167 .size = 0b00,176 .size = 0b00,
168 },177 },
169 };178 };