aboutsummaryrefslogtreecommitdiff
path: root/src/link/Coff.zig
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2023-06-12 01:44:12 -0400
committerAndrew Kelley <andrew@ziglang.org>2023-06-11 23:45:09 -0700
commitd37ebfcf231c68a0430840c4fbe649dd0076ae1e (patch)
treed9f67acedf38600487a2d2ed08e1e202dfad5667 /src/link/Coff.zig
parent54460e39ace2140e6bfcb0bf4ae1709d128f9e8d (diff)
downloadzig-d37ebfcf231c68a0430840c4fbe649dd0076ae1e.tar.gz
zig-d37ebfcf231c68a0430840c4fbe649dd0076ae1e.zip
InternPool: avoid as many slices pointing to `string_bytes` as possible
These are frequently invalidated whenever a string is interned, so avoid creating pointers to `string_bytes` wherever possible. This is an attempt to fix random CI failures.
Diffstat (limited to 'src/link/Coff.zig')
-rw-r--r--src/link/Coff.zig25
1 files changed, 12 insertions, 13 deletions
diff --git a/src/link/Coff.zig b/src/link/Coff.zig
index fec6a86b91..f7785858dd 100644
--- a/src/link/Coff.zig
+++ b/src/link/Coff.zig
@@ -1430,20 +1430,20 @@ pub fn updateDeclExports(
else => std.builtin.CallingConvention.C,
};
const decl_cc = exported_decl.ty.fnCallingConvention(mod);
- if (decl_cc == .C and ip.stringEqlSlice(exp.name, "main") and
+ if (decl_cc == .C and ip.stringEqlSlice(exp.opts.name, "main") and
self.base.options.link_libc)
{
mod.stage1_flags.have_c_main = true;
} else if (decl_cc == winapi_cc and self.base.options.target.os.tag == .windows) {
- if (ip.stringEqlSlice(exp.name, "WinMain")) {
+ if (ip.stringEqlSlice(exp.opts.name, "WinMain")) {
mod.stage1_flags.have_winmain = true;
- } else if (ip.stringEqlSlice(exp.name, "wWinMain")) {
+ } else if (ip.stringEqlSlice(exp.opts.name, "wWinMain")) {
mod.stage1_flags.have_wwinmain = true;
- } else if (ip.stringEqlSlice(exp.name, "WinMainCRTStartup")) {
+ } else if (ip.stringEqlSlice(exp.opts.name, "WinMainCRTStartup")) {
mod.stage1_flags.have_winmain_crt_startup = true;
- } else if (ip.stringEqlSlice(exp.name, "wWinMainCRTStartup")) {
+ } else if (ip.stringEqlSlice(exp.opts.name, "wWinMainCRTStartup")) {
mod.stage1_flags.have_wwinmain_crt_startup = true;
- } else if (ip.stringEqlSlice(exp.name, "DllMainCRTStartup")) {
+ } else if (ip.stringEqlSlice(exp.opts.name, "DllMainCRTStartup")) {
mod.stage1_flags.have_dllmain_crt_startup = true;
}
}
@@ -1461,10 +1461,9 @@ pub fn updateDeclExports(
const decl_metadata = self.decls.getPtr(decl_index).?;
for (exports) |exp| {
- const exp_name = mod.intern_pool.stringToSlice(exp.name);
- log.debug("adding new export '{s}'", .{exp_name});
+ log.debug("adding new export '{}'", .{exp.opts.name.fmt(&mod.intern_pool)});
- if (mod.intern_pool.stringToSliceUnwrap(exp.section)) |section_name| {
+ if (mod.intern_pool.stringToSliceUnwrap(exp.opts.section)) |section_name| {
if (!mem.eql(u8, section_name, ".text")) {
try mod.failed_exports.putNoClobber(
gpa,
@@ -1480,7 +1479,7 @@ pub fn updateDeclExports(
}
}
- if (exp.linkage == .LinkOnce) {
+ if (exp.opts.linkage == .LinkOnce) {
try mod.failed_exports.putNoClobber(
gpa,
exp,
@@ -1494,19 +1493,19 @@ pub fn updateDeclExports(
continue;
}
- const sym_index = decl_metadata.getExport(self, exp_name) orelse blk: {
+ const sym_index = decl_metadata.getExport(self, mod.intern_pool.stringToSlice(exp.opts.name)) orelse blk: {
const sym_index = try self.allocateSymbol();
try decl_metadata.exports.append(gpa, sym_index);
break :blk sym_index;
};
const sym_loc = SymbolWithLoc{ .sym_index = sym_index, .file = null };
const sym = self.getSymbolPtr(sym_loc);
- try self.setSymbolName(sym, exp_name);
+ try self.setSymbolName(sym, mod.intern_pool.stringToSlice(exp.opts.name));
sym.value = decl_sym.value;
sym.section_number = @intToEnum(coff.SectionNumber, self.text_section_index.? + 1);
sym.type = .{ .complex_type = .FUNCTION, .base_type = .NULL };
- switch (exp.linkage) {
+ switch (exp.opts.linkage) {
.Strong => {
sym.storage_class = .EXTERNAL;
},