]> granicus.if.org Git - clang/commitdiff
Use the new getFunctionInfo that takes a BlockPointerType parameter, and get rid...
authorAnders Carlsson <andersca@mac.com>
Tue, 7 Apr 2009 00:20:24 +0000 (00:20 +0000)
committerAnders Carlsson <andersca@mac.com>
Tue, 7 Apr 2009 00:20:24 +0000 (00:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68478 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGBlocks.cpp

index c05d3235dd89257a56bdb2fcae0135eb0cece549..e01df8d07429f4c31620b7ec2d7e30bb3addb6cc 100644 (file)
@@ -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) {