mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
Add NumFixedArgs attribute to CallSDNode which indicates the number of fixed arguments in a vararg call.
With the SVR4 ABI on PowerPC, vector arguments for vararg calls are passed differently depending on whether they are a fixed or a variable argument. Variable vector arguments always go into memory, fixed vector arguments are put into vector registers. If there are no free vector registers available, fixed vector arguments are put on the stack. The NumFixedArgs attribute allows to decide for an argument in a vararg call whether it belongs to the fixed or variable portion of the parameter list. llvm-svn: 74764
This commit is contained in:
parent
5d12ad7f9c
commit
cea3c16aa5
@ -536,7 +536,8 @@ public:
|
||||
///
|
||||
SDValue getCall(unsigned CallingConv, DebugLoc dl, bool IsVarArgs,
|
||||
bool IsTailCall, bool isInreg, SDVTList VTs,
|
||||
const SDValue *Operands, unsigned NumOperands);
|
||||
const SDValue *Operands, unsigned NumOperands,
|
||||
unsigned NumFixedArgs);
|
||||
|
||||
/// getLoad - Loads are not normal binary operators: their result type is not
|
||||
/// determined by their operands, and they produce a value AND a token chain.
|
||||
|
@ -2257,6 +2257,7 @@ class CallSDNode : public SDNode {
|
||||
unsigned CallingConv;
|
||||
bool IsVarArg;
|
||||
bool IsTailCall;
|
||||
unsigned NumFixedArgs;
|
||||
// We might eventually want a full-blown Attributes for the result; that
|
||||
// will expand the size of the representation. At the moment we only
|
||||
// need Inreg.
|
||||
@ -2264,10 +2265,10 @@ class CallSDNode : public SDNode {
|
||||
friend class SelectionDAG;
|
||||
CallSDNode(unsigned cc, DebugLoc dl, bool isvararg, bool istailcall,
|
||||
bool isinreg, SDVTList VTs, const SDValue *Operands,
|
||||
unsigned numOperands)
|
||||
unsigned numOperands, unsigned numFixedArgs)
|
||||
: SDNode(ISD::CALL, dl, VTs, Operands, numOperands),
|
||||
CallingConv(cc), IsVarArg(isvararg), IsTailCall(istailcall),
|
||||
Inreg(isinreg) {}
|
||||
NumFixedArgs(numFixedArgs), Inreg(isinreg) {}
|
||||
public:
|
||||
unsigned getCallingConv() const { return CallingConv; }
|
||||
unsigned isVarArg() const { return IsVarArg; }
|
||||
@ -2284,6 +2285,12 @@ public:
|
||||
SDValue getCallee() const { return getOperand(1); }
|
||||
|
||||
unsigned getNumArgs() const { return (getNumOperands() - 2) / 2; }
|
||||
unsigned getNumFixedArgs() const {
|
||||
if (isVarArg())
|
||||
return NumFixedArgs;
|
||||
else
|
||||
return getNumArgs();
|
||||
}
|
||||
SDValue getArg(unsigned i) const { return getOperand(2+2*i); }
|
||||
SDValue getArgFlagsVal(unsigned i) const {
|
||||
return getOperand(3+2*i);
|
||||
|
@ -1122,9 +1122,9 @@ public:
|
||||
typedef std::vector<ArgListEntry> ArgListTy;
|
||||
virtual std::pair<SDValue, SDValue>
|
||||
LowerCallTo(SDValue Chain, const Type *RetTy, bool RetSExt, bool RetZExt,
|
||||
bool isVarArg, bool isInreg, unsigned CallingConv,
|
||||
bool isTailCall, SDValue Callee, ArgListTy &Args,
|
||||
SelectionDAG &DAG, DebugLoc dl);
|
||||
bool isVarArg, bool isInreg, unsigned NumFixedArgs,
|
||||
unsigned CallingConv, bool isTailCall, SDValue Callee,
|
||||
ArgListTy &Args, SelectionDAG &DAG, DebugLoc dl);
|
||||
|
||||
/// EmitTargetCodeForMemcpy - Emit target-specific code that performs a
|
||||
/// memcpy. This can be used by targets to provide code sequences for cases
|
||||
|
@ -1900,7 +1900,7 @@ SDValue SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC, SDNode *Node,
|
||||
const Type *RetTy = Node->getValueType(0).getTypeForMVT();
|
||||
std::pair<SDValue, SDValue> CallInfo =
|
||||
TLI.LowerCallTo(InChain, RetTy, isSigned, !isSigned, false, false,
|
||||
CallingConv::C, false, Callee, Args, DAG,
|
||||
0, CallingConv::C, false, Callee, Args, DAG,
|
||||
Node->getDebugLoc());
|
||||
|
||||
// Legalize the call sequence, starting with the chain. This will advance
|
||||
@ -2305,7 +2305,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node,
|
||||
TargetLowering::ArgListTy Args;
|
||||
std::pair<SDValue, SDValue> CallResult =
|
||||
TLI.LowerCallTo(Node->getOperand(0), Type::VoidTy,
|
||||
false, false, false, false, CallingConv::C, false,
|
||||
false, false, false, false, 0, CallingConv::C, false,
|
||||
DAG.getExternalSymbol("abort", TLI.getPointerTy()),
|
||||
Args, DAG, dl);
|
||||
Results.push_back(CallResult.second);
|
||||
|
@ -1006,7 +1006,7 @@ SDValue DAGTypeLegalizer::MakeLibCall(RTLIB::Libcall LC, MVT RetVT,
|
||||
const Type *RetTy = RetVT.getTypeForMVT();
|
||||
std::pair<SDValue,SDValue> CallInfo =
|
||||
TLI.LowerCallTo(DAG.getEntryNode(), RetTy, isSigned, !isSigned, false,
|
||||
false, CallingConv::C, false, Callee, Args, DAG, dl);
|
||||
false, 0, CallingConv::C, false, Callee, Args, DAG, dl);
|
||||
return CallInfo.first;
|
||||
}
|
||||
|
||||
|
@ -3375,7 +3375,7 @@ SDValue SelectionDAG::getMemcpy(SDValue Chain, DebugLoc dl, SDValue Dst,
|
||||
// FIXME: pass in DebugLoc
|
||||
std::pair<SDValue,SDValue> CallResult =
|
||||
TLI.LowerCallTo(Chain, Type::VoidTy,
|
||||
false, false, false, false, CallingConv::C, false,
|
||||
false, false, false, false, 0, CallingConv::C, false,
|
||||
getExternalSymbol("memcpy", TLI.getPointerTy()),
|
||||
Args, *this, dl);
|
||||
return CallResult.second;
|
||||
@ -3421,7 +3421,7 @@ SDValue SelectionDAG::getMemmove(SDValue Chain, DebugLoc dl, SDValue Dst,
|
||||
// FIXME: pass in DebugLoc
|
||||
std::pair<SDValue,SDValue> CallResult =
|
||||
TLI.LowerCallTo(Chain, Type::VoidTy,
|
||||
false, false, false, false, CallingConv::C, false,
|
||||
false, false, false, false, 0, CallingConv::C, false,
|
||||
getExternalSymbol("memmove", TLI.getPointerTy()),
|
||||
Args, *this, dl);
|
||||
return CallResult.second;
|
||||
@ -3473,7 +3473,7 @@ SDValue SelectionDAG::getMemset(SDValue Chain, DebugLoc dl, SDValue Dst,
|
||||
// FIXME: pass in DebugLoc
|
||||
std::pair<SDValue,SDValue> CallResult =
|
||||
TLI.LowerCallTo(Chain, Type::VoidTy,
|
||||
false, false, false, false, CallingConv::C, false,
|
||||
false, false, false, false, 0, CallingConv::C, false,
|
||||
getExternalSymbol("memset", TLI.getPointerTy()),
|
||||
Args, *this, dl);
|
||||
return CallResult.second;
|
||||
@ -3605,7 +3605,8 @@ SelectionDAG::getMemIntrinsicNode(unsigned Opcode, DebugLoc dl, SDVTList VTList,
|
||||
SDValue
|
||||
SelectionDAG::getCall(unsigned CallingConv, DebugLoc dl, bool IsVarArgs,
|
||||
bool IsTailCall, bool IsInreg, SDVTList VTs,
|
||||
const SDValue *Operands, unsigned NumOperands) {
|
||||
const SDValue *Operands, unsigned NumOperands,
|
||||
unsigned NumFixedArgs) {
|
||||
// Do not include isTailCall in the folding set profile.
|
||||
FoldingSetNodeID ID;
|
||||
AddNodeIDNode(ID, ISD::CALL, VTs, Operands, NumOperands);
|
||||
@ -3621,7 +3622,7 @@ SelectionDAG::getCall(unsigned CallingConv, DebugLoc dl, bool IsVarArgs,
|
||||
}
|
||||
SDNode *N = NodeAllocator.Allocate<CallSDNode>();
|
||||
new (N) CallSDNode(CallingConv, dl, IsVarArgs, IsTailCall, IsInreg,
|
||||
VTs, Operands, NumOperands);
|
||||
VTs, Operands, NumOperands, NumFixedArgs);
|
||||
CSEMap.InsertNode(N, IP);
|
||||
AllNodes.push_back(N);
|
||||
return SDValue(N, 0);
|
||||
|
@ -4416,7 +4416,7 @@ void SelectionDAGLowering::LowerCallTo(CallSite CS, SDValue Callee,
|
||||
TLI.LowerCallTo(getRoot(), CS.getType(),
|
||||
CS.paramHasAttr(0, Attribute::SExt),
|
||||
CS.paramHasAttr(0, Attribute::ZExt), FTy->isVarArg(),
|
||||
CS.paramHasAttr(0, Attribute::InReg),
|
||||
CS.paramHasAttr(0, Attribute::InReg), FTy->getNumParams(),
|
||||
CS.getCallingConv(),
|
||||
IsTailCall && PerformTailCallOpt,
|
||||
Callee, Args, DAG, getCurDebugLoc());
|
||||
@ -5468,7 +5468,7 @@ void SelectionDAGLowering::visitMalloc(MallocInst &I) {
|
||||
|
||||
std::pair<SDValue,SDValue> Result =
|
||||
TLI.LowerCallTo(getRoot(), I.getType(), false, false, false, false,
|
||||
CallingConv::C, PerformTailCallOpt,
|
||||
0, CallingConv::C, PerformTailCallOpt,
|
||||
DAG.getExternalSymbol("malloc", IntPtr),
|
||||
Args, DAG, getCurDebugLoc());
|
||||
setValue(&I, Result.first); // Pointers always fit in registers
|
||||
@ -5484,7 +5484,7 @@ void SelectionDAGLowering::visitFree(FreeInst &I) {
|
||||
MVT IntPtr = TLI.getPointerTy();
|
||||
std::pair<SDValue,SDValue> Result =
|
||||
TLI.LowerCallTo(getRoot(), Type::VoidTy, false, false, false, false,
|
||||
CallingConv::C, PerformTailCallOpt,
|
||||
0, CallingConv::C, PerformTailCallOpt,
|
||||
DAG.getExternalSymbol("free", IntPtr), Args, DAG,
|
||||
getCurDebugLoc());
|
||||
DAG.setRoot(Result.second);
|
||||
@ -5657,7 +5657,7 @@ void TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG,
|
||||
std::pair<SDValue, SDValue>
|
||||
TargetLowering::LowerCallTo(SDValue Chain, const Type *RetTy,
|
||||
bool RetSExt, bool RetZExt, bool isVarArg,
|
||||
bool isInreg,
|
||||
bool isInreg, unsigned NumFixedArgs,
|
||||
unsigned CallingConv, bool isTailCall,
|
||||
SDValue Callee,
|
||||
ArgListTy &Args, SelectionDAG &DAG, DebugLoc dl) {
|
||||
@ -5755,7 +5755,7 @@ TargetLowering::LowerCallTo(SDValue Chain, const Type *RetTy,
|
||||
isVarArg, isTailCall, isInreg,
|
||||
DAG.getVTList(&LoweredRetTys[0],
|
||||
LoweredRetTys.size()),
|
||||
&Ops[0], Ops.size()
|
||||
&Ops[0], Ops.size(), NumFixedArgs
|
||||
);
|
||||
Chain = Res.getValue(LoweredRetTys.size() - 1);
|
||||
|
||||
|
@ -1159,7 +1159,7 @@ ARMTargetLowering::LowerToTLSGeneralDynamicModel(GlobalAddressSDNode *GA,
|
||||
// FIXME: is there useful debug info available here?
|
||||
std::pair<SDValue, SDValue> CallResult =
|
||||
LowerCallTo(Chain, (const Type *) Type::Int32Ty, false, false, false, false,
|
||||
CallingConv::C, false,
|
||||
0, CallingConv::C, false,
|
||||
DAG.getExternalSymbol("__tls_get_addr", PtrVT), Args, DAG, dl);
|
||||
return CallResult.first;
|
||||
}
|
||||
|
@ -365,7 +365,8 @@ static SDValue LowerRET(SDValue Op, SelectionDAG &DAG) {
|
||||
std::pair<SDValue, SDValue>
|
||||
AlphaTargetLowering::LowerCallTo(SDValue Chain, const Type *RetTy,
|
||||
bool RetSExt, bool RetZExt, bool isVarArg,
|
||||
bool isInreg, unsigned CallingConv,
|
||||
bool isInreg, unsigned NumFixedArgs,
|
||||
unsigned CallingConv,
|
||||
bool isTailCall, SDValue Callee,
|
||||
ArgListTy &Args, SelectionDAG &DAG,
|
||||
DebugLoc dl) {
|
||||
|
@ -86,9 +86,9 @@ namespace llvm {
|
||||
/// actual call.
|
||||
virtual std::pair<SDValue, SDValue>
|
||||
LowerCallTo(SDValue Chain, const Type *RetTy, bool RetSExt, bool RetZExt,
|
||||
bool isVarArg, bool isInreg, unsigned CC, bool isTailCall,
|
||||
SDValue Callee, ArgListTy &Args, SelectionDAG &DAG,
|
||||
DebugLoc dl);
|
||||
bool isVarArg, bool isInreg, unsigned NumFixedArgs, unsigned CC,
|
||||
bool isTailCall, SDValue Callee, ArgListTy &Args,
|
||||
SelectionDAG &DAG, DebugLoc dl);
|
||||
|
||||
ConstraintType getConstraintType(const std::string &Constraint) const;
|
||||
|
||||
|
@ -113,7 +113,7 @@ namespace {
|
||||
const Type *RetTy = Op.getNode()->getValueType(0).getTypeForMVT();
|
||||
std::pair<SDValue, SDValue> CallInfo =
|
||||
TLI.LowerCallTo(InChain, RetTy, isSigned, !isSigned, false, false,
|
||||
CallingConv::C, false, Callee, Args, DAG,
|
||||
0, CallingConv::C, false, Callee, Args, DAG,
|
||||
Op.getDebugLoc());
|
||||
|
||||
return CallInfo.first;
|
||||
|
@ -315,7 +315,8 @@ void IA64TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG,
|
||||
std::pair<SDValue, SDValue>
|
||||
IA64TargetLowering::LowerCallTo(SDValue Chain, const Type *RetTy,
|
||||
bool RetSExt, bool RetZExt, bool isVarArg,
|
||||
bool isInreg, unsigned CallingConv,
|
||||
bool isInreg, unsigned NumFixedArgs,
|
||||
unsigned CallingConv,
|
||||
bool isTailCall, SDValue Callee,
|
||||
ArgListTy &Args, SelectionDAG &DAG,
|
||||
DebugLoc dl) {
|
||||
|
@ -62,7 +62,7 @@ namespace llvm {
|
||||
virtual std::pair<SDValue, SDValue>
|
||||
LowerCallTo(SDValue Chain, const Type *RetTy,
|
||||
bool RetSExt, bool RetZExt, bool isVarArg, bool isInreg,
|
||||
unsigned CC, bool isTailCall,
|
||||
unsigned NumFixedArgs, unsigned CC, bool isTailCall,
|
||||
SDValue Callee, ArgListTy &Args, SelectionDAG &DAG,
|
||||
DebugLoc dl);
|
||||
|
||||
|
@ -399,7 +399,7 @@ PIC16TargetLowering::MakePIC16Libcall(PIC16ISD::PIC16Libcall Call,
|
||||
const Type *RetTy = RetVT.getTypeForMVT();
|
||||
std::pair<SDValue,SDValue> CallInfo =
|
||||
LowerCallTo(DAG.getEntryNode(), RetTy, isSigned, !isSigned, false,
|
||||
false, CallingConv::C, false, Callee, Args, DAG, dl);
|
||||
false, 0, CallingConv::C, false, Callee, Args, DAG, dl);
|
||||
|
||||
return CallInfo.first;
|
||||
}
|
||||
@ -1302,7 +1302,8 @@ SDValue PIC16TargetLowering::LegalizeCALL(SDValue Op, SelectionDAG &DAG) {
|
||||
// Generate new call with all the operands legal
|
||||
return DAG.getCall(TheCall->getCallingConv(), dl,
|
||||
TheCall->isVarArg(), TheCall->isTailCall(),
|
||||
TheCall->isInreg(), VTs, &Ops[0], Ops.size());
|
||||
TheCall->isInreg(), VTs, &Ops[0], Ops.size(),
|
||||
TheCall->getNumFixedArgs());
|
||||
}
|
||||
|
||||
void PIC16TargetLowering::
|
||||
|
@ -1267,7 +1267,7 @@ SDValue PPCTargetLowering::LowerTRAMPOLINE(SDValue Op, SelectionDAG &DAG) {
|
||||
// Lower to a call to __trampoline_setup(Trmp, TrampSize, FPtr, ctx_reg)
|
||||
std::pair<SDValue, SDValue> CallResult =
|
||||
LowerCallTo(Chain, Op.getValueType().getTypeForMVT(), false, false,
|
||||
false, false, CallingConv::C, false,
|
||||
false, false, 0, CallingConv::C, false,
|
||||
DAG.getExternalSymbol("__trampoline_setup", PtrVT),
|
||||
Args, DAG, dl);
|
||||
|
||||
|
@ -5813,7 +5813,7 @@ X86TargetLowering::EmitTargetCodeForMemset(SelectionDAG &DAG, DebugLoc dl,
|
||||
Args.push_back(Entry);
|
||||
std::pair<SDValue,SDValue> CallResult =
|
||||
LowerCallTo(Chain, Type::VoidTy, false, false, false, false,
|
||||
CallingConv::C, false,
|
||||
0, CallingConv::C, false,
|
||||
DAG.getExternalSymbol(bzeroEntry, IntPtr), Args, DAG, dl);
|
||||
return CallResult.second;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user