diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-09-09 06:44:21 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-09-09 06:44:21 +0000 |
commit | 2169a75a0aa67dec2424ebf1aaa5be3f8a9c2050 (patch) | |
tree | ee5cb373bc0c769b51b68ffe077756b85ae8f5a7 /clang/lib/CodeGen/CodeGenModule.cpp | |
parent | e74bc0ef4c4b3149c53ae35b5b3ad7fbb1a385c5 (diff) | |
download | bcm5719-llvm-2169a75a0aa67dec2424ebf1aaa5be3f8a9c2050.tar.gz bcm5719-llvm-2169a75a0aa67dec2424ebf1aaa5be3f8a9c2050.zip |
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.
Fixes rdar://10028656.
llvm-svn: 139359
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 81 |
1 files changed, 36 insertions, 45 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index dbcb7acfee8..7ccae084648 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -68,9 +68,7 @@ CodeGenModule::CodeGenModule(ASTContext &C, const CodeGenOptions &CGO, 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 @@ void CodeGenModule::EmitGlobal(GlobalDecl GD) { // 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 @@ void CodeGenModule::EmitGlobal(GlobalDecl GD) { 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 @@ llvm::Constant *CodeGenModule::getBlockObjectDispose() { 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 @@ llvm::Constant *CodeGenModule::getBlockObjectAssign() { 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 @@ llvm::Constant *CodeGenModule::getNSConcreteGlobalBlock() { 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 @@ llvm::Constant *CodeGenModule::getNSConcreteStackBlock() { 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 = |