diff options
| author | mlugg <mlugg@mlugg.co.uk> | 2024-02-01 16:58:52 +0000 |
|---|---|---|
| committer | Matthew Lugg <mlugg@mlugg.co.uk> | 2024-02-02 11:02:03 +0000 |
| commit | 9eda6ccefce370c76209ea50dd57fe65bfe25536 (patch) | |
| tree | d5b4af496b8a6d1811788557d85e340ce26ef2bc /src/codegen.zig | |
| parent | 5a3ae38f3b79a69cb6f4ad28934a51165cae2ef1 (diff) | |
| download | zig-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.zig | 31 |
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), |
