Index: llvm/include/llvm-c/Core.h =================================================================== --- llvm/include/llvm-c/Core.h +++ llvm/include/llvm-c/Core.h @@ -3399,10 +3399,16 @@ 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 */ Index: llvm/include/llvm/IR/IRBuilder.h =================================================================== --- llvm/include/llvm/IR/IRBuilder.h +++ llvm/include/llvm/IR/IRBuilder.h @@ -889,19 +889,51 @@ } /// 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(Callee, NormalDest, UnwindDest, Args), + 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 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) { Index: llvm/include/llvm/IR/Instructions.h =================================================================== --- llvm/include/llvm/IR/Instructions.h +++ llvm/include/llvm/IR/Instructions.h @@ -3603,36 +3603,17 @@ /// 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, + + inline InvokeInst(FunctionType *Ty, 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); - } - - 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 @@ 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 @@ NameStr, InsertBefore); } - static InvokeInst *Create(Value *Func, + 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, + 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,83 @@ 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 +3828,14 @@ 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); } //===----------------------------------------------------------------------===// Index: llvm/lib/IR/Core.cpp =================================================================== --- llvm/lib/IR/Core.cpp +++ llvm/lib/IR/Core.cpp @@ -2976,7 +2976,20 @@ LLVMValueRef *Args, unsigned NumArgs, LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch, const char *Name) { - return wrap(unwrap(B)->CreateInvoke(unwrap(Fn), unwrap(Then), unwrap(Catch), + 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)); }