Skip to content

Commit 8f75823

Browse files
authored
Merge pull request #11446 from ziglang/aarch64-macos-llvm
stage2: fix behavior test failures on aarch64-macos (LLVM+native), and other minor fixes
2 parents a315d51 + 897df18 commit 8f75823

File tree

7 files changed

+39
-28
lines changed

7 files changed

+39
-28
lines changed

lib/std/start.zig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ comptime {
3030
builtin.zig_backend == .stage2_arm or
3131
builtin.zig_backend == .stage2_riscv64 or
3232
builtin.zig_backend == .stage2_sparcv9 or
33-
(builtin.zig_backend == .stage2_llvm and native_os != .linux) or
34-
(builtin.zig_backend == .stage2_llvm and native_arch != .x86_64))
33+
(builtin.zig_backend == .stage2_llvm and native_os != .linux and native_os != .macos) or
34+
(builtin.zig_backend == .stage2_llvm and native_arch != .x86_64 and native_arch != .aarch64))
3535
{
3636
if (builtin.output_mode == .Exe) {
3737
if ((builtin.link_libc or builtin.object_format == .c) and @hasDecl(root, "main")) {

lib/std/target.zig

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1718,8 +1718,17 @@ pub const Target = struct {
17181718
}
17191719
return switch (F) {
17201720
f128 => switch (target.cpu.arch) {
1721+
.aarch64 => {
1722+
// According to Apple's official guide:
1723+
// > The long double type is a double precision IEEE754 binary floating-point type,
1724+
// > which makes it identical to the double type. This behavior contrasts to the
1725+
// > standard specification, in which a long double is a quad-precision, IEEE754
1726+
// > binary, floating-point type.
1727+
// https://developer.apple.com/documentation/xcode/writing-arm64-code-for-apple-platforms
1728+
return !target.isDarwin();
1729+
},
1730+
17211731
.riscv64,
1722-
.aarch64,
17231732
.aarch64_be,
17241733
.aarch64_32,
17251734
.s390x,

src/link.zig

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -352,11 +352,6 @@ pub const File = struct {
352352
}
353353
switch (base.tag) {
354354
.macho => if (base.file) |f| {
355-
if (base.intermediary_basename != null) {
356-
// The file we have open is not the final file that we want to
357-
// make executable, so we don't have to close it.
358-
return;
359-
}
360355
if (comptime builtin.target.isDarwin() and builtin.target.cpu.arch == .aarch64) {
361356
if (base.options.target.cpu.arch == .aarch64) {
362357
// XNU starting with Big Sur running on arm64 is caching inodes of running binaries.
@@ -371,8 +366,10 @@ pub const File = struct {
371366
try emit.directory.handle.copyFile(emit.sub_path, emit.directory.handle, emit.sub_path, .{});
372367
}
373368
}
374-
f.close();
375-
base.file = null;
369+
if (base.intermediary_basename == null) {
370+
f.close();
371+
base.file = null;
372+
}
376373
},
377374
.coff, .elf, .plan9 => if (base.file) |f| {
378375
if (base.intermediary_basename != null) {

src/link/MachO.zig

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ pub fn flush(self: *MachO, comp: *Compilation) !void {
423423
if (self.base.options.emit == null) {
424424
if (build_options.have_llvm) {
425425
if (self.llvm_object) |llvm_object| {
426-
return try llvm_object.flushModule(comp);
426+
try llvm_object.flushModule(comp);
427427
}
428428
}
429429
return;
@@ -1116,7 +1116,8 @@ pub fn flushObject(self: *MachO, comp: *Compilation) !void {
11161116
defer tracy.end();
11171117

11181118
if (build_options.have_llvm)
1119-
if (self.llvm_object) |llvm_object| return llvm_object.flushModule(comp);
1119+
if (self.llvm_object) |llvm_object|
1120+
return llvm_object.flushModule(comp);
11201121

11211122
return error.TODOImplementWritingObjFiles;
11221123
}

src/stage1/target.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1008,8 +1008,16 @@ bool target_long_double_is_f128(const ZigTarget *target) {
10081008
return false;
10091009
}
10101010
switch (target->arch) {
1011-
case ZigLLVM_riscv64:
10121011
case ZigLLVM_aarch64:
1012+
// According to Apple's official guide:
1013+
// > The long double type is a double precision IEEE754 binary floating-point type,
1014+
// > which makes it identical to the double type. This behavior contrasts to the
1015+
// > standard specification, in which a long double is a quad-precision, IEEE754
1016+
// > binary, floating-point type.
1017+
// https://developer.apple.com/documentation/xcode/writing-arm64-code-for-apple-platforms
1018+
return !target_os_is_darwin(target->os);
1019+
1020+
case ZigLLVM_riscv64:
10131021
case ZigLLVM_aarch64_be:
10141022
case ZigLLVM_aarch64_32:
10151023
case ZigLLVM_systemz:

src/type.zig

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6155,7 +6155,6 @@ pub const CType = enum {
61556155
},
61566156

61576157
.linux,
6158-
.macos,
61596158
.freebsd,
61606159
.netbsd,
61616160
.dragonfly,
@@ -6198,7 +6197,7 @@ pub const CType = enum {
61986197
.longlong, .ulonglong, .longdouble => return 64,
61996198
},
62006199

6201-
.ios, .tvos, .watchos => switch (self) {
6200+
.macos, .ios, .tvos, .watchos => switch (self) {
62026201
.short, .ushort => return 16,
62036202
.int, .uint => return 32,
62046203
.long, .ulong, .longlong, .ulonglong => return 64,

test/behavior/cast.zig

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -79,19 +79,16 @@ test "comptime_int @intToFloat" {
7979
try expect(result == 1234.0);
8080
}
8181

82-
if (!((builtin.zig_backend == .stage2_aarch64 or builtin.zig_backend == .stage2_x86_64) and builtin.os.tag == .macos)) {
83-
// TODO investigate why this traps on x86_64-macos and aarch64-macos
84-
{
85-
const result = @intToFloat(f128, 1234);
86-
try expect(@TypeOf(result) == f128);
87-
try expect(result == 1234.0);
88-
}
89-
// big comptime_int (> 64 bits) to f128 conversion
90-
{
91-
const result = @intToFloat(f128, 0x1_0000_0000_0000_0000);
92-
try expect(@TypeOf(result) == f128);
93-
try expect(result == 0x1_0000_0000_0000_0000.0);
94-
}
82+
{
83+
const result = @intToFloat(f128, 1234);
84+
try expect(@TypeOf(result) == f128);
85+
try expect(result == 1234.0);
86+
}
87+
// big comptime_int (> 64 bits) to f128 conversion
88+
{
89+
const result = @intToFloat(f128, 0x1_0000_0000_0000_0000);
90+
try expect(@TypeOf(result) == f128);
91+
try expect(result == 0x1_0000_0000_0000_0000.0);
9592
}
9693
}
9794

0 commit comments

Comments
 (0)