aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlex Rønne Petersen <alex@alexrp.com>2025-01-24 04:01:18 +0100
committerAlex Rønne Petersen <alex@alexrp.com>2025-01-25 14:56:59 +0100
commitb95081209a83be39b52b3f304387f75cfab22e9e (patch)
treecc1fe29ac1da3fb2b92f8a10ba2a1a222296ea7d /src
parent673544b783fb81d5fd970e132e0d78f234498603 (diff)
downloadzig-b95081209a83be39b52b3f304387f75cfab22e9e.tar.gz
zig-b95081209a83be39b52b3f304387f75cfab22e9e.zip
compiler: Explicitly specify loongarch ABI when talking to LLVM.
Necessary because of: https://github.com/llvm/llvm-project/commit/dc665fa5f5b8b572479ceac6bf32e0174de65f1e
Diffstat (limited to 'src')
-rw-r--r--src/target.zig55
1 files changed, 32 insertions, 23 deletions
diff --git a/src/target.zig b/src/target.zig
index 99e0fd1faa..b7e1c73ef1 100644
--- a/src/target.zig
+++ b/src/target.zig
@@ -500,33 +500,42 @@ pub fn llvmMachineAbi(target: std.Target) ?[:0]const u8 {
// Once our self-hosted linker can handle both ABIs, this hack should go away.
if (target.cpu.arch == .powerpc64) return "elfv2";
- switch (target.cpu.arch) {
- .riscv64 => {
+ return switch (target.cpu.arch) {
+ // TODO: `muslsf` and `muslf32` in LLVM 20.
+ .loongarch64 => switch (target.abi) {
+ .gnusf => "lp64s",
+ .gnuf32 => "lp64f",
+ else => "lp64d",
+ },
+ .loongarch32 => switch (target.abi) {
+ .gnusf => "ilp32s",
+ .gnuf32 => "ilp32f",
+ else => "ilp32d",
+ },
+ .riscv64 => b: {
const featureSetHas = std.Target.riscv.featureSetHas;
- if (featureSetHas(target.cpu.features, .e)) {
- return "lp64e";
- } else if (featureSetHas(target.cpu.features, .d)) {
- return "lp64d";
- } else if (featureSetHas(target.cpu.features, .f)) {
- return "lp64f";
- } else {
- return "lp64";
- }
+ break :b if (featureSetHas(target.cpu.features, .e))
+ "lp64e"
+ else if (featureSetHas(target.cpu.features, .d))
+ "lp64d"
+ else if (featureSetHas(target.cpu.features, .f))
+ "lp64f"
+ else
+ "lp64";
},
- .riscv32 => {
+ .riscv32 => b: {
const featureSetHas = std.Target.riscv.featureSetHas;
- if (featureSetHas(target.cpu.features, .e)) {
- return "ilp32e";
- } else if (featureSetHas(target.cpu.features, .d)) {
- return "ilp32d";
- } else if (featureSetHas(target.cpu.features, .f)) {
- return "ilp32f";
- } else {
- return "ilp32";
- }
+ break :b if (featureSetHas(target.cpu.features, .e))
+ "ilp32e"
+ else if (featureSetHas(target.cpu.features, .d))
+ "ilp32d"
+ else if (featureSetHas(target.cpu.features, .f))
+ "ilp32f"
+ else
+ "ilp32";
},
- else => return null,
- }
+ else => null,
+ };
}
/// This function returns 1 if function alignment is not observable or settable. Note that this