aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2023-12-03 18:07:49 -0500
committerJacob Young <jacobly0@users.noreply.github.com>2023-12-03 18:18:09 -0500
commit0be7c23f111eeda5ed65c065ad65a6febd12f20c (patch)
treee955075ea98ba3e60b72d70d2187927cc51f66df /src
parent7c85ea65ba9f85be44aa8af3745a6038b132bd7f (diff)
downloadzig-0be7c23f111eeda5ed65c065ad65a6febd12f20c.tar.gz
zig-0be7c23f111eeda5ed65c065ad65a6febd12f20c.zip
Coff: minor fixes
* Update the msdos stub to be eight bytes smaller, which moves the machine PE header field into the first 128 bytes of the file, allowing it to be matched by a binfmt_misc magic sequence. This allows the build system to get the correct error during exec. * Fix library name memory leaks in Sema.
Diffstat (limited to 'src')
-rw-r--r--src/Sema.zig30
-rw-r--r--src/link/Coff.zig2
-rw-r--r--src/link/msdos-stub.binbin128 -> 120 bytes
3 files changed, 15 insertions, 17 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 6d6f8d8fb6..752a5b1023 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -9069,7 +9069,7 @@ fn handleExternLibName(
block: *Block,
src_loc: LazySrcLoc,
lib_name: []const u8,
-) CompileError![:0]u8 {
+) CompileError!void {
blk: {
const mod = sema.mod;
const comp = mod.comp;
@@ -9117,7 +9117,6 @@ fn handleExternLibName(
});
};
}
- return sema.gpa.dupeZ(u8, lib_name);
}
/// These are calling conventions that are confirmed to work with variadic functions.
@@ -9422,15 +9421,13 @@ fn funcCommon(
assert(section != .generic);
assert(address_space != null);
assert(!is_generic);
+ if (opt_lib_name) |lib_name| try sema.handleExternLibName(block, .{
+ .node_offset_lib_name = src_node_offset,
+ }, lib_name);
const func_index = try ip.getExternFunc(gpa, .{
.ty = func_ty,
.decl = sema.owner_decl_index,
- .lib_name = if (opt_lib_name) |lib_name| (try mod.intern_pool.getOrPutString(
- gpa,
- try sema.handleExternLibName(block, .{
- .node_offset_lib_name = src_node_offset,
- }, lib_name),
- )).toOptional() else .none,
+ .lib_name = try mod.intern_pool.getOrPutStringOpt(gpa, opt_lib_name),
});
return finishFunc(
sema,
@@ -24688,10 +24685,11 @@ fn zirVarExtended(
var extra_index: usize = extra.end;
- const lib_name: ?[]const u8 = if (small.has_lib_name) blk: {
+ const lib_name = if (small.has_lib_name) lib_name: {
const lib_name = sema.code.nullTerminatedString(sema.code.extra[extra_index]);
extra_index += 1;
- break :blk lib_name;
+ try sema.handleExternLibName(block, ty_src, lib_name);
+ break :lib_name lib_name;
} else null;
// ZIR supports encoding this information but it is not used; the information
@@ -24729,10 +24727,7 @@ fn zirVarExtended(
.ty = var_ty.toIntern(),
.init = init_val,
.decl = sema.owner_decl_index,
- .lib_name = if (lib_name) |lname| (try mod.intern_pool.getOrPutString(
- sema.gpa,
- try sema.handleExternLibName(block, ty_src, lname),
- )).toOptional() else .none,
+ .lib_name = try mod.intern_pool.getOrPutStringOpt(sema.gpa, lib_name),
.is_extern = small.is_extern,
.is_threadlocal = small.is_threadlocal,
} })));
@@ -25177,12 +25172,13 @@ fn resolveExternOptions(
.needed_comptime_reason = "threadlocality of the extern symbol must be comptime-known",
});
- const library_name = if (library_name_val.optionalValue(mod)) |payload| blk: {
- const library_name = try payload.toAllocatedBytes(Type.slice_const_u8, sema.arena, mod);
+ const library_name = if (library_name_val.optionalValue(mod)) |library_name_payload| library_name: {
+ const library_name = try library_name_payload.toAllocatedBytes(Type.slice_const_u8, sema.arena, mod);
if (library_name.len == 0) {
return sema.fail(block, library_src, "library name cannot be empty", .{});
}
- break :blk try sema.handleExternLibName(block, library_src, library_name);
+ try sema.handleExternLibName(block, library_src, library_name);
+ break :library_name library_name;
} else null;
if (name.len == 0) {
diff --git a/src/link/Coff.zig b/src/link/Coff.zig
index 44b329d5b9..5fbf02871a 100644
--- a/src/link/Coff.zig
+++ b/src/link/Coff.zig
@@ -316,6 +316,8 @@ pub fn deinit(self: *Coff) void {
}
self.import_tables.deinit(gpa);
+ self.lazy_syms.deinit(gpa);
+
for (self.decls.values()) |*metadata| {
metadata.deinit(gpa);
}
diff --git a/src/link/msdos-stub.bin b/src/link/msdos-stub.bin
index 96ad91198f..8993ab1544 100644
--- a/src/link/msdos-stub.bin
+++ b/src/link/msdos-stub.bin
Binary files differ