aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2024-12-07 21:41:44 -0800
committerAndrew Kelley <andrew@ziglang.org>2025-01-15 15:11:35 -0800
commitb3ecdb21eedeb8be099cf1ef43ceff68592593ed (patch)
treef5fb9a8412cf2b652e5d501c201064fdb219a7b5 /src/codegen.zig
parentbf20a4aa9eeca3c1911709bf48a8c476106042dc (diff)
downloadzig-b3ecdb21eedeb8be099cf1ef43ceff68592593ed.tar.gz
zig-b3ecdb21eedeb8be099cf1ef43ceff68592593ed.zip
switch to ArrayListUnmanaged for machine code
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig104
1 files changed, 53 insertions, 51 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index 0f49e44b97..d8601234fd 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -55,7 +55,7 @@ pub fn generateFunction(
func_index: InternPool.Index,
air: Air,
liveness: Liveness,
- code: *std.ArrayList(u8),
+ code: *std.ArrayListUnmanaged(u8),
debug_output: link.File.DebugInfoOutput,
) CodeGenError!void {
const zcu = pt.zcu;
@@ -80,7 +80,7 @@ pub fn generateLazyFunction(
pt: Zcu.PerThread,
src_loc: Zcu.LazySrcLoc,
lazy_sym: link.File.LazySymbol,
- code: *std.ArrayList(u8),
+ code: *std.ArrayListUnmanaged(u8),
debug_output: link.File.DebugInfoOutput,
) CodeGenError!void {
const zcu = pt.zcu;
@@ -110,7 +110,7 @@ pub fn generateLazySymbol(
lazy_sym: link.File.LazySymbol,
// TODO don't use an "out" parameter like this; put it in the result instead
alignment: *Alignment,
- code: *std.ArrayList(u8),
+ code: *std.ArrayListUnmanaged(u8),
debug_output: link.File.DebugInfoOutput,
reloc_parent: link.File.RelocInfo.Parent,
) CodeGenError!void {
@@ -120,6 +120,7 @@ pub fn generateLazySymbol(
defer tracy.end();
const comp = bin_file.comp;
+ const gpa = comp.gpa;
const zcu = pt.zcu;
const ip = &zcu.intern_pool;
const target = comp.root_mod.resolved_target.result;
@@ -140,7 +141,7 @@ pub fn generateLazySymbol(
const err_names = ip.global_error_set.getNamesFromMainThread();
var offset_index: u32 = @intCast(code.items.len);
var string_index: u32 = @intCast(4 * (1 + err_names.len + @intFromBool(err_names.len > 0)));
- try code.resize(offset_index + string_index);
+ try code.resize(gpa, offset_index + string_index);
mem.writeInt(u32, code.items[offset_index..][0..4], @intCast(err_names.len), endian);
if (err_names.len == 0) return .ok;
offset_index += 4;
@@ -148,7 +149,7 @@ pub fn generateLazySymbol(
const err_name = err_name_nts.toSlice(ip);
mem.writeInt(u32, code.items[offset_index..][0..4], string_index, endian);
offset_index += 4;
- try code.ensureUnusedCapacity(err_name.len + 1);
+ try code.ensureUnusedCapacity(gpa, err_name.len + 1);
code.appendSliceAssumeCapacity(err_name);
code.appendAssumeCapacity(0);
string_index += @intCast(err_name.len + 1);
@@ -160,7 +161,7 @@ pub fn generateLazySymbol(
const tag_names = enum_ty.enumFields(zcu);
for (0..tag_names.len) |tag_index| {
const tag_name = tag_names.get(ip)[tag_index].toSlice(ip);
- try code.ensureUnusedCapacity(tag_name.len + 1);
+ try code.ensureUnusedCapacity(gpa, tag_name.len + 1);
code.appendSliceAssumeCapacity(tag_name);
code.appendAssumeCapacity(0);
}
@@ -182,13 +183,14 @@ pub fn generateSymbol(
pt: Zcu.PerThread,
src_loc: Zcu.LazySrcLoc,
val: Value,
- code: *std.ArrayList(u8),
+ code: *std.ArrayListUnmanaged(u8),
reloc_parent: link.File.RelocInfo.Parent,
) GenerateSymbolError!void {
const tracy = trace(@src());
defer tracy.end();
const zcu = pt.zcu;
+ const gpa = zcu.gpa;
const ip = &zcu.intern_pool;
const ty = val.typeOf(zcu);
@@ -199,7 +201,7 @@ pub fn generateSymbol(
if (val.isUndefDeep(zcu)) {
const abi_size = math.cast(usize, ty.abiSize(zcu)) orelse return error.Overflow;
- try code.appendNTimes(0xaa, abi_size);
+ try code.appendNTimes(gpa, 0xaa, abi_size);
return;
}
@@ -231,7 +233,7 @@ pub fn generateSymbol(
.@"unreachable",
.generic_poison,
=> unreachable, // non-runtime values
- .false, .true => try code.append(switch (simple_value) {
+ .false, .true => try code.append(gpa, switch (simple_value) {
.false => 0,
.true => 1,
else => unreachable,
@@ -247,11 +249,11 @@ pub fn generateSymbol(
const abi_size = math.cast(usize, ty.abiSize(zcu)) orelse return error.Overflow;
var space: Value.BigIntSpace = undefined;
const int_val = val.toBigInt(&space, zcu);
- int_val.writeTwosComplement(try code.addManyAsSlice(abi_size), endian);
+ int_val.writeTwosComplement(try code.addManyAsSlice(gpa, abi_size), endian);
},
.err => |err| {
const int = try pt.getErrorValue(err.name);
- try code.writer().writeInt(u16, @intCast(int), endian);
+ try code.writer(gpa).writeInt(u16, @intCast(int), endian);
},
.error_union => |error_union| {
const payload_ty = ty.errorUnionPayload(zcu);
@@ -261,7 +263,7 @@ pub fn generateSymbol(
};
if (!payload_ty.hasRuntimeBitsIgnoreComptime(zcu)) {
- try code.writer().writeInt(u16, err_val, endian);
+ try code.writer(gpa).writeInt(u16, err_val, endian);
return;
}
@@ -271,7 +273,7 @@ pub fn generateSymbol(
// error value first when its type is larger than the error union's payload
if (error_align.order(payload_align) == .gt) {
- try code.writer().writeInt(u16, err_val, endian);
+ try code.writer(gpa).writeInt(u16, err_val, endian);
}
// emit payload part of the error union
@@ -286,20 +288,20 @@ pub fn generateSymbol(
const padding = math.cast(usize, padded_end - unpadded_end) orelse return error.Overflow;
if (padding > 0) {
- try code.appendNTimes(0, padding);
+ try code.appendNTimes(gpa, 0, padding);
}
}
// Payload size is larger than error set, so emit our error set last
if (error_align.compare(.lte, payload_align)) {
const begin = code.items.len;
- try code.writer().writeInt(u16, err_val, endian);
+ try code.writer(gpa).writeInt(u16, err_val, endian);
const unpadded_end = code.items.len - begin;
const padded_end = abi_align.forward(unpadded_end);
const padding = math.cast(usize, padded_end - unpadded_end) orelse return error.Overflow;
if (padding > 0) {
- try code.appendNTimes(0, padding);
+ try code.appendNTimes(gpa, 0, padding);
}
}
},
@@ -308,15 +310,15 @@ pub fn generateSymbol(
try generateSymbol(bin_file, pt, src_loc, try pt.getCoerced(Value.fromInterned(enum_tag.int), int_tag_ty), code, reloc_parent);
},
.float => |float| switch (float.storage) {
- .f16 => |f16_val| writeFloat(f16, f16_val, target, endian, try code.addManyAsArray(2)),
- .f32 => |f32_val| writeFloat(f32, f32_val, target, endian, try code.addManyAsArray(4)),
- .f64 => |f64_val| writeFloat(f64, f64_val, target, endian, try code.addManyAsArray(8)),
+ .f16 => |f16_val| writeFloat(f16, f16_val, target, endian, try code.addManyAsArray(gpa, 2)),
+ .f32 => |f32_val| writeFloat(f32, f32_val, target, endian, try code.addManyAsArray(gpa, 4)),
+ .f64 => |f64_val| writeFloat(f64, f64_val, target, endian, try code.addManyAsArray(gpa, 8)),
.f80 => |f80_val| {
- writeFloat(f80, f80_val, target, endian, try code.addManyAsArray(10));
+ writeFloat(f80, f80_val, target, endian, try code.addManyAsArray(gpa, 10));
const abi_size = math.cast(usize, ty.abiSize(zcu)) orelse return error.Overflow;
- try code.appendNTimes(0, abi_size - 10);
+ try code.appendNTimes(gpa, 0, abi_size - 10);
},
- .f128 => |f128_val| writeFloat(f128, f128_val, target, endian, try code.addManyAsArray(16)),
+ .f128 => |f128_val| writeFloat(f128, f128_val, target, endian, try code.addManyAsArray(gpa, 16)),
},
.ptr => try lowerPtr(bin_file, pt, src_loc, val.toIntern(), code, reloc_parent, 0),
.slice => |slice| {
@@ -332,7 +334,7 @@ pub fn generateSymbol(
if (payload_val) |value| {
try generateSymbol(bin_file, pt, src_loc, value, code, reloc_parent);
} else {
- try code.appendNTimes(0, abi_size);
+ try code.appendNTimes(gpa, 0, abi_size);
}
} else {
const padding = abi_size - (math.cast(usize, payload_type.abiSize(zcu)) orelse return error.Overflow) - 1;
@@ -342,13 +344,13 @@ pub fn generateSymbol(
}));
try generateSymbol(bin_file, pt, src_loc, value, code, reloc_parent);
}
- try code.writer().writeByte(@intFromBool(payload_val != null));
- try code.appendNTimes(0, padding);
+ try code.writer(gpa).writeByte(@intFromBool(payload_val != null));
+ try code.appendNTimes(gpa, 0, padding);
}
},
.aggregate => |aggregate| switch (ip.indexToKey(ty.toIntern())) {
.array_type => |array_type| switch (aggregate.storage) {
- .bytes => |bytes| try code.appendSlice(bytes.toSlice(array_type.lenIncludingSentinel(), ip)),
+ .bytes => |bytes| try code.appendSlice(gpa, bytes.toSlice(array_type.lenIncludingSentinel(), ip)),
.elems, .repeated_elem => {
var index: u64 = 0;
while (index < array_type.lenIncludingSentinel()) : (index += 1) {
@@ -366,7 +368,7 @@ pub fn generateSymbol(
.vector_type => |vector_type| {
const abi_size = math.cast(usize, ty.abiSize(zcu)) orelse return error.Overflow;
if (vector_type.child == .bool_type) {
- const bytes = try code.addManyAsSlice(abi_size);
+ const bytes = try code.addManyAsSlice(gpa, abi_size);
@memset(bytes, 0xaa);
var index: usize = 0;
const len = math.cast(usize, vector_type.len) orelse return error.Overflow;
@@ -405,7 +407,7 @@ pub fn generateSymbol(
}
} else {
switch (aggregate.storage) {
- .bytes => |bytes| try code.appendSlice(bytes.toSlice(vector_type.len, ip)),
+ .bytes => |bytes| try code.appendSlice(gpa, bytes.toSlice(vector_type.len, ip)),
.elems, .repeated_elem => {
var index: u64 = 0;
while (index < vector_type.len) : (index += 1) {
@@ -423,7 +425,7 @@ pub fn generateSymbol(
const padding = abi_size -
(math.cast(usize, Type.fromInterned(vector_type.child).abiSize(zcu) * vector_type.len) orelse
return error.Overflow);
- if (padding > 0) try code.appendNTimes(0, padding);
+ if (padding > 0) try code.appendNTimes(gpa, 0, padding);
}
},
.tuple_type => |tuple| {
@@ -454,7 +456,7 @@ pub fn generateSymbol(
return error.Overflow;
if (padding > 0) {
- try code.appendNTimes(0, padding);
+ try code.appendNTimes(gpa, 0, padding);
}
}
},
@@ -464,7 +466,7 @@ pub fn generateSymbol(
.@"packed" => {
const abi_size = math.cast(usize, ty.abiSize(zcu)) orelse return error.Overflow;
const current_pos = code.items.len;
- try code.appendNTimes(0, abi_size);
+ try code.appendNTimes(gpa, 0, abi_size);
var bits: u16 = 0;
for (struct_type.field_types.get(ip), 0..) |field_ty, index| {
@@ -482,8 +484,8 @@ pub fn generateSymbol(
if (Type.fromInterned(field_ty).zigTypeTag(zcu) == .pointer) {
const field_size = math.cast(usize, Type.fromInterned(field_ty).abiSize(zcu)) orelse
return error.Overflow;
- var tmp_list = try std.ArrayList(u8).initCapacity(code.allocator, field_size);
- defer tmp_list.deinit();
+ var tmp_list = try std.ArrayListUnmanaged(u8).initCapacity(gpa, field_size);
+ defer tmp_list.deinit(gpa);
try generateSymbol(bin_file, pt, src_loc, Value.fromInterned(field_val), &tmp_list, reloc_parent);
@memcpy(code.items[current_pos..][0..tmp_list.items.len], tmp_list.items);
} else {
@@ -515,7 +517,7 @@ pub fn generateSymbol(
usize,
offsets[field_index] - (code.items.len - struct_begin),
) orelse return error.Overflow;
- if (padding > 0) try code.appendNTimes(0, padding);
+ if (padding > 0) try code.appendNTimes(gpa, 0, padding);
try generateSymbol(bin_file, pt, src_loc, Value.fromInterned(field_val), code, reloc_parent);
}
@@ -528,7 +530,7 @@ pub fn generateSymbol(
std.mem.alignForward(u64, size, @max(alignment, 1)) -
(code.items.len - struct_begin),
) orelse return error.Overflow;
- if (padding > 0) try code.appendNTimes(0, padding);
+ if (padding > 0) try code.appendNTimes(gpa, 0, padding);
},
}
},
@@ -551,13 +553,13 @@ pub fn generateSymbol(
const field_index = ty.unionTagFieldIndex(Value.fromInterned(un.tag), zcu).?;
const field_ty = Type.fromInterned(union_obj.field_types.get(ip)[field_index]);
if (!field_ty.hasRuntimeBits(zcu)) {
- try code.appendNTimes(0xaa, math.cast(usize, layout.payload_size) orelse return error.Overflow);
+ try code.appendNTimes(gpa, 0xaa, math.cast(usize, layout.payload_size) orelse return error.Overflow);
} else {
try generateSymbol(bin_file, pt, src_loc, Value.fromInterned(un.val), code, reloc_parent);
const padding = math.cast(usize, layout.payload_size - field_ty.abiSize(zcu)) orelse return error.Overflow;
if (padding > 0) {
- try code.appendNTimes(0, padding);
+ try code.appendNTimes(gpa, 0, padding);
}
}
} else {
@@ -568,7 +570,7 @@ pub fn generateSymbol(
try generateSymbol(bin_file, pt, src_loc, Value.fromInterned(un.tag), code, reloc_parent);
if (layout.padding > 0) {
- try code.appendNTimes(0, layout.padding);
+ try code.appendNTimes(gpa, 0, layout.padding);
}
}
},
@@ -581,7 +583,7 @@ fn lowerPtr(
pt: Zcu.PerThread,
src_loc: Zcu.LazySrcLoc,
ptr_val: InternPool.Index,
- code: *std.ArrayList(u8),
+ code: *std.ArrayListUnmanaged(u8),
reloc_parent: link.File.RelocInfo.Parent,
prev_offset: u64,
) GenerateSymbolError!void {
@@ -634,7 +636,7 @@ fn lowerUavRef(
pt: Zcu.PerThread,
src_loc: Zcu.LazySrcLoc,
uav: InternPool.Key.Ptr.BaseAddr.Uav,
- code: *std.ArrayList(u8),
+ code: *std.ArrayListUnmanaged(u8),
reloc_parent: link.File.RelocInfo.Parent,
offset: u64,
) GenerateSymbolError!void {
@@ -649,7 +651,7 @@ fn lowerUavRef(
log.debug("lowerUavRef: ty = {}", .{uav_ty.fmt(pt)});
const is_fn_body = uav_ty.zigTypeTag(zcu) == .@"fn";
if (!is_fn_body and !uav_ty.hasRuntimeBits(zcu)) {
- try code.appendNTimes(0xaa, ptr_width_bytes);
+ try code.appendNTimes(gpa, 0xaa, ptr_width_bytes);
return;
}
@@ -667,7 +669,7 @@ fn lowerUavRef(
.offset = @intCast(code.items.len),
.pointee = .{ .uav_index = uav.val },
});
- try code.appendNTimes(0, ptr_width_bytes);
+ try code.appendNTimes(gpa, 0, ptr_width_bytes);
return;
},
else => {},
@@ -686,9 +688,9 @@ fn lowerUavRef(
});
const endian = target.cpu.arch.endian();
switch (ptr_width_bytes) {
- 2 => mem.writeInt(u16, try code.addManyAsArray(2), @intCast(vaddr), endian),
- 4 => mem.writeInt(u32, try code.addManyAsArray(4), @intCast(vaddr), endian),
- 8 => mem.writeInt(u64, try code.addManyAsArray(8), vaddr, endian),
+ 2 => mem.writeInt(u16, try code.addManyAsArray(gpa, 2), @intCast(vaddr), endian),
+ 4 => mem.writeInt(u32, try code.addManyAsArray(gpa, 4), @intCast(vaddr), endian),
+ 8 => mem.writeInt(u64, try code.addManyAsArray(gpa, 8), vaddr, endian),
else => unreachable,
}
}
@@ -698,7 +700,7 @@ fn lowerNavRef(
pt: Zcu.PerThread,
src_loc: Zcu.LazySrcLoc,
nav_index: InternPool.Nav.Index,
- code: *std.ArrayList(u8),
+ code: *std.ArrayListUnmanaged(u8),
reloc_parent: link.File.RelocInfo.Parent,
offset: u64,
) GenerateSymbolError!void {
@@ -712,7 +714,7 @@ fn lowerNavRef(
const nav_ty = Type.fromInterned(ip.getNav(nav_index).typeOf(ip));
const is_fn_body = nav_ty.zigTypeTag(zcu) == .@"fn";
if (!is_fn_body and !nav_ty.hasRuntimeBits(zcu)) {
- try code.appendNTimes(0xaa, ptr_width_bytes);
+ try code.appendNTimes(gpa, 0xaa, ptr_width_bytes);
return;
}
@@ -730,7 +732,7 @@ fn lowerNavRef(
.offset = @intCast(code.items.len),
.pointee = .{ .nav_index = nav_index },
});
- try code.appendNTimes(0, ptr_width_bytes);
+ try code.appendNTimes(gpa, 0, ptr_width_bytes);
return;
},
else => {},
@@ -743,9 +745,9 @@ fn lowerNavRef(
}) catch @panic("TODO rework getNavVAddr");
const endian = target.cpu.arch.endian();
switch (ptr_width_bytes) {
- 2 => mem.writeInt(u16, try code.addManyAsArray(2), @intCast(vaddr), endian),
- 4 => mem.writeInt(u32, try code.addManyAsArray(4), @intCast(vaddr), endian),
- 8 => mem.writeInt(u64, try code.addManyAsArray(8), vaddr, endian),
+ 2 => mem.writeInt(u16, try code.addManyAsArray(gpa, 2), @intCast(vaddr), endian),
+ 4 => mem.writeInt(u32, try code.addManyAsArray(gpa, 4), @intCast(vaddr), endian),
+ 8 => mem.writeInt(u64, try code.addManyAsArray(gpa, 8), vaddr, endian),
else => unreachable,
}
}