diff --git a/src/target.zig b/src/target.zig index bc2ba4c831..221c2029ba 100644 --- a/src/target.zig +++ b/src/target.zig @@ -381,6 +381,14 @@ pub fn addrSpaceCastIsValid( } pub fn llvmMachineAbi(target: std.Target) ?[:0]const u8 { + // LLD does not support ELFv1. Rather than having LLVM produce ELFv1 code and then linking it + // into a broken ELFv2 binary, just force LLVM to use ELFv2 as well. This will break when glibc + // is linked as glibc only supports ELFv2 for little endian, but there's nothing we can do about + // that. With this hack, `powerpc64-linux-none` will at least work. + // + // Once our self-hosted linker can handle both ABIs, this hack should go away. + if (target.cpu.arch == .powerpc64) return "elfv2"; + const have_float = switch (target.abi) { .gnueabihf, .musleabihf, .eabihf => true, else => false, @@ -409,7 +417,6 @@ pub fn llvmMachineAbi(target: std.Target) ?[:0]const u8 { return "ilp32"; } }, - //TODO add ARM, Mips, and PowerPC else => return null, } } diff --git a/test/behavior/union.zig b/test/behavior/union.zig index a952e9b9d3..9938c3c045 100644 --- a/test/behavior/union.zig +++ b/test/behavior/union.zig @@ -1891,7 +1891,7 @@ test "reinterpret packed union" { try comptime S.doTheTest(); if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO - if (builtin.cpu.arch.isPowerPC32()) return error.SkipZigTest; // TODO + if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/21050 if (builtin.cpu.arch.isMIPS()) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/21050 if (builtin.cpu.arch.isWasm()) return error.SkipZigTest; // TODO try S.doTheTest(); diff --git a/test/behavior/vector.zig b/test/behavior/vector.zig index 08c81fd28b..cee9f168f1 100644 --- a/test/behavior/vector.zig +++ b/test/behavior/vector.zig @@ -1450,6 +1450,7 @@ test "store vector with memset" { .mips64el, .riscv64, .powerpc, + .powerpc64, => { // LLVM 16 ERROR: "Converting bits to bytes lost precision" // https://github.com/ziglang/zig/issues/16177 diff --git a/test/tests.zig b/test/tests.zig index 73934950db..7d5be7bbf7 100644 --- a/test/tests.zig +++ b/test/tests.zig @@ -438,6 +438,30 @@ const test_targets = blk: { // .link_libc = true, //}, + .{ + .target = .{ + .cpu_arch = .powerpc64, + .os_tag = .linux, + .abi = .none, + }, + }, + .{ + .target = .{ + .cpu_arch = .powerpc64, + .os_tag = .linux, + .abi = .musl, + }, + .link_libc = true, + }, + // Requires ELFv1 linker support. + // .{ + // .target = .{ + // .cpu_arch = .powerpc64, + // .os_tag = .linux, + // .abi = .gnu, + // }, + // .link_libc = true, + // }, .{ .target = .{ .cpu_arch = .powerpc64le,