Model ARM backend ABI selection after the front end code doing the
authorEric Christopher <echristo@gmail.com>
Thu, 18 Dec 2014 02:08:45 +0000 (02:08 +0000)
committerEric Christopher <echristo@gmail.com>
Thu, 18 Dec 2014 02:08:45 +0000 (02:08 +0000)
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

lib/Target/ARM/ARMSubtarget.cpp
test/CodeGen/ARM/arm-abi-attr.ll
test/CodeGen/ARM/atomic-64bit.ll
test/CodeGen/ARM/dagcombine-concatvector.ll
test/CodeGen/ARM/emit-big-cst.ll
test/CodeGen/ARM/tail-call.ll

index fa653759df4f1526d2132b4f46aa9e1ef7400519..199000f71f0dbe8f467be3fa951b6a1da5aeab27 100644 (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;
index f3923ae5cc82bc96264ae1e2499972851577c089..6219eb5154102463b9aa62519df2471cd2ed7cec 100644 (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
index 462c1859dc919cf378a3f43fbede16a81348aabc..56e6ca4c3908931952dfbb34d0fcd3341d7bf414 100644 (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) {
index 62ed87fd78717185fd0481782bd0fc66c88eaa8a..a64630312a104eca6724054df47f15f4858e6d4a 100644 (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:
index 9a3367dab1a160d2c932461c8451ced3b3e75762..c044355f2d60a2c357a0ffae30c8814fc63d1100 100644 (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:
index c3e79652c035119b7afeb95d415520c9302e8b3b..8705c4245de2925266bfedb8ab444a2ca14c231a 100644 (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)