[cfe-commits] r139359 - in /cfe/trunk: lib/CodeGen/CodeGenModule.cpp lib/CodeGen/CodeGenModule.h test/PCH/block-decl-merging.c test/PCH/block-decl-merging.cpp

Douglas Gregor dgregor at apple.com
Fri Sep 9 09:15:24 PDT 2011


On Sep 8, 2011, at 11:44 PM, Argyrios Kyrtzidis wrote:

> Author: akirtzidis
> Date: Fri Sep  9 01:44:21 2011
> New Revision: 139359
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=139359&view=rev
> Log:
> Do a lookup for the blocks runtime globals to see if they were declared,
> instead of codegen waiting to consume such a declaration, which won't
> happen if that decls are coming from a PCH.

An alternative would be to hoist NSConcreteGlobalBlockDecl, NSConcreteStackBlockDecl, BlockObjectAssignDecl, and BlockObjectDisposeDecl up into ASTContext, and treat them the same way we treat, e.g., the FILE and jmp_buf type declarations. PCH can then hand them off as "interesting" declarations to the consumer when it loads them.

	- Doug

> Fixes rdar://10028656.
> 
> Added:
>    cfe/trunk/test/PCH/block-decl-merging.c
>    cfe/trunk/test/PCH/block-decl-merging.cpp
> Modified:
>    cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>    cfe/trunk/lib/CodeGen/CodeGenModule.h
> 
> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=139359&r1=139358&r2=139359&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Fri Sep  9 01:44:21 2011
> @@ -68,9 +68,7 @@
>     CFConstantStringClassRef(0), ConstantStringClassRef(0),
>     NSConstantStringType(0),
>     VMContext(M.getContext()),
> -    NSConcreteGlobalBlockDecl(0), NSConcreteStackBlockDecl(0),
>     NSConcreteGlobalBlock(0), NSConcreteStackBlock(0),
> -    BlockObjectAssignDecl(0), BlockObjectDisposeDecl(0),
>     BlockObjectAssign(0), BlockObjectDispose(0),
>     BlockDescriptorType(0), GenericBlockLiteralType(0) {
>   if (Features.ObjC1)
> @@ -739,15 +737,6 @@
> 
>   // Ignore declarations, they will be emitted on their first use.
>   if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Global)) {
> -    if (FD->getIdentifier()) {
> -      StringRef Name = FD->getName();
> -      if (Name == "_Block_object_assign") {
> -        BlockObjectAssignDecl = FD;
> -      } else if (Name == "_Block_object_dispose") {
> -        BlockObjectDisposeDecl = FD;
> -      }
> -    }
> -
>     // Forward declarations are emitted lazily on first use.
>     if (!FD->doesThisDeclarationHaveABody()) {
>       if (!FD->doesDeclarationForceExternallyVisibleDefinition())
> @@ -768,16 +757,6 @@
>     const VarDecl *VD = cast<VarDecl>(Global);
>     assert(VD->isFileVarDecl() && "Cannot emit local var decl as global.");
> 
> -    if (VD->getIdentifier()) {
> -      StringRef Name = VD->getName();
> -      if (Name == "_NSConcreteGlobalBlock") {
> -        NSConcreteGlobalBlockDecl = VD;
> -      } else if (Name == "_NSConcreteStackBlock") {
> -        NSConcreteStackBlockDecl = VD;
> -      }
> -    }
> -
> -
>     if (VD->isThisDeclarationADefinition() != VarDecl::Definition)
>       return;
>   }
> @@ -2428,12 +2407,15 @@
>   if (BlockObjectDispose)
>     return BlockObjectDispose;
> 
> -  // If we saw an explicit decl, use that.
> -  if (BlockObjectDisposeDecl) {
> -    return BlockObjectDispose = GetAddrOfFunction(
> -      BlockObjectDisposeDecl,
> -      getTypes().GetFunctionType(BlockObjectDisposeDecl));
> -  }
> +  DeclarationName DName(&Context.Idents.get("_Block_object_dispose"));
> +  DeclContext::lookup_result
> +    Lookup = Context.getTranslationUnitDecl()->lookup(DName);
> +
> +  // If there is an explicit decl, use that.
> +  if (Lookup.first != Lookup.second)
> +    if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*Lookup.first))
> +      return BlockObjectDispose =
> +          GetAddrOfFunction(FD, getTypes().GetFunctionType(FD));
> 
>   // Otherwise construct the function by hand.
>   llvm::Type *args[] = { Int8PtrTy, Int32Ty };
> @@ -2447,12 +2429,15 @@
>   if (BlockObjectAssign)
>     return BlockObjectAssign;
> 
> -  // If we saw an explicit decl, use that.
> -  if (BlockObjectAssignDecl) {
> -    return BlockObjectAssign = GetAddrOfFunction(
> -      BlockObjectAssignDecl,
> -      getTypes().GetFunctionType(BlockObjectAssignDecl));
> -  }
> +  DeclarationName DName(&Context.Idents.get("_Block_object_assign"));
> +  DeclContext::lookup_result
> +    Lookup = Context.getTranslationUnitDecl()->lookup(DName);
> +
> +  // If there is an explicit decl, use that.
> +  if (Lookup.first != Lookup.second)
> +    if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*Lookup.first))
> +      return BlockObjectAssign =
> +          GetAddrOfFunction(FD, getTypes().GetFunctionType(FD));
> 
>   // Otherwise construct the function by hand.
>   llvm::Type *args[] = { Int8PtrTy, Int8PtrTy, Int32Ty };
> @@ -2466,12 +2451,15 @@
>   if (NSConcreteGlobalBlock)
>     return NSConcreteGlobalBlock;
> 
> -  // If we saw an explicit decl, use that.
> -  if (NSConcreteGlobalBlockDecl) {
> -    return NSConcreteGlobalBlock = GetAddrOfGlobalVar(
> -      NSConcreteGlobalBlockDecl,
> -      getTypes().ConvertType(NSConcreteGlobalBlockDecl->getType()));
> -  }
> +  DeclarationName DName(&Context.Idents.get("_NSConcreteGlobalBlock"));
> +  DeclContext::lookup_result
> +    Lookup = Context.getTranslationUnitDecl()->lookup(DName);
> +
> +  // If there is an explicit decl, use that.
> +  if (Lookup.first != Lookup.second)
> +    if (const VarDecl *VD = dyn_cast<VarDecl>(*Lookup.first))
> +      return NSConcreteGlobalBlock =
> +          GetAddrOfGlobalVar(VD, getTypes().ConvertType(VD->getType()));
> 
>   // Otherwise construct the variable by hand.
>   return NSConcreteGlobalBlock =
> @@ -2482,12 +2470,15 @@
>   if (NSConcreteStackBlock)
>     return NSConcreteStackBlock;
> 
> -  // If we saw an explicit decl, use that.
> -  if (NSConcreteStackBlockDecl) {
> -    return NSConcreteStackBlock = GetAddrOfGlobalVar(
> -      NSConcreteStackBlockDecl,
> -      getTypes().ConvertType(NSConcreteStackBlockDecl->getType()));
> -  }
> +  DeclarationName DName(&Context.Idents.get("_NSConcreteStackBlock"));
> +  DeclContext::lookup_result
> +    Lookup = Context.getTranslationUnitDecl()->lookup(DName);
> +
> +  // If there is an explicit decl, use that.
> +  if (Lookup.first != Lookup.second)
> +    if (const VarDecl *VD = dyn_cast<VarDecl>(*Lookup.first))
> +      return NSConcreteStackBlock =
> +          GetAddrOfGlobalVar(VD, getTypes().ConvertType(VD->getType()));
> 
>   // Otherwise construct the variable by hand.
>   return NSConcreteStackBlock =
> 
> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=139359&r1=139358&r2=139359&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenModule.h (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenModule.h Fri Sep  9 01:44:21 2011
> @@ -314,13 +314,9 @@
>   /// @name Cache for Blocks Runtime Globals
>   /// @{
> 
> -  const VarDecl *NSConcreteGlobalBlockDecl;
> -  const VarDecl *NSConcreteStackBlockDecl;
>   llvm::Constant *NSConcreteGlobalBlock;
>   llvm::Constant *NSConcreteStackBlock;
> 
> -  const FunctionDecl *BlockObjectAssignDecl;
> -  const FunctionDecl *BlockObjectDisposeDecl;
>   llvm::Constant *BlockObjectAssign;
>   llvm::Constant *BlockObjectDispose;
> 
> 
> Added: cfe/trunk/test/PCH/block-decl-merging.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/block-decl-merging.c?rev=139359&view=auto
> ==============================================================================
> --- cfe/trunk/test/PCH/block-decl-merging.c (added)
> +++ cfe/trunk/test/PCH/block-decl-merging.c Fri Sep  9 01:44:21 2011
> @@ -0,0 +1,28 @@
> +// RUN: %clang_cc1 -triple i386-apple-darwin10 -fblocks %s -emit-pch -o %t
> +// RUN: %clang_cc1 -triple i386-apple-darwin10 -fblocks %s -include-pch %t -emit-llvm -o - | \
> +// RUN:   FileCheck %s
> +
> +#ifndef HEADER
> +#define HEADER
> +
> +// CHECK: @_NSConcreteGlobalBlock = extern_weak global
> +extern void * _NSConcreteStackBlock[32] __attribute__((weak_import));
> +// CHECK: @_NSConcreteStackBlock = extern_weak global
> +extern void * _NSConcreteGlobalBlock[32] __attribute__((weak_import));
> +extern void _Block_object_dispose(const void *, const int) __attribute__((weak_import));
> +// CHECK: declare extern_weak void @_Block_object_assign
> +extern void _Block_object_assign(void *, const void *, const int) __attribute__((weak_import));
> +// CHECK: declare extern_weak void @_Block_object_dispose
> +
> +#else
> +
> +void *x = ^(){};
> +
> +void f1(void (^a0)(void));
> +
> +void f0() {
> +  __block int x;
> +  f1(^(void){ x = 1; });
> +}
> +
> +#endif
> 
> Added: cfe/trunk/test/PCH/block-decl-merging.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/block-decl-merging.cpp?rev=139359&view=auto
> ==============================================================================
> --- cfe/trunk/test/PCH/block-decl-merging.cpp (added)
> +++ cfe/trunk/test/PCH/block-decl-merging.cpp Fri Sep  9 01:44:21 2011
> @@ -0,0 +1,30 @@
> +// RUN: %clang_cc1 -triple i386-apple-darwin10 -fblocks %s -emit-pch -o %t
> +// RUN: %clang_cc1 -triple i386-apple-darwin10 -fblocks %s -include-pch %t -emit-llvm -o - | \
> +// RUN:   FileCheck %s
> +
> +#ifndef HEADER
> +#define HEADER
> +
> +extern "C" {
> +// CHECK: @_NSConcreteGlobalBlock = extern_weak global
> +extern void * _NSConcreteStackBlock[32] __attribute__((weak_import));
> +// CHECK: @_NSConcreteStackBlock = extern_weak global
> +extern void * _NSConcreteGlobalBlock[32] __attribute__((weak_import));
> +extern void _Block_object_dispose(const void *, const int) __attribute__((weak_import));
> +// CHECK: declare extern_weak void @_Block_object_assign
> +extern void _Block_object_assign(void *, const void *, const int) __attribute__((weak_import));
> +// CHECK: declare extern_weak void @_Block_object_dispose
> +}
> +
> +#else
> +
> +void *x = ^(){};
> +
> +void f1(void (^a0)(void));
> +
> +void f0() {
> +  __block int x;
> +  f1(^(void){ x = 1; });
> +}
> +
> +#endif
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list