diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2023-10-29 13:28:17 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2023-10-29 18:55:58 +0100 |
| commit | eaca72534c6d57acf85b7f20e76fd31302785a5e (patch) | |
| tree | e1efe284c266e78b23f6a45f6373a00e67e2c1d1 | |
| parent | 209fd8cb9326ed8376bf17e847209ff0598d3aa6 (diff) | |
| download | zig-eaca72534c6d57acf85b7f20e76fd31302785a5e.tar.gz zig-eaca72534c6d57acf85b7f20e76fd31302785a5e.zip | |
elf: implement exporting anon decls
| -rw-r--r-- | src/link/Elf.zig | 17 | ||||
| -rw-r--r-- | test/behavior/export_builtin.zig | 3 |
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; |
