Skip to content

Commit 4c0da27

Browse files
brad0tstellar
authored andcommitted
[PATCH] [PowerPC] Correctly use ELFv2 ABI on all OS's that use the ELFv2 ABI
Add a member function isPPC64ELFv2ABI() to determine what ABI is used on the 64-bit PowerPC big endian operating environment. Reviewed By: nemanjai, dim, pkubaj Differential Revision: https://reviews.llvm.org/D144321 (cherry picked from commit 4b09cb2)
1 parent 80a3a5f commit 4c0da27

File tree

7 files changed

+25
-6
lines changed

7 files changed

+25
-6
lines changed

clang/lib/Basic/Targets/PPC.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,10 @@ class LLVM_LIBRARY_VISIBILITY PPC64TargetInfo : public PPCTargetInfo {
428428
ABI = "elfv2";
429429
} else {
430430
DataLayout = "E-m:e-i64:64-n32:64";
431-
ABI = "elfv1";
431+
if (Triple.isPPC64ELFv2ABI())
432+
ABI = "elfv2";
433+
else
434+
ABI = "elfv1";
432435
}
433436

434437
if (Triple.isOSFreeBSD() || Triple.isOSOpenBSD() || Triple.isMusl()) {

clang/lib/Driver/ToolChains/Clang.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -2003,8 +2003,7 @@ void Clang::AddPPCTargetArgs(const ArgList &Args,
20032003
if (T.isOSBinFormatELF()) {
20042004
switch (getToolChain().getArch()) {
20052005
case llvm::Triple::ppc64: {
2006-
if ((T.isOSFreeBSD() && T.getOSMajorVersion() >= 13) ||
2007-
T.isOSOpenBSD() || T.isMusl())
2006+
if (T.isPPC64ELFv2ABI())
20082007
ABIName = "elfv2";
20092008
else
20102009
ABIName = "elfv1";

clang/test/Driver/ppc-abi.c

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
// RUN: %clang -target powerpc64-unknown-freebsd12 %s -### 2>&1 | FileCheck --check-prefix=CHECK-ELFv1 %s
2121
// RUN: %clang -target powerpc64-unknown-freebsd13 %s -### 2>&1 | FileCheck --check-prefix=CHECK-ELFv2-BE %s
2222
// RUN: %clang -target powerpc64-unknown-freebsd14 %s -### 2>&1 | FileCheck --check-prefix=CHECK-ELFv2-BE %s
23+
// RUN: %clang -target powerpc64-unknown-freebsd %s -### 2>&1 | FileCheck --check-prefix=CHECK-ELFv2-BE %s
2324
// RUN: %clang -target powerpc64le-unknown-freebsd13 %s -### 2>&1 | FileCheck --check-prefix=CHECK-ELFv2 %s
2425
// RUN: %clang -target powerpc64-unknown-openbsd %s -### 2>&1 | FileCheck --check-prefix=CHECK-ELFv2-BE-PIE %s
2526
// RUN: %clang -target powerpc64-linux-musl %s -### 2>&1 | FileCheck --check-prefix=CHECK-ELFv2-BE-PIE %s

llvm/include/llvm/TargetParser/Triple.h

+8
Original file line numberDiff line numberDiff line change
@@ -882,6 +882,14 @@ class Triple {
882882
return getArch() == Triple::ppc64 || getArch() == Triple::ppc64le;
883883
}
884884

885+
/// Tests whether the target 64-bit PowerPC big endian ABI is ELFv2.
886+
bool isPPC64ELFv2ABI() const {
887+
return (getArch() == Triple::ppc64 &&
888+
((getOS() == Triple::FreeBSD &&
889+
(getOSMajorVersion() >= 13 || getOSVersion().empty())) ||
890+
getOS() == Triple::OpenBSD || isMusl()));
891+
}
892+
885893
/// Tests whether the target is 32-bit RISC-V.
886894
bool isRISCV32() const { return getArch() == Triple::riscv32; }
887895

llvm/lib/Target/PowerPC/PPCTargetMachine.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,10 @@ static PPCTargetMachine::PPCABI computeTargetABI(const Triple &TT,
237237
case Triple::ppc64le:
238238
return PPCTargetMachine::PPC_ABI_ELFv2;
239239
case Triple::ppc64:
240-
return PPCTargetMachine::PPC_ABI_ELFv1;
240+
if (TT.isPPC64ELFv2ABI())
241+
return PPCTargetMachine::PPC_ABI_ELFv2;
242+
else
243+
return PPCTargetMachine::PPC_ABI_ELFv1;
241244
default:
242245
return PPCTargetMachine::PPC_ABI_UNKNOWN;
243246
}

llvm/test/CodeGen/PowerPC/ppc64-elf-abi.ll

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,14 @@
55
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -target-abi elfv1 < %s | FileCheck %s -check-prefix=CHECK-ELFv1
66
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -target-abi elfv2 < %s | FileCheck %s -check-prefix=CHECK-ELFv2
77

8-
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-freebsd < %s | FileCheck %s -check-prefix=CHECK-ELFv1
8+
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-linux-musl < %s | FileCheck %s -check-prefix=CHECK-ELFv2
9+
10+
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-freebsd12 < %s | FileCheck %s -check-prefix=CHECK-ELFv1
11+
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-freebsd < %s | FileCheck %s -check-prefix=CHECK-ELFv2
912
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-freebsd -target-abi elfv1 < %s | FileCheck %s -check-prefix=CHECK-ELFv1
1013
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-freebsd -target-abi elfv2 < %s | FileCheck %s -check-prefix=CHECK-ELFv2
1114

15+
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-openbsd < %s | FileCheck %s -check-prefix=CHECK-ELFv2
16+
1217
; CHECK-ELFv2: .abiversion 2
1318
; CHECK-ELFv1-NOT: .abiversion 2

llvm/test/CodeGen/PowerPC/pr47373.ll

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2-
; RUN: llc -opaque-pointers=0 -mtriple=powerpc64-unknown-freebsd13.0 -verify-machineinstrs \
2+
; RUN: llc -opaque-pointers=0 -mtriple=powerpc64-unknown-freebsd12.0 -verify-machineinstrs \
33
; RUN: -mcpu=ppc64 -ppc-asm-full-reg-names < %s | FileCheck %s
44
@a = local_unnamed_addr global float* null, align 8
55

0 commit comments

Comments
 (0)