Expand Up
@@ -491,17 +491,19 @@ static void buildCopyToRegs(MachineIRBuilder &B, ArrayRef<Register> DstRegs,
B.buildUnmerge (UnmergeResults, UnmergeSrc);
}
bool CallLowering::handleAssignments (MachineIRBuilder &MIRBuilder,
SmallVectorImpl<ArgInfo> &Args,
ValueHandler &Handler,
CallingConv::ID CallConv, bool IsVarArg,
Register ThisReturnReg) const {
bool CallLowering::determineAndHandleAssignments (
ValueHandler &Handler, ValueAssigner &Assigner,
SmallVectorImpl<ArgInfo> &Args, MachineIRBuilder &MIRBuilder,
CallingConv::ID CallConv, bool IsVarArg, Register ThisReturnReg) const {
MachineFunction &MF = MIRBuilder.getMF ();
const Function &F = MF.getFunction ();
SmallVector<CCValAssign, 16 > ArgLocs;
CCState CCInfo (CallConv, IsVarArg, MF, ArgLocs, F.getContext ());
return handleAssignments (CCInfo, ArgLocs, MIRBuilder, Args, Handler,
if (!determineAssignments (Assigner, Args, CCInfo))
return false ;
return handleAssignments (Handler, Args, CCInfo, ArgLocs, MIRBuilder,
ThisReturnReg);
}
Expand All
@@ -513,33 +515,27 @@ static unsigned extendOpFromFlags(llvm::ISD::ArgFlagsTy Flags) {
return TargetOpcode::G_ANYEXT;
}
bool CallLowering::handleAssignments (CCState &CCInfo,
SmallVectorImpl<CCValAssign> &ArgLocs,
MachineIRBuilder &MIRBuilder,
SmallVectorImpl<ArgInfo> &Args,
ValueHandler &Handler,
Register ThisReturnReg) const {
MachineFunction &MF = MIRBuilder.getMF ();
MachineRegisterInfo &MRI = MF.getRegInfo ();
const Function &F = MF.getFunction ();
const DataLayout &DL = F.getParent ()->getDataLayout ();
bool CallLowering::determineAssignments (ValueAssigner &Assigner,
SmallVectorImpl<ArgInfo> &Args,
CCState &CCInfo) const {
LLVMContext &Ctx = CCInfo.getContext ();
const CallingConv::ID CallConv = CCInfo.getCallingConv ();
unsigned NumArgs = Args.size ();
for (unsigned i = 0 ; i != NumArgs; ++i) {
EVT CurVT = EVT::getEVT (Args[i].Ty );
MVT NewVT = TLI->getRegisterTypeForCallingConv (
F.getContext (), CCInfo.getCallingConv (), CurVT);
MVT NewVT = TLI->getRegisterTypeForCallingConv (Ctx, CallConv, CurVT);
// If we need to split the type over multiple regs, check it's a scenario
// we currently support.
unsigned NumParts = TLI-> getNumRegistersForCallingConv (
F. getContext (), CCInfo. getCallingConv () , CurVT);
unsigned NumParts =
TLI-> getNumRegistersForCallingConv (Ctx, CallConv , CurVT);
if (NumParts == 1 ) {
// Try to use the register type if we couldn't assign the VT.
if (Handler .assignArg (i, CurVT, NewVT, NewVT, CCValAssign::Full, Args[i],
Args[i].Flags [0 ], CCInfo))
if (Assigner .assignArg (i, CurVT, NewVT, NewVT, CCValAssign::Full, Args[i],
Args[i].Flags [0 ], CCInfo))
return false ;
continue ;
}
Expand Down
Expand Up
@@ -568,7 +564,7 @@ bool CallLowering::handleAssignments(CCState &CCInfo,
Flags.setSplitEnd ();
}
if (!Handler .isIncomingArgumentHandler ()) {
if (!Assigner .isIncomingArgumentHandler ()) {
// TODO: Also check if there is a valid extension that preserves the
// bits. However currently this call lowering doesn't support non-exact
// split parts, so that can't be tested.
Expand All
@@ -579,14 +575,30 @@ bool CallLowering::handleAssignments(CCState &CCInfo,
}
Args[i].Flags .push_back (Flags);
if (Handler .assignArg (i, CurVT, NewVT, NewVT, CCValAssign::Full, Args[i],
Args[i].Flags [Part], CCInfo)) {
if (Assigner .assignArg (i, CurVT, NewVT, NewVT, CCValAssign::Full, Args[i],
Args[i].Flags [Part], CCInfo)) {
// Still couldn't assign this smaller part type for some reason.
return false ;
}
}
}
return true ;
}
bool CallLowering::handleAssignments (ValueHandler &Handler,
SmallVectorImpl<ArgInfo> &Args,
CCState &CCInfo,
SmallVectorImpl<CCValAssign> &ArgLocs,
MachineIRBuilder &MIRBuilder,
Register ThisReturnReg) const {
MachineFunction &MF = MIRBuilder.getMF ();
MachineRegisterInfo &MRI = MF.getRegInfo ();
const Function &F = MF.getFunction ();
const DataLayout &DL = F.getParent ()->getDataLayout ();
const unsigned NumArgs = Args.size ();
for (unsigned i = 0 , j = 0 ; i != NumArgs; ++i, ++j) {
assert (j < ArgLocs.size () && " Skipped too many arg locs" );
CCValAssign &VA = ArgLocs[j];
Expand Down
Expand Up
@@ -652,7 +664,7 @@ bool CallLowering::handleAssignments(CCState &CCInfo,
// TODO: The memory size may be larger than the value we need to
// store. We may need to adjust the offset for big endian targets.
uint64_t MemSize = Handler.getStackValueStoreSize (VA);
uint64_t MemSize = Handler.getStackValueStoreSize (DL, VA);
MachinePointerInfo MPO;
Register StackAddr =
Expand Down
Expand Up
@@ -880,23 +892,6 @@ bool CallLowering::checkReturnTypeForCallConv(MachineFunction &MF) const {
return canLowerReturn (MF, CallConv, SplitArgs, F.isVarArg ());
}
bool CallLowering::analyzeArgInfo (CCState &CCState,
SmallVectorImpl<ArgInfo> &Args,
CCAssignFn &AssignFnFixed,
CCAssignFn &AssignFnVarArg) const {
for (unsigned i = 0 , e = Args.size (); i < e; ++i) {
MVT VT = MVT::getVT (Args[i].Ty );
CCAssignFn &Fn = Args[i].IsFixed ? AssignFnFixed : AssignFnVarArg;
if (Fn (i, VT, VT, CCValAssign::Full, Args[i].Flags [0 ], CCState)) {
// Bail out on anything we can't handle.
LLVM_DEBUG (dbgs () << " Cannot analyze " << EVT (VT).getEVTString ()
<< " (arg number = " << i << " \n " );
return false ;
}
}
return true ;
}
bool CallLowering::parametersInCSRMatch (
const MachineRegisterInfo &MRI, const uint32_t *CallerPreservedMask,
const SmallVectorImpl<CCValAssign> &OutLocs,
Expand Down
Expand Up
@@ -952,10 +947,8 @@ bool CallLowering::parametersInCSRMatch(
bool CallLowering::resultsCompatible (CallLoweringInfo &Info,
MachineFunction &MF,
SmallVectorImpl<ArgInfo> &InArgs,
CCAssignFn &CalleeAssignFnFixed,
CCAssignFn &CalleeAssignFnVarArg,
CCAssignFn &CallerAssignFnFixed,
CCAssignFn &CallerAssignFnVarArg) const {
ValueAssigner &CalleeAssigner,
ValueAssigner &CallerAssigner) const {
const Function &F = MF.getFunction ();
CallingConv::ID CalleeCC = Info.CallConv ;
CallingConv::ID CallerCC = F.getCallingConv ();
Expand All
@@ -965,14 +958,12 @@ bool CallLowering::resultsCompatible(CallLoweringInfo &Info,
SmallVector<CCValAssign, 16 > ArgLocs1;
CCState CCInfo1 (CalleeCC, false , MF, ArgLocs1, F.getContext ());
if (!analyzeArgInfo (CCInfo1, InArgs, CalleeAssignFnFixed,
CalleeAssignFnVarArg))
if (!determineAssignments (CalleeAssigner, InArgs, CCInfo1))
return false ;
SmallVector<CCValAssign, 16 > ArgLocs2;
CCState CCInfo2 (CallerCC, false , MF, ArgLocs2, F.getContext ());
if (!analyzeArgInfo (CCInfo2, InArgs, CallerAssignFnFixed,
CalleeAssignFnVarArg))
if (!determineAssignments (CallerAssigner, InArgs, CCInfo2))
return false ;
// We need the argument locations to match up exactly. If there's more in
Expand Down
Expand Up
@@ -1008,13 +999,11 @@ bool CallLowering::resultsCompatible(CallLoweringInfo &Info,
}
uint64_t CallLowering::ValueHandler::getStackValueStoreSize (
const CCValAssign &VA) const {
const DataLayout &DL, const CCValAssign &VA) const {
const EVT ValVT = VA.getValVT ();
if (ValVT != MVT::iPTR)
return ValVT.getStoreSize ();
const DataLayout &DL = MIRBuilder.getDataLayout ();
// / FIXME: We need to get the correct pointer address space.
return DL.getPointerSize ();
}
Expand Down
Expand Up
@@ -1082,7 +1071,7 @@ Register CallLowering::ValueHandler::extendRegister(Register ValReg,
llvm_unreachable (" unable to extend register" );
}
void CallLowering::ValueHandler ::anchor () {}
void CallLowering::ValueAssigner ::anchor () {}
Register CallLowering::IncomingValueHandler::buildExtensionHint (CCValAssign &VA,
Register SrcReg,
Expand Down