diff options
author | Anders Carlsson <andersca@mac.com> | 2009-04-07 00:20:24 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-04-07 00:20:24 +0000 |
commit | f8544a466744a1c02ebceffee9b54071f7801753 (patch) | |
tree | b3accfae3ce209c3b3d5100fc70ac5c1177008da /lib/CodeGen/CGBlocks.cpp | |
parent | 933c42217fca2407e3d6dedb1ee6b1b390797d0a (diff) |
Use the new getFunctionInfo that takes a BlockPointerType parameter, and get rid of getBlockFunctionType from CGBlocks.cpp
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68478 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGBlocks.cpp')
-rw-r--r-- | lib/CodeGen/CGBlocks.cpp | 31 |
1 files changed, 8 insertions, 23 deletions
diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index c05d3235dd..e01df8d074 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -408,29 +408,14 @@ const llvm::Type *BlockModule::getGenericExtendedBlockLiteralType() { return GenericExtendedBlockLiteralType; } -/// getBlockFunctionType - Given a BlockPointerType, will return the -/// function type for the block, including the first block literal argument. -static QualType getBlockFunctionType(ASTContext &Ctx, - const BlockPointerType *BPT) { - const FunctionProtoType *FTy = dyn_cast<FunctionProtoType>(BPT->getPointeeType()); - const clang::QualType ResType = BPT->getPointeeType()->getAsFunctionType()->getResultType(); - - llvm::SmallVector<QualType, 8> Types; - Types.push_back(Ctx.getPointerType(Ctx.VoidTy)); - - if (FTy) - for (FunctionProtoType::arg_type_iterator i = FTy->arg_type_begin(), - e = FTy->arg_type_end(); i != e; ++i) - Types.push_back(*i); - - return Ctx.getFunctionType(ResType, &Types[0], Types.size(), - FTy && FTy->isVariadic(), 0); -} - RValue CodeGenFunction::EmitBlockCallExpr(const CallExpr* E) { const BlockPointerType *BPT = E->getCallee()->getType()->getAsBlockPointerType(); + const CGFunctionInfo &FnInfo = CGM.getTypes().getFunctionInfo(BPT); + bool IsVariadic = + BPT->getPointeeType()->getAsFunctionProtoType()->isVariadic(); + llvm::Value *Callee = EmitScalarExpr(E->getCallee()); // Get a pointer to the generic block literal. @@ -446,8 +431,9 @@ RValue CodeGenFunction::EmitBlockCallExpr(const CallExpr* E) { llvm::Value *Func = Builder.CreateLoad(FuncPtr, false, "tmp"); // Cast the function pointer to the right type. - const llvm::Type *BlockFTy = - ConvertType(getBlockFunctionType(getContext(), BPT)); + const llvm::Type *BlockFTy = + CGM.getTypes().GetFunctionType(FnInfo, IsVariadic); + const llvm::Type *BlockFTyPtr = llvm::PointerType::getUnqual(BlockFTy); Func = Builder.CreateBitCast(Func, BlockFTyPtr); @@ -468,8 +454,7 @@ RValue CodeGenFunction::EmitBlockCallExpr(const CallExpr* E) { i->getType())); // And call the block. - return EmitCall(CGM.getTypes().getFunctionInfo(E->getType(), Args), - Func, Args); + return EmitCall(FnInfo, Func, Args); } llvm::Value *CodeGenFunction::GetAddrOfBlockDecl(const BlockDeclRefExpr *E) { |