]> granicus.if.org Git - clang/commitdiff
Generate the helper function for blocks. Now basic codegen is
authorMike Stump <mrs@apple.com>
Sat, 14 Feb 2009 22:16:35 +0000 (22:16 +0000)
committerMike Stump <mrs@apple.com>
Sat, 14 Feb 2009 22:16:35 +0000 (22:16 +0000)
starting to work for blocks.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64570 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGBlocks.cpp
lib/CodeGen/CGExprConstant.cpp
lib/CodeGen/CGExprScalar.cpp
lib/CodeGen/CodeGenFunction.h
lib/CodeGen/CodeGenModule.h

index cb9de169d72a30b8c7b88b66bf43bbd341ff976c..ecc9406b2fe9c443f24cd2507d745f5c6276b7b0 100644 (file)
@@ -107,7 +107,7 @@ llvm::Constant *CodeGenModule::getNSConcreteStackBlock() {
   return NSConcreteStackBlock;
 }
 
-llvm::Constant *CodeGenFunction::BuildBlockLiteralTmp() {
+llvm::Constant *CodeGenFunction::BuildBlockLiteralTmp(const BlockExpr *BE) {
   // FIXME: Push up
   bool BlockHasCopyDispose = false;
   bool insideFunction = false;
@@ -147,8 +147,12 @@ llvm::Constant *CodeGenFunction::BuildBlockLiteralTmp() {
     Elts.push_back(C);
 
     // __FuncPtr
-    // FIXME: Build this up.
-    Elts.push_back(C);
+    std::string Name;
+    if (const NamedDecl *ND = dyn_cast<NamedDecl>(CurFuncDecl))
+      Name = ND->getNameAsString();
+    BlockInfo Info(0, Name);
+    llvm::Function *Fn = CodeGenFunction(*this).GenerateBlockFunction(BE, Info);
+    Elts.push_back(Fn);
 
     // __descriptor
     Elts.push_back(BuildDescriptorBlockDecl());
@@ -287,7 +291,8 @@ RValue CodeGenFunction::EmitBlockCallExpr(const CallExpr* E) {
                   Func, Args);
 }
 
-llvm::Constant *CodeGenModule::GetAddrOfGlobalBlock(const BlockExpr *BE) {
+llvm::Constant *
+CodeGenModule::GetAddrOfGlobalBlock(const BlockExpr *BE, std::string n) {
   // Generate the block descriptor.
   const llvm::Type *UnsignedLongTy = Types.ConvertType(Context.UnsignedLongTy);
   const llvm::IntegerType *IntTy = cast<llvm::IntegerType>(
@@ -316,7 +321,7 @@ llvm::Constant *CodeGenModule::GetAddrOfGlobalBlock(const BlockExpr *BE) {
   // Generate the constants for the block literal.
   llvm::Constant *LiteralFields[5];
 
-  CodeGenFunction::BlockInfo Info(0, "global");
+  CodeGenFunction::BlockInfo Info(0, n);
   llvm::Function *Fn = CodeGenFunction(*this).GenerateBlockFunction(BE, Info);
 
   // isa
@@ -371,8 +376,7 @@ llvm::Function *CodeGenFunction::GenerateBlockFunction(const BlockExpr *Expr,
   const CGFunctionInfo &FI =
     CGM.getTypes().getFunctionInfo(FTy->getResultType(), Args);
 
-  std::string Name = std::string("__block_function_") + Info.NameSuffix;
-
+  std::string Name = std::string("__") + Info.Name + "_block_invoke_";
   CodeGenTypes &Types = CGM.getTypes();
   const llvm::FunctionType *LTy = Types.GetFunctionType(FI, FTy->isVariadic());
 
index bfb523bb32445096355db57ac224457f7778d00c..aa5d37dd1f0fbda3336e2109a17520a7ff72207a 100644 (file)
@@ -372,7 +372,10 @@ public:
   }
     
   llvm::Constant *VisitBlockExpr(const BlockExpr *E) {
-    return CGM.GetAddrOfGlobalBlock(E);
+    const char *Name = "";
+    if (const NamedDecl *ND = dyn_cast<NamedDecl>(CGF->CurFuncDecl))
+      Name = ND->getNameAsString().c_str();
+    return CGM.GetAddrOfGlobalBlock(E, Name);
   }
   
   // Utility methods
index 164d57eb715de7534e53c74941b47afb99e92f31..f5a1cf05258a3132ca18026f7fdcd2895adcf9e9 100644 (file)
@@ -1369,7 +1369,7 @@ Value *ScalarExprEmitter::VisitObjCEncodeExpr(const ObjCEncodeExpr *E) {
 
 
 Value *ScalarExprEmitter::VisitBlockExpr(const BlockExpr *BE) {
-  llvm::Constant *C = CGF.BuildBlockLiteralTmp();
+  llvm::Constant *C = CGF.BuildBlockLiteralTmp(BE);
 
   const llvm::PointerType *PtrToInt8Ty
     = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
index ff505856f5cef89e34eafbba79041f3d8f29d41c..038db1b305651a1e5475523e81dbb51bfbcca392 100644 (file)
@@ -88,7 +88,7 @@ public:
   const llvm::Type *LLVMIntTy;
   uint32_t LLVMPointerWidth;
 
-  llvm::Constant *BuildBlockLiteralTmp();
+  llvm::Constant *BuildBlockLiteralTmp(const BlockExpr *);
   llvm::Constant *BuildDescriptorBlockDecl();
 
 public:
@@ -250,13 +250,16 @@ public:
   void GenerateObjCSetter(ObjCImplementationDecl *IMP,
                           const ObjCPropertyImplDecl *PID);
 
+  /// BlockInfo - Information to generate a block literal.
   struct BlockInfo {
+    /// BlockLiteralTy - The type of the block literal.
     const llvm::Type *BlockLiteralTy;
-    
-    const char *NameSuffix;
 
-    BlockInfo(const llvm::Type *blt, const char *ns) 
-      :  BlockLiteralTy(blt), NameSuffix(ns) {}
+    /// Name - the name of the function this block was created for, if any
+    std::string Name;
+
+    BlockInfo(const llvm::Type *blt, std::string n)
+      : BlockLiteralTy(blt), Name(n) {}
   };
   
   llvm::Function *GenerateBlockFunction(const BlockExpr *Expr,
index 4c2aeb75ac236d182cbcd63c899ed15de1e66e7b..e5c412a75c1ac298e4c35d13c8fe61e4a17649b3 100644 (file)
@@ -219,7 +219,7 @@ public:
   llvm::Constant *GetAddrOfConstantCString(const std::string &str,
                                            const char *GlobalName=0);
 
-  llvm::Constant *GetAddrOfGlobalBlock(const BlockExpr *BE);
+  llvm::Constant *GetAddrOfGlobalBlock(const BlockExpr *BE, std::string);
 
   /// getBuiltinLibFunction - Given a builtin id for a function like
   /// "__builtin_fabsf", return a Function* for "fabsf".