commit 0ec01e58b429e96d50411f74a0005076c24dda0c (tree)
parent 3b09262c1252de0d9f946630e701be65bc5b2fc7
Author: Andrew Kelley <andrew@ziglang.org>
Date: Wed, 22 Sep 2021 22:08:34 -0400
Merge pull request #9717 from SpexGuy/stage2-start-windows
Make stage2 start.zig work on Windows
Diffstat:
6 files changed, 18 insertions(+), 13 deletions(-)
diff --git a/build.zig b/build.zig
@@ -115,6 +115,7 @@ pub fn build(b: *Builder) !void {
if (target.isWindows() and target.getAbi() == .gnu) {
// LTO is currently broken on mingw, this can be removed when it's fixed.
exe.want_lto = false;
+ test_stage2.want_lto = false;
}
const exe_options = b.addOptions();
@@ -501,6 +502,7 @@ fn addStaticLlvmOptionsToExe(
if (exe.target.getOs().tag == .windows) {
exe.linkSystemLibrary("version");
exe.linkSystemLibrary("uuid");
+ exe.linkSystemLibrary("ole32");
}
}
diff --git a/lib/std/start.zig b/lib/std/start.zig
@@ -28,6 +28,8 @@ comptime {
if (@typeInfo(@TypeOf(root.main)).Fn.calling_convention != .C) {
@export(main2, .{ .name = "main" });
}
+ } else if (builtin.os.tag == .windows) {
+ @export(wWinMainCRTStartup2, .{ .name = "wWinMainCRTStartup" });
} else {
if (!@hasDecl(root, "_start")) {
@export(_start2, .{ .name = "_start" });
@@ -96,6 +98,11 @@ fn callMain2() noreturn {
exit2(0);
}
+fn wWinMainCRTStartup2() callconv(.C) noreturn {
+ root.main();
+ exit2(0);
+}
+
fn exit2(code: usize) noreturn {
switch (native_os) {
.linux => switch (builtin.stage2_arch) {
@@ -148,11 +155,16 @@ fn exit2(code: usize) noreturn {
},
else => @compileError("TODO"),
},
+ .windows => {
+ ExitProcess(@truncate(u32, code));
+ },
else => @compileError("TODO"),
}
unreachable;
}
+extern "kernel32" fn ExitProcess(exit_code: u32) callconv(.C) noreturn;
+
////////////////////////////////////////////////////////////////////////////////
fn _DllMainCRTStartup(
diff --git a/src/Module.zig b/src/Module.zig
@@ -3758,13 +3758,6 @@ pub fn clearDecl(
dep.removeDependency(decl);
if (outdated_decls) |map| {
map.putAssumeCapacity(dep, {});
- } else if (std.debug.runtime_safety) {
- // If `outdated_decls` is `null`, it means we're being called from
- // `Compilation` after `performAllTheWork` and we cannot queue up any
- // more work. `dep` must necessarily be another Decl that is no longer
- // being referenced, and will be in the `deletion_set`. Otherwise,
- // something has gone wrong.
- assert(mod.deletion_set.contains(dep));
}
}
decl.dependants.clearRetainingCapacity();
diff --git a/src/type.zig b/src/type.zig
@@ -1336,6 +1336,8 @@ pub const Type = extern union {
}
}
+ /// For structs and unions, if the type does not have their fields resolved
+ /// this will return `false`.
pub fn hasCodeGenBits(self: Type) bool {
return switch (self.tag()) {
.u1,
@@ -1400,14 +1402,10 @@ pub const Type = extern union {
=> true,
.@"struct" => {
- // TODO introduce lazy value mechanism
const struct_obj = self.castTag(.@"struct").?.data;
if (struct_obj.known_has_bits) {
return true;
}
- assert(struct_obj.status == .have_field_types or
- struct_obj.status == .layout_wip or
- struct_obj.status == .have_layout);
for (struct_obj.fields.values()) |value| {
if (value.ty.hasCodeGenBits())
return true;
diff --git a/test/cases.zig b/test/cases.zig
@@ -26,7 +26,7 @@ pub fn addCases(ctx: *TestContext) !void {
var case = ctx.exe("hello world with updates", linux_x64);
case.addError("", &[_][]const u8{
- ":95:9: error: struct 'tmp.tmp' has no member named 'main'",
+ ":97:9: error: struct 'tmp.tmp' has no member named 'main'",
});
// Incorrect return type
diff --git a/test/stage2/darwin.zig b/test/stage2/darwin.zig
@@ -14,7 +14,7 @@ pub fn addCases(ctx: *TestContext) !void {
{
var case = ctx.exe("darwin hello world with updates", target);
case.addError("", &[_][]const u8{
- ":95:9: error: struct 'tmp.tmp' has no member named 'main'",
+ ":97:9: error: struct 'tmp.tmp' has no member named 'main'",
});
// Incorrect return type