| author | |
| committer | |
| log | 8f75823728d247bc11d916b7257d7eebc7be06de |
| tree | c75f34334db2fba833ae91f2ae7a52f9cbd546c8 |
| parent | a315d51c0a0c8eda2467c5571f9d7e2495274dbd |
| parent | 897df18573c951b49fb6421a9e1b711cabfeda67 |
| signature |
stage2: fix behavior test failures on aarch64-macos (LLVM+native), and other minor fixes7 files changed, 39 insertions(+), 28 deletions(-)
lib/std/start.zig+2-2| ... | ... | @@ -30,8 +30,8 @@ comptime { |
| 30 | 30 | builtin.zig_backend == .stage2_arm or |
| 31 | 31 | builtin.zig_backend == .stage2_riscv64 or |
| 32 | 32 | 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)) | |
| 35 | 35 | { |
| 36 | 36 | if (builtin.output_mode == .Exe) { |
| 37 | 37 | if ((builtin.link_libc or builtin.object_format == .c) and @hasDecl(root, "main")) { |
lib/std/target.zig+10-1| ... | ... | @@ -1718,8 +1718,17 @@ pub const Target = struct { |
| 1718 | 1718 | } |
| 1719 | 1719 | return switch (F) { |
| 1720 | 1720 | 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 | ||
| 1721 | 1731 | .riscv64, |
| 1722 | .aarch64, | |
| 1723 | 1732 | .aarch64_be, |
| 1724 | 1733 | .aarch64_32, |
| 1725 | 1734 | .s390x, |
src/link.zig+4-7| ... | ... | @@ -352,11 +352,6 @@ pub const File = struct { |
| 352 | 352 | } |
| 353 | 353 | switch (base.tag) { |
| 354 | 354 | .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 | } | |
| 360 | 355 | if (comptime builtin.target.isDarwin() and builtin.target.cpu.arch == .aarch64) { |
| 361 | 356 | if (base.options.target.cpu.arch == .aarch64) { |
| 362 | 357 | // XNU starting with Big Sur running on arm64 is caching inodes of running binaries. |
| ... | ... | @@ -371,8 +366,10 @@ pub const File = struct { |
| 371 | 366 | try emit.directory.handle.copyFile(emit.sub_path, emit.directory.handle, emit.sub_path, .{}); |
| 372 | 367 | } |
| 373 | 368 | } |
| 374 | f.close(); | |
| 375 | base.file = null; | |
| 369 | if (base.intermediary_basename == null) { | |
| 370 | f.close(); | |
| 371 | base.file = null; | |
| 372 | } | |
| 376 | 373 | }, |
| 377 | 374 | .coff, .elf, .plan9 => if (base.file) |f| { |
| 378 | 375 | if (base.intermediary_basename != null) { |
src/link/MachO.zig+3-2| ... | ... | @@ -423,7 +423,7 @@ pub fn flush(self: *MachO, comp: *Compilation) !void { |
| 423 | 423 | if (self.base.options.emit == null) { |
| 424 | 424 | if (build_options.have_llvm) { |
| 425 | 425 | if (self.llvm_object) |llvm_object| { |
| 426 | return try llvm_object.flushModule(comp); | |
| 426 | try llvm_object.flushModule(comp); | |
| 427 | 427 | } |
| 428 | 428 | } |
| 429 | 429 | return; |
| ... | ... | @@ -1116,7 +1116,8 @@ pub fn flushObject(self: *MachO, comp: *Compilation) !void { |
| 1116 | 1116 | defer tracy.end(); |
| 1117 | 1117 | |
| 1118 | 1118 | 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); | |
| 1120 | 1121 | |
| 1121 | 1122 | return error.TODOImplementWritingObjFiles; |
| 1122 | 1123 | } |
src/stage1/target.cpp+9-1| ... | ... | @@ -1008,8 +1008,16 @@ bool target_long_double_is_f128(const ZigTarget *target) { |
| 1008 | 1008 | return false; |
| 1009 | 1009 | } |
| 1010 | 1010 | switch (target->arch) { |
| 1011 | case ZigLLVM_riscv64: | |
| 1012 | 1011 | 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: | |
| 1013 | 1021 | case ZigLLVM_aarch64_be: |
| 1014 | 1022 | case ZigLLVM_aarch64_32: |
| 1015 | 1023 | case ZigLLVM_systemz: |
src/type.zig+1-2| ... | ... | @@ -6155,7 +6155,6 @@ pub const CType = enum { |
| 6155 | 6155 | }, |
| 6156 | 6156 | |
| 6157 | 6157 | .linux, |
| 6158 | .macos, | |
| 6159 | 6158 | .freebsd, |
| 6160 | 6159 | .netbsd, |
| 6161 | 6160 | .dragonfly, |
| ... | ... | @@ -6198,7 +6197,7 @@ pub const CType = enum { |
| 6198 | 6197 | .longlong, .ulonglong, .longdouble => return 64, |
| 6199 | 6198 | }, |
| 6200 | 6199 | |
| 6201 | .ios, .tvos, .watchos => switch (self) { | |
| 6200 | .macos, .ios, .tvos, .watchos => switch (self) { | |
| 6202 | 6201 | .short, .ushort => return 16, |
| 6203 | 6202 | .int, .uint => return 32, |
| 6204 | 6203 | .long, .ulong, .longlong, .ulonglong => return 64, |
test/behavior/cast.zig+10-13| ... | ... | @@ -79,19 +79,16 @@ test "comptime_int @intToFloat" { |
| 79 | 79 | try expect(result == 1234.0); |
| 80 | 80 | } |
| 81 | 81 | |
| 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); | |
| 95 | 92 | } |
| 96 | 93 | } |
| 97 | 94 |