aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2023-06-01 23:46:04 -0700
committerAndrew Kelley <andrew@ziglang.org>2023-06-10 20:47:58 -0700
commit69b7b910929e84248671377e1743477757e66837 (patch)
tree4e6b8295de849dc066e6da9c1a8a35ab37b837c3 /src/codegen.zig
parent34dae73005baa3be54e0d9e0725ab31cb0723a06 (diff)
downloadzig-69b7b910929e84248671377e1743477757e66837.tar.gz
zig-69b7b910929e84248671377e1743477757e66837.zip
compiler: eliminate Decl.value_arena and Sema.perm_arena
The main motivation for this commit is eliminating Decl.value_arena. Everything else is dominoes. Decl.name used to be stored in the GPA, now it is stored in InternPool. It ended up being simpler to migrate other strings to be interned as well, such as struct field names, union field names, and a few others. This ended up requiring a big diff, sorry about that. But the changes are pretty nice, we finally start to take advantage of InternPool's existence. global_error_set and error_name_list are simplified. Now it is a single ArrayHashMap(NullTerminatedString, void) and the index is the error tag value. Module.tmp_hack_arena is re-introduced (it was removed in eeff407941560ce8eb5b737b2436dfa93cfd3a0c) in order to deal with comptime_args, optimized_order, and struct and union fields. After structs and unions get moved into InternPool properly, tmp_hack_arena can be deleted again.
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig20
1 files changed, 8 insertions, 12 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index b0febb5ea7..77359d78da 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -142,11 +142,12 @@ pub fn generateLazySymbol(
if (lazy_sym.ty.isAnyError(mod)) {
alignment.* = 4;
- const err_names = mod.error_name_list.items;
+ const err_names = mod.global_error_set.keys();
mem.writeInt(u32, try code.addManyAsArray(4), @intCast(u32, err_names.len), endian);
var offset = code.items.len;
try code.resize((1 + err_names.len + 1) * 4);
- for (err_names) |err_name| {
+ for (err_names) |err_name_nts| {
+ const err_name = mod.intern_pool.stringToSlice(err_name_nts);
mem.writeInt(u32, code.items[offset..][0..4], @intCast(u32, code.items.len), endian);
offset += 4;
try code.ensureUnusedCapacity(err_name.len + 1);
@@ -251,15 +252,13 @@ pub fn generateSymbol(
val.writeTwosComplement(try code.addManyAsSlice(abi_size), endian);
},
.err => |err| {
- const name = mod.intern_pool.stringToSlice(err.name);
- const kv = try mod.getErrorValue(name);
- try code.writer().writeInt(u16, @intCast(u16, kv.value), endian);
+ const int = try mod.getErrorValue(err.name);
+ try code.writer().writeInt(u16, @intCast(u16, int), endian);
},
.error_union => |error_union| {
const payload_ty = typed_value.ty.errorUnionPayload(mod);
-
const err_val = switch (error_union.val) {
- .err_name => |err_name| @intCast(u16, (try mod.getErrorValue(mod.intern_pool.stringToSlice(err_name))).value),
+ .err_name => |err_name| @intCast(u16, try mod.getErrorValue(err_name)),
.payload => @as(u16, 0),
};
@@ -974,11 +973,8 @@ pub fn genTypedValue(
}, owner_decl_index);
},
.ErrorSet => {
- const err_name = mod.intern_pool.stringToSlice(
- mod.intern_pool.indexToKey(typed_value.val.toIntern()).err.name,
- );
- const global_error_set = mod.global_error_set;
- const error_index = global_error_set.get(err_name).?;
+ const err_name = mod.intern_pool.indexToKey(typed_value.val.toIntern()).err.name;
+ const error_index = mod.global_error_set.getIndex(err_name).?;
return GenResult.mcv(.{ .immediate = error_index });
},
.ErrorUnion => {