forked from OSchip/llvm-project
Convert CallInst and InvokeInst APIs to use ArrayRef.
llvm-svn: 135265
This commit is contained in:
parent
6730e4d904
commit
5bd375a6cc
|
@ -38,8 +38,7 @@ static void EmitMemoryBarrier(CodeGenFunction &CGF,
|
|||
StoreLoad ? True : False,
|
||||
StoreStore ? True : False,
|
||||
Device ? True : False };
|
||||
CGF.Builder.CreateCall(CGF.CGM.getIntrinsic(Intrinsic::memory_barrier),
|
||||
C, C + 5);
|
||||
CGF.Builder.CreateCall(CGF.CGM.getIntrinsic(Intrinsic::memory_barrier), C);
|
||||
}
|
||||
|
||||
/// Emit the conversions required to turn the given value into an
|
||||
|
@ -69,14 +68,14 @@ static Value *EmitFromInt(CodeGenFunction &CGF, llvm::Value *V,
|
|||
// The atomic builtins are also full memory barriers. This is a utility for
|
||||
// wrapping a call to the builtins with memory barriers.
|
||||
static Value *EmitCallWithBarrier(CodeGenFunction &CGF, Value *Fn,
|
||||
Value **ArgBegin, Value **ArgEnd) {
|
||||
ArrayRef<Value *> Args) {
|
||||
// FIXME: We need a target hook for whether this applies to device memory or
|
||||
// not.
|
||||
bool Device = true;
|
||||
|
||||
// Create barriers both before and after the call.
|
||||
EmitMemoryBarrier(CGF, true, true, true, true, Device);
|
||||
Value *Result = CGF.Builder.CreateCall(Fn, ArgBegin, ArgEnd);
|
||||
Value *Result = CGF.Builder.CreateCall(Fn, Args);
|
||||
EmitMemoryBarrier(CGF, true, true, true, true, Device);
|
||||
return Result;
|
||||
}
|
||||
|
@ -109,7 +108,7 @@ static RValue EmitBinaryAtomic(CodeGenFunction &CGF,
|
|||
const llvm::Type *ValueType = Args[1]->getType();
|
||||
Args[1] = EmitToInt(CGF, Args[1], T, IntType);
|
||||
|
||||
llvm::Value *Result = EmitCallWithBarrier(CGF, AtomF, Args, Args + 2);
|
||||
llvm::Value *Result = EmitCallWithBarrier(CGF, AtomF, Args);
|
||||
Result = EmitFromInt(CGF, Result, T, ValueType);
|
||||
return RValue::get(Result);
|
||||
}
|
||||
|
@ -144,7 +143,7 @@ static RValue EmitBinaryAtomicPost(CodeGenFunction &CGF,
|
|||
Args[1] = EmitToInt(CGF, Args[1], T, IntType);
|
||||
Args[0] = CGF.Builder.CreateBitCast(DestPtr, IntPtrType);
|
||||
|
||||
llvm::Value *Result = EmitCallWithBarrier(CGF, AtomF, Args, Args + 2);
|
||||
llvm::Value *Result = EmitCallWithBarrier(CGF, AtomF, Args);
|
||||
Result = CGF.Builder.CreateBinOp(Op, Result, Args[1]);
|
||||
Result = EmitFromInt(CGF, Result, T, ValueType);
|
||||
return RValue::get(Result);
|
||||
|
@ -879,7 +878,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
|
|||
Args[1] = EmitToInt(*this, Args[1], T, IntType);
|
||||
Args[2] = EmitToInt(*this, EmitScalarExpr(E->getArg(2)), T, IntType);
|
||||
|
||||
Value *Result = EmitCallWithBarrier(*this, AtomF, Args, Args + 3);
|
||||
Value *Result = EmitCallWithBarrier(*this, AtomF, Args);
|
||||
Result = EmitFromInt(*this, Result, T, ValueType);
|
||||
return RValue::get(Result);
|
||||
}
|
||||
|
@ -908,7 +907,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
|
|||
Args[2] = EmitToInt(*this, EmitScalarExpr(E->getArg(2)), T, IntType);
|
||||
|
||||
Value *OldVal = Args[1];
|
||||
Value *PrevVal = EmitCallWithBarrier(*this, AtomF, Args, Args + 3);
|
||||
Value *PrevVal = EmitCallWithBarrier(*this, AtomF, Args);
|
||||
Value *Result = Builder.CreateICmpEQ(PrevVal, OldVal);
|
||||
// zext bool to int.
|
||||
Result = Builder.CreateZExt(Result, ConvertType(E->getType()));
|
||||
|
@ -957,7 +956,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
|
|||
EmitScalarExpr(E->getArg(3)),
|
||||
EmitScalarExpr(E->getArg(4))
|
||||
};
|
||||
Builder.CreateCall(CGM.getIntrinsic(Intrinsic::memory_barrier), C, C + 5);
|
||||
Builder.CreateCall(CGM.getIntrinsic(Intrinsic::memory_barrier), C);
|
||||
return RValue::get(0);
|
||||
}
|
||||
|
||||
|
@ -1075,7 +1074,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
|
|||
Args.push_back(ArgValue);
|
||||
}
|
||||
|
||||
Value *V = Builder.CreateCall(F, Args.data(), Args.data() + Args.size());
|
||||
Value *V = Builder.CreateCall(F, Args);
|
||||
QualType BuiltinRetType = E->getType();
|
||||
|
||||
const llvm::Type *RetTy = llvm::Type::getVoidTy(getLLVMContext());
|
||||
|
@ -1152,7 +1151,7 @@ Value *CodeGenFunction::EmitNeonCall(Function *F, SmallVectorImpl<Value*> &Ops,
|
|||
else
|
||||
Ops[j] = Builder.CreateBitCast(Ops[j], ai->getType(), name);
|
||||
|
||||
return Builder.CreateCall(F, Ops.begin(), Ops.end(), name);
|
||||
return Builder.CreateCall(F, Ops, name);
|
||||
}
|
||||
|
||||
Value *CodeGenFunction::EmitNeonShiftVector(Value *V, const llvm::Type *Ty,
|
||||
|
@ -1200,8 +1199,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
|
|||
const llvm::Type *Ty = CGM.getTypes().ConvertType(FD->getType());
|
||||
const llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty);
|
||||
llvm::StringRef Name = FD->getName();
|
||||
return Builder.CreateCall(CGM.CreateRuntimeFunction(FTy, Name),
|
||||
Ops.begin(), Ops.end());
|
||||
return Builder.CreateCall(CGM.CreateRuntimeFunction(FTy, Name), Ops);
|
||||
}
|
||||
|
||||
if (BuiltinID == ARM::BI__builtin_arm_ldrexd) {
|
||||
|
@ -1262,7 +1260,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
|
|||
|
||||
// Call the appropriate intrinsic.
|
||||
Function *F = CGM.getIntrinsic(Int, Ty);
|
||||
return Builder.CreateCall(F, Ops.begin(), Ops.end(), "vcvtr");
|
||||
return Builder.CreateCall(F, Ops, "vcvtr");
|
||||
}
|
||||
|
||||
// Determine the type of this overloaded NEON intrinsic.
|
||||
|
@ -1459,7 +1457,9 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
|
|||
Ops[2] = Builder.CreateBitCast(Ops[2], Ty);
|
||||
Ops[3] = Builder.CreateBitCast(Ops[3], Ty);
|
||||
Ops.push_back(GetPointeeAlignment(*this, E->getArg(1)));
|
||||
Ops[1] = Builder.CreateCall(F, Ops.begin() + 1, Ops.end(), "vld2_lane");
|
||||
Ops[1] = Builder.CreateCall(F,
|
||||
ArrayRef<Value *>(Ops.begin() + 1, Ops.end()),
|
||||
"vld2_lane");
|
||||
Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
|
||||
Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
|
||||
return Builder.CreateStore(Ops[1], Ops[0]);
|
||||
|
@ -1471,7 +1471,9 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
|
|||
Ops[3] = Builder.CreateBitCast(Ops[3], Ty);
|
||||
Ops[4] = Builder.CreateBitCast(Ops[4], Ty);
|
||||
Ops.push_back(GetPointeeAlignment(*this, E->getArg(1)));
|
||||
Ops[1] = Builder.CreateCall(F, Ops.begin() + 1, Ops.end(), "vld3_lane");
|
||||
Ops[1] = Builder.CreateCall(F,
|
||||
ArrayRef<Value *>(Ops.begin() + 1, Ops.end()),
|
||||
"vld3_lane");
|
||||
Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
|
||||
Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
|
||||
return Builder.CreateStore(Ops[1], Ops[0]);
|
||||
|
@ -1484,7 +1486,9 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
|
|||
Ops[4] = Builder.CreateBitCast(Ops[4], Ty);
|
||||
Ops[5] = Builder.CreateBitCast(Ops[5], Ty);
|
||||
Ops.push_back(GetPointeeAlignment(*this, E->getArg(1)));
|
||||
Ops[1] = Builder.CreateCall(F, Ops.begin() + 1, Ops.end(), "vld3_lane");
|
||||
Ops[1] = Builder.CreateCall(F,
|
||||
ArrayRef<Value *>(Ops.begin() + 1, Ops.end()),
|
||||
"vld3_lane");
|
||||
Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
|
||||
Ops[0] = Builder.CreateBitCast(Ops[0], Ty);
|
||||
return Builder.CreateStore(Ops[1], Ops[0]);
|
||||
|
@ -1536,7 +1540,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
|
|||
Args.push_back(CI);
|
||||
Args.push_back(GetPointeeAlignment(*this, E->getArg(1)));
|
||||
|
||||
Ops[1] = Builder.CreateCall(F, Args.begin(), Args.end(), "vld_dup");
|
||||
Ops[1] = Builder.CreateCall(F, Args, "vld_dup");
|
||||
// splat lane 0 to all elts in each vector of the result.
|
||||
for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
|
||||
Value *Val = Builder.CreateExtractValue(Ops[1], i);
|
||||
|
@ -2023,7 +2027,7 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
|
|||
break;
|
||||
}
|
||||
llvm::Function *F = CGM.getIntrinsic(ID);
|
||||
return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name);
|
||||
return Builder.CreateCall(F, Ops, name);
|
||||
}
|
||||
case X86::BI__builtin_ia32_vec_init_v8qi:
|
||||
case X86::BI__builtin_ia32_vec_init_v4hi:
|
||||
|
@ -2083,15 +2087,15 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
|
|||
break;
|
||||
}
|
||||
llvm::Function *F = CGM.getIntrinsic(ID);
|
||||
return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name);
|
||||
return Builder.CreateCall(F, Ops, name);
|
||||
}
|
||||
case X86::BI__builtin_ia32_cmpps: {
|
||||
llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse_cmp_ps);
|
||||
return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), "cmpps");
|
||||
return Builder.CreateCall(F, Ops, "cmpps");
|
||||
}
|
||||
case X86::BI__builtin_ia32_cmpss: {
|
||||
llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse_cmp_ss);
|
||||
return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), "cmpss");
|
||||
return Builder.CreateCall(F, Ops, "cmpss");
|
||||
}
|
||||
case X86::BI__builtin_ia32_ldmxcsr: {
|
||||
const llvm::Type *PtrTy = Int8PtrTy;
|
||||
|
@ -2111,11 +2115,11 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
|
|||
}
|
||||
case X86::BI__builtin_ia32_cmppd: {
|
||||
llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse2_cmp_pd);
|
||||
return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), "cmppd");
|
||||
return Builder.CreateCall(F, Ops, "cmppd");
|
||||
}
|
||||
case X86::BI__builtin_ia32_cmpsd: {
|
||||
llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse2_cmp_sd);
|
||||
return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), "cmpsd");
|
||||
return Builder.CreateCall(F, Ops, "cmpsd");
|
||||
}
|
||||
case X86::BI__builtin_ia32_storehps:
|
||||
case X86::BI__builtin_ia32_storelps: {
|
||||
|
@ -2159,7 +2163,7 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
|
|||
|
||||
// create i32 constant
|
||||
llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_mmx_psrl_q);
|
||||
return Builder.CreateCall(F, &Ops[0], &Ops[0] + 2, "palignr");
|
||||
return Builder.CreateCall(F, ArrayRef<Value *>(&Ops[0], 2), "palignr");
|
||||
}
|
||||
|
||||
// If palignr is shifting the pair of vectors more than 32 bytes, emit zero.
|
||||
|
@ -2189,7 +2193,7 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
|
|||
|
||||
// create i32 constant
|
||||
llvm::Function *F = CGM.getIntrinsic(Intrinsic::x86_sse2_psrl_dq);
|
||||
return Builder.CreateCall(F, &Ops[0], &Ops[0] + 2, "palignr");
|
||||
return Builder.CreateCall(F, ArrayRef<Value *>(&Ops[0], 2), "palignr");
|
||||
}
|
||||
|
||||
// If palignr is shifting the pair of vectors more than 32 bytes, emit zero.
|
||||
|
@ -2341,7 +2345,7 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
|
|||
break;
|
||||
}
|
||||
llvm::Function *F = CGM.getIntrinsic(ID);
|
||||
return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), name);
|
||||
return Builder.CreateCall(F, Ops, name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2397,7 +2401,7 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
|
|||
break;
|
||||
}
|
||||
llvm::Function *F = CGM.getIntrinsic(ID);
|
||||
return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), "");
|
||||
return Builder.CreateCall(F, Ops, "");
|
||||
}
|
||||
|
||||
// vec_st
|
||||
|
@ -2430,7 +2434,7 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
|
|||
break;
|
||||
}
|
||||
llvm::Function *F = CGM.getIntrinsic(ID);
|
||||
return Builder.CreateCall(F, &Ops[0], &Ops[0] + Ops.size(), "");
|
||||
return Builder.CreateCall(F, Ops, "");
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -1427,20 +1427,25 @@ void CodeGenFunction::EmitCallArg(CallArgList &args, const Expr *E,
|
|||
/// on the current state of the EH stack.
|
||||
llvm::CallSite
|
||||
CodeGenFunction::EmitCallOrInvoke(llvm::Value *Callee,
|
||||
llvm::Value * const *ArgBegin,
|
||||
llvm::Value * const *ArgEnd,
|
||||
llvm::ArrayRef<llvm::Value *> Args,
|
||||
const llvm::Twine &Name) {
|
||||
llvm::BasicBlock *InvokeDest = getInvokeDest();
|
||||
if (!InvokeDest)
|
||||
return Builder.CreateCall(Callee, ArgBegin, ArgEnd, Name);
|
||||
return Builder.CreateCall(Callee, Args, Name);
|
||||
|
||||
llvm::BasicBlock *ContBB = createBasicBlock("invoke.cont");
|
||||
llvm::InvokeInst *Invoke = Builder.CreateInvoke(Callee, ContBB, InvokeDest,
|
||||
ArgBegin, ArgEnd, Name);
|
||||
Args, Name);
|
||||
EmitBlock(ContBB);
|
||||
return Invoke;
|
||||
}
|
||||
|
||||
llvm::CallSite
|
||||
CodeGenFunction::EmitCallOrInvoke(llvm::Value *Callee,
|
||||
const llvm::Twine &Name) {
|
||||
return EmitCallOrInvoke(Callee, llvm::ArrayRef<llvm::Value *>(), Name);
|
||||
}
|
||||
|
||||
static void checkArgMatches(llvm::Value *Elt, unsigned &ArgNo,
|
||||
llvm::FunctionType *FTy) {
|
||||
if (ArgNo < FTy->getNumParams())
|
||||
|
@ -1700,11 +1705,10 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
|
|||
|
||||
llvm::CallSite CS;
|
||||
if (!InvokeDest) {
|
||||
CS = Builder.CreateCall(Callee, Args.data(), Args.data()+Args.size());
|
||||
CS = Builder.CreateCall(Callee, Args);
|
||||
} else {
|
||||
llvm::BasicBlock *Cont = createBasicBlock("invoke.cont");
|
||||
CS = Builder.CreateInvoke(Callee, Cont, InvokeDest,
|
||||
Args.data(), Args.data()+Args.size());
|
||||
CS = Builder.CreateInvoke(Callee, Cont, InvokeDest, Args);
|
||||
EmitBlock(Cont);
|
||||
}
|
||||
if (callOrInvoke)
|
||||
|
|
|
@ -149,7 +149,7 @@ CodeGenFunction::EmitCXXGlobalDtorRegistration(llvm::Constant *DtorFn,
|
|||
llvm::Value *Args[3] = { llvm::ConstantExpr::getBitCast(DtorFn, DtorFnTy),
|
||||
llvm::ConstantExpr::getBitCast(DeclPtr, Int8PtrTy),
|
||||
llvm::ConstantExpr::getBitCast(Handle, Int8PtrTy) };
|
||||
Builder.CreateCall(AtExitFn, &Args[0], llvm::array_endof(Args));
|
||||
Builder.CreateCall(AtExitFn, Args);
|
||||
}
|
||||
|
||||
void CodeGenFunction::EmitCXXGuardedInit(const VarDecl &D,
|
||||
|
|
|
@ -788,7 +788,7 @@ llvm::BasicBlock *CodeGenFunction::EmitLandingPad() {
|
|||
// Tell the backend how to generate the landing pad.
|
||||
llvm::CallInst *Selection =
|
||||
Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::eh_selector),
|
||||
EHSelector.begin(), EHSelector.end(), "eh.selector");
|
||||
EHSelector, "eh.selector");
|
||||
Selection->setDoesNotThrow();
|
||||
|
||||
// Save the selector value in mandatory-cleanup mode.
|
||||
|
@ -928,7 +928,7 @@ namespace {
|
|||
return;
|
||||
}
|
||||
|
||||
CGF.EmitCallOrInvoke(getEndCatchFn(CGF), 0, 0);
|
||||
CGF.EmitCallOrInvoke(getEndCatchFn(CGF));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -1141,7 +1141,7 @@ static void BeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *S) {
|
|||
namespace {
|
||||
struct CallRethrow : EHScopeStack::Cleanup {
|
||||
void Emit(CodeGenFunction &CGF, Flags flags) {
|
||||
CGF.EmitCallOrInvoke(getReThrowFn(CGF), 0, 0);
|
||||
CGF.EmitCallOrInvoke(getReThrowFn(CGF));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -1221,7 +1221,7 @@ namespace {
|
|||
CGF.Builder.CreateLoad(ForEHVar, "finally.endcatch");
|
||||
CGF.Builder.CreateCondBr(ShouldEndCatch, EndCatchBB, CleanupContBB);
|
||||
CGF.EmitBlock(EndCatchBB);
|
||||
CGF.EmitCallOrInvoke(EndCatchFn, 0, 0); // catch-all, so might throw
|
||||
CGF.EmitCallOrInvoke(EndCatchFn); // catch-all, so might throw
|
||||
CGF.EmitBlock(CleanupContBB);
|
||||
}
|
||||
};
|
||||
|
@ -1266,10 +1266,9 @@ namespace {
|
|||
|
||||
CGF.EmitBlock(RethrowBB);
|
||||
if (SavedExnVar) {
|
||||
llvm::Value *Args[] = { CGF.Builder.CreateLoad(SavedExnVar) };
|
||||
CGF.EmitCallOrInvoke(RethrowFn, Args, Args+1);
|
||||
CGF.EmitCallOrInvoke(RethrowFn, CGF.Builder.CreateLoad(SavedExnVar));
|
||||
} else {
|
||||
CGF.EmitCallOrInvoke(RethrowFn, 0, 0);
|
||||
CGF.EmitCallOrInvoke(RethrowFn);
|
||||
}
|
||||
CGF.Builder.CreateUnreachable();
|
||||
|
||||
|
@ -1417,7 +1416,7 @@ llvm::BasicBlock *CodeGenFunction::getTerminateLandingPad() {
|
|||
llvm::Value *Args[3] = { Exn, getOpaquePersonalityFn(CGM, Personality),
|
||||
getCatchAllValue(*this) };
|
||||
Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::eh_selector),
|
||||
Args, Args+3, "eh.selector")
|
||||
Args, "eh.selector")
|
||||
->setDoesNotThrow();
|
||||
|
||||
llvm::CallInst *TerminateCall = Builder.CreateCall(getTerminateFn(*this));
|
||||
|
|
|
@ -1448,7 +1448,7 @@ static llvm::Constant *getBadTypeidFn(CodeGenFunction &CGF) {
|
|||
|
||||
static void EmitBadTypeidCall(CodeGenFunction &CGF) {
|
||||
llvm::Value *Fn = getBadTypeidFn(CGF);
|
||||
CGF.EmitCallOrInvoke(Fn, 0, 0).setDoesNotReturn();
|
||||
CGF.EmitCallOrInvoke(Fn).setDoesNotReturn();
|
||||
CGF.Builder.CreateUnreachable();
|
||||
}
|
||||
|
||||
|
@ -1546,7 +1546,7 @@ static llvm::Constant *getBadCastFn(CodeGenFunction &CGF) {
|
|||
|
||||
static void EmitBadCastCall(CodeGenFunction &CGF) {
|
||||
llvm::Value *Fn = getBadCastFn(CGF);
|
||||
CGF.EmitCallOrInvoke(Fn, 0, 0).setDoesNotReturn();
|
||||
CGF.EmitCallOrInvoke(Fn).setDoesNotReturn();
|
||||
CGF.Builder.CreateUnreachable();
|
||||
}
|
||||
|
||||
|
|
|
@ -531,7 +531,7 @@ protected:
|
|||
CGBuilderTy &Builder = CGF.Builder;
|
||||
llvm::Value *lookupArgs[] = {EnforceType(Builder, ObjCSuper,
|
||||
PtrToObjCSuperTy), cmd};
|
||||
return Builder.CreateCall(MsgLookupSuperFn, lookupArgs, lookupArgs+2);
|
||||
return Builder.CreateCall(MsgLookupSuperFn, lookupArgs);
|
||||
}
|
||||
public:
|
||||
CGObjCGCC(CodeGenModule &Mod) : CGObjCGNU(Mod, 8, 2) {
|
||||
|
@ -600,8 +600,7 @@ class CGObjCGNUstep : public CGObjCGNU {
|
|||
CGBuilderTy &Builder = CGF.Builder;
|
||||
llvm::Value *lookupArgs[] = {ObjCSuper, cmd};
|
||||
|
||||
llvm::CallInst *slot = Builder.CreateCall(SlotLookupSuperFn, lookupArgs,
|
||||
lookupArgs+2);
|
||||
llvm::CallInst *slot = Builder.CreateCall(SlotLookupSuperFn, lookupArgs);
|
||||
slot->setOnlyReadsMemory();
|
||||
|
||||
return Builder.CreateLoad(Builder.CreateStructGEP(slot, 4));
|
||||
|
@ -2310,8 +2309,8 @@ void CGObjCGNU::EmitThrowStmt(CodeGenFunction &CGF,
|
|||
CGF.Builder.CreateCall(ExceptionThrowFn, ExceptionAsObject);
|
||||
CGF.Builder.CreateUnreachable();
|
||||
} else {
|
||||
CGF.Builder.CreateInvoke(ExceptionThrowFn, UnwindBB, UnwindBB, &ExceptionAsObject,
|
||||
&ExceptionAsObject+1);
|
||||
CGF.Builder.CreateInvoke(ExceptionThrowFn, UnwindBB, UnwindBB,
|
||||
ExceptionAsObject);
|
||||
}
|
||||
// Clear the insertion point to indicate we are in unreachable code.
|
||||
CGF.Builder.ClearInsertionPoint();
|
||||
|
|
|
@ -2697,14 +2697,12 @@ FragileHazards::FragileHazards(CodeGenFunction &CGF) : CGF(CGF) {
|
|||
void FragileHazards::emitWriteHazard() {
|
||||
if (Locals.empty()) return;
|
||||
|
||||
CGF.Builder.CreateCall(WriteHazard, Locals.begin(), Locals.end())
|
||||
->setDoesNotThrow();
|
||||
CGF.Builder.CreateCall(WriteHazard, Locals)->setDoesNotThrow();
|
||||
}
|
||||
|
||||
void FragileHazards::emitReadHazard(CGBuilderTy &Builder) {
|
||||
assert(!Locals.empty());
|
||||
Builder.CreateCall(ReadHazard, Locals.begin(), Locals.end())
|
||||
->setDoesNotThrow();
|
||||
Builder.CreateCall(ReadHazard, Locals)->setDoesNotThrow();
|
||||
}
|
||||
|
||||
/// Emit read hazards in all the protected blocks, i.e. all the blocks
|
||||
|
@ -6048,12 +6046,10 @@ void CGObjCNonFragileABIMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
|
|||
llvm::Value *Exception = CGF.EmitScalarExpr(ThrowExpr);
|
||||
Exception = CGF.Builder.CreateBitCast(Exception, ObjCTypes.ObjectPtrTy,
|
||||
"tmp");
|
||||
llvm::Value *Args[] = { Exception };
|
||||
CGF.EmitCallOrInvoke(ObjCTypes.getExceptionThrowFn(),
|
||||
Args, Args+1)
|
||||
CGF.EmitCallOrInvoke(ObjCTypes.getExceptionThrowFn(), Exception)
|
||||
.setDoesNotReturn();
|
||||
} else {
|
||||
CGF.EmitCallOrInvoke(ObjCTypes.getExceptionRethrowFn(), 0, 0)
|
||||
CGF.EmitCallOrInvoke(ObjCTypes.getExceptionRethrowFn())
|
||||
.setDoesNotReturn();
|
||||
}
|
||||
|
||||
|
|
|
@ -157,7 +157,7 @@ namespace {
|
|||
return;
|
||||
}
|
||||
|
||||
CGF.EmitCallOrInvoke(Fn, 0, 0);
|
||||
CGF.EmitCallOrInvoke(Fn);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1591,7 +1591,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
|
|||
llvm::InlineAsm *IA =
|
||||
llvm::InlineAsm::get(FTy, AsmString, Constraints,
|
||||
S.isVolatile() || S.getNumOutputs() == 0);
|
||||
llvm::CallInst *Result = Builder.CreateCall(IA, Args.begin(), Args.end());
|
||||
llvm::CallInst *Result = Builder.CreateCall(IA, Args);
|
||||
Result->addAttribute(~0, llvm::Attribute::NoUnwind);
|
||||
|
||||
// Slap the source location of the inline asm into a !srcloc metadata on the
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include "clang/Frontend/CodeGenOptions.h"
|
||||
#include "clang/Basic/ABI.h"
|
||||
#include "clang/Basic/TargetInfo.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/Support/ValueHandle.h"
|
||||
|
@ -2073,8 +2074,9 @@ public:
|
|||
ReturnValueSlot ReturnValue = ReturnValueSlot());
|
||||
|
||||
llvm::CallSite EmitCallOrInvoke(llvm::Value *Callee,
|
||||
llvm::Value * const *ArgBegin,
|
||||
llvm::Value * const *ArgEnd,
|
||||
llvm::ArrayRef<llvm::Value *> Args,
|
||||
const llvm::Twine &Name = "");
|
||||
llvm::CallSite EmitCallOrInvoke(llvm::Value *Callee,
|
||||
const llvm::Twine &Name = "");
|
||||
|
||||
llvm::Value *BuildVirtualCall(const CXXMethodDecl *MD, llvm::Value *This,
|
||||
|
|
|
@ -1413,8 +1413,7 @@ static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old,
|
|||
// Okay, we can transform this. Create the new call instruction and copy
|
||||
// over the required information.
|
||||
ArgList.append(CS.arg_begin(), CS.arg_begin() + ArgNo);
|
||||
llvm::CallInst *NewCall = llvm::CallInst::Create(NewFn, ArgList.begin(),
|
||||
ArgList.end(), "", CI);
|
||||
llvm::CallInst *NewCall = llvm::CallInst::Create(NewFn, ArgList, "", CI);
|
||||
ArgList.clear();
|
||||
if (!NewCall->getType()->isVoidTy())
|
||||
NewCall->takeName(CI);
|
||||
|
|
|
@ -616,6 +616,7 @@ from the previous release.</p>
|
|||
include:
|
||||
<ul>
|
||||
<!-- Please keep this list sorted. -->
|
||||
<li><code>CallInst::Create</code></li>
|
||||
<li><code>ComputeLinearIndex</code> (in <code>llvm/CodeGen/Analysis.h</code>)</li>
|
||||
<li><code>ConstantArray::get</code></li>
|
||||
<li><code>ConstantExpr::getExtractElement</code></li>
|
||||
|
@ -629,10 +630,13 @@ from the previous release.</p>
|
|||
<li><code>ExtractValueInst::getIndexedType</code></li>
|
||||
<li><code>ExtractValueInst::getIndices</code></li>
|
||||
<li><code>FindInsertedValue</code> (in <code>llvm/Analysis/ValueTracking.h</code>)</li>
|
||||
<li><code>IRBuilder::CreateCall</code></li>
|
||||
<li><code>IRBuilder::CreateExtractValue</code></li>
|
||||
<li><code>IRBuilder::CreateInsertValue</code></li>
|
||||
<li><code>IRBuilder::CreateInvoke</code></li>
|
||||
<li><code>InsertValueInst::Create</code></li>
|
||||
<li><code>InsertValueInst::getIndices</code></li>
|
||||
<li><code>InvokeInst::Create</code></li>
|
||||
<li><code>MDNode::get</code></li>
|
||||
<li><code>MDNode::getIfExists</code></li>
|
||||
<li><code>MDNode::getTemporary</code></li>
|
||||
|
|
|
@ -842,46 +842,17 @@ public:
|
|||
class CallInst : public Instruction {
|
||||
AttrListPtr AttributeList; ///< parameter attributes for call
|
||||
CallInst(const CallInst &CI);
|
||||
void init(Value *Func, Value* const *Params, unsigned NumParams);
|
||||
void init(Value *Func, Value *Actual1, Value *Actual2);
|
||||
void init(Value *Func, Value *Actual);
|
||||
void init(Value *Func);
|
||||
void init(Value *Func, ArrayRef<Value *> Args, const Twine &NameStr);
|
||||
void init(Value *Func, const Twine &NameStr);
|
||||
|
||||
template<typename RandomAccessIterator>
|
||||
void init(Value *Func,
|
||||
RandomAccessIterator ArgBegin,
|
||||
RandomAccessIterator ArgEnd,
|
||||
const Twine &NameStr,
|
||||
// This argument ensures that we have an iterator we can
|
||||
// do arithmetic on in constant time
|
||||
std::random_access_iterator_tag) {
|
||||
unsigned NumArgs = (unsigned)std::distance(ArgBegin, ArgEnd);
|
||||
|
||||
// This requires that the iterator points to contiguous memory.
|
||||
init(Func, NumArgs ? &*ArgBegin : 0, NumArgs);
|
||||
setName(NameStr);
|
||||
}
|
||||
|
||||
/// Construct a CallInst given a range of arguments. RandomAccessIterator
|
||||
/// 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.
|
||||
/// Construct a CallInst given a range of arguments.
|
||||
/// @brief Construct a CallInst from a range of arguments
|
||||
template<typename RandomAccessIterator>
|
||||
CallInst(Value *Func,
|
||||
RandomAccessIterator ArgBegin, RandomAccessIterator ArgEnd,
|
||||
const Twine &NameStr, Instruction *InsertBefore);
|
||||
inline CallInst(Value *Func, ArrayRef<Value *> Args,
|
||||
const Twine &NameStr, Instruction *InsertBefore);
|
||||
|
||||
/// Construct a CallInst given a range of arguments. RandomAccessIterator
|
||||
/// 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.
|
||||
/// Construct a CallInst given a range of arguments.
|
||||
/// @brief Construct a CallInst from a range of arguments
|
||||
template<typename RandomAccessIterator>
|
||||
inline CallInst(Value *Func,
|
||||
RandomAccessIterator ArgBegin, RandomAccessIterator ArgEnd,
|
||||
inline CallInst(Value *Func, ArrayRef<Value *> Args,
|
||||
const Twine &NameStr, BasicBlock *InsertAtEnd);
|
||||
|
||||
CallInst(Value *F, Value *Actual, const Twine &NameStr,
|
||||
|
@ -894,31 +865,18 @@ class CallInst : public Instruction {
|
|||
protected:
|
||||
virtual CallInst *clone_impl() const;
|
||||
public:
|
||||
template<typename RandomAccessIterator>
|
||||
static CallInst *Create(Value *Func,
|
||||
RandomAccessIterator ArgBegin,
|
||||
RandomAccessIterator ArgEnd,
|
||||
ArrayRef<Value *> Args,
|
||||
const Twine &NameStr = "",
|
||||
Instruction *InsertBefore = 0) {
|
||||
return new(unsigned(ArgEnd - ArgBegin + 1))
|
||||
CallInst(Func, ArgBegin, ArgEnd, NameStr, InsertBefore);
|
||||
return new(unsigned(Args.size() + 1))
|
||||
CallInst(Func, Args, NameStr, InsertBefore);
|
||||
}
|
||||
template<typename RandomAccessIterator>
|
||||
static CallInst *Create(Value *Func,
|
||||
RandomAccessIterator ArgBegin,
|
||||
RandomAccessIterator ArgEnd,
|
||||
ArrayRef<Value *> Args,
|
||||
const Twine &NameStr, BasicBlock *InsertAtEnd) {
|
||||
return new(unsigned(ArgEnd - ArgBegin + 1))
|
||||
CallInst(Func, ArgBegin, ArgEnd, NameStr, InsertAtEnd);
|
||||
}
|
||||
static CallInst *Create(Value *F, Value *Actual,
|
||||
const Twine &NameStr = "",
|
||||
Instruction *InsertBefore = 0) {
|
||||
return new(2) CallInst(F, Actual, NameStr, InsertBefore);
|
||||
}
|
||||
static CallInst *Create(Value *F, Value *Actual, const Twine &NameStr,
|
||||
BasicBlock *InsertAtEnd) {
|
||||
return new(2) CallInst(F, Actual, NameStr, InsertAtEnd);
|
||||
return new(unsigned(Args.size() + 1))
|
||||
CallInst(Func, Args, NameStr, InsertAtEnd);
|
||||
}
|
||||
static CallInst *Create(Value *F, const Twine &NameStr = "",
|
||||
Instruction *InsertBefore = 0) {
|
||||
|
@ -1093,32 +1051,24 @@ template <>
|
|||
struct OperandTraits<CallInst> : public VariadicOperandTraits<CallInst, 1> {
|
||||
};
|
||||
|
||||
template<typename RandomAccessIterator>
|
||||
CallInst::CallInst(Value *Func,
|
||||
RandomAccessIterator ArgBegin, RandomAccessIterator ArgEnd,
|
||||
CallInst::CallInst(Value *Func, ArrayRef<Value *> Args,
|
||||
const Twine &NameStr, BasicBlock *InsertAtEnd)
|
||||
: Instruction(cast<FunctionType>(cast<PointerType>(Func->getType())
|
||||
->getElementType())->getReturnType(),
|
||||
Instruction::Call,
|
||||
OperandTraits<CallInst>::op_end(this) - (ArgEnd - ArgBegin + 1),
|
||||
unsigned(ArgEnd - ArgBegin + 1), InsertAtEnd) {
|
||||
init(Func, ArgBegin, ArgEnd, NameStr,
|
||||
typename std::iterator_traits<RandomAccessIterator>
|
||||
::iterator_category());
|
||||
OperandTraits<CallInst>::op_end(this) - (Args.size() + 1),
|
||||
unsigned(Args.size() + 1), InsertAtEnd) {
|
||||
init(Func, Args, NameStr);
|
||||
}
|
||||
|
||||
template<typename RandomAccessIterator>
|
||||
CallInst::CallInst(Value *Func,
|
||||
RandomAccessIterator ArgBegin, RandomAccessIterator ArgEnd,
|
||||
CallInst::CallInst(Value *Func, ArrayRef<Value *> Args,
|
||||
const Twine &NameStr, Instruction *InsertBefore)
|
||||
: Instruction(cast<FunctionType>(cast<PointerType>(Func->getType())
|
||||
->getElementType())->getReturnType(),
|
||||
Instruction::Call,
|
||||
OperandTraits<CallInst>::op_end(this) - (ArgEnd - ArgBegin + 1),
|
||||
unsigned(ArgEnd - ArgBegin + 1), InsertBefore) {
|
||||
init(Func, ArgBegin, ArgEnd, NameStr,
|
||||
typename std::iterator_traits<RandomAccessIterator>
|
||||
::iterator_category());
|
||||
OperandTraits<CallInst>::op_end(this) - (Args.size() + 1),
|
||||
unsigned(Args.size() + 1), InsertBefore) {
|
||||
init(Func, Args, NameStr);
|
||||
}
|
||||
|
||||
|
||||
|
@ -2282,71 +2232,39 @@ DEFINE_TRANSPARENT_OPERAND_ACCESSORS(IndirectBrInst, Value)
|
|||
class InvokeInst : public TerminatorInst {
|
||||
AttrListPtr AttributeList;
|
||||
InvokeInst(const InvokeInst &BI);
|
||||
void init(Value *Fn, BasicBlock *IfNormal, BasicBlock *IfException,
|
||||
Value* const *Args, unsigned NumArgs);
|
||||
|
||||
template<typename RandomAccessIterator>
|
||||
void init(Value *Func, BasicBlock *IfNormal, BasicBlock *IfException,
|
||||
RandomAccessIterator ArgBegin, RandomAccessIterator ArgEnd,
|
||||
const Twine &NameStr,
|
||||
// This argument ensures that we have an iterator we can
|
||||
// do arithmetic on in constant time
|
||||
std::random_access_iterator_tag) {
|
||||
unsigned NumArgs = (unsigned)std::distance(ArgBegin, ArgEnd);
|
||||
|
||||
// This requires that the iterator points to contiguous memory.
|
||||
init(Func, IfNormal, IfException, NumArgs ? &*ArgBegin : 0, NumArgs);
|
||||
setName(NameStr);
|
||||
}
|
||||
ArrayRef<Value *> Args, const Twine &NameStr);
|
||||
|
||||
/// Construct an InvokeInst given a range of arguments.
|
||||
/// RandomAccessIterator 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 RandomAccessIterator>
|
||||
inline InvokeInst(Value *Func, BasicBlock *IfNormal, BasicBlock *IfException,
|
||||
RandomAccessIterator ArgBegin, RandomAccessIterator ArgEnd,
|
||||
unsigned Values,
|
||||
ArrayRef<Value *> Args, unsigned Values,
|
||||
const Twine &NameStr, Instruction *InsertBefore);
|
||||
|
||||
/// Construct an InvokeInst given a range of arguments.
|
||||
/// RandomAccessIterator 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 RandomAccessIterator>
|
||||
inline InvokeInst(Value *Func, BasicBlock *IfNormal, BasicBlock *IfException,
|
||||
RandomAccessIterator ArgBegin, RandomAccessIterator ArgEnd,
|
||||
unsigned Values,
|
||||
ArrayRef<Value *> Args, unsigned Values,
|
||||
const Twine &NameStr, BasicBlock *InsertAtEnd);
|
||||
protected:
|
||||
virtual InvokeInst *clone_impl() const;
|
||||
public:
|
||||
template<typename RandomAccessIterator>
|
||||
static InvokeInst *Create(Value *Func,
|
||||
BasicBlock *IfNormal, BasicBlock *IfException,
|
||||
RandomAccessIterator ArgBegin,
|
||||
RandomAccessIterator ArgEnd,
|
||||
const Twine &NameStr = "",
|
||||
ArrayRef<Value *> Args, const Twine &NameStr = "",
|
||||
Instruction *InsertBefore = 0) {
|
||||
unsigned Values(ArgEnd - ArgBegin + 3);
|
||||
return new(Values) InvokeInst(Func, IfNormal, IfException, ArgBegin, ArgEnd,
|
||||
unsigned Values = unsigned(Args.size()) + 3;
|
||||
return new(Values) InvokeInst(Func, IfNormal, IfException, Args,
|
||||
Values, NameStr, InsertBefore);
|
||||
}
|
||||
template<typename RandomAccessIterator>
|
||||
static InvokeInst *Create(Value *Func,
|
||||
BasicBlock *IfNormal, BasicBlock *IfException,
|
||||
RandomAccessIterator ArgBegin,
|
||||
RandomAccessIterator ArgEnd,
|
||||
const Twine &NameStr,
|
||||
ArrayRef<Value *> Args, const Twine &NameStr,
|
||||
BasicBlock *InsertAtEnd) {
|
||||
unsigned Values(ArgEnd - ArgBegin + 3);
|
||||
return new(Values) InvokeInst(Func, IfNormal, IfException, ArgBegin, ArgEnd,
|
||||
unsigned Values = unsigned(Args.size()) + 3;
|
||||
return new(Values) InvokeInst(Func, IfNormal, IfException, Args,
|
||||
Values, NameStr, InsertAtEnd);
|
||||
}
|
||||
|
||||
|
@ -2512,37 +2430,27 @@ template <>
|
|||
struct OperandTraits<InvokeInst> : public VariadicOperandTraits<InvokeInst, 3> {
|
||||
};
|
||||
|
||||
template<typename RandomAccessIterator>
|
||||
InvokeInst::InvokeInst(Value *Func,
|
||||
BasicBlock *IfNormal, BasicBlock *IfException,
|
||||
RandomAccessIterator ArgBegin,
|
||||
RandomAccessIterator ArgEnd,
|
||||
unsigned Values,
|
||||
ArrayRef<Value *> Args, unsigned Values,
|
||||
const Twine &NameStr, Instruction *InsertBefore)
|
||||
: TerminatorInst(cast<FunctionType>(cast<PointerType>(Func->getType())
|
||||
->getElementType())->getReturnType(),
|
||||
Instruction::Invoke,
|
||||
OperandTraits<InvokeInst>::op_end(this) - Values,
|
||||
Values, InsertBefore) {
|
||||
init(Func, IfNormal, IfException, ArgBegin, ArgEnd, NameStr,
|
||||
typename std::iterator_traits<RandomAccessIterator>
|
||||
::iterator_category());
|
||||
init(Func, IfNormal, IfException, Args, NameStr);
|
||||
}
|
||||
template<typename RandomAccessIterator>
|
||||
InvokeInst::InvokeInst(Value *Func,
|
||||
BasicBlock *IfNormal, BasicBlock *IfException,
|
||||
RandomAccessIterator ArgBegin,
|
||||
RandomAccessIterator ArgEnd,
|
||||
unsigned Values,
|
||||
ArrayRef<Value *> Args, unsigned Values,
|
||||
const Twine &NameStr, BasicBlock *InsertAtEnd)
|
||||
: TerminatorInst(cast<FunctionType>(cast<PointerType>(Func->getType())
|
||||
->getElementType())->getReturnType(),
|
||||
Instruction::Invoke,
|
||||
OperandTraits<InvokeInst>::op_end(this) - Values,
|
||||
Values, InsertAtEnd) {
|
||||
init(Func, IfNormal, IfException, ArgBegin, ArgEnd, NameStr,
|
||||
typename std::iterator_traits<RandomAccessIterator>
|
||||
::iterator_category());
|
||||
init(Func, IfNormal, IfException, Args, NameStr);
|
||||
}
|
||||
|
||||
DEFINE_TRANSPARENT_OPERAND_ACCESSORS(InvokeInst, Value)
|
||||
|
|
|
@ -449,34 +449,30 @@ public:
|
|||
|
||||
InvokeInst *CreateInvoke(Value *Callee, BasicBlock *NormalDest,
|
||||
BasicBlock *UnwindDest, const Twine &Name = "") {
|
||||
Value *Args[] = { 0 };
|
||||
return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest, Args,
|
||||
Args), Name);
|
||||
return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest,
|
||||
ArrayRef<Value *>()),
|
||||
Name);
|
||||
}
|
||||
InvokeInst *CreateInvoke(Value *Callee, BasicBlock *NormalDest,
|
||||
BasicBlock *UnwindDest, Value *Arg1,
|
||||
const Twine &Name = "") {
|
||||
Value *Args[] = { Arg1 };
|
||||
return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest, Args,
|
||||
Args+1), Name);
|
||||
return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest, Arg1),
|
||||
Name);
|
||||
}
|
||||
InvokeInst *CreateInvoke3(Value *Callee, BasicBlock *NormalDest,
|
||||
BasicBlock *UnwindDest, Value *Arg1,
|
||||
Value *Arg2, Value *Arg3,
|
||||
const Twine &Name = "") {
|
||||
Value *Args[] = { Arg1, Arg2, Arg3 };
|
||||
return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest, Args,
|
||||
Args+3), Name);
|
||||
return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest, Args),
|
||||
Name);
|
||||
}
|
||||
/// CreateInvoke - Create an invoke instruction.
|
||||
template<typename RandomAccessIterator>
|
||||
InvokeInst *CreateInvoke(Value *Callee, BasicBlock *NormalDest,
|
||||
BasicBlock *UnwindDest,
|
||||
RandomAccessIterator ArgBegin,
|
||||
RandomAccessIterator ArgEnd,
|
||||
BasicBlock *UnwindDest, ArrayRef<Value *> Args,
|
||||
const Twine &Name = "") {
|
||||
return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest,
|
||||
ArgBegin, ArgEnd), Name);
|
||||
return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest, Args),
|
||||
Name);
|
||||
}
|
||||
|
||||
UnwindInst *CreateUnwind() {
|
||||
|
@ -1126,33 +1122,27 @@ public:
|
|||
CallInst *CreateCall2(Value *Callee, Value *Arg1, Value *Arg2,
|
||||
const Twine &Name = "") {
|
||||
Value *Args[] = { Arg1, Arg2 };
|
||||
return Insert(CallInst::Create(Callee, Args, Args+2), Name);
|
||||
return Insert(CallInst::Create(Callee, Args), Name);
|
||||
}
|
||||
CallInst *CreateCall3(Value *Callee, Value *Arg1, Value *Arg2, Value *Arg3,
|
||||
const Twine &Name = "") {
|
||||
Value *Args[] = { Arg1, Arg2, Arg3 };
|
||||
return Insert(CallInst::Create(Callee, Args, Args+3), Name);
|
||||
return Insert(CallInst::Create(Callee, Args), Name);
|
||||
}
|
||||
CallInst *CreateCall4(Value *Callee, Value *Arg1, Value *Arg2, Value *Arg3,
|
||||
Value *Arg4, const Twine &Name = "") {
|
||||
Value *Args[] = { Arg1, Arg2, Arg3, Arg4 };
|
||||
return Insert(CallInst::Create(Callee, Args, Args+4), Name);
|
||||
return Insert(CallInst::Create(Callee, Args), Name);
|
||||
}
|
||||
CallInst *CreateCall5(Value *Callee, Value *Arg1, Value *Arg2, Value *Arg3,
|
||||
Value *Arg4, Value *Arg5, const Twine &Name = "") {
|
||||
Value *Args[] = { Arg1, Arg2, Arg3, Arg4, Arg5 };
|
||||
return Insert(CallInst::Create(Callee, Args, Args+5), Name);
|
||||
return Insert(CallInst::Create(Callee, Args), Name);
|
||||
}
|
||||
|
||||
CallInst *CreateCall(Value *Callee, ArrayRef<Value *> Arg,
|
||||
CallInst *CreateCall(Value *Callee, ArrayRef<Value *> Args,
|
||||
const Twine &Name = "") {
|
||||
return Insert(CallInst::Create(Callee, Arg.begin(), Arg.end(), Name));
|
||||
}
|
||||
|
||||
template<typename RandomAccessIterator>
|
||||
CallInst *CreateCall(Value *Callee, RandomAccessIterator ArgBegin,
|
||||
RandomAccessIterator ArgEnd, const Twine &Name = "") {
|
||||
return Insert(CallInst::Create(Callee, ArgBegin, ArgEnd), Name);
|
||||
return Insert(CallInst::Create(Callee, Args, Name));
|
||||
}
|
||||
|
||||
Value *CreateSelect(Value *C, Value *True, Value *False,
|
||||
|
|
|
@ -786,7 +786,7 @@ Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
|
|||
DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
|
||||
|
||||
Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
|
||||
return CallInst::Create(DeclareFn, Args, Args+2, "", InsertBefore);
|
||||
return CallInst::Create(DeclareFn, Args, "", InsertBefore);
|
||||
}
|
||||
|
||||
/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
|
||||
|
@ -802,9 +802,9 @@ Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
|
|||
// If this block already has a terminator then insert this intrinsic
|
||||
// before the terminator.
|
||||
if (TerminatorInst *T = InsertAtEnd->getTerminator())
|
||||
return CallInst::Create(DeclareFn, Args, Args+2, "", T);
|
||||
return CallInst::Create(DeclareFn, Args, "", T);
|
||||
else
|
||||
return CallInst::Create(DeclareFn, Args, Args+2, "", InsertAtEnd);
|
||||
return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
|
||||
}
|
||||
|
||||
/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
|
||||
|
@ -819,7 +819,7 @@ Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
|
|||
Value *Args[] = { MDNode::get(V->getContext(), V),
|
||||
ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
|
||||
VarInfo };
|
||||
return CallInst::Create(ValueFn, Args, Args+3, "", InsertBefore);
|
||||
return CallInst::Create(ValueFn, Args, "", InsertBefore);
|
||||
}
|
||||
|
||||
/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
|
||||
|
@ -834,6 +834,6 @@ Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
|
|||
Value *Args[] = { MDNode::get(V->getContext(), V),
|
||||
ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
|
||||
VarInfo };
|
||||
return CallInst::Create(ValueFn, Args, Args+3, "", InsertAtEnd);
|
||||
return CallInst::Create(ValueFn, Args, "", InsertAtEnd);
|
||||
}
|
||||
|
||||
|
|
|
@ -3218,8 +3218,7 @@ bool LLParser::ParseInvoke(Instruction *&Inst, PerFunctionState &PFS) {
|
|||
// Finish off the Attributes and check them
|
||||
AttrListPtr PAL = AttrListPtr::get(Attrs.begin(), Attrs.end());
|
||||
|
||||
InvokeInst *II = InvokeInst::Create(Callee, NormalBB, UnwindBB,
|
||||
Args.begin(), Args.end());
|
||||
InvokeInst *II = InvokeInst::Create(Callee, NormalBB, UnwindBB, Args);
|
||||
II->setCallingConv(CC);
|
||||
II->setAttributes(PAL);
|
||||
Inst = II;
|
||||
|
@ -3555,7 +3554,7 @@ bool LLParser::ParseCall(Instruction *&Inst, PerFunctionState &PFS,
|
|||
// Finish off the Attributes and check them
|
||||
AttrListPtr PAL = AttrListPtr::get(Attrs.begin(), Attrs.end());
|
||||
|
||||
CallInst *CI = CallInst::Create(Callee, Args.begin(), Args.end());
|
||||
CallInst *CI = CallInst::Create(Callee, Args);
|
||||
CI->setTailCall(isTail);
|
||||
CI->setCallingConv(CC);
|
||||
CI->setAttributes(PAL);
|
||||
|
|
|
@ -2465,8 +2465,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
|||
}
|
||||
}
|
||||
|
||||
I = InvokeInst::Create(Callee, NormalBB, UnwindBB,
|
||||
Ops.begin(), Ops.end());
|
||||
I = InvokeInst::Create(Callee, NormalBB, UnwindBB, Ops);
|
||||
InstructionList.push_back(I);
|
||||
cast<InvokeInst>(I)->setCallingConv(
|
||||
static_cast<CallingConv::ID>(CCInfo));
|
||||
|
@ -2579,7 +2578,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
|||
}
|
||||
}
|
||||
|
||||
I = CallInst::Create(Callee, Args.begin(), Args.end());
|
||||
I = CallInst::Create(Callee, Args);
|
||||
InstructionList.push_back(I);
|
||||
cast<CallInst>(I)->setCallingConv(
|
||||
static_cast<CallingConv::ID>(CCInfo>>1));
|
||||
|
|
|
@ -336,8 +336,7 @@ bool DwarfEHPrepare::HandleURoRInvokes() {
|
|||
Args.push_back(EHCatchAllValue->getInitializer()); // Catch-all indicator.
|
||||
|
||||
CallInst *NewSelector =
|
||||
CallInst::Create(SelectorIntrinsic, Args.begin(), Args.end(),
|
||||
"eh.sel.catch.all", II);
|
||||
CallInst::Create(SelectorIntrinsic, Args, "eh.sel.catch.all", II);
|
||||
|
||||
NewSelector->setTailCall(II->isTailCall());
|
||||
NewSelector->setAttributes(II->getAttributes());
|
||||
|
|
|
@ -77,7 +77,7 @@ static CallInst *ReplaceCallWith(const char *NewFn, CallInst *CI,
|
|||
|
||||
IRBuilder<> Builder(CI->getParent(), CI);
|
||||
SmallVector<Value *, 8> Args(ArgBegin, ArgEnd);
|
||||
CallInst *NewCI = Builder.CreateCall(FCache, Args.begin(), Args.end());
|
||||
CallInst *NewCI = Builder.CreateCall(FCache, Args);
|
||||
NewCI->setName(CI->getName());
|
||||
if (!CI->use_empty())
|
||||
CI->replaceAllUsesWith(NewCI);
|
||||
|
|
|
@ -165,8 +165,7 @@ namespace {
|
|||
|
||||
InvokeInst *II = InvokeInst::Create(CI->getCalledValue(),
|
||||
NewBB, CleanupBB,
|
||||
Args.begin(), Args.end(),
|
||||
CI->getName(), CallBB);
|
||||
Args, CI->getName(), CallBB);
|
||||
II->setCallingConv(CI->getCallingConv());
|
||||
II->setAttributes(CI->getAttributes());
|
||||
CI->replaceAllUsesWith(II);
|
||||
|
|
|
@ -186,7 +186,7 @@ bool StackProtector::InsertStackProtectors() {
|
|||
Value *Args[] = { LI, AI };
|
||||
CallInst::
|
||||
Create(Intrinsic::getDeclaration(M, Intrinsic::stackprotector),
|
||||
&Args[0], array_endof(Args), "", InsPt);
|
||||
Args, "", InsPt);
|
||||
|
||||
// Create the basic block to jump to when the guard check fails.
|
||||
FailBB = CreateFailBB();
|
||||
|
|
|
@ -533,8 +533,7 @@ GenericValue JIT::runFunction(Function *F,
|
|||
Args.push_back(C);
|
||||
}
|
||||
|
||||
CallInst *TheCall = CallInst::Create(F, Args.begin(), Args.end(),
|
||||
"", StubBB);
|
||||
CallInst *TheCall = CallInst::Create(F, Args, "", StubBB);
|
||||
TheCall->setCallingConv(F->getCallingConv());
|
||||
TheCall->setTailCall();
|
||||
if (!TheCall->getType()->isVoidTy())
|
||||
|
|
|
@ -733,12 +733,12 @@ CallGraphNode *ArgPromotion::DoPromotion(Function *F,
|
|||
Instruction *New;
|
||||
if (InvokeInst *II = dyn_cast<InvokeInst>(Call)) {
|
||||
New = InvokeInst::Create(NF, II->getNormalDest(), II->getUnwindDest(),
|
||||
Args.begin(), Args.end(), "", Call);
|
||||
Args, "", Call);
|
||||
cast<InvokeInst>(New)->setCallingConv(CS.getCallingConv());
|
||||
cast<InvokeInst>(New)->setAttributes(AttrListPtr::get(AttributesVec.begin(),
|
||||
AttributesVec.end()));
|
||||
} else {
|
||||
New = CallInst::Create(NF, Args.begin(), Args.end(), "", Call);
|
||||
New = CallInst::Create(NF, Args, "", Call);
|
||||
cast<CallInst>(New)->setCallingConv(CS.getCallingConv());
|
||||
cast<CallInst>(New)->setAttributes(AttrListPtr::get(AttributesVec.begin(),
|
||||
AttributesVec.end()));
|
||||
|
|
|
@ -244,11 +244,11 @@ bool DAE::DeleteDeadVarargs(Function &Fn) {
|
|||
Instruction *New;
|
||||
if (InvokeInst *II = dyn_cast<InvokeInst>(Call)) {
|
||||
New = InvokeInst::Create(NF, II->getNormalDest(), II->getUnwindDest(),
|
||||
Args.begin(), Args.end(), "", Call);
|
||||
Args, "", Call);
|
||||
cast<InvokeInst>(New)->setCallingConv(CS.getCallingConv());
|
||||
cast<InvokeInst>(New)->setAttributes(PAL);
|
||||
} else {
|
||||
New = CallInst::Create(NF, Args.begin(), Args.end(), "", Call);
|
||||
New = CallInst::Create(NF, Args, "", Call);
|
||||
cast<CallInst>(New)->setCallingConv(CS.getCallingConv());
|
||||
cast<CallInst>(New)->setAttributes(PAL);
|
||||
if (cast<CallInst>(Call)->isTailCall())
|
||||
|
@ -822,11 +822,11 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) {
|
|||
Instruction *New;
|
||||
if (InvokeInst *II = dyn_cast<InvokeInst>(Call)) {
|
||||
New = InvokeInst::Create(NF, II->getNormalDest(), II->getUnwindDest(),
|
||||
Args.begin(), Args.end(), "", Call);
|
||||
Args, "", Call);
|
||||
cast<InvokeInst>(New)->setCallingConv(CS.getCallingConv());
|
||||
cast<InvokeInst>(New)->setAttributes(NewCallPAL);
|
||||
} else {
|
||||
New = CallInst::Create(NF, Args.begin(), Args.end(), "", Call);
|
||||
New = CallInst::Create(NF, Args, "", Call);
|
||||
cast<CallInst>(New)->setCallingConv(CS.getCallingConv());
|
||||
cast<CallInst>(New)->setAttributes(NewCallPAL);
|
||||
if (cast<CallInst>(Call)->isTailCall())
|
||||
|
|
|
@ -267,7 +267,7 @@ void LowerSetJmp::TransformLongJmpCall(CallInst* Inst)
|
|||
CastInst* CI =
|
||||
new BitCastInst(Inst->getArgOperand(0), SBPTy, "LJBuf", Inst);
|
||||
Value *Args[] = { CI, Inst->getArgOperand(1) };
|
||||
CallInst::Create(ThrowLongJmp, Args, Args + 2, "", Inst);
|
||||
CallInst::Create(ThrowLongJmp, Args, "", Inst);
|
||||
|
||||
SwitchValuePair& SVP = SwitchValMap[Inst->getParent()->getParent()];
|
||||
|
||||
|
@ -386,7 +386,7 @@ void LowerSetJmp::TransformSetJmpCall(CallInst* Inst)
|
|||
GetSetJmpMap(Func), BufPtr,
|
||||
ConstantInt::get(Type::getInt32Ty(Inst->getContext()), SetJmpIDMap[Func]++)
|
||||
};
|
||||
CallInst::Create(AddSJToMap, Args, Args + 3, "", Inst);
|
||||
CallInst::Create(AddSJToMap, Args, "", Inst);
|
||||
|
||||
// We are guaranteed that there are no values live across basic blocks
|
||||
// (because we are "not in SSA form" yet), but there can still be values live
|
||||
|
@ -482,7 +482,7 @@ void LowerSetJmp::visitCallInst(CallInst& CI)
|
|||
std::vector<Value*> Params(CS.arg_begin(), CS.arg_end());
|
||||
InvokeInst* II =
|
||||
InvokeInst::Create(CI.getCalledValue(), NewBB, PrelimBBMap[Func],
|
||||
Params.begin(), Params.end(), CI.getName(), Term);
|
||||
Params, CI.getName(), Term);
|
||||
II->setCallingConv(CI.getCallingConv());
|
||||
II->setAttributes(CI.getAttributes());
|
||||
|
||||
|
|
|
@ -732,7 +732,7 @@ void MergeFunctions::writeThunk(Function *F, Function *G) {
|
|||
++i;
|
||||
}
|
||||
|
||||
CallInst *CI = Builder.CreateCall(F, Args.begin(), Args.end());
|
||||
CallInst *CI = Builder.CreateCall(F, Args);
|
||||
CI->setTailCall();
|
||||
CI->setCallingConv(F->getCallingConv());
|
||||
if (NewG->getReturnType()->isVoidTy()) {
|
||||
|
|
|
@ -175,8 +175,7 @@ bool PruneEH::SimplifyFunction(Function *F) {
|
|||
if (II->doesNotThrow()) {
|
||||
SmallVector<Value*, 8> Args(II->op_begin(), II->op_end() - 3);
|
||||
// Insert a call instruction before the invoke.
|
||||
CallInst *Call = CallInst::Create(II->getCalledValue(),
|
||||
Args.begin(), Args.end(), "", II);
|
||||
CallInst *Call = CallInst::Create(II->getCalledValue(), Args, "", II);
|
||||
Call->takeName(II);
|
||||
Call->setCallingConv(II->getCallingConv());
|
||||
Call->setAttributes(II->getAttributes());
|
||||
|
|
|
@ -1118,13 +1118,13 @@ bool InstCombiner::transformConstExprCastCall(CallSite CS) {
|
|||
Instruction *NC;
|
||||
if (InvokeInst *II = dyn_cast<InvokeInst>(Caller)) {
|
||||
NC = Builder->CreateInvoke(Callee, II->getNormalDest(),
|
||||
II->getUnwindDest(), Args.begin(), Args.end());
|
||||
II->getUnwindDest(), Args);
|
||||
NC->takeName(II);
|
||||
cast<InvokeInst>(NC)->setCallingConv(II->getCallingConv());
|
||||
cast<InvokeInst>(NC)->setAttributes(NewCallerPAL);
|
||||
} else {
|
||||
CallInst *CI = cast<CallInst>(Caller);
|
||||
NC = Builder->CreateCall(Callee, Args.begin(), Args.end());
|
||||
NC = Builder->CreateCall(Callee, Args);
|
||||
NC->takeName(CI);
|
||||
if (CI->isTailCall())
|
||||
cast<CallInst>(NC)->setTailCall();
|
||||
|
@ -1289,11 +1289,11 @@ Instruction *InstCombiner::transformCallThroughTrampoline(CallSite CS) {
|
|||
if (InvokeInst *II = dyn_cast<InvokeInst>(Caller)) {
|
||||
NewCaller = InvokeInst::Create(NewCallee,
|
||||
II->getNormalDest(), II->getUnwindDest(),
|
||||
NewArgs.begin(), NewArgs.end());
|
||||
NewArgs);
|
||||
cast<InvokeInst>(NewCaller)->setCallingConv(II->getCallingConv());
|
||||
cast<InvokeInst>(NewCaller)->setAttributes(NewPAL);
|
||||
} else {
|
||||
NewCaller = CallInst::Create(NewCallee, NewArgs.begin(), NewArgs.end());
|
||||
NewCaller = CallInst::Create(NewCallee, NewArgs);
|
||||
if (cast<CallInst>(Caller)->isTailCall())
|
||||
cast<CallInst>(NewCaller)->setTailCall();
|
||||
cast<CallInst>(NewCaller)->
|
||||
|
|
|
@ -1062,7 +1062,7 @@ void PathProfiler::insertCounterIncrement(Value* incValue,
|
|||
|
||||
CallInst::Create(
|
||||
increment ? llvmIncrementHashFunction : llvmDecrementHashFunction,
|
||||
args.begin(), args.end(), "", insertPoint);
|
||||
args, "", insertPoint);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -62,8 +62,7 @@ void llvm::InsertProfilingInitCall(Function *MainFn, const char *FnName,
|
|||
}
|
||||
Args[3] = ConstantInt::get(Type::getInt32Ty(Context), NumElements);
|
||||
|
||||
CallInst *InitCall = CallInst::Create(InitFn, Args.begin(), Args.end(),
|
||||
"newargc", InsertPos);
|
||||
CallInst *InitCall = CallInst::Create(InitFn, Args, "newargc", InsertPos);
|
||||
|
||||
// If argc or argv are not available in main, just pass null values in.
|
||||
Function::arg_iterator AI;
|
||||
|
|
|
@ -3421,7 +3421,7 @@ void ObjCARCContract::ContractRelease(Instruction *Release,
|
|||
Args[1] = new BitCastInst(Args[1], I8X, "", Store);
|
||||
CallInst *StoreStrong =
|
||||
CallInst::Create(getStoreStrongCallee(BB->getParent()->getParent()),
|
||||
Args, array_endof(Args), "", Store);
|
||||
Args, "", Store);
|
||||
StoreStrong->setDoesNotThrow();
|
||||
StoreStrong->setDebugLoc(Store->getDebugLoc());
|
||||
|
||||
|
|
|
@ -91,8 +91,7 @@ static void ChangeToUnreachable(Instruction *I, bool UseLLVMTrap) {
|
|||
static void ChangeToCall(InvokeInst *II) {
|
||||
BasicBlock *BB = II->getParent();
|
||||
SmallVector<Value*, 8> Args(II->op_begin(), II->op_end() - 3);
|
||||
CallInst *NewCall = CallInst::Create(II->getCalledValue(), Args.begin(),
|
||||
Args.end(), "", II);
|
||||
CallInst *NewCall = CallInst::Create(II->getCalledValue(), Args, "", II);
|
||||
NewCall->takeName(II);
|
||||
NewCall->setCallingConv(II->getCallingConv());
|
||||
NewCall->setAttributes(II->getAttributes());
|
||||
|
|
|
@ -429,7 +429,7 @@ emitCallAndSwitchStatement(Function *newFunction, BasicBlock *codeReplacer,
|
|||
}
|
||||
|
||||
// Emit the call to the function
|
||||
CallInst *call = CallInst::Create(newFunction, params.begin(), params.end(),
|
||||
CallInst *call = CallInst::Create(newFunction, params,
|
||||
NumExitBlocks > 1 ? "targetBlock" : "");
|
||||
codeReplacer->getInstList().push_back(call);
|
||||
|
||||
|
|
|
@ -450,9 +450,7 @@ static bool HandleCallsInBlockInlinedThroughInvoke(BasicBlock *BB,
|
|||
NewSelector.push_back(Outer->getArgOperand(i));
|
||||
|
||||
CallInst *NewInner =
|
||||
IRBuilder<>(Inner).CreateCall(Inner->getCalledValue(),
|
||||
NewSelector.begin(),
|
||||
NewSelector.end());
|
||||
IRBuilder<>(Inner).CreateCall(Inner->getCalledValue(), NewSelector);
|
||||
// No need to copy attributes, calling convention, etc.
|
||||
NewInner->takeName(Inner);
|
||||
Inner->replaceAllUsesWith(NewInner);
|
||||
|
@ -488,8 +486,7 @@ static bool HandleCallsInBlockInlinedThroughInvoke(BasicBlock *BB,
|
|||
InvokeInst *II =
|
||||
InvokeInst::Create(CI->getCalledValue(), Split,
|
||||
Invoke.getOuterUnwindDest(),
|
||||
InvokeArgs.begin(), InvokeArgs.end(),
|
||||
CI->getName(), BB);
|
||||
InvokeArgs, CI->getName(), BB);
|
||||
II->setCallingConv(CI->getCallingConv());
|
||||
II->setAttributes(CI->getAttributes());
|
||||
|
||||
|
@ -702,7 +699,7 @@ static Value *HandleByValArgument(Value *Arg, Instruction *TheCall,
|
|||
ConstantInt::get(Type::getInt32Ty(Context), 1),
|
||||
ConstantInt::getFalse(Context) // isVolatile
|
||||
};
|
||||
IRBuilder<>(TheCall).CreateCall(MemCpyFn, CallArgs, CallArgs+5);
|
||||
IRBuilder<>(TheCall).CreateCall(MemCpyFn, CallArgs);
|
||||
|
||||
// Uses of the argument in the function should use our new alloca
|
||||
// instead.
|
||||
|
|
|
@ -176,8 +176,7 @@ bool LowerInvoke::insertCheapEHSupport(Function &F) {
|
|||
SmallVector<Value*,16> CallArgs(II->op_begin(), II->op_end() - 3);
|
||||
// Insert a normal call instruction...
|
||||
CallInst *NewCall = CallInst::Create(II->getCalledValue(),
|
||||
CallArgs.begin(), CallArgs.end(),
|
||||
"",II);
|
||||
CallArgs, "", II);
|
||||
NewCall->takeName(II);
|
||||
NewCall->setCallingConv(II->getCallingConv());
|
||||
NewCall->setAttributes(II->getAttributes());
|
||||
|
@ -257,8 +256,7 @@ void LowerInvoke::rewriteExpensiveInvoke(InvokeInst *II, unsigned InvokeNo,
|
|||
// Insert a normal call instruction.
|
||||
SmallVector<Value*,16> CallArgs(II->op_begin(), II->op_end() - 3);
|
||||
CallInst *NewCall = CallInst::Create(II->getCalledValue(),
|
||||
CallArgs.begin(), CallArgs.end(), "",
|
||||
II);
|
||||
CallArgs, "", II);
|
||||
NewCall->takeName(II);
|
||||
NewCall->setCallingConv(II->getCallingConv());
|
||||
NewCall->setAttributes(II->getAttributes());
|
||||
|
@ -565,7 +563,7 @@ bool LowerInvoke::insertExpensiveEHSupport(Function &F) {
|
|||
Type::getInt8PtrTy(F.getContext()),
|
||||
"tmp", UnwindBlock);
|
||||
Idx[1] = ConstantInt::get(Type::getInt32Ty(F.getContext()), 1);
|
||||
CallInst::Create(LongJmpFn, &Idx[0], &Idx[2], "", UnwindBlock);
|
||||
CallInst::Create(LongJmpFn, Idx, "", UnwindBlock);
|
||||
new UnreachableInst(F.getContext(), UnwindBlock);
|
||||
|
||||
// Set up the term block ("throw without a catch").
|
||||
|
|
|
@ -2211,8 +2211,7 @@ bool SimplifyCFGOpt::SimplifyUnwind(UnwindInst *UI, IRBuilder<> &Builder) {
|
|||
SmallVector<Value*,8> Args(II->op_begin(), II->op_end()-3);
|
||||
Builder.SetInsertPoint(BI);
|
||||
CallInst *CI = Builder.CreateCall(II->getCalledValue(),
|
||||
Args.begin(), Args.end(),
|
||||
II->getName());
|
||||
Args, II->getName());
|
||||
CI->setCallingConv(II->getCallingConv());
|
||||
CI->setAttributes(II->getAttributes());
|
||||
// If the invoke produced a value, the Call now does instead.
|
||||
|
@ -2355,8 +2354,7 @@ bool SimplifyCFGOpt::SimplifyUnreachable(UnreachableInst *UI) {
|
|||
SmallVector<Value*, 8> Args(II->op_begin(), II->op_end()-3);
|
||||
Builder.SetInsertPoint(BI);
|
||||
CallInst *CI = Builder.CreateCall(II->getCalledValue(),
|
||||
Args.begin(), Args.end(),
|
||||
II->getName());
|
||||
Args, II->getName());
|
||||
CI->setCallingConv(II->getCallingConv());
|
||||
CI->setAttributes(II->getAttributes());
|
||||
// If the invoke produced a value, the call does now instead.
|
||||
|
|
|
@ -198,7 +198,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) {
|
|||
Value *Operands[4] = { CI->getArgOperand(0), CI->getArgOperand(1),
|
||||
CI->getArgOperand(2),
|
||||
llvm::ConstantInt::get(I32Ty, 1) };
|
||||
CallInst *NewCI = CallInst::Create(NewFn, Operands, Operands+4,
|
||||
CallInst *NewCI = CallInst::Create(NewFn, Operands,
|
||||
CI->getName(), CI);
|
||||
NewCI->setTailCall(CI->isTailCall());
|
||||
NewCI->setCallingConv(CI->getCallingConv());
|
||||
|
|
|
@ -1680,7 +1680,7 @@ LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef B, LLVMValueRef Fn,
|
|||
LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
|
||||
const char *Name) {
|
||||
return wrap(unwrap(B)->CreateInvoke(unwrap(Fn), unwrap(Then), unwrap(Catch),
|
||||
unwrap(Args), unwrap(Args) + NumArgs,
|
||||
ArrayRef<Value *>(unwrap(Args), NumArgs),
|
||||
Name));
|
||||
}
|
||||
|
||||
|
@ -2063,8 +2063,9 @@ LLVMValueRef LLVMBuildPhi(LLVMBuilderRef B, LLVMTypeRef Ty, const char *Name) {
|
|||
LLVMValueRef LLVMBuildCall(LLVMBuilderRef B, LLVMValueRef Fn,
|
||||
LLVMValueRef *Args, unsigned NumArgs,
|
||||
const char *Name) {
|
||||
return wrap(unwrap(B)->CreateCall(unwrap(Fn), unwrap(Args),
|
||||
unwrap(Args) + NumArgs, Name));
|
||||
return wrap(unwrap(B)->CreateCall(unwrap(Fn),
|
||||
ArrayRef<Value *>(unwrap(Args), NumArgs),
|
||||
Name));
|
||||
}
|
||||
|
||||
LLVMValueRef LLVMBuildSelect(LLVMBuilderRef B, LLVMValueRef If,
|
||||
|
|
|
@ -52,9 +52,9 @@ Value *IRBuilderBase::getCastedInt8PtrValue(Value *Ptr) {
|
|||
return BCI;
|
||||
}
|
||||
|
||||
static CallInst *createCallHelper(Value *Callee, Value *const* Ops,
|
||||
unsigned NumOps, IRBuilderBase *Builder) {
|
||||
CallInst *CI = CallInst::Create(Callee, Ops, Ops + NumOps, "");
|
||||
static CallInst *createCallHelper(Value *Callee, ArrayRef<Value *> Ops,
|
||||
IRBuilderBase *Builder) {
|
||||
CallInst *CI = CallInst::Create(Callee, Ops, "");
|
||||
Builder->GetInsertBlock()->getInstList().insert(Builder->GetInsertPoint(),CI);
|
||||
Builder->SetInstDebugLocation(CI);
|
||||
return CI;
|
||||
|
@ -69,7 +69,7 @@ CreateMemSet(Value *Ptr, Value *Val, Value *Size, unsigned Align,
|
|||
Module *M = BB->getParent()->getParent();
|
||||
Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memset, Tys);
|
||||
|
||||
CallInst *CI = createCallHelper(TheFn, Ops, 5, this);
|
||||
CallInst *CI = createCallHelper(TheFn, Ops, this);
|
||||
|
||||
// Set the TBAA info if present.
|
||||
if (TBAATag)
|
||||
|
@ -89,7 +89,7 @@ CreateMemCpy(Value *Dst, Value *Src, Value *Size, unsigned Align,
|
|||
Module *M = BB->getParent()->getParent();
|
||||
Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memcpy, Tys);
|
||||
|
||||
CallInst *CI = createCallHelper(TheFn, Ops, 5, this);
|
||||
CallInst *CI = createCallHelper(TheFn, Ops, this);
|
||||
|
||||
// Set the TBAA info if present.
|
||||
if (TBAATag)
|
||||
|
@ -109,7 +109,7 @@ CreateMemMove(Value *Dst, Value *Src, Value *Size, unsigned Align,
|
|||
Module *M = BB->getParent()->getParent();
|
||||
Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memmove, Tys);
|
||||
|
||||
CallInst *CI = createCallHelper(TheFn, Ops, 5, this);
|
||||
CallInst *CI = createCallHelper(TheFn, Ops, this);
|
||||
|
||||
// Set the TBAA info if present.
|
||||
if (TBAATag)
|
||||
|
@ -130,7 +130,7 @@ CallInst *IRBuilderBase::CreateLifetimeStart(Value *Ptr, ConstantInt *Size) {
|
|||
Value *Ops[] = { Size, Ptr };
|
||||
Module *M = BB->getParent()->getParent();
|
||||
Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::lifetime_start);
|
||||
return createCallHelper(TheFn, Ops, 2, this);
|
||||
return createCallHelper(TheFn, Ops, this);
|
||||
}
|
||||
|
||||
CallInst *IRBuilderBase::CreateLifetimeEnd(Value *Ptr, ConstantInt *Size) {
|
||||
|
@ -145,5 +145,5 @@ CallInst *IRBuilderBase::CreateLifetimeEnd(Value *Ptr, ConstantInt *Size) {
|
|||
Value *Ops[] = { Size, Ptr };
|
||||
Module *M = BB->getParent()->getParent();
|
||||
Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::lifetime_end);
|
||||
return createCallHelper(TheFn, Ops, 2, this);
|
||||
return createCallHelper(TheFn, Ops, this);
|
||||
}
|
||||
|
|
|
@ -174,95 +174,42 @@ Value *PHINode::hasConstantValue() const {
|
|||
CallInst::~CallInst() {
|
||||
}
|
||||
|
||||
void CallInst::init(Value *Func, Value* const *Params, unsigned NumParams) {
|
||||
assert(NumOperands == NumParams+1 && "NumOperands not set up?");
|
||||
void CallInst::init(Value *Func, ArrayRef<Value *> Args, const Twine &NameStr) {
|
||||
assert(NumOperands == Args.size() + 1 && "NumOperands not set up?");
|
||||
Op<-1>() = Func;
|
||||
|
||||
#ifndef NDEBUG
|
||||
const FunctionType *FTy =
|
||||
cast<FunctionType>(cast<PointerType>(Func->getType())->getElementType());
|
||||
(void)FTy; // silence warning.
|
||||
|
||||
assert((NumParams == FTy->getNumParams() ||
|
||||
(FTy->isVarArg() && NumParams > FTy->getNumParams())) &&
|
||||
assert((Args.size() == FTy->getNumParams() ||
|
||||
(FTy->isVarArg() && Args.size() > FTy->getNumParams())) &&
|
||||
"Calling a function with bad signature!");
|
||||
for (unsigned i = 0; i != NumParams; ++i) {
|
||||
|
||||
for (unsigned i = 0; i != Args.size(); ++i)
|
||||
assert((i >= FTy->getNumParams() ||
|
||||
FTy->getParamType(i) == Params[i]->getType()) &&
|
||||
FTy->getParamType(i) == Args[i]->getType()) &&
|
||||
"Calling a function with a bad signature!");
|
||||
OperandList[i] = Params[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
std::copy(Args.begin(), Args.end(), op_begin());
|
||||
setName(NameStr);
|
||||
}
|
||||
|
||||
void CallInst::init(Value *Func, Value *Actual1, Value *Actual2) {
|
||||
assert(NumOperands == 3 && "NumOperands not set up?");
|
||||
Op<-1>() = Func;
|
||||
Op<0>() = Actual1;
|
||||
Op<1>() = Actual2;
|
||||
|
||||
const FunctionType *FTy =
|
||||
cast<FunctionType>(cast<PointerType>(Func->getType())->getElementType());
|
||||
(void)FTy; // silence warning.
|
||||
|
||||
assert((FTy->getNumParams() == 2 ||
|
||||
(FTy->isVarArg() && FTy->getNumParams() < 2)) &&
|
||||
"Calling a function with bad signature");
|
||||
assert((0 >= FTy->getNumParams() ||
|
||||
FTy->getParamType(0) == Actual1->getType()) &&
|
||||
"Calling a function with a bad signature!");
|
||||
assert((1 >= FTy->getNumParams() ||
|
||||
FTy->getParamType(1) == Actual2->getType()) &&
|
||||
"Calling a function with a bad signature!");
|
||||
}
|
||||
|
||||
void CallInst::init(Value *Func, Value *Actual) {
|
||||
assert(NumOperands == 2 && "NumOperands not set up?");
|
||||
Op<-1>() = Func;
|
||||
Op<0>() = Actual;
|
||||
|
||||
const FunctionType *FTy =
|
||||
cast<FunctionType>(cast<PointerType>(Func->getType())->getElementType());
|
||||
(void)FTy; // silence warning.
|
||||
|
||||
assert((FTy->getNumParams() == 1 ||
|
||||
(FTy->isVarArg() && FTy->getNumParams() == 0)) &&
|
||||
"Calling a function with bad signature");
|
||||
assert((0 == FTy->getNumParams() ||
|
||||
FTy->getParamType(0) == Actual->getType()) &&
|
||||
"Calling a function with a bad signature!");
|
||||
}
|
||||
|
||||
void CallInst::init(Value *Func) {
|
||||
void CallInst::init(Value *Func, const Twine &NameStr) {
|
||||
assert(NumOperands == 1 && "NumOperands not set up?");
|
||||
Op<-1>() = Func;
|
||||
|
||||
#ifndef NDEBUG
|
||||
const FunctionType *FTy =
|
||||
cast<FunctionType>(cast<PointerType>(Func->getType())->getElementType());
|
||||
(void)FTy; // silence warning.
|
||||
|
||||
assert(FTy->getNumParams() == 0 && "Calling a function with bad signature");
|
||||
#endif
|
||||
|
||||
setName(NameStr);
|
||||
}
|
||||
|
||||
CallInst::CallInst(Value *Func, Value* Actual, const Twine &Name,
|
||||
Instruction *InsertBefore)
|
||||
: Instruction(cast<FunctionType>(cast<PointerType>(Func->getType())
|
||||
->getElementType())->getReturnType(),
|
||||
Instruction::Call,
|
||||
OperandTraits<CallInst>::op_end(this) - 2,
|
||||
2, InsertBefore) {
|
||||
init(Func, Actual);
|
||||
setName(Name);
|
||||
}
|
||||
|
||||
CallInst::CallInst(Value *Func, Value* Actual, const Twine &Name,
|
||||
BasicBlock *InsertAtEnd)
|
||||
: Instruction(cast<FunctionType>(cast<PointerType>(Func->getType())
|
||||
->getElementType())->getReturnType(),
|
||||
Instruction::Call,
|
||||
OperandTraits<CallInst>::op_end(this) - 2,
|
||||
2, InsertAtEnd) {
|
||||
init(Func, Actual);
|
||||
setName(Name);
|
||||
}
|
||||
CallInst::CallInst(Value *Func, const Twine &Name,
|
||||
Instruction *InsertBefore)
|
||||
: Instruction(cast<FunctionType>(cast<PointerType>(Func->getType())
|
||||
|
@ -270,8 +217,7 @@ CallInst::CallInst(Value *Func, const Twine &Name,
|
|||
Instruction::Call,
|
||||
OperandTraits<CallInst>::op_end(this) - 1,
|
||||
1, InsertBefore) {
|
||||
init(Func);
|
||||
setName(Name);
|
||||
init(Func, Name);
|
||||
}
|
||||
|
||||
CallInst::CallInst(Value *Func, const Twine &Name,
|
||||
|
@ -281,8 +227,7 @@ CallInst::CallInst(Value *Func, const Twine &Name,
|
|||
Instruction::Call,
|
||||
OperandTraits<CallInst>::op_end(this) - 1,
|
||||
1, InsertAtEnd) {
|
||||
init(Func);
|
||||
setName(Name);
|
||||
init(Func, Name);
|
||||
}
|
||||
|
||||
CallInst::CallInst(const CallInst &CI)
|
||||
|
@ -293,10 +238,7 @@ CallInst::CallInst(const CallInst &CI)
|
|||
setTailCall(CI.isTailCall());
|
||||
setCallingConv(CI.getCallingConv());
|
||||
|
||||
Use *OL = OperandList;
|
||||
Use *InOL = CI.OperandList;
|
||||
for (unsigned i = 0, e = CI.getNumOperands(); i != e; ++i)
|
||||
OL[i] = InOL[i];
|
||||
std::copy(CI.op_begin(), CI.op_end(), op_begin());
|
||||
SubclassOptionalData = CI.SubclassOptionalData;
|
||||
}
|
||||
|
||||
|
@ -487,27 +429,28 @@ Instruction* CallInst::CreateFree(Value* Source, BasicBlock *InsertAtEnd) {
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
void InvokeInst::init(Value *Fn, BasicBlock *IfNormal, BasicBlock *IfException,
|
||||
Value* const *Args, unsigned NumArgs) {
|
||||
assert(NumOperands == 3+NumArgs && "NumOperands not set up?");
|
||||
ArrayRef<Value *> Args, const Twine &NameStr) {
|
||||
assert(NumOperands == 3 + Args.size() && "NumOperands not set up?");
|
||||
Op<-3>() = Fn;
|
||||
Op<-2>() = IfNormal;
|
||||
Op<-1>() = IfException;
|
||||
|
||||
#ifndef NDEBUG
|
||||
const FunctionType *FTy =
|
||||
cast<FunctionType>(cast<PointerType>(Fn->getType())->getElementType());
|
||||
(void)FTy; // silence warning.
|
||||
|
||||
assert(((NumArgs == FTy->getNumParams()) ||
|
||||
(FTy->isVarArg() && NumArgs > FTy->getNumParams())) &&
|
||||
assert(((Args.size() == FTy->getNumParams()) ||
|
||||
(FTy->isVarArg() && Args.size() > FTy->getNumParams())) &&
|
||||
"Invoking a function with bad signature");
|
||||
|
||||
Use *OL = OperandList;
|
||||
for (unsigned i = 0, e = NumArgs; i != e; i++) {
|
||||
for (unsigned i = 0, e = Args.size(); i != e; i++)
|
||||
assert((i >= FTy->getNumParams() ||
|
||||
FTy->getParamType(i) == Args[i]->getType()) &&
|
||||
"Invoking a function with a bad signature!");
|
||||
|
||||
OL[i] = Args[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
std::copy(Args.begin(), Args.end(), op_begin());
|
||||
setName(NameStr);
|
||||
}
|
||||
|
||||
InvokeInst::InvokeInst(const InvokeInst &II)
|
||||
|
@ -517,9 +460,7 @@ InvokeInst::InvokeInst(const InvokeInst &II)
|
|||
II.getNumOperands()) {
|
||||
setAttributes(II.getAttributes());
|
||||
setCallingConv(II.getCallingConv());
|
||||
Use *OL = OperandList, *InOL = II.OperandList;
|
||||
for (unsigned i = 0, e = II.getNumOperands(); i != e; ++i)
|
||||
OL[i] = InOL[i];
|
||||
std::copy(II.op_begin(), II.op_end(), op_begin());
|
||||
SubclassOptionalData = II.SubclassOptionalData;
|
||||
}
|
||||
|
||||
|
|
|
@ -794,8 +794,7 @@ static void CleanupAndPrepareModules(BugDriver &BD, Module *&Test,
|
|||
|
||||
// Call the old main function and return its result
|
||||
BasicBlock *BB = BasicBlock::Create(Safe->getContext(), "entry", newMain);
|
||||
CallInst *call = CallInst::Create(oldMainProto, args.begin(), args.end(),
|
||||
"", BB);
|
||||
CallInst *call = CallInst::Create(oldMainProto, args, "", BB);
|
||||
|
||||
// If the type of old function wasn't void, return value of call
|
||||
ReturnInst::Create(Safe->getContext(), call, BB);
|
||||
|
@ -873,8 +872,7 @@ static void CleanupAndPrepareModules(BugDriver &BD, Module *&Test,
|
|||
//
|
||||
// call resolver(GetElementPtr...)
|
||||
CallInst *Resolver =
|
||||
CallInst::Create(resolverFunc, ResolverArgs.begin(),
|
||||
ResolverArgs.end(), "resolver", LookupBB);
|
||||
CallInst::Create(resolverFunc, ResolverArgs, "resolver", LookupBB);
|
||||
|
||||
// Cast the result from the resolver to correctly-typed function.
|
||||
CastInst *CastedResolver =
|
||||
|
@ -899,10 +897,10 @@ static void CleanupAndPrepareModules(BugDriver &BD, Module *&Test,
|
|||
|
||||
// Pass on the arguments to the real function, return its result
|
||||
if (F->getReturnType()->isVoidTy()) {
|
||||
CallInst::Create(FuncPtr, Args.begin(), Args.end(), "", DoCallBB);
|
||||
CallInst::Create(FuncPtr, Args, "", DoCallBB);
|
||||
ReturnInst::Create(F->getContext(), DoCallBB);
|
||||
} else {
|
||||
CallInst *Call = CallInst::Create(FuncPtr, Args.begin(), Args.end(),
|
||||
CallInst *Call = CallInst::Create(FuncPtr, Args,
|
||||
"retval", DoCallBB);
|
||||
ReturnInst::Create(F->getContext(),Call, DoCallBB);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue