From 96ce046605637adcfc155c85800ccaf0002cbca6 Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Sun, 2 Oct 2022 17:17:08 -0400 Subject: [PATCH 1/2] llvm: fix missing llvm module global initializers Fixes #12025 Fixes #12588 --- src/codegen/llvm.zig | 2 ++ test/behavior.zig | 1 + test/behavior/bugs/12025.zig | 10 ++++++++++ test/standalone.zig | 1 + test/standalone/issue_12588/build.zig | 18 ++++++++++++++++++ test/standalone/issue_12588/main.zig | 6 ++++++ 6 files changed, 38 insertions(+) create mode 100644 test/behavior/bugs/12025.zig create mode 100644 test/standalone/issue_12588/build.zig create mode 100644 test/standalone/issue_12588/main.zig diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index a24c14c9c693..df7d8542127e 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -2633,6 +2633,8 @@ pub const DeclGen = struct { if (variable.data.is_weak_linkage) llvm_global.setLinkage(.ExternalWeak); } } else { + // Ensure the llvm module remains valid even if we decide to not codegen an initializer. + llvm_global.setInitializer(llvm_type.getUndef()); llvm_global.setLinkage(.Internal); llvm_global.setUnnamedAddr(.True); } diff --git a/test/behavior.zig b/test/behavior.zig index 8f4657e634af..894e24ad1703 100644 --- a/test/behavior.zig +++ b/test/behavior.zig @@ -83,6 +83,7 @@ test { _ = @import("behavior/bugs/11213.zig"); _ = @import("behavior/bugs/11816.zig"); _ = @import("behavior/bugs/12003.zig"); + _ = @import("behavior/bugs/12025.zig"); _ = @import("behavior/bugs/12033.zig"); _ = @import("behavior/bugs/12430.zig"); _ = @import("behavior/bugs/12486.zig"); diff --git a/test/behavior/bugs/12025.zig b/test/behavior/bugs/12025.zig new file mode 100644 index 000000000000..7b1804cf20ef --- /dev/null +++ b/test/behavior/bugs/12025.zig @@ -0,0 +1,10 @@ +test { + comptime var st = .{ + .foo = &1, + .bar = &2, + }; + + inline for (@typeInfo(@TypeOf(st)).Struct.fields) |field| { + _ = field; + } +} diff --git a/test/standalone.zig b/test/standalone.zig index d3dedb59e616..7c0eb824bc4f 100644 --- a/test/standalone.zig +++ b/test/standalone.zig @@ -99,4 +99,5 @@ pub fn addCases(cases: *tests.StandaloneContext) void { //cases.add("tools/update_spirv_features.zig"); cases.addBuildFile("test/standalone/issue_13030/build.zig", .{ .build_modes = true }); + cases.addBuildFile("test/standalone/issue_12588/build.zig", .{}); } diff --git a/test/standalone/issue_12588/build.zig b/test/standalone/issue_12588/build.zig new file mode 100644 index 000000000000..01081d24eda4 --- /dev/null +++ b/test/standalone/issue_12588/build.zig @@ -0,0 +1,18 @@ +const std = @import("std"); +const Builder = std.build.Builder; + +pub fn build(b: *Builder) void { + const mode = b.standardReleaseOptions(); + const target = b.standardTargetOptions(.{}); + + const obj = b.addObject("main", "main.zig"); + obj.setBuildMode(mode); + obj.setTarget(target); + obj.emit_llvm_ir = .emit; + obj.emit_llvm_bc = .emit; + obj.emit_bin = .no_emit; + b.default_step.dependOn(&obj.step); + + const test_step = b.step("test", "Test the program"); + test_step.dependOn(&obj.step); +} diff --git a/test/standalone/issue_12588/main.zig b/test/standalone/issue_12588/main.zig new file mode 100644 index 000000000000..47f67515c7d7 --- /dev/null +++ b/test/standalone/issue_12588/main.zig @@ -0,0 +1,6 @@ +const std = @import("std"); + +export fn strFromFloatHelp(float: f64) void { + var buf: [400]u8 = undefined; + _ = std.fmt.bufPrint(&buf, "{d}", .{float}) catch unreachable; +} From f8c7a4a3deb69ad353e8069a467af0c796a77e41 Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Mon, 3 Oct 2022 00:41:39 -0400 Subject: [PATCH 2/2] test: move build artifacts to build root instead cwd --- test/standalone/issue_12588/build.zig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/standalone/issue_12588/build.zig b/test/standalone/issue_12588/build.zig index 01081d24eda4..02fa5e1680d3 100644 --- a/test/standalone/issue_12588/build.zig +++ b/test/standalone/issue_12588/build.zig @@ -8,8 +8,8 @@ pub fn build(b: *Builder) void { const obj = b.addObject("main", "main.zig"); obj.setBuildMode(mode); obj.setTarget(target); - obj.emit_llvm_ir = .emit; - obj.emit_llvm_bc = .emit; + obj.emit_llvm_ir = .{ .emit_to = b.pathFromRoot("main.ll") }; + obj.emit_llvm_bc = .{ .emit_to = b.pathFromRoot("main.bc") }; obj.emit_bin = .no_emit; b.default_step.dependOn(&obj.step);