From 3630e78db9268dbe81a9369a33e49b857804f2ec Mon Sep 17 00:00:00 2001 From: Lauro Ramos Venancio Date: Tue, 13 Feb 2007 19:52:28 +0000 Subject: [PATCH] Add ABI information to ARM subtarget. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34245 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/ARMSubtarget.cpp | 14 ++++++++++---- lib/Target/ARM/ARMSubtarget.h | 10 +++++++++- lib/Target/ARM/ARMTargetMachine.cpp | 8 +++++--- test/CodeGen/ARM/arguments.ll | 2 +- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/lib/Target/ARM/ARMSubtarget.cpp b/lib/Target/ARM/ARMSubtarget.cpp index 27889c7818d..4363697d3e3 100644 --- a/lib/Target/ARM/ARMSubtarget.cpp +++ b/lib/Target/ARM/ARMSubtarget.cpp @@ -26,8 +26,9 @@ ARMSubtarget::ARMSubtarget(const Module &M, const std::string &FS) , HasVFP2(false) , UseThumbBacktraces(false) , IsR9Reserved(false) - , stackAlignment(8) - , TargetType(isELF) { // Default to ELF unless otherwise specified. + , stackAlignment(4) + , TargetType(isELF) // Default to ELF unless otherwise specified. + , TargetABI(ARM_ABI_APCS) { // Determine default and user specified characteristics std::string CPU = "generic"; @@ -49,9 +50,14 @@ ARMSubtarget::ARMSubtarget(const Module &M, const std::string &FS) #endif } + if (TT.find("eabi") != std::string::npos) + TargetABI = ARM_ABI_AAPCS; + + if (isAAPCS_ABI()) + stackAlignment = 8; + if (isTargetDarwin()) { UseThumbBacktraces = true; IsR9Reserved = true; - stackAlignment = 4; - } + } } diff --git a/lib/Target/ARM/ARMSubtarget.h b/lib/Target/ARM/ARMSubtarget.h index 33e440b0cf4..88ceaef7b66 100644 --- a/lib/Target/ARM/ARMSubtarget.h +++ b/lib/Target/ARM/ARMSubtarget.h @@ -42,7 +42,7 @@ protected: /// IsR9Reserved - True if R9 is a not available as general purpose register. bool IsR9Reserved; - + /// stackAlignment - The minimum alignment known to hold of the stack frame on /// entry to the function and which must be maintained by every function. unsigned stackAlignment; @@ -52,6 +52,11 @@ protected: isELF, isDarwin } TargetType; + enum { + ARM_ABI_APCS, + ARM_ABI_AAPCS // ARM EABI + } TargetABI; + /// This constructor initializes the data members to match that /// of the specified module. /// @@ -71,6 +76,9 @@ protected: bool isTargetDarwin() const { return TargetType == isDarwin; } bool isTargetELF() const { return TargetType == isELF; } + bool isAPCS_ABI() const { return TargetABI == ARM_ABI_APCS; } + bool isAAPCS_ABI() const { return TargetABI == ARM_ABI_AAPCS; } + bool isThumb() const { return IsThumb; } bool useThumbBacktraces() const { return UseThumbBacktraces; } diff --git a/lib/Target/ARM/ARMTargetMachine.cpp b/lib/Target/ARM/ARMTargetMachine.cpp index 442d25ecc25..31884045225 100644 --- a/lib/Target/ARM/ARMTargetMachine.cpp +++ b/lib/Target/ARM/ARMTargetMachine.cpp @@ -34,13 +34,15 @@ namespace { /// ARMTargetMachine::ARMTargetMachine(const Module &M, const std::string &FS) : Subtarget(M, FS), - DataLayout(Subtarget.isTargetDarwin() ? + DataLayout(Subtarget.isAPCS_ABI() ? + //APCS ABI (Subtarget.isThumb() ? std::string("e-p:32:32-d:32:32-l:32:32-s:16:32-b:8:32-B:8:32-A:32") : std::string("e-p:32:32-d:32:32-l:32:32")) : + //AAPCS ABI (Subtarget.isThumb() ? - std::string("e-p:32:32-d:32:64-l:64:64-s:16:32-b:8:32-B:8:32-A:32") : - std::string("e-p:32:32-d:32:64-l:64:64"))), + std::string("e-p:32:32-d:64:64-l:64:64-s:16:32-b:8:32-B:8:32-A:32") : + std::string("e-p:32:32-d:64:64-l:64:64"))), InstrInfo(Subtarget), FrameInfo(Subtarget) {} diff --git a/test/CodeGen/ARM/arguments.ll b/test/CodeGen/ARM/arguments.ll index 77cadd6fdfb..018be239e30 100644 --- a/test/CodeGen/ARM/arguments.ll +++ b/test/CodeGen/ARM/arguments.ll @@ -1,5 +1,5 @@ ; RUN: llvm-as < %s | llc -march=arm && -; RUN: llvm-as < %s | llc -mtriple=arm-linux | grep "mov r0, r2" | wc -l | grep 1 && +; RUN: llvm-as < %s | llc -mtriple=arm-linux-gnueabi | grep "mov r0, r2" | wc -l | grep 1 && ; RUN: llvm-as < %s | llc -mtriple=arm-apple-darwin | grep "mov r0, r1" | wc -l | grep 1 define i32 @f(i32 %a, i64 %b) { -- 2.34.1