aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authormlugg <mlugg@mlugg.co.uk>2024-02-01 16:58:52 +0000
committerMatthew Lugg <mlugg@mlugg.co.uk>2024-02-02 11:02:03 +0000
commit9eda6ccefce370c76209ea50dd57fe65bfe25536 (patch)
treed5b4af496b8a6d1811788557d85e340ce26ef2bc /src/codegen.zig
parent5a3ae38f3b79a69cb6f4ad28934a51165cae2ef1 (diff)
downloadzig-9eda6ccefce370c76209ea50dd57fe65bfe25536.tar.gz
zig-9eda6ccefce370c76209ea50dd57fe65bfe25536.zip
InternPool: use separate key for slices
This change eliminates some problematic recursive logic in InternPool, and provides a safer API.
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig31
1 files changed, 15 insertions, 16 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index e9509c4efd..dd851eeb03 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -322,24 +322,24 @@ pub fn generateSymbol(
},
.f128 => |f128_val| writeFloat(f128, f128_val, target, endian, try code.addManyAsArray(16)),
},
- .ptr => |ptr| {
- // generate ptr
- switch (try lowerParentPtr(bin_file, src_loc, switch (ptr.len) {
- .none => typed_value.val,
- else => typed_value.val.slicePtr(mod),
- }.toIntern(), code, debug_output, reloc_info)) {
+ .ptr => switch (try lowerParentPtr(bin_file, src_loc, typed_value.val.toIntern(), code, debug_output, reloc_info)) {
+ .ok => {},
+ .fail => |em| return .{ .fail = em },
+ },
+ .slice => |slice| {
+ switch (try generateSymbol(bin_file, src_loc, .{
+ .ty = typed_value.ty.slicePtrFieldType(mod),
+ .val = Value.fromInterned(slice.ptr),
+ }, code, debug_output, reloc_info)) {
.ok => {},
.fail => |em| return .{ .fail = em },
}
- if (ptr.len != .none) {
- // generate len
- switch (try generateSymbol(bin_file, src_loc, .{
- .ty = Type.usize,
- .val = Value.fromInterned(ptr.len),
- }, code, debug_output, reloc_info)) {
- .ok => {},
- .fail => |em| return Result{ .fail = em },
- }
+ switch (try generateSymbol(bin_file, src_loc, .{
+ .ty = Type.usize,
+ .val = Value.fromInterned(slice.len),
+ }, code, debug_output, reloc_info)) {
+ .ok => {},
+ .fail => |em| return .{ .fail = em },
}
},
.opt => {
@@ -676,7 +676,6 @@ fn lowerParentPtr(
) CodeGenError!Result {
const mod = bin_file.comp.module.?;
const ptr = mod.intern_pool.indexToKey(parent_ptr).ptr;
- assert(ptr.len == .none);
return switch (ptr.addr) {
.decl => |decl| try lowerDeclRef(bin_file, src_loc, decl, code, debug_output, reloc_info),
.mut_decl => |md| try lowerDeclRef(bin_file, src_loc, md.decl, code, debug_output, reloc_info),