mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
Update InvokeInst to work like CallInst
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41506 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
44c8265cf8
commit
f1355a55f8
@ -1544,13 +1544,65 @@ class InvokeInst : public TerminatorInst {
|
||||
InvokeInst(const InvokeInst &BI);
|
||||
void init(Value *Fn, BasicBlock *IfNormal, BasicBlock *IfException,
|
||||
Value* const *Args, unsigned NumArgs);
|
||||
|
||||
template<typename InputIterator>
|
||||
void init(Value *Func, BasicBlock *IfNormal, BasicBlock *IfException,
|
||||
InputIterator ArgBegin, InputIterator ArgEnd,
|
||||
const std::string &Name,
|
||||
// This argument ensures that we have an iterator we can
|
||||
// do arithmetic on in constant time
|
||||
std::random_access_iterator_tag) {
|
||||
typename std::iterator_traits<InputIterator>::difference_type NumArgs =
|
||||
std::distance(ArgBegin, ArgEnd);
|
||||
|
||||
if (NumArgs > 0) {
|
||||
// This requires that the iterator points to contiguous memory.
|
||||
init(Func, IfNormal, IfException, &*ArgBegin, NumArgs);
|
||||
}
|
||||
else {
|
||||
init(Func, IfNormal, IfException, 0, NumArgs);
|
||||
}
|
||||
|
||||
setName(Name);
|
||||
}
|
||||
|
||||
public:
|
||||
InvokeInst(Value *Fn, BasicBlock *IfNormal, BasicBlock *IfException,
|
||||
Value* const* Args, unsigned NumArgs, const std::string &Name = "",
|
||||
Instruction *InsertBefore = 0);
|
||||
InvokeInst(Value *Fn, BasicBlock *IfNormal, BasicBlock *IfException,
|
||||
Value* const* Args, unsigned NumArgs, const std::string &Name,
|
||||
BasicBlock *InsertAtEnd);
|
||||
/// Construct an InvokeInst given a range of arguments.
|
||||
/// InputIterator must be a random-access iterator pointing to
|
||||
/// contiguous storage (e.g. a std::vector<>::iterator). Checks are
|
||||
/// made for random-accessness but not for contiguous storage as
|
||||
/// that would incur runtime overhead.
|
||||
///
|
||||
/// @brief Construct an InvokeInst from a range of arguments
|
||||
template<typename InputIterator>
|
||||
InvokeInst(Value *Func, BasicBlock *IfNormal, BasicBlock *IfException,
|
||||
InputIterator ArgBegin, InputIterator ArgEnd,
|
||||
const std::string &Name = "", Instruction *InsertBefore = 0)
|
||||
: TerminatorInst(cast<FunctionType>(cast<PointerType>(Func->getType())
|
||||
->getElementType())->getReturnType(),
|
||||
Instruction::Invoke, 0, 0, InsertBefore) {
|
||||
init(Func, IfNormal, IfException, ArgBegin, ArgEnd, Name,
|
||||
typename std::iterator_traits<InputIterator>::iterator_category());
|
||||
}
|
||||
|
||||
/// Construct an InvokeInst given a range of arguments.
|
||||
/// InputIterator must be a random-access iterator pointing to
|
||||
/// contiguous storage (e.g. a std::vector<>::iterator). Checks are
|
||||
/// made for random-accessness but not for contiguous storage as
|
||||
/// that would incur runtime overhead.
|
||||
///
|
||||
/// @brief Construct an InvokeInst from a range of arguments
|
||||
template<typename InputIterator>
|
||||
InvokeInst(Value *Func, BasicBlock *IfNormal, BasicBlock *IfException,
|
||||
InputIterator ArgBegin, InputIterator ArgEnd,
|
||||
const std::string &Name, BasicBlock *InsertAtEnd)
|
||||
: TerminatorInst(cast<FunctionType>(cast<PointerType>(Func->getType())
|
||||
->getElementType())->getReturnType(),
|
||||
Instruction::Invoke, 0, 0, InsertAtEnd) {
|
||||
init(Func, IfNormal, IfException, ArgBegin, ArgEnd, Name,
|
||||
typename std::iterator_traits<InputIterator>::iterator_category());
|
||||
}
|
||||
|
||||
~InvokeInst();
|
||||
|
||||
virtual InvokeInst *clone() const;
|
||||
|
@ -115,12 +115,12 @@ public:
|
||||
}
|
||||
|
||||
/// CreateInvoke - Create an invoke instruction.
|
||||
template<typename InputIterator>
|
||||
InvokeInst *CreateInvoke(Value *Callee, BasicBlock *NormalDest,
|
||||
BasicBlock *UnwindDest,
|
||||
Value *const* Args, unsigned NumArgs,
|
||||
const char *Name = "") {
|
||||
return Insert(new InvokeInst(Callee, NormalDest, UnwindDest, Args, NumArgs,
|
||||
Name));
|
||||
BasicBlock *UnwindDest, InputIterator ArgBegin,
|
||||
InputIterator ArgEnd, const char *Name = "") {
|
||||
return(Insert(new InvokeInst(Callee, NormalDest, UnwindDest,
|
||||
ArgBegin, ArgEnd, Name)));
|
||||
}
|
||||
|
||||
UnwindInst *CreateUnwind() {
|
||||
|
@ -2652,7 +2652,7 @@ BBTerminatorInst : RET ResolvedVal { // Return with a result...
|
||||
}
|
||||
|
||||
// Create the InvokeInst
|
||||
InvokeInst *II = new InvokeInst(V, Normal, Except, &Args[0], Args.size());
|
||||
InvokeInst *II = new InvokeInst(V, Normal, Except, Args.begin(), Args.end());
|
||||
II->setCallingConv($2);
|
||||
$$ = II;
|
||||
delete $6;
|
||||
|
@ -1400,7 +1400,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
}
|
||||
}
|
||||
|
||||
I = new InvokeInst(Callee, NormalBB, UnwindBB, &Ops[0], Ops.size());
|
||||
I = new InvokeInst(Callee, NormalBB, UnwindBB, Ops.begin(), Ops.end());
|
||||
cast<InvokeInst>(I)->setCallingConv(CCInfo);
|
||||
break;
|
||||
}
|
||||
|
@ -447,7 +447,7 @@ Function *ArgPromotion::DoPromotion(Function *F,
|
||||
Instruction *New;
|
||||
if (InvokeInst *II = dyn_cast<InvokeInst>(Call)) {
|
||||
New = new InvokeInst(NF, II->getNormalDest(), II->getUnwindDest(),
|
||||
&Args[0], Args.size(), "", Call);
|
||||
Args.begin(), Args.end(), "", Call);
|
||||
cast<InvokeInst>(New)->setCallingConv(CS.getCallingConv());
|
||||
} else {
|
||||
New = new CallInst(NF, Args.begin(), Args.end(), "", Call);
|
||||
|
@ -174,7 +174,7 @@ bool DAE::DeleteDeadVarargs(Function &Fn) {
|
||||
Instruction *New;
|
||||
if (InvokeInst *II = dyn_cast<InvokeInst>(Call)) {
|
||||
New = new InvokeInst(NF, II->getNormalDest(), II->getUnwindDest(),
|
||||
&Args[0], Args.size(), "", Call);
|
||||
Args.begin(), Args.end(), "", Call);
|
||||
cast<InvokeInst>(New)->setCallingConv(CS.getCallingConv());
|
||||
} else {
|
||||
New = new CallInst(NF, Args.begin(), Args.end(), "", Call);
|
||||
@ -540,7 +540,7 @@ void DAE::RemoveDeadArgumentsFromFunction(Function *F) {
|
||||
Instruction *New;
|
||||
if (InvokeInst *II = dyn_cast<InvokeInst>(Call)) {
|
||||
New = new InvokeInst(NF, II->getNormalDest(), II->getUnwindDest(),
|
||||
&Args[0], Args.size(), "", Call);
|
||||
Args.begin(), Args.end(), "", Call);
|
||||
cast<InvokeInst>(New)->setCallingConv(CS.getCallingConv());
|
||||
} else {
|
||||
New = new CallInst(NF, Args.begin(), Args.end(), "", Call);
|
||||
|
@ -475,7 +475,7 @@ void LowerSetJmp::visitCallInst(CallInst& CI)
|
||||
std::vector<Value*> Params(CI.op_begin() + 1, CI.op_end());
|
||||
InvokeInst* II = new
|
||||
InvokeInst(CI.getCalledValue(), NewBB, PrelimBBMap[Func],
|
||||
&Params[0], Params.size(), CI.getName(), Term);
|
||||
Params.begin(), Params.end(), CI.getName(), Term);
|
||||
|
||||
// Replace the old call inst with the invoke inst and remove the call.
|
||||
CI.replaceAllUsesWith(II);
|
||||
|
@ -8006,7 +8006,7 @@ bool InstCombiner::transformConstExprCastCall(CallSite CS) {
|
||||
Instruction *NC;
|
||||
if (InvokeInst *II = dyn_cast<InvokeInst>(Caller)) {
|
||||
NC = new InvokeInst(Callee, II->getNormalDest(), II->getUnwindDest(),
|
||||
&Args[0], Args.size(), Caller->getName(), Caller);
|
||||
Args.begin(), Args.end(), Caller->getName(), Caller);
|
||||
cast<InvokeInst>(NC)->setCallingConv(II->getCallingConv());
|
||||
} else {
|
||||
NC = new CallInst(Callee, Args.begin(), Args.end(),
|
||||
|
@ -331,7 +331,7 @@ bool LowerGC::runOnFunction(Function &F) {
|
||||
std::vector<Value*> Args(CI->op_begin()+1, CI->op_end());
|
||||
|
||||
Value *II = new InvokeInst(CI->getCalledValue(), NewBB, Cleanup,
|
||||
&Args[0], Args.size(), CI->getName(), CBB);
|
||||
Args.begin(), Args.end(), CI->getName(), CBB);
|
||||
CI->replaceAllUsesWith(II);
|
||||
delete CI;
|
||||
}
|
||||
|
@ -85,7 +85,7 @@ static void HandleInlinedInvoke(InvokeInst *II, BasicBlock *FirstNewBlock,
|
||||
SmallVector<Value*, 8> InvokeArgs(CI->op_begin()+1, CI->op_end());
|
||||
InvokeInst *II =
|
||||
new InvokeInst(CI->getCalledValue(), Split, InvokeDest,
|
||||
&InvokeArgs[0], InvokeArgs.size(),
|
||||
InvokeArgs.begin(), InvokeArgs.end(),
|
||||
CI->getName(), BB->getTerminator());
|
||||
II->setCallingConv(CI->getCallingConv());
|
||||
|
||||
|
@ -395,28 +395,6 @@ void InvokeInst::init(Value *Fn, BasicBlock *IfNormal, BasicBlock *IfException,
|
||||
}
|
||||
}
|
||||
|
||||
InvokeInst::InvokeInst(Value *Fn, BasicBlock *IfNormal,
|
||||
BasicBlock *IfException,
|
||||
Value* const *Args, unsigned NumArgs,
|
||||
const std::string &Name, Instruction *InsertBefore)
|
||||
: TerminatorInst(cast<FunctionType>(cast<PointerType>(Fn->getType())
|
||||
->getElementType())->getReturnType(),
|
||||
Instruction::Invoke, 0, 0, InsertBefore) {
|
||||
init(Fn, IfNormal, IfException, Args, NumArgs);
|
||||
setName(Name);
|
||||
}
|
||||
|
||||
InvokeInst::InvokeInst(Value *Fn, BasicBlock *IfNormal,
|
||||
BasicBlock *IfException,
|
||||
Value* const *Args, unsigned NumArgs,
|
||||
const std::string &Name, BasicBlock *InsertAtEnd)
|
||||
: TerminatorInst(cast<FunctionType>(cast<PointerType>(Fn->getType())
|
||||
->getElementType())->getReturnType(),
|
||||
Instruction::Invoke, 0, 0, InsertAtEnd) {
|
||||
init(Fn, IfNormal, IfException, Args, NumArgs);
|
||||
setName(Name);
|
||||
}
|
||||
|
||||
InvokeInst::InvokeInst(const InvokeInst &II)
|
||||
: TerminatorInst(II.getType(), Instruction::Invoke,
|
||||
new Use[II.getNumOperands()], II.getNumOperands()) {
|
||||
|
@ -3342,7 +3342,8 @@ BBTerminatorInst
|
||||
|
||||
// Create the call node...
|
||||
if (!$6) { // Has no arguments?
|
||||
$$.TI = new InvokeInst(V, Normal, Except, 0, 0);
|
||||
std::vector<Value*> Args;
|
||||
$$.TI = new InvokeInst(V, Normal, Except, Args.begin(), Args.end());
|
||||
} else { // Has arguments?
|
||||
// Loop through FunctionType's arguments and ensure they are specified
|
||||
// correctly!
|
||||
@ -3362,7 +3363,7 @@ BBTerminatorInst
|
||||
if (I != E || (ArgI != ArgE && !Ty->isVarArg()))
|
||||
error("Invalid number of parameters detected");
|
||||
|
||||
$$.TI = new InvokeInst(V, Normal, Except, &Args[0], Args.size());
|
||||
$$.TI = new InvokeInst(V, Normal, Except, Args.begin(), Args.end());
|
||||
}
|
||||
cast<InvokeInst>($$.TI)->setCallingConv(upgradeCallingConv($2));
|
||||
delete $3.PAT;
|
||||
|
@ -1083,8 +1083,7 @@ CppWriter::printInstruction(const Instruction *I, const std::string& bbname) {
|
||||
<< opNames[0] << ", "
|
||||
<< opNames[1] << ", "
|
||||
<< opNames[2] << ", "
|
||||
<< "&" << iName << "_params[0], " << inv->getNumOperands() - 3
|
||||
<< ", \"";
|
||||
<< iName << "_params.begin(), " << iName << "_params.end(), \"";
|
||||
printEscapedString(inv->getName());
|
||||
Out << "\", " << bbname << ");";
|
||||
nl(Out) << iName << "->setCallingConv(";
|
||||
|
Loading…
Reference in New Issue
Block a user