[llvm-commits] [llvm-gcc-4.2] r79103 - in /llvm-gcc-4.2/trunk/gcc: config/i386/llvm-i386-target.h config/rs6000/rs6000.h llvm-abi.h llvm-convert.cpp llvm-types.cpp
Bob Wilson
bob.wilson at apple.com
Sat Aug 15 08:13:35 PDT 2009
Author: bwilson
Date: Sat Aug 15 10:13:34 2009
New Revision: 79103
URL: http://llvm.org/viewvc/llvm-project?rev=79103&view=rev
Log:
Keep track of the calling convention in all DefaultABIClient subclasses and
pass the CC into LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS and
LLVM_AGGREGATE_PARTIALLY_PASSED_IN_REGS.
Patch by Sandeep Patel.
Modified:
llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h
llvm-gcc-4.2/trunk/gcc/config/rs6000/rs6000.h
llvm-gcc-4.2/trunk/gcc/llvm-abi.h
llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
llvm-gcc-4.2/trunk/gcc/llvm-types.cpp
Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h?rev=79103&r1=79102&r2=79103&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h (original)
+++ llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h Sat Aug 15 10:13:34 2009
@@ -212,7 +212,7 @@
llvm_x86_32_should_pass_aggregate_in_mixed_regs(tree, const Type *Ty,
std::vector<const Type*>&);
-#define LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS(T, TY, E) \
+#define LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS(T, TY, CC, E) \
(TARGET_64BIT ? \
llvm_x86_64_should_pass_aggregate_in_mixed_regs((T), (TY), (E)) : \
llvm_x86_32_should_pass_aggregate_in_mixed_regs((T), (TY), (E)))
@@ -222,7 +222,7 @@
std::vector<const Type*>&,
bool);
-#define LLVM_AGGREGATE_PARTIALLY_PASSED_IN_REGS(E, SE, ISR) \
+#define LLVM_AGGREGATE_PARTIALLY_PASSED_IN_REGS(E, SE, ISR, CC) \
(TARGET_64BIT ? \
llvm_x86_64_aggregate_partially_passed_in_regs((E), (SE), (ISR)) : \
false)
Modified: llvm-gcc-4.2/trunk/gcc/config/rs6000/rs6000.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/rs6000/rs6000.h?rev=79103&r1=79102&r2=79103&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/rs6000/rs6000.h (original)
+++ llvm-gcc-4.2/trunk/gcc/config/rs6000/rs6000.h Sat Aug 15 10:13:34 2009
@@ -3503,7 +3503,7 @@
std::vector<const Type*>&);
/* FIXME this is needed for 64-bit */
-#define LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS(T, TY, E) \
+#define LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS(T, TY, CC, E) \
llvm_rs6000_should_pass_aggregate_in_mixed_regs((T), (TY), (E))
extern tree llvm_rs6000_should_return_vector_as_scalar(tree, bool);
Modified: llvm-gcc-4.2/trunk/gcc/llvm-abi.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-abi.h?rev=79103&r1=79102&r2=79103&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-abi.h (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-abi.h Sat Aug 15 10:13:34 2009
@@ -32,6 +32,7 @@
#include "llvm-internal.h"
#include "llvm/Attributes.h"
+#include "llvm/CallingConv.h"
#include "llvm/Constants.h"
#include "llvm/DerivedTypes.h"
#include "llvm/Target/TargetData.h"
@@ -271,7 +272,7 @@
// registers. The routine should also return by reference a vector of the
// types of the registers being used. The default is false.
#ifndef LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS
-#define LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS(T, TY, E) \
+#define LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS(T, TY, CC, E) \
false
#endif
@@ -281,7 +282,7 @@
// the aggregate. Note, this routine should return false if none of the needed
// registers are available.
#ifndef LLVM_AGGREGATE_PARTIALLY_PASSED_IN_REGS
-#define LLVM_AGGREGATE_PARTIALLY_PASSED_IN_REGS(E, SE, ISR) \
+#define LLVM_AGGREGATE_PARTIALLY_PASSED_IN_REGS(E, SE, ISR, CC) \
false
#endif
@@ -463,9 +464,12 @@
ScalarElts.push_back(Ty);
} else if (LLVM_SHOULD_PASS_AGGREGATE_AS_FCA(type, Ty)) {
C.HandleFCAArgument(Ty, type);
- } else if (LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS(type, Ty, Elts)) {
+ } else if (LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS(type, Ty,
+ C.getCallingConv(),
+ Elts)) {
if (!LLVM_AGGREGATE_PARTIALLY_PASSED_IN_REGS(Elts, ScalarElts,
- C.isShadowReturn()))
+ C.isShadowReturn(),
+ C.getCallingConv()))
PassInMixedRegisters(type, Ty, Elts, ScalarElts);
else {
C.HandleByValArgument(Ty, type);
@@ -874,7 +878,9 @@
if (Attributes) {
*Attributes |= Attr;
}
- } else if (LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS(type, Ty, Elts)) {
+ } else if (LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS(type, Ty,
+ C.getCallingConv(),
+ Elts)) {
HOST_WIDE_INT SrcSize = int_size_in_bytes(type);
// With the SVR4 ABI, the only aggregates which are passed in registers
Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=79103&r1=79102&r2=79103&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Sat Aug 15 10:13:34 2009
@@ -251,13 +251,17 @@
std::vector<Value*> LocStack;
std::vector<std::string> NameStack;
unsigned Offset;
+ CallingConv::ID &CallingConv;
bool isShadowRet;
FunctionPrologArgumentConversion(tree FnDecl,
Function::arg_iterator &ai,
- const LLVMBuilder &B)
- : FunctionDecl(FnDecl), AI(ai), Builder(B), Offset(0),
+ const LLVMBuilder &B, CallingConv::ID &CC)
+ : FunctionDecl(FnDecl), AI(ai), Builder(B), Offset(0), CallingConv(CC),
isShadowRet(false) {}
+ /// getCallingConv - This provides the desired CallingConv for the function.
+ CallingConv::ID& getCallingConv(void) { return CallingConv; }
+
bool isShadowReturn() {
return isShadowRet;
}
@@ -386,13 +390,14 @@
// passed in memory byval.
static bool isPassedByVal(tree type, const Type *Ty,
std::vector<const Type*> &ScalarArgs,
- bool isShadowRet) {
+ bool isShadowRet, CallingConv::ID &CC) {
if (LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(type, Ty))
return true;
std::vector<const Type*> Args;
- if (LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS(type, Ty, Args) &&
- LLVM_AGGREGATE_PARTIALLY_PASSED_IN_REGS(Args, ScalarArgs, isShadowRet))
+ if (LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS(type, Ty, CC, Args) &&
+ LLVM_AGGREGATE_PARTIALLY_PASSED_IN_REGS(Args, ScalarArgs, isShadowRet,
+ CC))
// We want to pass the whole aggregate in registers but only some of the
// registers are available.
return true;
@@ -550,7 +555,7 @@
Function::arg_iterator AI = Fn->arg_begin();
// Rename and alloca'ify real arguments.
- FunctionPrologArgumentConversion Client(FnDecl, AI, Builder);
+ FunctionPrologArgumentConversion Client(FnDecl, AI, Builder, CallingConv);
TheLLVMABI<FunctionPrologArgumentConversion> ABIConverter(Client);
// Handle the DECL_RESULT.
@@ -575,7 +580,7 @@
LLVM_SHOULD_PASS_VECTOR_USING_BYVAL_ATTR(TREE_TYPE(Args))) ||
(!ArgTy->isSingleValueType() &&
isPassedByVal(TREE_TYPE(Args), ArgTy, ScalarArgs,
- Client.isShadowReturn()))) {
+ Client.isShadowReturn(), CallingConv))) {
// If the value is passed by 'invisible reference' or 'byval reference',
// the l-value for the argument IS the argument itself.
AI->setName(Name);
@@ -2680,6 +2685,7 @@
LLVMBuilder &Builder;
Value *TheValue;
MemRef RetBuf;
+ CallingConv::ID &CallingConv;
bool isShadowRet;
bool isAggrRet;
unsigned Offset;
@@ -2688,10 +2694,14 @@
const FunctionType *FnTy,
const MemRef *destloc,
bool ReturnSlotOpt,
- LLVMBuilder &b)
+ LLVMBuilder &b,
+ CallingConv::ID &CC)
: CallOperands(ops), FTy(FnTy), DestLoc(destloc),
- useReturnSlot(ReturnSlotOpt), Builder(b), isShadowRet(false),
- isAggrRet(false), Offset(0) { }
+ useReturnSlot(ReturnSlotOpt), Builder(b), CallingConv(CC),
+ isShadowRet(false), isAggrRet(false), Offset(0) { }
+
+ /// getCallingConv - This provides the desired CallingConv for the function.
+ CallingConv::ID& getCallingConv(void) { return CallingConv; }
// Push the address of an argument.
void pushAddress(Value *Loc) {
@@ -2970,7 +2980,7 @@
const FunctionType *FTy = cast<FunctionType>(PFTy->getElementType());
FunctionCallArgumentConversion Client(CallOperands, FTy, DestLoc,
CALL_EXPR_RETURN_SLOT_OPT(exp),
- Builder);
+ Builder, CallingConvention);
TheLLVMABI<FunctionCallArgumentConversion> ABIConverter(Client);
// Handle the result, including struct returns.
Modified: llvm-gcc-4.2/trunk/gcc/llvm-types.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-types.cpp?rev=79103&r1=79102&r2=79103&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-types.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-types.cpp Sat Aug 15 10:13:34 2009
@@ -938,6 +938,9 @@
isShadowRet = false;
}
+ /// getCallingConv - This provides the desired CallingConv for the function.
+ CallingConv::ID& getCallingConv(void) { return CallingConv; }
+
bool isShadowReturn() const { return isShadowRet; }
/// HandleScalarResult - This callback is invoked if the function returns a
More information about the llvm-commits
mailing list