Model ARM backend ABI selection after the front end code doing the

same. This will change the "bare metal" ABI from APCS to AAPCS.

The only difference between the front and back end code is that
the code for Triple::GNU was added for environment. That will migrate
to the front end shortly.

Tests updated with the ABI they were originally testing in the case
of bare metal (e.g. -mtriple armv7) or with a -gnu for arm-linux
triples.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@224489 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eric Christopher 2014-12-18 02:08:45 +00:00
parent ee40b16641
commit 360cbd4839
6 changed files with 42 additions and 25 deletions

View File

@ -225,8 +225,8 @@ void ARMSubtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) {
// Insert the architecture feature derived from the target triple into the
// feature string. This is important for setting features that are implied
// based on the architecture version.
std::string ArchFS = ARM_MC::ParseARMTriple(TargetTriple.getTriple(),
CPUString);
std::string ArchFS =
ARM_MC::ParseARMTriple(TargetTriple.getTriple(), CPUString);
if (!FS.empty()) {
if (!ArchFS.empty())
ArchFS = ArchFS + "," + FS.str();
@ -246,29 +246,45 @@ void ARMSubtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) {
InstrItins = getInstrItineraryForCPU(CPUString);
if (TargetABI == ARM_ABI_UNKNOWN) {
switch (TargetTriple.getEnvironment()) {
case Triple::Android:
case Triple::EABI:
case Triple::EABIHF:
case Triple::GNUEABI:
case Triple::GNUEABIHF:
TargetABI = ARM_ABI_AAPCS;
break;
default:
if (TargetTriple.isOSBinFormatMachO() &&
TargetTriple.getOS() == Triple::UnknownOS)
// FIXME: This is duplicated code from the front end and should be unified.
if (TargetTriple.isOSBinFormatMachO()) {
if (TargetTriple.getEnvironment() == llvm::Triple::EABI ||
(TargetTriple.getOS() == llvm::Triple::UnknownOS &&
TargetTriple.getObjectFormat() == llvm::Triple::MachO) ||
CPU.startswith("cortex-m")) {
TargetABI = ARM_ABI_AAPCS;
else
} else {
TargetABI = ARM_ABI_APCS;
break;
}
} else if (TargetTriple.isOSWindows()) {
// FIXME: this is invalid for WindowsCE
TargetABI = ARM_ABI_AAPCS;
} else {
// Select the default based on the platform.
switch (TargetTriple.getEnvironment()) {
case llvm::Triple::Android:
case llvm::Triple::GNUEABI:
case llvm::Triple::GNUEABIHF:
case llvm::Triple::EABIHF:
case llvm::Triple::EABI:
TargetABI = ARM_ABI_AAPCS;
break;
case llvm::Triple::GNU:
TargetABI = ARM_ABI_APCS;
break;
default:
if (TargetTriple.getOS() == llvm::Triple::NetBSD)
TargetABI = ARM_ABI_APCS;
else
TargetABI = ARM_ABI_AAPCS;
break;
}
}
}
// FIXME: this is invalid for WindowsCE
if (isTargetWindows()) {
TargetABI = ARM_ABI_AAPCS;
if (isTargetWindows())
NoARM = true;
}
if (isAAPCS_ABI())
stackAlignment = 8;

View File

@ -1,5 +1,5 @@
; RUN: llc -mtriple=arm-linux < %s | FileCheck %s --check-prefix=APCS
; RUN: llc -mtriple=arm-linux -mattr=apcs < %s | \
; RUN: llc -mtriple=arm-linux-gnu < %s | FileCheck %s --check-prefix=APCS
; RUN: llc -mtriple=arm-linux-gnu -mattr=apcs < %s | \
; RUN: FileCheck %s --check-prefix=APCS
; RUN: llc -mtriple=arm-linux-gnueabi -mattr=apcs < %s | \
; RUN: FileCheck %s --check-prefix=APCS

View File

@ -1,6 +1,6 @@
; RUN: llc < %s -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-LE
; RUN: llc < %s -mtriple=thumbv7-none-linux-gnueabihf | FileCheck %s --check-prefix=CHECK-THUMB --check-prefix=CHECK-THUMB-LE
; RUN: llc < %s -mtriple=armebv7 | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-BE
; RUN: llc < %s -mtriple=armebv7 -mattr=apcs | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-BE
; RUN: llc < %s -mtriple=thumbebv7-none-linux-gnueabihf | FileCheck %s --check-prefix=CHECK-THUMB --check-prefix=CHECK-THUMB-BE
define i64 @test1(i64* %ptr, i64 %val) {

View File

@ -1,5 +1,5 @@
; RUN: llc < %s -mtriple=thumbv7s-apple-ios3.0.0 -mcpu=generic | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-LE
; RUN: llc < %s -mtriple=thumbeb -mattr=v7,neon | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-BE
; RUN: llc < %s -mtriple=thumbeb -mattr=apcs -mattr=v7,neon | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-BE
; PR15525
; CHECK-LABEL: test1:

View File

@ -1,4 +1,4 @@
; RUN: llc -mtriple=thumbv7-unknown-unknown < %s | FileCheck %s
; RUN: llc -mtriple=thumbv7-unknown-unknown -mattr=apcs < %s | FileCheck %s
; Check assembly printing of odd constants.
; CHECK: bigCst:

View File

@ -1,5 +1,6 @@
; RUN: llc -mtriple armv7 -O0 -o - < %s | FileCheck %s -check-prefix CHECK-TAIL
; RUN: llc -mtriple armv7 -O0 -disable-tail-calls -o - < %s \
; RUN: llc -mtriple armv7 -mattr=apcs -O0 -o - < %s \
; RUN: | FileCheck %s -check-prefix CHECK-TAIL
; RUN: llc -mtriple armv7 -mattr=apcs -O0 -disable-tail-calls -o - < %s \
; RUN: | FileCheck %s -check-prefix CHECK-NO-TAIL
declare i32 @callee(i32 %i)