aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-10-29 13:28:17 +0100
committerJakub Konka <kubkon@jakubkonka.com>2023-10-29 18:55:58 +0100
commiteaca72534c6d57acf85b7f20e76fd31302785a5e (patch)
treee1efe284c266e78b23f6a45f6373a00e67e2c1d1
parent209fd8cb9326ed8376bf17e847209ff0598d3aa6 (diff)
downloadzig-eaca72534c6d57acf85b7f20e76fd31302785a5e.tar.gz
zig-eaca72534c6d57acf85b7f20e76fd31302785a5e.zip
elf: implement exporting anon decls
-rw-r--r--src/link/Elf.zig17
-rw-r--r--test/behavior/export_builtin.zig3
2 files changed, 16 insertions, 4 deletions
diff --git a/src/link/Elf.zig b/src/link/Elf.zig
index 3251005b02..15a10f1b63 100644
--- a/src/link/Elf.zig
+++ b/src/link/Elf.zig
@@ -3585,8 +3585,21 @@ pub fn updateExports(
_ = try self.getOrCreateMetadataForDecl(decl_index);
break :blk self.decls.getPtr(decl_index).?;
},
- // TODO is it possible to request export before const being lowered?
- .value => |value| self.anon_decls.getPtr(value).?,
+ .value => |value| self.anon_decls.getPtr(value) orelse blk: {
+ const first_exp = exports[0];
+ const res = try self.lowerAnonDecl(value, .none, first_exp.getSrcLoc(mod));
+ switch (res) {
+ .ok => {},
+ .fail => |em| {
+ // TODO maybe it's enough to return an error here and let Module.processExportsInner
+ // handle the error?
+ try mod.failed_exports.ensureUnusedCapacity(mod.gpa, 1);
+ mod.failed_exports.putAssumeCapacityNoClobber(first_exp, em);
+ return;
+ },
+ }
+ break :blk self.anon_decls.getPtr(value).?;
+ },
};
const sym_index = metadata.symbol_index;
const esym_index = self.symbol(sym_index).esym_index;
diff --git a/test/behavior/export_builtin.zig b/test/behavior/export_builtin.zig
index ec1797f32e..21d727501b 100644
--- a/test/behavior/export_builtin.zig
+++ b/test/behavior/export_builtin.zig
@@ -70,8 +70,7 @@ test "exporting comptime-known value" {
test "exporting comptime var" {
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
- if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
- // if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
+ if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;