summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 02e7502)
raw | patch | inline | side by side (parent: 02e7502)
author | Stephen Lin <stephenwlin@gmail.com> | |
Wed, 26 Jun 2013 21:42:14 +0000 (21:42 +0000) | ||
committer | Stephen Lin <stephenwlin@gmail.com> | |
Wed, 26 Jun 2013 21:42:14 +0000 (21:42 +0000) |
(Currently, ARM 'this'-returns are handled in the standard calling convention case by treating R0 as preserved and doing some extra magic in LowerCallResult; this may not apply to calling conventions added in the future so this patch provides and documents an interface for indicating such)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185024 91177308-0d34-0410-b5e6-96231b3b80d8
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185024 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/ARM/ARMBaseRegisterInfo.cpp | patch | blob | history | |
lib/Target/ARM/ARMBaseRegisterInfo.h | patch | blob | history | |
lib/Target/ARM/ARMISelLowering.cpp | patch | blob | history |
index 3ba3b625d7dcf79f1a34a87dfac95ce12aa2312e..0e1e50e5293bf0f6b4dd30c15800e7bfe8e90aab 100644 (file)
ARMBaseRegisterInfo::getThisReturnPreservedMask(CallingConv::ID) const {
return (STI.isTargetIOS() && !STI.isAAPCS_ABI())
? CSR_iOS_ThisReturn_RegMask : CSR_AAPCS_ThisReturn_RegMask;
+ // This should return NULL in the case of any calling convention that does
+ // not use the same register for an i32 first argument and an i32 return
+ // value
}
const uint32_t*
index 03b36825419baa4c43ba5ff80292156fd179bfc0..be3f1368f697121527eb29deac2b43929c90c9db 100644 (file)
/// Code Generation virtual methods...
const uint16_t *getCalleeSavedRegs(const MachineFunction *MF = 0) const;
const uint32_t *getCallPreservedMask(CallingConv::ID) const;
- const uint32_t *getThisReturnPreservedMask(CallingConv::ID) const;
const uint32_t *getNoPreservedMask() const;
+ // getThisReturnPreservedMask - Returns a call preserved mask specific to the
+ // case that 'returned' is an i32 first argument if the calling convention
+ // is one that can (partially) model this attribute with a preserved mask
+ // (i.e. it is a calling convention that uses the same register for the first
+ // i32 argument and an i32 return value)
+ //
+ // Should return NULL in the case that the calling convention does not have
+ // this property
+ const uint32_t *getThisReturnPreservedMask(CallingConv::ID) const;
+
BitVector getReservedRegs(const MachineFunction &MF) const;
const TargetRegisterClass*
index 6b981d5ba5212a3450dfef85703165d0168f2f95..c8d73d76d75108d5d711c48647086993de6b84eb 100644 (file)
const uint32_t *Mask;
const TargetRegisterInfo *TRI = getTargetMachine().getRegisterInfo();
const ARMBaseRegisterInfo *ARI = static_cast<const ARMBaseRegisterInfo*>(TRI);
- if (isThisReturn)
- // For 'this' returns, use the R0-preserving mask
+ if (isThisReturn) {
+ // For 'this' returns, use the R0-preserving mask if applicable
Mask = ARI->getThisReturnPreservedMask(CallConv);
- else
+ if (!Mask) {
+ // Set isThisReturn to false if the calling convention is not one that
+ // allows 'returned' to be modeled in this way, so LowerCallResult does
+ // not try to pass 'this' straight through
+ isThisReturn = false;
+ Mask = ARI->getCallPreservedMask(CallConv);
+ }
+ } else
Mask = ARI->getCallPreservedMask(CallConv);
assert(Mask && "Missing call preserved mask for calling convention");