mirror of
https://github.com/ziglang/zig.git
synced 2026-02-13 21:08:36 +00:00
Zcu: cache fully qualified name on Decl
This avoids needing to mutate the intern pool from backends.
This commit is contained in:
parent
95d9292a7a
commit
667b4f9054
@ -7955,6 +7955,7 @@ fn finishFuncInstance(
|
||||
const fn_owner_decl = ip.declPtr(ip.funcDeclOwner(generic_owner));
|
||||
const decl_index = try ip.createDecl(gpa, tid, .{
|
||||
.name = undefined,
|
||||
.fqn = undefined,
|
||||
.src_namespace = fn_owner_decl.src_namespace,
|
||||
.has_tv = true,
|
||||
.owns_tv = true,
|
||||
|
||||
35
src/Sema.zig
35
src/Sema.zig
@ -2878,7 +2878,7 @@ fn createAnonymousDeclTypeNamed(
|
||||
switch (name_strategy) {
|
||||
.anon => {}, // handled after switch
|
||||
.parent => {
|
||||
try zcu.initNewAnonDecl(new_decl_index, val, block.type_name_ctx);
|
||||
try pt.initNewAnonDecl(new_decl_index, val, block.type_name_ctx, .none);
|
||||
return new_decl_index;
|
||||
},
|
||||
.func => func_strat: {
|
||||
@ -2923,7 +2923,7 @@ fn createAnonymousDeclTypeNamed(
|
||||
|
||||
try writer.writeByte(')');
|
||||
const name = try ip.getOrPutString(gpa, pt.tid, buf.items, .no_embedded_nulls);
|
||||
try zcu.initNewAnonDecl(new_decl_index, val, name);
|
||||
try pt.initNewAnonDecl(new_decl_index, val, name, .none);
|
||||
return new_decl_index;
|
||||
},
|
||||
.dbg_var => {
|
||||
@ -2937,7 +2937,7 @@ fn createAnonymousDeclTypeNamed(
|
||||
const 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);
|
||||
try zcu.initNewAnonDecl(new_decl_index, val, name);
|
||||
try pt.initNewAnonDecl(new_decl_index, val, name, .none);
|
||||
return new_decl_index;
|
||||
},
|
||||
else => {},
|
||||
@ -2958,7 +2958,7 @@ fn createAnonymousDeclTypeNamed(
|
||||
const name = ip.getOrPutStringFmt(gpa, pt.tid, "{}__{s}_{d}", .{
|
||||
block.type_name_ctx.fmt(ip), anon_prefix, @intFromEnum(new_decl_index),
|
||||
}, .no_embedded_nulls) catch unreachable;
|
||||
try zcu.initNewAnonDecl(new_decl_index, val, name);
|
||||
try pt.initNewAnonDecl(new_decl_index, val, name, .none);
|
||||
return new_decl_index;
|
||||
}
|
||||
|
||||
@ -5527,13 +5527,12 @@ fn failWithBadStructFieldAccess(
|
||||
const zcu = pt.zcu;
|
||||
const ip = &zcu.intern_pool;
|
||||
const decl = zcu.declPtr(struct_type.decl.unwrap().?);
|
||||
const fqn = try decl.fullyQualifiedName(pt);
|
||||
|
||||
const msg = msg: {
|
||||
const msg = try sema.errMsg(
|
||||
field_src,
|
||||
"no field named '{}' in struct '{}'",
|
||||
.{ field_name.fmt(ip), fqn.fmt(ip) },
|
||||
.{ field_name.fmt(ip), decl.fqn.fmt(ip) },
|
||||
);
|
||||
errdefer msg.destroy(sema.gpa);
|
||||
try sema.errNote(struct_ty.srcLoc(zcu), msg, "struct declared here", .{});
|
||||
@ -5554,15 +5553,13 @@ fn failWithBadUnionFieldAccess(
|
||||
const zcu = pt.zcu;
|
||||
const ip = &zcu.intern_pool;
|
||||
const gpa = sema.gpa;
|
||||
|
||||
const decl = zcu.declPtr(union_obj.decl);
|
||||
const fqn = try decl.fullyQualifiedName(pt);
|
||||
|
||||
const msg = msg: {
|
||||
const msg = try sema.errMsg(
|
||||
field_src,
|
||||
"no field named '{}' in union '{}'",
|
||||
.{ field_name.fmt(ip), fqn.fmt(ip) },
|
||||
.{ field_name.fmt(ip), decl.fqn.fmt(ip) },
|
||||
);
|
||||
errdefer msg.destroy(gpa);
|
||||
try sema.errNote(union_ty.srcLoc(zcu), msg, "union declared here", .{});
|
||||
@ -9733,6 +9730,9 @@ fn funcCommon(
|
||||
.generic_owner = sema.generic_owner,
|
||||
.comptime_args = sema.comptime_args,
|
||||
});
|
||||
const func_decl = mod.declPtr(ip.indexToKey(func_index).func.owner_decl);
|
||||
func_decl.fqn =
|
||||
try ip.namespacePtr(func_decl.src_namespace).internFullyQualifiedName(pt, func_decl.name);
|
||||
return finishFunc(
|
||||
sema,
|
||||
block,
|
||||
@ -26500,7 +26500,7 @@ fn zirBuiltinExtern(
|
||||
const new_decl_index = try pt.allocateNewDecl(sema.owner_decl.src_namespace);
|
||||
errdefer pt.destroyDecl(new_decl_index);
|
||||
const new_decl = mod.declPtr(new_decl_index);
|
||||
try mod.initNewAnonDecl(
|
||||
try pt.initNewAnonDecl(
|
||||
new_decl_index,
|
||||
Value.fromInterned(
|
||||
if (Type.fromInterned(ptr_info.child).zigTypeTag(mod) == .Fn)
|
||||
@ -26522,6 +26522,7 @@ fn zirBuiltinExtern(
|
||||
} }),
|
||||
),
|
||||
options.name,
|
||||
.none,
|
||||
);
|
||||
new_decl.owns_tv = true;
|
||||
// Note that this will queue the anon decl for codegen, so that the backend can
|
||||
@ -36735,24 +36736,23 @@ fn generateUnionTagTypeNumbered(
|
||||
|
||||
const new_decl_index = try pt.allocateNewDecl(block.namespace);
|
||||
errdefer pt.destroyDecl(new_decl_index);
|
||||
const fqn = try union_owner_decl.fullyQualifiedName(pt);
|
||||
const name = try ip.getOrPutStringFmt(
|
||||
gpa,
|
||||
pt.tid,
|
||||
"@typeInfo({}).Union.tag_type.?",
|
||||
.{fqn.fmt(ip)},
|
||||
.{union_owner_decl.fqn.fmt(ip)},
|
||||
.no_embedded_nulls,
|
||||
);
|
||||
try mod.initNewAnonDecl(
|
||||
try pt.initNewAnonDecl(
|
||||
new_decl_index,
|
||||
Value.@"unreachable",
|
||||
name,
|
||||
name.toOptional(),
|
||||
);
|
||||
errdefer pt.abortAnonDecl(new_decl_index);
|
||||
|
||||
const new_decl = mod.declPtr(new_decl_index);
|
||||
new_decl.owns_tv = true;
|
||||
new_decl.name_fully_qualified = true;
|
||||
|
||||
const enum_ty = try ip.getGeneratedTagEnumType(gpa, pt.tid, .{
|
||||
.decl = new_decl_index,
|
||||
@ -36784,22 +36784,21 @@ fn generateUnionTagTypeSimple(
|
||||
const gpa = sema.gpa;
|
||||
|
||||
const new_decl_index = new_decl_index: {
|
||||
const fqn = try union_owner_decl.fullyQualifiedName(pt);
|
||||
const new_decl_index = try pt.allocateNewDecl(block.namespace);
|
||||
errdefer pt.destroyDecl(new_decl_index);
|
||||
const name = try ip.getOrPutStringFmt(
|
||||
gpa,
|
||||
pt.tid,
|
||||
"@typeInfo({}).Union.tag_type.?",
|
||||
.{fqn.fmt(ip)},
|
||||
.{union_owner_decl.fqn.fmt(ip)},
|
||||
.no_embedded_nulls,
|
||||
);
|
||||
try mod.initNewAnonDecl(
|
||||
try pt.initNewAnonDecl(
|
||||
new_decl_index,
|
||||
Value.@"unreachable",
|
||||
name,
|
||||
name.toOptional(),
|
||||
);
|
||||
mod.declPtr(new_decl_index).name_fully_qualified = true;
|
||||
break :new_decl_index new_decl_index;
|
||||
};
|
||||
errdefer pt.abortAnonDecl(new_decl_index);
|
||||
|
||||
14
src/Type.zig
14
src/Type.zig
@ -268,10 +268,10 @@ pub fn print(ty: Type, writer: anytype, pt: Zcu.PerThread) @TypeOf(writer).Error
|
||||
return;
|
||||
},
|
||||
.inferred_error_set_type => |func_index| {
|
||||
try writer.writeAll("@typeInfo(@typeInfo(@TypeOf(");
|
||||
const owner_decl = mod.funcOwnerDeclPtr(func_index);
|
||||
try owner_decl.renderFullyQualifiedName(mod, writer);
|
||||
try writer.writeAll(")).Fn.return_type.?).ErrorUnion.error_set");
|
||||
try writer.print("@typeInfo(@typeInfo(@TypeOf({})).Fn.return_type.?).ErrorUnion.error_set", .{
|
||||
owner_decl.fqn.fmt(ip),
|
||||
});
|
||||
},
|
||||
.error_set_type => |error_set_type| {
|
||||
const names = error_set_type.names;
|
||||
@ -334,7 +334,7 @@ pub fn print(ty: Type, writer: anytype, pt: Zcu.PerThread) @TypeOf(writer).Error
|
||||
const struct_type = ip.loadStructType(ty.toIntern());
|
||||
if (struct_type.decl.unwrap()) |decl_index| {
|
||||
const decl = mod.declPtr(decl_index);
|
||||
try decl.renderFullyQualifiedName(mod, writer);
|
||||
try writer.print("{}", .{decl.fqn.fmt(ip)});
|
||||
} else if (ip.loadStructType(ty.toIntern()).namespace.unwrap()) |namespace_index| {
|
||||
const namespace = mod.namespacePtr(namespace_index);
|
||||
try namespace.renderFullyQualifiedName(mod, .empty, writer);
|
||||
@ -367,15 +367,15 @@ pub fn print(ty: Type, writer: anytype, pt: Zcu.PerThread) @TypeOf(writer).Error
|
||||
|
||||
.union_type => {
|
||||
const decl = mod.declPtr(ip.loadUnionType(ty.toIntern()).decl);
|
||||
try decl.renderFullyQualifiedName(mod, writer);
|
||||
try writer.print("{}", .{decl.fqn.fmt(ip)});
|
||||
},
|
||||
.opaque_type => {
|
||||
const decl = mod.declPtr(ip.loadOpaqueType(ty.toIntern()).decl);
|
||||
try decl.renderFullyQualifiedName(mod, writer);
|
||||
try writer.print("{}", .{decl.fqn.fmt(ip)});
|
||||
},
|
||||
.enum_type => {
|
||||
const decl = mod.declPtr(ip.loadEnumType(ty.toIntern()).decl);
|
||||
try decl.renderFullyQualifiedName(mod, writer);
|
||||
try writer.print("{}", .{decl.fqn.fmt(ip)});
|
||||
},
|
||||
.func_type => |fn_info| {
|
||||
if (fn_info.is_noinline) {
|
||||
|
||||
44
src/Zcu.zig
44
src/Zcu.zig
@ -326,7 +326,10 @@ pub const Reference = struct {
|
||||
};
|
||||
|
||||
pub const Decl = struct {
|
||||
/// Equal to `fqn` if already fully qualified.
|
||||
name: InternPool.NullTerminatedString,
|
||||
/// Fully qualified name.
|
||||
fqn: InternPool.NullTerminatedString,
|
||||
/// The most recent Value of the Decl after a successful semantic analysis.
|
||||
/// Populated when `has_tv`.
|
||||
val: Value,
|
||||
@ -384,8 +387,6 @@ pub const Decl = struct {
|
||||
is_pub: bool,
|
||||
/// Whether the corresponding AST decl has a `export` keyword.
|
||||
is_exported: bool,
|
||||
/// If true `name` is already fully qualified.
|
||||
name_fully_qualified: bool = false,
|
||||
/// What kind of a declaration is this.
|
||||
kind: Kind,
|
||||
|
||||
@ -408,25 +409,6 @@ pub const Decl = struct {
|
||||
return extra.data.getBodies(@intCast(extra.end), zir);
|
||||
}
|
||||
|
||||
pub fn renderFullyQualifiedName(decl: Decl, zcu: *Zcu, writer: anytype) !void {
|
||||
if (decl.name_fully_qualified) {
|
||||
try writer.print("{}", .{decl.name.fmt(&zcu.intern_pool)});
|
||||
} else {
|
||||
try zcu.namespacePtr(decl.src_namespace).renderFullyQualifiedName(zcu, decl.name, writer);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn renderFullyQualifiedDebugName(decl: Decl, zcu: *Zcu, writer: anytype) !void {
|
||||
return zcu.namespacePtr(decl.src_namespace).renderFullyQualifiedDebugName(zcu, decl.name, writer);
|
||||
}
|
||||
|
||||
pub fn fullyQualifiedName(decl: Decl, pt: Zcu.PerThread) !InternPool.NullTerminatedString {
|
||||
return if (decl.name_fully_qualified)
|
||||
decl.name
|
||||
else
|
||||
pt.zcu.namespacePtr(decl.src_namespace).fullyQualifiedName(pt, decl.name);
|
||||
}
|
||||
|
||||
pub fn typeOf(decl: Decl, zcu: *const Zcu) Type {
|
||||
assert(decl.has_tv);
|
||||
return decl.val.typeOf(zcu);
|
||||
@ -686,7 +668,7 @@ pub const Namespace = struct {
|
||||
if (name != .empty) try writer.print("{c}{}", .{ sep, name.fmt(&zcu.intern_pool) });
|
||||
}
|
||||
|
||||
pub fn fullyQualifiedName(
|
||||
pub fn internFullyQualifiedName(
|
||||
ns: Namespace,
|
||||
pt: Zcu.PerThread,
|
||||
name: InternPool.NullTerminatedString,
|
||||
@ -882,7 +864,7 @@ pub const File = struct {
|
||||
};
|
||||
}
|
||||
|
||||
pub fn fullyQualifiedName(file: File, pt: Zcu.PerThread) !InternPool.NullTerminatedString {
|
||||
pub fn internFullyQualifiedName(file: File, pt: Zcu.PerThread) !InternPool.NullTerminatedString {
|
||||
const gpa = pt.zcu.gpa;
|
||||
const ip = &pt.zcu.intern_pool;
|
||||
const strings = ip.getLocal(pt.tid).getMutableStrings(gpa);
|
||||
@ -3313,22 +3295,6 @@ pub fn errorSetBits(mod: *Module) u16 {
|
||||
return std.math.log2_int_ceil(ErrorInt, mod.error_limit + 1); // +1 for no error
|
||||
}
|
||||
|
||||
pub fn initNewAnonDecl(
|
||||
mod: *Module,
|
||||
new_decl_index: Decl.Index,
|
||||
val: Value,
|
||||
name: InternPool.NullTerminatedString,
|
||||
) Allocator.Error!void {
|
||||
const new_decl = mod.declPtr(new_decl_index);
|
||||
|
||||
new_decl.name = name;
|
||||
new_decl.val = val;
|
||||
new_decl.alignment = .none;
|
||||
new_decl.@"linksection" = .none;
|
||||
new_decl.has_tv = true;
|
||||
new_decl.analysis = .complete;
|
||||
}
|
||||
|
||||
pub fn errNote(
|
||||
mod: *Module,
|
||||
src_loc: LazySrcLoc,
|
||||
|
||||
@ -548,7 +548,7 @@ pub fn ensureDeclAnalyzed(pt: Zcu.PerThread, decl_index: Zcu.Decl.Index) Zcu.Sem
|
||||
};
|
||||
}
|
||||
|
||||
const decl_prog_node = mod.sema_prog_node.start((try decl.fullyQualifiedName(pt)).toSlice(ip), 0);
|
||||
const decl_prog_node = mod.sema_prog_node.start(decl.fqn.toSlice(ip), 0);
|
||||
defer decl_prog_node.end();
|
||||
|
||||
break :blk pt.semaDecl(decl_index) catch |err| switch (err) {
|
||||
@ -747,10 +747,9 @@ pub fn linkerUpdateFunc(pt: Zcu.PerThread, func_index: InternPool.Index, air: Ai
|
||||
defer liveness.deinit(gpa);
|
||||
|
||||
if (build_options.enable_debug_extensions and comp.verbose_air) {
|
||||
const fqn = try decl.fullyQualifiedName(pt);
|
||||
std.debug.print("# Begin Function AIR: {}:\n", .{fqn.fmt(ip)});
|
||||
std.debug.print("# Begin Function AIR: {}:\n", .{decl.fqn.fmt(ip)});
|
||||
@import("../print_air.zig").dump(pt, air, liveness);
|
||||
std.debug.print("# End Function AIR: {}\n\n", .{fqn.fmt(ip)});
|
||||
std.debug.print("# End Function AIR: {}\n\n", .{decl.fqn.fmt(ip)});
|
||||
}
|
||||
|
||||
if (std.debug.runtime_safety) {
|
||||
@ -781,7 +780,7 @@ pub fn linkerUpdateFunc(pt: Zcu.PerThread, func_index: InternPool.Index, air: Ai
|
||||
};
|
||||
}
|
||||
|
||||
const codegen_prog_node = zcu.codegen_prog_node.start((try decl.fullyQualifiedName(pt)).toSlice(ip), 0);
|
||||
const codegen_prog_node = zcu.codegen_prog_node.start(decl.fqn.toSlice(ip), 0);
|
||||
defer codegen_prog_node.end();
|
||||
|
||||
if (!air.typesFullyResolved(zcu)) {
|
||||
@ -996,8 +995,8 @@ fn semaFile(pt: Zcu.PerThread, file_index: Zcu.File.Index) Zcu.SemaError!void {
|
||||
zcu.setFileRootDecl(file_index, new_decl_index.toOptional());
|
||||
zcu.namespacePtr(new_namespace_index).decl_index = new_decl_index;
|
||||
|
||||
new_decl.name = try file.fullyQualifiedName(pt);
|
||||
new_decl.name_fully_qualified = true;
|
||||
new_decl.fqn = try file.internFullyQualifiedName(pt);
|
||||
new_decl.name = new_decl.fqn;
|
||||
new_decl.is_pub = true;
|
||||
new_decl.is_exported = false;
|
||||
new_decl.alignment = .none;
|
||||
@ -1058,10 +1057,8 @@ fn semaDecl(pt: Zcu.PerThread, decl_index: Zcu.Decl.Index) !Zcu.SemaDeclResult {
|
||||
}
|
||||
|
||||
log.debug("semaDecl '{d}'", .{@intFromEnum(decl_index)});
|
||||
log.debug("decl name '{}'", .{(try decl.fullyQualifiedName(pt)).fmt(ip)});
|
||||
defer blk: {
|
||||
log.debug("finish decl name '{}'", .{(decl.fullyQualifiedName(pt) catch break :blk).fmt(ip)});
|
||||
}
|
||||
log.debug("decl name '{}'", .{decl.fqn.fmt(ip)});
|
||||
defer log.debug("finish decl name '{}'", .{decl.fqn.fmt(ip)});
|
||||
|
||||
const old_has_tv = decl.has_tv;
|
||||
// The following values are ignored if `!old_has_tv`
|
||||
@ -1728,6 +1725,7 @@ const ScanDeclIter = struct {
|
||||
const was_exported = decl.is_exported;
|
||||
assert(decl.kind == kind); // ZIR tracking should preserve this
|
||||
decl.name = decl_name;
|
||||
decl.fqn = try namespace.internFullyQualifiedName(pt, decl_name);
|
||||
decl.is_pub = declaration.flags.is_pub;
|
||||
decl.is_exported = declaration.flags.is_export;
|
||||
break :decl_index .{ was_exported, decl_index };
|
||||
@ -1737,6 +1735,7 @@ const ScanDeclIter = struct {
|
||||
const new_decl = zcu.declPtr(new_decl_index);
|
||||
new_decl.kind = kind;
|
||||
new_decl.name = decl_name;
|
||||
new_decl.fqn = try namespace.internFullyQualifiedName(pt, decl_name);
|
||||
new_decl.is_pub = declaration.flags.is_pub;
|
||||
new_decl.is_exported = declaration.flags.is_export;
|
||||
new_decl.zir_decl_index = tracked_inst.toOptional();
|
||||
@ -1761,10 +1760,9 @@ const ScanDeclIter = struct {
|
||||
if (!comp.config.is_test) break :a false;
|
||||
if (decl_mod != zcu.main_mod) break :a false;
|
||||
if (is_named_test and comp.test_filters.len > 0) {
|
||||
const decl_fqn = try namespace.fullyQualifiedName(pt, decl_name);
|
||||
const decl_fqn_slice = decl_fqn.toSlice(ip);
|
||||
const decl_fqn = decl.fqn.toSlice(ip);
|
||||
for (comp.test_filters) |test_filter| {
|
||||
if (std.mem.indexOf(u8, decl_fqn_slice, test_filter)) |_| break;
|
||||
if (std.mem.indexOf(u8, decl_fqn, test_filter)) |_| break;
|
||||
} else break :a false;
|
||||
}
|
||||
zcu.test_functions.putAssumeCapacity(decl_index, {}); // may clobber on incremental update
|
||||
@ -1805,12 +1803,10 @@ pub fn analyzeFnBody(pt: Zcu.PerThread, func_index: InternPool.Index, arena: All
|
||||
const decl_index = func.owner_decl;
|
||||
const decl = mod.declPtr(decl_index);
|
||||
|
||||
log.debug("func name '{}'", .{(try decl.fullyQualifiedName(pt)).fmt(ip)});
|
||||
defer blk: {
|
||||
log.debug("finish func name '{}'", .{(decl.fullyQualifiedName(pt) catch break :blk).fmt(ip)});
|
||||
}
|
||||
log.debug("func name '{}'", .{decl.fqn.fmt(ip)});
|
||||
defer log.debug("finish func name '{}'", .{decl.fqn.fmt(ip)});
|
||||
|
||||
const decl_prog_node = mod.sema_prog_node.start((try decl.fullyQualifiedName(pt)).toSlice(ip), 0);
|
||||
const decl_prog_node = mod.sema_prog_node.start(decl.fqn.toSlice(ip), 0);
|
||||
defer decl_prog_node.end();
|
||||
|
||||
mod.intern_pool.removeDependenciesForDepender(gpa, InternPool.AnalUnit.wrap(.{ .func = func_index }));
|
||||
@ -2053,6 +2049,7 @@ pub fn allocateNewDecl(pt: Zcu.PerThread, namespace: Zcu.Namespace.Index) !Zcu.D
|
||||
const gpa = zcu.gpa;
|
||||
const decl_index = try zcu.intern_pool.createDecl(gpa, pt.tid, .{
|
||||
.name = undefined,
|
||||
.fqn = undefined,
|
||||
.src_namespace = namespace,
|
||||
.has_tv = false,
|
||||
.owns_tv = false,
|
||||
@ -2077,6 +2074,25 @@ pub fn allocateNewDecl(pt: Zcu.PerThread, namespace: Zcu.Namespace.Index) !Zcu.D
|
||||
return decl_index;
|
||||
}
|
||||
|
||||
pub fn initNewAnonDecl(
|
||||
pt: Zcu.PerThread,
|
||||
new_decl_index: Zcu.Decl.Index,
|
||||
val: Value,
|
||||
name: InternPool.NullTerminatedString,
|
||||
fqn: InternPool.OptionalNullTerminatedString,
|
||||
) Allocator.Error!void {
|
||||
const new_decl = pt.zcu.declPtr(new_decl_index);
|
||||
|
||||
new_decl.name = name;
|
||||
new_decl.fqn = fqn.unwrap() orelse
|
||||
try pt.zcu.namespacePtr(new_decl.src_namespace).internFullyQualifiedName(pt, name);
|
||||
new_decl.val = val;
|
||||
new_decl.alignment = .none;
|
||||
new_decl.@"linksection" = .none;
|
||||
new_decl.has_tv = true;
|
||||
new_decl.analysis = .complete;
|
||||
}
|
||||
|
||||
fn lockAndClearFileCompileError(pt: Zcu.PerThread, file: *Zcu.File) void {
|
||||
switch (file.status) {
|
||||
.success_zir, .retryable_failure => {},
|
||||
@ -2260,7 +2276,7 @@ pub fn populateTestFunctions(
|
||||
|
||||
for (test_fn_vals, zcu.test_functions.keys()) |*test_fn_val, test_decl_index| {
|
||||
const test_decl = zcu.declPtr(test_decl_index);
|
||||
const test_decl_name = try test_decl.fullyQualifiedName(pt);
|
||||
const test_decl_name = test_decl.fqn;
|
||||
const test_decl_name_len = test_decl_name.length(ip);
|
||||
const test_name_anon_decl: InternPool.Key.Ptr.BaseAddr.AnonDecl = n: {
|
||||
const test_name_ty = try pt.arrayType(.{
|
||||
@ -2366,7 +2382,7 @@ pub fn linkerUpdateDecl(pt: Zcu.PerThread, decl_index: Zcu.Decl.Index) !void {
|
||||
|
||||
const decl = zcu.declPtr(decl_index);
|
||||
|
||||
const codegen_prog_node = zcu.codegen_prog_node.start((try decl.fullyQualifiedName(pt)).toSlice(&zcu.intern_pool), 0);
|
||||
const codegen_prog_node = zcu.codegen_prog_node.start(decl.fqn.toSlice(&zcu.intern_pool), 0);
|
||||
defer codegen_prog_node.end();
|
||||
|
||||
if (comp.bin_file) |lf| {
|
||||
|
||||
@ -933,7 +933,7 @@ fn formatDecl(
|
||||
_: std.fmt.FormatOptions,
|
||||
writer: anytype,
|
||||
) @TypeOf(writer).Error!void {
|
||||
try data.mod.declPtr(data.decl_index).renderFullyQualifiedName(data.mod, writer);
|
||||
try writer.print("{}", .{data.mod.declPtr(data.decl_index).fqn.fmt(&data.mod.intern_pool)});
|
||||
}
|
||||
fn fmtDecl(func: *Func, decl_index: InternPool.DeclIndex) std.fmt.Formatter(formatDecl) {
|
||||
return .{ .data = .{
|
||||
|
||||
@ -7284,8 +7284,8 @@ fn getTagNameFunction(func: *CodeGen, enum_ty: Type) InnerError!u32 {
|
||||
defer arena_allocator.deinit();
|
||||
const arena = arena_allocator.allocator();
|
||||
|
||||
const fqn = try mod.declPtr(enum_decl_index).fullyQualifiedName(pt);
|
||||
const func_name = try std.fmt.allocPrintZ(arena, "__zig_tag_name_{}", .{fqn.fmt(ip)});
|
||||
const decl = mod.declPtr(enum_decl_index);
|
||||
const func_name = try std.fmt.allocPrintZ(arena, "__zig_tag_name_{}", .{decl.fqn.fmt(ip)});
|
||||
|
||||
// check if we already generated code for this.
|
||||
if (func.bin_file.findGlobalSymbol(func_name)) |loc| {
|
||||
|
||||
@ -1077,7 +1077,7 @@ fn formatDecl(
|
||||
_: std.fmt.FormatOptions,
|
||||
writer: anytype,
|
||||
) @TypeOf(writer).Error!void {
|
||||
try data.zcu.declPtr(data.decl_index).renderFullyQualifiedName(data.zcu, writer);
|
||||
try writer.print("{}", .{data.zcu.declPtr(data.decl_index).fqn.fmt(&data.zcu.intern_pool)});
|
||||
}
|
||||
fn fmtDecl(self: *Self, decl_index: InternPool.DeclIndex) std.fmt.Formatter(formatDecl) {
|
||||
return .{ .data = .{
|
||||
|
||||
@ -2194,13 +2194,9 @@ pub const DeclGen = struct {
|
||||
}) else {
|
||||
// MSVC has a limit of 4095 character token length limit, and fmtIdent can (worst case),
|
||||
// expand to 3x the length of its input, but let's cut it off at a much shorter limit.
|
||||
var name: [100]u8 = undefined;
|
||||
var name_stream = std.io.fixedBufferStream(&name);
|
||||
decl.renderFullyQualifiedName(zcu, name_stream.writer()) catch |err| switch (err) {
|
||||
error.NoSpaceLeft => {},
|
||||
};
|
||||
const fqn_slice = decl.fqn.toSlice(ip);
|
||||
try writer.print("{}__{d}", .{
|
||||
fmtIdent(name_stream.getWritten()),
|
||||
fmtIdent(fqn_slice[0..@min(fqn_slice.len, 100)]),
|
||||
@intFromEnum(decl_index),
|
||||
});
|
||||
}
|
||||
@ -2587,11 +2583,9 @@ pub fn genTypeDecl(
|
||||
try writer.writeByte(';');
|
||||
const owner_decl = zcu.declPtr(owner_decl_index);
|
||||
const owner_mod = zcu.namespacePtr(owner_decl.src_namespace).fileScope(zcu).mod;
|
||||
if (!owner_mod.strip) {
|
||||
try writer.writeAll(" /* ");
|
||||
try owner_decl.renderFullyQualifiedName(zcu, writer);
|
||||
try writer.writeAll(" */");
|
||||
}
|
||||
if (!owner_mod.strip) try writer.print(" /* {} */", .{
|
||||
owner_decl.fqn.fmt(&zcu.intern_pool),
|
||||
});
|
||||
try writer.writeByte('\n');
|
||||
},
|
||||
},
|
||||
@ -4563,9 +4557,7 @@ fn airDbgInlineBlock(f: *Function, inst: Air.Inst.Index) !CValue {
|
||||
const extra = f.air.extraData(Air.DbgInlineBlock, ty_pl.payload);
|
||||
const owner_decl = zcu.funcOwnerDeclPtr(extra.data.func);
|
||||
const writer = f.object.writer();
|
||||
try writer.writeAll("/* inline:");
|
||||
try owner_decl.renderFullyQualifiedName(zcu, writer);
|
||||
try writer.writeAll(" */\n");
|
||||
try writer.print("/* inline:{} */\n", .{owner_decl.fqn.fmt(&zcu.intern_pool)});
|
||||
return lowerBlock(f, inst, @ptrCast(f.air.extra[extra.end..][0..extra.data.body_len]));
|
||||
}
|
||||
|
||||
|
||||
@ -1744,7 +1744,7 @@ pub const Object = struct {
|
||||
if (export_indices.len != 0) {
|
||||
return updateExportedGlobal(self, zcu, global_index, export_indices);
|
||||
} else {
|
||||
const fqn = try self.builder.strtabString((try decl.fullyQualifiedName(pt)).toSlice(ip));
|
||||
const fqn = try self.builder.strtabString(decl.fqn.toSlice(ip));
|
||||
try global_index.rename(fqn, &self.builder);
|
||||
global_index.setLinkage(.internal, &self.builder);
|
||||
if (comp.config.dll_export_fns)
|
||||
@ -2863,10 +2863,7 @@ pub const Object = struct {
|
||||
const is_extern = decl.isExtern(zcu);
|
||||
const function_index = try o.builder.addFunction(
|
||||
try o.lowerType(zig_fn_type),
|
||||
try o.builder.strtabString((if (is_extern)
|
||||
decl.name
|
||||
else
|
||||
try decl.fullyQualifiedName(pt)).toSlice(ip)),
|
||||
try o.builder.strtabString((if (is_extern) decl.name else decl.fqn).toSlice(ip)),
|
||||
toLlvmAddressSpace(decl.@"addrspace", target),
|
||||
);
|
||||
gop.value_ptr.* = function_index.ptrConst(&o.builder).global;
|
||||
@ -3077,14 +3074,12 @@ pub const Object = struct {
|
||||
|
||||
const pt = o.pt;
|
||||
const zcu = pt.zcu;
|
||||
const ip = &zcu.intern_pool;
|
||||
const decl = zcu.declPtr(decl_index);
|
||||
const is_extern = decl.isExtern(zcu);
|
||||
|
||||
const variable_index = try o.builder.addVariable(
|
||||
try o.builder.strtabString((if (is_extern)
|
||||
decl.name
|
||||
else
|
||||
try decl.fullyQualifiedName(pt)).toSlice(&zcu.intern_pool)),
|
||||
try o.builder.strtabString((if (is_extern) decl.name else decl.fqn).toSlice(ip)),
|
||||
try o.lowerType(decl.typeOf(zcu)),
|
||||
toLlvmGlobalAddressSpace(decl.@"addrspace", zcu.getTarget()),
|
||||
);
|
||||
@ -3312,7 +3307,7 @@ pub const Object = struct {
|
||||
return int_ty;
|
||||
}
|
||||
|
||||
const fqn = try mod.declPtr(struct_type.decl.unwrap().?).fullyQualifiedName(pt);
|
||||
const decl = mod.declPtr(struct_type.decl.unwrap().?);
|
||||
|
||||
var llvm_field_types = std.ArrayListUnmanaged(Builder.Type){};
|
||||
defer llvm_field_types.deinit(o.gpa);
|
||||
@ -3377,7 +3372,7 @@ pub const Object = struct {
|
||||
);
|
||||
}
|
||||
|
||||
const ty = try o.builder.opaqueType(try o.builder.string(fqn.toSlice(ip)));
|
||||
const ty = try o.builder.opaqueType(try o.builder.string(decl.fqn.toSlice(ip)));
|
||||
try o.type_map.put(o.gpa, t.toIntern(), ty);
|
||||
|
||||
o.builder.namedTypeSetBody(
|
||||
@ -3466,7 +3461,7 @@ pub const Object = struct {
|
||||
return enum_tag_ty;
|
||||
}
|
||||
|
||||
const fqn = try mod.declPtr(union_obj.decl).fullyQualifiedName(pt);
|
||||
const decl = mod.declPtr(union_obj.decl);
|
||||
|
||||
const aligned_field_ty = Type.fromInterned(union_obj.field_types.get(ip)[layout.most_aligned_field]);
|
||||
const aligned_field_llvm_ty = try o.lowerType(aligned_field_ty);
|
||||
@ -3486,7 +3481,7 @@ pub const Object = struct {
|
||||
};
|
||||
|
||||
if (layout.tag_size == 0) {
|
||||
const ty = try o.builder.opaqueType(try o.builder.string(fqn.toSlice(ip)));
|
||||
const ty = try o.builder.opaqueType(try o.builder.string(decl.fqn.toSlice(ip)));
|
||||
try o.type_map.put(o.gpa, t.toIntern(), ty);
|
||||
|
||||
o.builder.namedTypeSetBody(
|
||||
@ -3514,7 +3509,7 @@ pub const Object = struct {
|
||||
llvm_fields_len += 1;
|
||||
}
|
||||
|
||||
const ty = try o.builder.opaqueType(try o.builder.string(fqn.toSlice(ip)));
|
||||
const ty = try o.builder.opaqueType(try o.builder.string(decl.fqn.toSlice(ip)));
|
||||
try o.type_map.put(o.gpa, t.toIntern(), ty);
|
||||
|
||||
o.builder.namedTypeSetBody(
|
||||
@ -3527,8 +3522,7 @@ pub const Object = struct {
|
||||
const gop = try o.type_map.getOrPut(o.gpa, t.toIntern());
|
||||
if (!gop.found_existing) {
|
||||
const decl = mod.declPtr(ip.loadOpaqueType(t.toIntern()).decl);
|
||||
const fqn = try decl.fullyQualifiedName(pt);
|
||||
gop.value_ptr.* = try o.builder.opaqueType(try o.builder.string(fqn.toSlice(ip)));
|
||||
gop.value_ptr.* = try o.builder.opaqueType(try o.builder.string(decl.fqn.toSlice(ip)));
|
||||
}
|
||||
return gop.value_ptr.*;
|
||||
},
|
||||
@ -4587,11 +4581,11 @@ pub const Object = struct {
|
||||
|
||||
const usize_ty = try o.lowerType(Type.usize);
|
||||
const ret_ty = try o.lowerType(Type.slice_const_u8_sentinel_0);
|
||||
const fqn = try zcu.declPtr(enum_type.decl).fullyQualifiedName(pt);
|
||||
const decl = zcu.declPtr(enum_type.decl);
|
||||
const target = zcu.root_mod.resolved_target.result;
|
||||
const function_index = try o.builder.addFunction(
|
||||
try o.builder.fnType(ret_ty, &.{try o.lowerType(Type.fromInterned(enum_type.tag_ty))}, .normal),
|
||||
try o.builder.strtabStringFmt("__zig_tag_name_{}", .{fqn.fmt(ip)}),
|
||||
try o.builder.strtabStringFmt("__zig_tag_name_{}", .{decl.fqn.fmt(ip)}),
|
||||
toLlvmAddressSpace(.generic, target),
|
||||
);
|
||||
|
||||
@ -5175,8 +5169,6 @@ pub const FuncGen = struct {
|
||||
const line_number = decl.navSrcLine(zcu) + 1;
|
||||
self.inlined = self.wip.debug_location;
|
||||
|
||||
const fqn = try decl.fullyQualifiedName(pt);
|
||||
|
||||
const fn_ty = try pt.funcType(.{
|
||||
.param_types = &.{},
|
||||
.return_type = .void_type,
|
||||
@ -5185,7 +5177,7 @@ pub const FuncGen = struct {
|
||||
self.scope = try o.builder.debugSubprogram(
|
||||
self.file,
|
||||
try o.builder.metadataString(decl.name.toSlice(&zcu.intern_pool)),
|
||||
try o.builder.metadataString(fqn.toSlice(&zcu.intern_pool)),
|
||||
try o.builder.metadataString(decl.fqn.toSlice(&zcu.intern_pool)),
|
||||
line_number,
|
||||
line_number + func.lbrace_line,
|
||||
try o.lowerDebugType(fn_ty),
|
||||
@ -9702,18 +9694,19 @@ pub const FuncGen = struct {
|
||||
const o = self.dg.object;
|
||||
const pt = o.pt;
|
||||
const zcu = pt.zcu;
|
||||
const enum_type = zcu.intern_pool.loadEnumType(enum_ty.toIntern());
|
||||
const ip = &zcu.intern_pool;
|
||||
const enum_type = ip.loadEnumType(enum_ty.toIntern());
|
||||
|
||||
// TODO: detect when the type changes and re-emit this function.
|
||||
const gop = try o.named_enum_map.getOrPut(o.gpa, enum_type.decl);
|
||||
if (gop.found_existing) return gop.value_ptr.*;
|
||||
errdefer assert(o.named_enum_map.remove(enum_type.decl));
|
||||
|
||||
const fqn = try zcu.declPtr(enum_type.decl).fullyQualifiedName(pt);
|
||||
const decl = zcu.declPtr(enum_type.decl);
|
||||
const target = zcu.root_mod.resolved_target.result;
|
||||
const function_index = try o.builder.addFunction(
|
||||
try o.builder.fnType(.i1, &.{try o.lowerType(Type.fromInterned(enum_type.tag_ty))}, .normal),
|
||||
try o.builder.strtabStringFmt("__zig_is_named_enum_value_{}", .{fqn.fmt(&zcu.intern_pool)}),
|
||||
try o.builder.strtabStringFmt("__zig_is_named_enum_value_{}", .{decl.fqn.fmt(ip)}),
|
||||
toLlvmAddressSpace(.generic, target),
|
||||
);
|
||||
|
||||
|
||||
@ -3012,12 +3012,11 @@ const DeclGen = struct {
|
||||
// Append the actual code into the functions section.
|
||||
try self.spv.addFunction(spv_decl_index, self.func);
|
||||
|
||||
const fqn = try decl.fullyQualifiedName(self.pt);
|
||||
try self.spv.debugName(result_id, fqn.toSlice(ip));
|
||||
try self.spv.debugName(result_id, decl.fqn.toSlice(ip));
|
||||
|
||||
// Temporarily generate a test kernel declaration if this is a test function.
|
||||
if (self.pt.zcu.test_functions.contains(self.decl_index)) {
|
||||
try self.generateTestEntryPoint(fqn.toSlice(ip), spv_decl_index);
|
||||
try self.generateTestEntryPoint(decl.fqn.toSlice(ip), spv_decl_index);
|
||||
}
|
||||
},
|
||||
.global => {
|
||||
@ -3041,8 +3040,7 @@ const DeclGen = struct {
|
||||
.storage_class = final_storage_class,
|
||||
});
|
||||
|
||||
const fqn = try decl.fullyQualifiedName(self.pt);
|
||||
try self.spv.debugName(result_id, fqn.toSlice(ip));
|
||||
try self.spv.debugName(result_id, decl.fqn.toSlice(ip));
|
||||
try self.spv.declareDeclDeps(spv_decl_index, &.{});
|
||||
},
|
||||
.invocation_global => {
|
||||
@ -3086,8 +3084,7 @@ const DeclGen = struct {
|
||||
try self.func.body.emit(self.spv.gpa, .OpFunctionEnd, {});
|
||||
try self.spv.addFunction(spv_decl_index, self.func);
|
||||
|
||||
const fqn = try decl.fullyQualifiedName(self.pt);
|
||||
try self.spv.debugNameFmt(initializer_id, "initializer of {}", .{fqn.fmt(ip)});
|
||||
try self.spv.debugNameFmt(initializer_id, "initializer of {}", .{decl.fqn.fmt(ip)});
|
||||
|
||||
try self.spv.sections.types_globals_constants.emit(self.spv.gpa, .OpExtInst, .{
|
||||
.id_result_type = ptr_ty_id,
|
||||
|
||||
@ -1176,9 +1176,10 @@ pub fn lowerUnnamedConst(self: *Coff, pt: Zcu.PerThread, val: Value, decl_index:
|
||||
gop.value_ptr.* = .{};
|
||||
}
|
||||
const unnamed_consts = gop.value_ptr;
|
||||
const decl_name = try decl.fullyQualifiedName(pt);
|
||||
const index = unnamed_consts.items.len;
|
||||
const sym_name = try std.fmt.allocPrint(gpa, "__unnamed_{}_{d}", .{ decl_name.fmt(&mod.intern_pool), index });
|
||||
const sym_name = try std.fmt.allocPrint(gpa, "__unnamed_{}_{d}", .{
|
||||
decl.fqn.fmt(&mod.intern_pool), index,
|
||||
});
|
||||
defer gpa.free(sym_name);
|
||||
const ty = val.typeOf(mod);
|
||||
const atom_index = switch (try self.lowerConst(pt, sym_name, val, ty.abiAlignment(pt), self.rdata_section_index.?, decl.navSrcLoc(mod))) {
|
||||
@ -1427,9 +1428,7 @@ fn updateDeclCode(self: *Coff, pt: Zcu.PerThread, decl_index: InternPool.DeclInd
|
||||
const mod = pt.zcu;
|
||||
const decl = mod.declPtr(decl_index);
|
||||
|
||||
const decl_name = try decl.fullyQualifiedName(pt);
|
||||
|
||||
log.debug("updateDeclCode {}{*}", .{ decl_name.fmt(&mod.intern_pool), decl });
|
||||
log.debug("updateDeclCode {}{*}", .{ decl.fqn.fmt(&mod.intern_pool), decl });
|
||||
const required_alignment: u32 = @intCast(decl.getAlignment(pt).toByteUnits() orelse 0);
|
||||
|
||||
const decl_metadata = self.decls.get(decl_index).?;
|
||||
@ -1441,7 +1440,7 @@ fn updateDeclCode(self: *Coff, pt: Zcu.PerThread, decl_index: InternPool.DeclInd
|
||||
|
||||
if (atom.size != 0) {
|
||||
const sym = atom.getSymbolPtr(self);
|
||||
try self.setSymbolName(sym, decl_name.toSlice(&mod.intern_pool));
|
||||
try self.setSymbolName(sym, decl.fqn.toSlice(&mod.intern_pool));
|
||||
sym.section_number = @as(coff.SectionNumber, @enumFromInt(sect_index + 1));
|
||||
sym.type = .{ .complex_type = complex_type, .base_type = .NULL };
|
||||
|
||||
@ -1449,7 +1448,7 @@ fn updateDeclCode(self: *Coff, pt: Zcu.PerThread, decl_index: InternPool.DeclInd
|
||||
const need_realloc = code.len > capacity or !mem.isAlignedGeneric(u64, sym.value, required_alignment);
|
||||
if (need_realloc) {
|
||||
const vaddr = try self.growAtom(atom_index, code_len, required_alignment);
|
||||
log.debug("growing {} from 0x{x} to 0x{x}", .{ decl_name.fmt(&mod.intern_pool), sym.value, vaddr });
|
||||
log.debug("growing {} from 0x{x} to 0x{x}", .{ decl.fqn.fmt(&mod.intern_pool), sym.value, vaddr });
|
||||
log.debug(" (required alignment 0x{x}", .{required_alignment});
|
||||
|
||||
if (vaddr != sym.value) {
|
||||
@ -1465,13 +1464,13 @@ fn updateDeclCode(self: *Coff, pt: Zcu.PerThread, decl_index: InternPool.DeclInd
|
||||
self.getAtomPtr(atom_index).size = code_len;
|
||||
} else {
|
||||
const sym = atom.getSymbolPtr(self);
|
||||
try self.setSymbolName(sym, decl_name.toSlice(&mod.intern_pool));
|
||||
try self.setSymbolName(sym, decl.fqn.toSlice(&mod.intern_pool));
|
||||
sym.section_number = @as(coff.SectionNumber, @enumFromInt(sect_index + 1));
|
||||
sym.type = .{ .complex_type = complex_type, .base_type = .NULL };
|
||||
|
||||
const vaddr = try self.allocateAtom(atom_index, code_len, required_alignment);
|
||||
errdefer self.freeAtom(atom_index);
|
||||
log.debug("allocated atom for {} at 0x{x}", .{ decl_name.fmt(&mod.intern_pool), vaddr });
|
||||
log.debug("allocated atom for {} at 0x{x}", .{ decl.fqn.fmt(&mod.intern_pool), vaddr });
|
||||
self.getAtomPtr(atom_index).size = code_len;
|
||||
sym.value = vaddr;
|
||||
|
||||
|
||||
@ -1082,9 +1082,7 @@ pub fn initDeclState(self: *Dwarf, pt: Zcu.PerThread, decl_index: InternPool.Dec
|
||||
defer tracy.end();
|
||||
|
||||
const decl = pt.zcu.declPtr(decl_index);
|
||||
const decl_linkage_name = try decl.fullyQualifiedName(pt);
|
||||
|
||||
log.debug("initDeclState {}{*}", .{ decl_linkage_name.fmt(&pt.zcu.intern_pool), decl });
|
||||
log.debug("initDeclState {}{*}", .{ decl.fqn.fmt(&pt.zcu.intern_pool), decl });
|
||||
|
||||
const gpa = self.allocator;
|
||||
var decl_state: DeclState = .{
|
||||
@ -1157,7 +1155,7 @@ pub fn initDeclState(self: *Dwarf, pt: Zcu.PerThread, decl_index: InternPool.Dec
|
||||
|
||||
// .debug_info subprogram
|
||||
const decl_name_slice = decl.name.toSlice(&pt.zcu.intern_pool);
|
||||
const decl_linkage_name_slice = decl_linkage_name.toSlice(&pt.zcu.intern_pool);
|
||||
const decl_linkage_name_slice = decl.fqn.toSlice(&pt.zcu.intern_pool);
|
||||
try dbg_info_buffer.ensureUnusedCapacity(1 + ptr_width_bytes + 4 + 4 +
|
||||
(decl_name_slice.len + 1) + (decl_linkage_name_slice.len + 1));
|
||||
|
||||
|
||||
@ -907,10 +907,10 @@ fn updateDeclCode(
|
||||
) !void {
|
||||
const gpa = elf_file.base.comp.gpa;
|
||||
const mod = pt.zcu;
|
||||
const ip = &mod.intern_pool;
|
||||
const decl = mod.declPtr(decl_index);
|
||||
const decl_name = try decl.fullyQualifiedName(pt);
|
||||
|
||||
log.debug("updateDeclCode {}{*}", .{ decl_name.fmt(&mod.intern_pool), decl });
|
||||
log.debug("updateDeclCode {}{*}", .{ decl.fqn.fmt(ip), decl });
|
||||
|
||||
const required_alignment = decl.getAlignment(pt).max(
|
||||
target_util.minFunctionAlignment(mod.getTarget()),
|
||||
@ -923,7 +923,7 @@ fn updateDeclCode(
|
||||
sym.output_section_index = shdr_index;
|
||||
atom_ptr.output_section_index = shdr_index;
|
||||
|
||||
sym.name_offset = try self.strtab.insert(gpa, decl_name.toSlice(&mod.intern_pool));
|
||||
sym.name_offset = try self.strtab.insert(gpa, decl.fqn.toSlice(ip));
|
||||
atom_ptr.flags.alive = true;
|
||||
atom_ptr.name_offset = sym.name_offset;
|
||||
esym.st_name = sym.name_offset;
|
||||
@ -940,7 +940,7 @@ fn updateDeclCode(
|
||||
const need_realloc = code.len > capacity or !required_alignment.check(@intCast(atom_ptr.value));
|
||||
if (need_realloc) {
|
||||
try atom_ptr.grow(elf_file);
|
||||
log.debug("growing {} from 0x{x} to 0x{x}", .{ decl_name.fmt(&mod.intern_pool), old_vaddr, atom_ptr.value });
|
||||
log.debug("growing {} from 0x{x} to 0x{x}", .{ decl.fqn.fmt(ip), old_vaddr, atom_ptr.value });
|
||||
if (old_vaddr != atom_ptr.value) {
|
||||
sym.value = 0;
|
||||
esym.st_value = 0;
|
||||
@ -1007,11 +1007,11 @@ fn updateTlv(
|
||||
code: []const u8,
|
||||
) !void {
|
||||
const mod = pt.zcu;
|
||||
const ip = &mod.intern_pool;
|
||||
const gpa = mod.gpa;
|
||||
const decl = mod.declPtr(decl_index);
|
||||
const decl_name = try decl.fullyQualifiedName(pt);
|
||||
|
||||
log.debug("updateTlv {} ({*})", .{ decl_name.fmt(&mod.intern_pool), decl });
|
||||
log.debug("updateTlv {} ({*})", .{ decl.fqn.fmt(ip), decl });
|
||||
|
||||
const required_alignment = decl.getAlignment(pt);
|
||||
|
||||
@ -1023,7 +1023,7 @@ fn updateTlv(
|
||||
sym.output_section_index = shndx;
|
||||
atom_ptr.output_section_index = shndx;
|
||||
|
||||
sym.name_offset = try self.strtab.insert(gpa, decl_name.toSlice(&mod.intern_pool));
|
||||
sym.name_offset = try self.strtab.insert(gpa, decl.fqn.toSlice(ip));
|
||||
atom_ptr.flags.alive = true;
|
||||
atom_ptr.name_offset = sym.name_offset;
|
||||
esym.st_value = 0;
|
||||
@ -1286,9 +1286,8 @@ pub fn lowerUnnamedConst(
|
||||
}
|
||||
const unnamed_consts = gop.value_ptr;
|
||||
const decl = mod.declPtr(decl_index);
|
||||
const decl_name = try decl.fullyQualifiedName(pt);
|
||||
const index = unnamed_consts.items.len;
|
||||
const name = try std.fmt.allocPrint(gpa, "__unnamed_{}_{d}", .{ decl_name.fmt(&mod.intern_pool), index });
|
||||
const name = try std.fmt.allocPrint(gpa, "__unnamed_{}_{d}", .{ decl.fqn.fmt(&mod.intern_pool), index });
|
||||
defer gpa.free(name);
|
||||
const ty = val.typeOf(mod);
|
||||
const sym_index = switch (try self.lowerConst(
|
||||
@ -1473,9 +1472,8 @@ pub fn updateDeclLineNumber(
|
||||
defer tracy.end();
|
||||
|
||||
const decl = pt.zcu.declPtr(decl_index);
|
||||
const decl_name = try decl.fullyQualifiedName(pt);
|
||||
|
||||
log.debug("updateDeclLineNumber {}{*}", .{ decl_name.fmt(&pt.zcu.intern_pool), decl });
|
||||
log.debug("updateDeclLineNumber {}{*}", .{ decl.fqn.fmt(&pt.zcu.intern_pool), decl });
|
||||
|
||||
if (self.dwarf) |*dw| {
|
||||
try dw.updateDeclLineNumber(pt.zcu, decl_index);
|
||||
|
||||
@ -809,10 +809,10 @@ fn updateDeclCode(
|
||||
) !void {
|
||||
const gpa = macho_file.base.comp.gpa;
|
||||
const mod = pt.zcu;
|
||||
const ip = &mod.intern_pool;
|
||||
const decl = mod.declPtr(decl_index);
|
||||
const decl_name = try decl.fullyQualifiedName(pt);
|
||||
|
||||
log.debug("updateDeclCode {}{*}", .{ decl_name.fmt(&mod.intern_pool), decl });
|
||||
log.debug("updateDeclCode {}{*}", .{ decl.fqn.fmt(ip), decl });
|
||||
|
||||
const required_alignment = decl.getAlignment(pt);
|
||||
|
||||
@ -824,7 +824,7 @@ fn updateDeclCode(
|
||||
sym.out_n_sect = sect_index;
|
||||
atom.out_n_sect = sect_index;
|
||||
|
||||
sym.name = try self.strtab.insert(gpa, decl_name.toSlice(&mod.intern_pool));
|
||||
sym.name = try self.strtab.insert(gpa, decl.fqn.toSlice(ip));
|
||||
atom.flags.alive = true;
|
||||
atom.name = sym.name;
|
||||
nlist.n_strx = sym.name;
|
||||
@ -843,7 +843,7 @@ fn updateDeclCode(
|
||||
|
||||
if (need_realloc) {
|
||||
try atom.grow(macho_file);
|
||||
log.debug("growing {} from 0x{x} to 0x{x}", .{ decl_name.fmt(&mod.intern_pool), old_vaddr, atom.value });
|
||||
log.debug("growing {} from 0x{x} to 0x{x}", .{ decl.fqn.fmt(ip), old_vaddr, atom.value });
|
||||
if (old_vaddr != atom.value) {
|
||||
sym.value = 0;
|
||||
nlist.n_value = 0;
|
||||
@ -893,25 +893,22 @@ fn updateTlv(
|
||||
sect_index: u8,
|
||||
code: []const u8,
|
||||
) !void {
|
||||
const ip = &pt.zcu.intern_pool;
|
||||
const decl = pt.zcu.declPtr(decl_index);
|
||||
const decl_name = try decl.fullyQualifiedName(pt);
|
||||
|
||||
log.debug("updateTlv {} ({*})", .{ decl_name.fmt(&pt.zcu.intern_pool), decl });
|
||||
|
||||
const decl_name_slice = decl_name.toSlice(&pt.zcu.intern_pool);
|
||||
const required_alignment = decl.getAlignment(pt);
|
||||
log.debug("updateTlv {} ({*})", .{ decl.fqn.fmt(&pt.zcu.intern_pool), decl });
|
||||
|
||||
// 1. Lower TLV initializer
|
||||
const init_sym_index = try self.createTlvInitializer(
|
||||
macho_file,
|
||||
decl_name_slice,
|
||||
required_alignment,
|
||||
decl.fqn.toSlice(ip),
|
||||
decl.getAlignment(pt),
|
||||
sect_index,
|
||||
code,
|
||||
);
|
||||
|
||||
// 2. Create TLV descriptor
|
||||
try self.createTlvDescriptor(macho_file, sym_index, init_sym_index, decl_name_slice);
|
||||
try self.createTlvDescriptor(macho_file, sym_index, init_sym_index, decl.fqn.toSlice(ip));
|
||||
}
|
||||
|
||||
fn createTlvInitializer(
|
||||
@ -1099,9 +1096,8 @@ pub fn lowerUnnamedConst(
|
||||
}
|
||||
const unnamed_consts = gop.value_ptr;
|
||||
const decl = mod.declPtr(decl_index);
|
||||
const decl_name = try decl.fullyQualifiedName(pt);
|
||||
const index = unnamed_consts.items.len;
|
||||
const name = try std.fmt.allocPrint(gpa, "__unnamed_{}_{d}", .{ decl_name.fmt(&mod.intern_pool), index });
|
||||
const name = try std.fmt.allocPrint(gpa, "__unnamed_{}_{d}", .{ decl.fqn.fmt(&mod.intern_pool), index });
|
||||
defer gpa.free(name);
|
||||
const sym_index = switch (try self.lowerConst(
|
||||
macho_file,
|
||||
|
||||
@ -483,11 +483,9 @@ pub fn lowerUnnamedConst(self: *Plan9, pt: Zcu.PerThread, val: Value, decl_index
|
||||
}
|
||||
const unnamed_consts = gop.value_ptr;
|
||||
|
||||
const decl_name = try decl.fullyQualifiedName(pt);
|
||||
|
||||
const index = unnamed_consts.items.len;
|
||||
// name is freed when the unnamed const is freed
|
||||
const name = try std.fmt.allocPrint(gpa, "__unnamed_{}_{d}", .{ decl_name.fmt(&mod.intern_pool), index });
|
||||
const name = try std.fmt.allocPrint(gpa, "__unnamed_{}_{d}", .{ decl.fqn.fmt(&mod.intern_pool), index });
|
||||
|
||||
const sym_index = try self.allocateSymbolIndex();
|
||||
const new_atom_idx = try self.createAtom();
|
||||
|
||||
@ -346,8 +346,7 @@ fn finishUpdateDecl(
|
||||
const atom_index = decl_info.atom;
|
||||
const atom = wasm_file.getAtomPtr(atom_index);
|
||||
const sym = zig_object.symbol(atom.sym_index);
|
||||
const full_name = try decl.fullyQualifiedName(pt);
|
||||
sym.name = try zig_object.string_table.insert(gpa, full_name.toSlice(ip));
|
||||
sym.name = try zig_object.string_table.insert(gpa, decl.fqn.toSlice(ip));
|
||||
try atom.code.appendSlice(gpa, code);
|
||||
atom.size = @intCast(code.len);
|
||||
|
||||
@ -387,7 +386,7 @@ fn finishUpdateDecl(
|
||||
// Will be freed upon freeing of decl or after cleanup of Wasm binary.
|
||||
const full_segment_name = try std.mem.concat(gpa, u8, &.{
|
||||
segment_name,
|
||||
full_name.toSlice(ip),
|
||||
decl.fqn.toSlice(ip),
|
||||
});
|
||||
errdefer gpa.free(full_segment_name);
|
||||
sym.tag = .data;
|
||||
@ -436,9 +435,8 @@ pub fn getOrCreateAtomForDecl(
|
||||
const sym_index = try zig_object.allocateSymbol(gpa);
|
||||
gop.value_ptr.* = .{ .atom = try wasm_file.createAtom(sym_index, zig_object.index) };
|
||||
const decl = pt.zcu.declPtr(decl_index);
|
||||
const full_name = try decl.fullyQualifiedName(pt);
|
||||
const sym = zig_object.symbol(sym_index);
|
||||
sym.name = try zig_object.string_table.insert(gpa, full_name.toSlice(&pt.zcu.intern_pool));
|
||||
sym.name = try zig_object.string_table.insert(gpa, decl.fqn.toSlice(&pt.zcu.intern_pool));
|
||||
}
|
||||
return gop.value_ptr.atom;
|
||||
}
|
||||
@ -494,9 +492,8 @@ pub fn lowerUnnamedConst(
|
||||
const parent_atom_index = try zig_object.getOrCreateAtomForDecl(wasm_file, pt, decl_index);
|
||||
const parent_atom = wasm_file.getAtom(parent_atom_index);
|
||||
const local_index = parent_atom.locals.items.len;
|
||||
const fqn = try decl.fullyQualifiedName(pt);
|
||||
const name = try std.fmt.allocPrintZ(gpa, "__unnamed_{}_{d}", .{
|
||||
fqn.fmt(&mod.intern_pool), local_index,
|
||||
decl.fqn.fmt(&mod.intern_pool), local_index,
|
||||
});
|
||||
defer gpa.free(name);
|
||||
|
||||
@ -1127,9 +1124,7 @@ pub fn updateDeclLineNumber(
|
||||
) !void {
|
||||
if (zig_object.dwarf) |*dw| {
|
||||
const decl = pt.zcu.declPtr(decl_index);
|
||||
const decl_name = try decl.fullyQualifiedName(pt);
|
||||
|
||||
log.debug("updateDeclLineNumber {}{*}", .{ decl_name.fmt(&pt.zcu.intern_pool), decl });
|
||||
log.debug("updateDeclLineNumber {}{*}", .{ decl.fqn.fmt(&pt.zcu.intern_pool), decl });
|
||||
try dw.updateDeclLineNumber(pt.zcu, decl_index);
|
||||
}
|
||||
}
|
||||
|
||||
@ -299,8 +299,8 @@ fn printPtrDerivation(derivation: Value.PointerDeriveStep, writer: anytype, leve
|
||||
int.ptr_ty.fmt(pt),
|
||||
int.addr,
|
||||
}),
|
||||
.decl_ptr => |decl| {
|
||||
try zcu.declPtr(decl).renderFullyQualifiedName(zcu, writer);
|
||||
.decl_ptr => |decl_index| {
|
||||
try writer.print("{}", .{zcu.declPtr(decl_index).fqn.fmt(ip)});
|
||||
},
|
||||
.anon_decl_ptr => |anon| {
|
||||
const ty = Value.fromInterned(anon.val).typeOf(zcu);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user