[cfe-commits] r120486 - in /cfe/trunk: lib/CodeGen/CGDecl.cpp test/CodeGen/blockwithlocalstatic.c

Fariborz Jahanian fjahanian at apple.com
Tue Nov 30 15:07:14 PST 2010


Author: fjahanian
Date: Tue Nov 30 17:07:14 2010
New Revision: 120486

URL: http://llvm.org/viewvc/llvm-project?rev=120486&view=rev
Log:
Declaring local static in global block
literal declaration caused crash in CodeGen.
This patch fixes it. pr8707

Added:
    cfe/trunk/test/CodeGen/blockwithlocalstatic.c
Modified:
    cfe/trunk/lib/CodeGen/CGDecl.cpp

Modified: cfe/trunk/lib/CodeGen/CGDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDecl.cpp?rev=120486&r1=120485&r2=120486&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGDecl.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGDecl.cpp Tue Nov 30 17:07:14 2010
@@ -145,14 +145,24 @@
   }
   
   std::string ContextName;
-  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CGF.CurFuncDecl)) {
+  if (!CGF.CurFuncDecl) {
+    // Better be in a block declared in global scope.
+    const NamedDecl *ND = cast<NamedDecl>(&D);
+    const DeclContext *DC = ND->getDeclContext();
+    if (const BlockDecl *BD = dyn_cast<BlockDecl>(DC)) {
+      MangleBuffer Name;
+      CGM.getMangledName(GlobalDecl(), Name, BD);
+      ContextName = Name.getString();
+    }
+    else
+      assert(0 && "Unknown context for block static var decl");
+  } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CGF.CurFuncDecl)) {
     llvm::StringRef Name = CGM.getMangledName(FD);
     ContextName = Name.str();
   } else if (isa<ObjCMethodDecl>(CGF.CurFuncDecl))
     ContextName = CGF.CurFn->getName();
   else
-    // FIXME: What about in a block??
-    assert(0 && "Unknown context for block var decl");
+    assert(0 && "Unknown context for static var decl");
   
   return ContextName + Separator + D.getNameAsString();
 }

Added: cfe/trunk/test/CodeGen/blockwithlocalstatic.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/blockwithlocalstatic.c?rev=120486&view=auto
==============================================================================
--- cfe/trunk/test/CodeGen/blockwithlocalstatic.c (added)
+++ cfe/trunk/test/CodeGen/blockwithlocalstatic.c Tue Nov 30 17:07:14 2010
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fblocks -emit-llvm -o - %s | FileCheck %s
+// pr8707
+
+// CHECK: @__block_global_0.test = internal global i32
+int (^block)(void) = ^ {
+	static int test=0;
+	return test;
+};
+// CHECK: @__block_global_1.test = internal global i32
+void (^block1)(void) = ^ {
+	static int test = 2;
+	return;
+};
+// CHECK: @__block_global_2.test = internal global i32
+int (^block2)(void) = ^ {
+	static int test = 5;
+	return test;
+};
+





More information about the cfe-commits mailing list