diff --git a/include/llvm-c/Core.h b/include/llvm-c/Core.h index 3c07738b1f9..9e4b41b2983 100644 --- a/include/llvm-c/Core.h +++ b/include/llvm-c/Core.h @@ -3398,10 +3398,16 @@ LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef, LLVMValueRef V, LLVMBasicBlockRef Else, unsigned NumCases); LLVMValueRef LLVMBuildIndirectBr(LLVMBuilderRef B, LLVMValueRef Addr, unsigned NumDests); +// LLVMBuildInvoke is deprecated in favor of LLVMBuildInvoke2, in preparation +// for opaque pointer types. LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn, LLVMValueRef *Args, unsigned NumArgs, LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch, const char *Name); +LLVMValueRef LLVMBuildInvoke2(LLVMBuilderRef, LLVMTypeRef Ty, LLVMValueRef Fn, + LLVMValueRef *Args, unsigned NumArgs, + LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch, + const char *Name); LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef); /* Exception Handling */ diff --git a/include/llvm/IR/IRBuilder.h b/include/llvm/IR/IRBuilder.h index 720a0a9126a..ed86b503b8d 100644 --- a/include/llvm/IR/IRBuilder.h +++ b/include/llvm/IR/IRBuilder.h @@ -889,19 +889,59 @@ public: } /// Create an invoke instruction. - InvokeInst *CreateInvoke(Value *Callee, BasicBlock *NormalDest, + InvokeInst *CreateInvoke(FunctionType *Ty, Value *Callee, + BasicBlock *NormalDest, BasicBlock *UnwindDest, + ArrayRef Args, + ArrayRef OpBundles, + const Twine &Name = "") { + return Insert( + InvokeInst::Create(Ty, Callee, NormalDest, UnwindDest, Args, OpBundles), + Name); + } + InvokeInst *CreateInvoke(FunctionType *Ty, Value *Callee, + BasicBlock *NormalDest, BasicBlock *UnwindDest, + ArrayRef Args = None, + const Twine &Name = "") { + return Insert(InvokeInst::Create(Ty, Callee, NormalDest, UnwindDest, Args), + Name); + } + + InvokeInst *CreateInvoke(Function *Callee, BasicBlock *NormalDest, + BasicBlock *UnwindDest, ArrayRef Args, + ArrayRef OpBundles, + const Twine &Name = "") { + return CreateInvoke(Callee->getFunctionType(), Callee, NormalDest, + UnwindDest, Args, OpBundles, Name); + } + + InvokeInst *CreateInvoke(Function *Callee, BasicBlock *NormalDest, BasicBlock *UnwindDest, ArrayRef Args = None, const Twine &Name = "") { - return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest, Args), - Name); + return CreateInvoke(Callee->getFunctionType(), Callee, NormalDest, + UnwindDest, Args, Name); } + + // Deprecated [opaque pointer types] InvokeInst *CreateInvoke(Value *Callee, BasicBlock *NormalDest, BasicBlock *UnwindDest, ArrayRef Args, ArrayRef OpBundles, const Twine &Name = "") { - return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest, Args, - OpBundles), Name); + return CreateInvoke( + cast( + cast(Callee->getType())->getElementType()), + Callee, NormalDest, UnwindDest, Args, OpBundles, Name); + } + + // Deprecated [opaque pointer types] + InvokeInst *CreateInvoke(Value *Callee, BasicBlock *NormalDest, + BasicBlock *UnwindDest, + ArrayRef Args = None, + const Twine &Name = "") { + return CreateInvoke( + cast( + cast(Callee->getType())->getElementType()), + Callee, NormalDest, UnwindDest, Args, Name); } ResumeInst *CreateResume(Value *Exn) { diff --git a/include/llvm/IR/Instructions.h b/include/llvm/IR/Instructions.h index d73e4f1a970..5f0ac907e18 100644 --- a/include/llvm/IR/Instructions.h +++ b/include/llvm/IR/Instructions.h @@ -3603,36 +3603,17 @@ class InvokeInst : public CallBase { /// Construct an InvokeInst given a range of arguments. /// /// Construct an InvokeInst from a range of arguments - inline InvokeInst(Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, - ArrayRef Args, ArrayRef Bundles, - int NumOperands, const Twine &NameStr, - Instruction *InsertBefore) - : InvokeInst(cast( - cast(Func->getType())->getElementType()), - Func, IfNormal, IfException, Args, Bundles, NumOperands, - NameStr, InsertBefore) {} - inline InvokeInst(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef Args, ArrayRef Bundles, int NumOperands, const Twine &NameStr, Instruction *InsertBefore); - /// Construct an InvokeInst given a range of arguments. - /// - /// Construct an InvokeInst from a range of arguments - inline InvokeInst(Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, - ArrayRef Args, ArrayRef Bundles, - int NumOperands, const Twine &NameStr, - BasicBlock *InsertAtEnd); - void init(Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, - ArrayRef Args, ArrayRef Bundles, - const Twine &NameStr) { - init(cast( - cast(Func->getType())->getElementType()), - Func, IfNormal, IfException, Args, Bundles, NameStr); - } + inline InvokeInst(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, + BasicBlock *IfException, ArrayRef Args, + ArrayRef Bundles, int NumOperands, + const Twine &NameStr, BasicBlock *InsertAtEnd); - void init(FunctionType *FTy, Value *Func, BasicBlock *IfNormal, + void init(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef Args, ArrayRef Bundles, const Twine &NameStr); @@ -3650,27 +3631,6 @@ protected: InvokeInst *cloneImpl() const; public: - static InvokeInst *Create(Value *Func, BasicBlock *IfNormal, - BasicBlock *IfException, ArrayRef Args, - const Twine &NameStr, - Instruction *InsertBefore = nullptr) { - return Create(cast( - cast(Func->getType())->getElementType()), - Func, IfNormal, IfException, Args, None, NameStr, - InsertBefore); - } - - static InvokeInst *Create(Value *Func, BasicBlock *IfNormal, - BasicBlock *IfException, ArrayRef Args, - ArrayRef Bundles = None, - const Twine &NameStr = "", - Instruction *InsertBefore = nullptr) { - return Create(cast( - cast(Func->getType())->getElementType()), - Func, IfNormal, IfException, Args, Bundles, NameStr, - InsertBefore); - } - static InvokeInst *Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef Args, const Twine &NameStr, @@ -3695,16 +3655,16 @@ public: NameStr, InsertBefore); } - static InvokeInst *Create(Value *Func, - BasicBlock *IfNormal, BasicBlock *IfException, - ArrayRef Args, const Twine &NameStr, - BasicBlock *InsertAtEnd) { + static InvokeInst *Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, + BasicBlock *IfException, ArrayRef Args, + const Twine &NameStr, BasicBlock *InsertAtEnd) { int NumOperands = ComputeNumOperands(Args.size()); - return new (NumOperands) InvokeInst(Func, IfNormal, IfException, Args, None, - NumOperands, NameStr, InsertAtEnd); + return new (NumOperands) + InvokeInst(Ty, Func, IfNormal, IfException, Args, None, NumOperands, + NameStr, InsertAtEnd); } - static InvokeInst *Create(Value *Func, BasicBlock *IfNormal, + static InvokeInst *Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef Args, ArrayRef Bundles, const Twine &NameStr, BasicBlock *InsertAtEnd) { @@ -3713,10 +3673,85 @@ public: unsigned DescriptorBytes = Bundles.size() * sizeof(BundleOpInfo); return new (NumOperands, DescriptorBytes) - InvokeInst(Func, IfNormal, IfException, Args, Bundles, NumOperands, + InvokeInst(Ty, Func, IfNormal, IfException, Args, Bundles, NumOperands, NameStr, InsertAtEnd); } + static InvokeInst *Create(Function *Func, BasicBlock *IfNormal, + BasicBlock *IfException, ArrayRef Args, + const Twine &NameStr, + Instruction *InsertBefore = nullptr) { + return Create(Func->getFunctionType(), Func, IfNormal, IfException, Args, + None, NameStr, InsertBefore); + } + + static InvokeInst *Create(Function *Func, BasicBlock *IfNormal, + BasicBlock *IfException, ArrayRef Args, + ArrayRef Bundles = None, + const Twine &NameStr = "", + Instruction *InsertBefore = nullptr) { + return Create(Func->getFunctionType(), Func, IfNormal, IfException, Args, + Bundles, NameStr, InsertBefore); + } + + static InvokeInst *Create(Function *Func, BasicBlock *IfNormal, + BasicBlock *IfException, ArrayRef Args, + const Twine &NameStr, BasicBlock *InsertAtEnd) { + return Create(Func->getFunctionType(), Func, IfNormal, IfException, Args, + NameStr, InsertAtEnd); + } + + static InvokeInst *Create(Function *Func, BasicBlock *IfNormal, + BasicBlock *IfException, ArrayRef Args, + ArrayRef Bundles, + const Twine &NameStr, BasicBlock *InsertAtEnd) { + return Create(Func->getFunctionType(), Func, IfNormal, IfException, Args, + Bundles, NameStr, InsertAtEnd); + } + + // Deprecated [opaque pointer types] + static InvokeInst *Create(Value *Func, BasicBlock *IfNormal, + BasicBlock *IfException, ArrayRef Args, + const Twine &NameStr, + Instruction *InsertBefore = nullptr) { + return Create(cast( + cast(Func->getType())->getElementType()), + Func, IfNormal, IfException, Args, None, NameStr, + InsertBefore); + } + + // Deprecated [opaque pointer types] + static InvokeInst *Create(Value *Func, BasicBlock *IfNormal, + BasicBlock *IfException, ArrayRef Args, + ArrayRef Bundles = None, + const Twine &NameStr = "", + Instruction *InsertBefore = nullptr) { + return Create(cast( + cast(Func->getType())->getElementType()), + Func, IfNormal, IfException, Args, Bundles, NameStr, + InsertBefore); + } + + // Deprecated [opaque pointer types] + static InvokeInst *Create(Value *Func, BasicBlock *IfNormal, + BasicBlock *IfException, ArrayRef Args, + const Twine &NameStr, BasicBlock *InsertAtEnd) { + return Create(cast( + cast(Func->getType())->getElementType()), + Func, IfNormal, IfException, Args, NameStr, InsertAtEnd); + } + + // Deprecated [opaque pointer types] + static InvokeInst *Create(Value *Func, BasicBlock *IfNormal, + BasicBlock *IfException, ArrayRef Args, + ArrayRef Bundles, + const Twine &NameStr, BasicBlock *InsertAtEnd) { + return Create(cast( + cast(Func->getType())->getElementType()), + Func, IfNormal, IfException, Args, Bundles, NameStr, + InsertAtEnd); + } + /// Create a clone of \p II with a different set of operand bundles and /// insert it before \p InsertPt. /// @@ -3795,17 +3830,14 @@ InvokeInst::InvokeInst(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, init(Ty, Func, IfNormal, IfException, Args, Bundles, NameStr); } -InvokeInst::InvokeInst(Value *Func, BasicBlock *IfNormal, +InvokeInst::InvokeInst(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef Args, ArrayRef Bundles, int NumOperands, const Twine &NameStr, BasicBlock *InsertAtEnd) - : CallBase(cast( - cast(Func->getType())->getElementType()) - ->getReturnType(), - Instruction::Invoke, + : CallBase(Ty->getReturnType(), Instruction::Invoke, OperandTraits::op_end(this) - NumOperands, NumOperands, InsertAtEnd) { - init(Func, IfNormal, IfException, Args, Bundles, NameStr); + init(Ty, Func, IfNormal, IfException, Args, Bundles, NameStr); } //===----------------------------------------------------------------------===// diff --git a/lib/IR/Core.cpp b/lib/IR/Core.cpp index f5459038311..8916d47841b 100644 --- a/lib/IR/Core.cpp +++ b/lib/IR/Core.cpp @@ -2975,9 +2975,22 @@ LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef B, LLVMValueRef Fn, LLVMValueRef *Args, unsigned NumArgs, LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch, const char *Name) { - return wrap(unwrap(B)->CreateInvoke(unwrap(Fn), unwrap(Then), unwrap(Catch), - makeArrayRef(unwrap(Args), NumArgs), - Name)); + Value *V = unwrap(Fn); + FunctionType *FnT = + cast(cast(V->getType())->getElementType()); + + return wrap( + unwrap(B)->CreateInvoke(FnT, unwrap(Fn), unwrap(Then), unwrap(Catch), + makeArrayRef(unwrap(Args), NumArgs), Name)); +} + +LLVMValueRef LLVMBuildInvoke2(LLVMBuilderRef B, LLVMTypeRef Ty, LLVMValueRef Fn, + LLVMValueRef *Args, unsigned NumArgs, + LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch, + const char *Name) { + return wrap(unwrap(B)->CreateInvoke( + unwrap(Ty), unwrap(Fn), unwrap(Then), unwrap(Catch), + makeArrayRef(unwrap(Args), NumArgs), Name)); } LLVMValueRef LLVMBuildLandingPad(LLVMBuilderRef B, LLVMTypeRef Ty,