aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authormlugg <mlugg@mlugg.co.uk>2025-06-07 14:47:59 +0100
committermlugg <mlugg@mlugg.co.uk>2025-06-12 13:55:41 +0100
commitc4ec382fc806e0cb4484c1cb2edcc5fc40c3c9d8 (patch)
treee2b3fd46007dfa4fc775245dfb53bb9f7946d92c /src/Sema.zig
parent580d622b0dfec3ae9f1e3262673d8d4daa6b5b60 (diff)
downloadzig-c4ec382fc806e0cb4484c1cb2edcc5fc40c3c9d8.tar.gz
zig-c4ec382fc806e0cb4484c1cb2edcc5fc40c3c9d8.zip
InternPool: store the Nav types are named after
When the name strategy is `.parent`, the DWARF info really wants to know what `Nav` we were named after to emit a more optimal hierarchy.
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig74
1 files changed, 48 insertions, 26 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index c9f307e624..87837d96d5 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -2963,13 +2963,14 @@ fn zirStructDecl(
};
errdefer wip_ty.cancel(ip, pt.tid);
- wip_ty.setName(ip, try sema.createTypeName(
+ const type_name = try sema.createTypeName(
block,
small.name_strategy,
"struct",
inst,
wip_ty.index,
- ));
+ );
+ wip_ty.setName(ip, type_name.name, type_name.nav);
const new_namespace_index: InternPool.NamespaceIndex = try pt.createNamespace(.{
.parent = block.namespace.toOptional(),
@@ -3007,7 +3008,10 @@ pub fn createTypeName(
inst: ?Zir.Inst.Index,
/// This is used purely to give the type a unique name in the `anon` case.
type_index: InternPool.Index,
-) !InternPool.NullTerminatedString {
+) !struct {
+ name: InternPool.NullTerminatedString,
+ nav: InternPool.Nav.Index.Optional,
+} {
const pt = sema.pt;
const zcu = pt.zcu;
const gpa = zcu.gpa;
@@ -3015,7 +3019,10 @@ pub fn createTypeName(
switch (name_strategy) {
.anon => {}, // handled after switch
- .parent => return block.type_name_ctx,
+ .parent => return .{
+ .name = block.type_name_ctx,
+ .nav = sema.owner.unwrap().nav_val.toOptional(),
+ },
.func => func_strat: {
const fn_info = sema.code.getFnInfo(ip.funcZirBodyInst(sema.func_index).resolve(ip) orelse return error.AnalysisFail);
const zir_tags = sema.code.instructions.items(.tag);
@@ -3057,7 +3064,10 @@ pub fn createTypeName(
};
try writer.writeByte(')');
- return ip.getOrPutString(gpa, pt.tid, buf.items, .no_embedded_nulls);
+ return .{
+ .name = try ip.getOrPutString(gpa, pt.tid, buf.items, .no_embedded_nulls),
+ .nav = .none,
+ };
},
.dbg_var => {
// TODO: this logic is questionable. We ideally should be traversing the `Block` rather than relying on the order of AstGen instructions.
@@ -3066,9 +3076,12 @@ pub fn createTypeName(
const zir_data = sema.code.instructions.items(.data);
for (@intFromEnum(inst.?)..zir_tags.len) |i| switch (zir_tags[i]) {
.dbg_var_ptr, .dbg_var_val => if (zir_data[i].str_op.operand == ref) {
- return ip.getOrPutStringFmt(gpa, pt.tid, "{}.{s}", .{
- block.type_name_ctx.fmt(ip), zir_data[i].str_op.getStr(sema.code),
- }, .no_embedded_nulls);
+ return .{
+ .name = try ip.getOrPutStringFmt(gpa, pt.tid, "{}.{s}", .{
+ block.type_name_ctx.fmt(ip), zir_data[i].str_op.getStr(sema.code),
+ }, .no_embedded_nulls),
+ .nav = .none,
+ };
},
else => {},
};
@@ -3086,9 +3099,12 @@ pub fn createTypeName(
// types appropriately. However, `@typeName` becomes a problem then. If we remove
// that builtin from the language, we can consider this.
- return ip.getOrPutStringFmt(gpa, pt.tid, "{}__{s}_{d}", .{
- block.type_name_ctx.fmt(ip), anon_prefix, @intFromEnum(type_index),
- }, .no_embedded_nulls);
+ return .{
+ .name = try ip.getOrPutStringFmt(gpa, pt.tid, "{}__{s}_{d}", .{
+ block.type_name_ctx.fmt(ip), anon_prefix, @intFromEnum(type_index),
+ }, .no_embedded_nulls),
+ .nav = .none,
+ };
}
fn zirEnumDecl(
@@ -3209,7 +3225,7 @@ fn zirEnumDecl(
inst,
wip_ty.index,
);
- wip_ty.setName(ip, type_name);
+ wip_ty.setName(ip, type_name.name, type_name.nav);
const new_namespace_index: InternPool.NamespaceIndex = try pt.createNamespace(.{
.parent = block.namespace.toOptional(),
@@ -3236,7 +3252,7 @@ fn zirEnumDecl(
inst,
tracked_inst,
new_namespace_index,
- type_name,
+ type_name.name,
small,
body,
tag_type_ref,
@@ -3340,13 +3356,14 @@ fn zirUnionDecl(
};
errdefer wip_ty.cancel(ip, pt.tid);
- wip_ty.setName(ip, try sema.createTypeName(
+ const type_name = try sema.createTypeName(
block,
small.name_strategy,
"union",
inst,
wip_ty.index,
- ));
+ );
+ wip_ty.setName(ip, type_name.name, type_name.nav);
const new_namespace_index: InternPool.NamespaceIndex = try pt.createNamespace(.{
.parent = block.namespace.toOptional(),
@@ -3432,13 +3449,14 @@ fn zirOpaqueDecl(
};
errdefer wip_ty.cancel(ip, pt.tid);
- wip_ty.setName(ip, try sema.createTypeName(
+ const type_name = try sema.createTypeName(
block,
small.name_strategy,
"opaque",
inst,
wip_ty.index,
- ));
+ );
+ wip_ty.setName(ip, type_name.name, type_name.nav);
const new_namespace_index: InternPool.NamespaceIndex = try pt.createNamespace(.{
.parent = block.namespace.toOptional(),
@@ -20062,7 +20080,8 @@ fn structInitAnon(
}, false)) {
.wip => |wip| ty: {
errdefer wip.cancel(ip, pt.tid);
- wip.setName(ip, try sema.createTypeName(block, .anon, "struct", inst, wip.index));
+ const type_name = try sema.createTypeName(block, .anon, "struct", inst, wip.index);
+ wip.setName(ip, type_name.name, type_name.nav);
const struct_type = ip.loadStructType(wip.index);
@@ -21122,13 +21141,14 @@ fn zirReify(
};
errdefer wip_ty.cancel(ip, pt.tid);
- wip_ty.setName(ip, try sema.createTypeName(
+ const type_name = try sema.createTypeName(
block,
name_strategy,
"opaque",
inst,
wip_ty.index,
- ));
+ );
+ wip_ty.setName(ip, type_name.name, type_name.nav);
const new_namespace_index = try pt.createNamespace(.{
.parent = block.namespace.toOptional(),
@@ -21327,13 +21347,14 @@ fn reifyEnum(
return sema.fail(block, src, "Type.Enum.tag_type must be an integer type", .{});
}
- wip_ty.setName(ip, try sema.createTypeName(
+ const type_name = try sema.createTypeName(
block,
name_strategy,
"enum",
inst,
wip_ty.index,
- ));
+ );
+ wip_ty.setName(ip, type_name.name, type_name.nav);
const new_namespace_index = try pt.createNamespace(.{
.parent = block.namespace.toOptional(),
@@ -21498,7 +21519,7 @@ fn reifyUnion(
inst,
wip_ty.index,
);
- wip_ty.setName(ip, type_name);
+ wip_ty.setName(ip, type_name.name, type_name.nav);
const field_types = try sema.arena.alloc(InternPool.Index, fields_len);
const field_aligns = if (any_aligns) try sema.arena.alloc(InternPool.Alignment, fields_len) else undefined;
@@ -21591,7 +21612,7 @@ fn reifyUnion(
}
}
- const enum_tag_ty = try sema.generateUnionTagTypeSimple(block, field_names.keys(), wip_ty.index, type_name);
+ const enum_tag_ty = try sema.generateUnionTagTypeSimple(block, field_names.keys(), wip_ty.index, type_name.name);
break :tag_ty .{ enum_tag_ty, false };
};
errdefer if (!has_explicit_tag) ip.remove(pt.tid, enum_tag_ty); // remove generated tag type on error
@@ -21853,13 +21874,14 @@ fn reifyStruct(
};
errdefer wip_ty.cancel(ip, pt.tid);
- wip_ty.setName(ip, try sema.createTypeName(
+ const type_name = try sema.createTypeName(
block,
name_strategy,
"struct",
inst,
wip_ty.index,
- ));
+ );
+ wip_ty.setName(ip, type_name.name, type_name.nav);
const struct_type = ip.loadStructType(wip_ty.index);