Author: void Date: Mon Sep 24 21:51:18 2007 New Revision: 42287 URL: http://llvm.org/viewvc/llvm-project?rev=42287&view=rev Log: During the processing of Objective-C "protocols", the objc frontend creates two decls for the protocol. One for the metadata and another for when it's referenced. However, protocols are "internal global", so when we do a lookup for the reference, it doesn't find the first decl because it's not "external". This will perform a second lookup for objective C protocols if we don't find it among the "external globals".
Modified: llvm-gcc-4.0/trunk/gcc/c-common.h llvm-gcc-4.0/trunk/gcc/llvm-backend.cpp llvm-gcc-4.0/trunk/gcc/objc/objc-act.c llvm-gcc-4.0/trunk/gcc/stub-objc.c Modified: llvm-gcc-4.0/trunk/gcc/c-common.h URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.0/trunk/gcc/c-common.h?rev=42287&r1=42286&r2=42287&view=diff ============================================================================== --- llvm-gcc-4.0/trunk/gcc/c-common.h (original) +++ llvm-gcc-4.0/trunk/gcc/c-common.h Mon Sep 24 21:51:18 2007 @@ -1139,6 +1139,12 @@ extern void objc_remove_weak_read (tree*); /* APPLE LOCAL end radar 4426814 */ +/* APPLE LOCAL begin - LLVM radar 5476262 */ +#ifdef ENABLE_LLVM +extern bool objc_is_protocol_reference (const char *name); +#endif +/* APPLE LOCAL end - LLVM radar 5476262 */ + /* APPLE LOCAL begin C* language */ extern void objc_set_method_opt (int); void objc_finish_foreach_loop (location_t, tree, tree, tree, tree); Modified: llvm-gcc-4.0/trunk/gcc/llvm-backend.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.0/trunk/gcc/llvm-backend.cpp?rev=42287&r1=42286&r2=42287&view=diff ============================================================================== --- llvm-gcc-4.0/trunk/gcc/llvm-backend.cpp (original) +++ llvm-gcc-4.0/trunk/gcc/llvm-backend.cpp Mon Sep 24 21:51:18 2007 @@ -66,6 +66,7 @@ #include "function.h" #include "tree-inline.h" #include "langhooks.h" +#include "c-common.h" } // Non-zero if bytecode from PCH is successfully read. @@ -1060,6 +1061,14 @@ // If the global has a name, prevent multiple vars with the same name from // being created. GlobalVariable *GVE = TheModule->getGlobalVariable(Name); + + // And Objective-C "@protocol" will create a decl for the + // protocol metadata and then when the protocol is + // referenced. However, protocols have file-scope, so they + // aren't found in the GlobalVariable list unless we look at + // non-extern globals as well. + if (!GVE && c_dialect_objc() && objc_is_protocol_reference(Name)) + GVE = TheModule->getGlobalVariable(Name, true); if (GVE == 0) { GV = new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage,0, Modified: llvm-gcc-4.0/trunk/gcc/objc/objc-act.c URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.0/trunk/gcc/objc/objc-act.c?rev=42287&r1=42286&r2=42287&view=diff ============================================================================== --- llvm-gcc-4.0/trunk/gcc/objc/objc-act.c (original) +++ llvm-gcc-4.0/trunk/gcc/objc/objc-act.c Mon Sep 24 21:51:18 2007 @@ -11669,6 +11669,19 @@ } } +/* APPLE LOCAL begin - LLVM radar 5476262 */ +#ifdef ENABLE_LLVM +/* This routine returns true if the name is the same as a protocol + reference name. */ + +bool +objc_is_protocol_reference (const char *name) +{ + return flag_objc_abi == 2 && strstr (name, "_OBJC_PROTOCOL_$_") != 0; +} +#endif +/* APPLE LOCAL end - LLVM radar 5476262 */ + /* This routine builds the protocol_reference_chain for each protocol name used @protocol(MyProtocol) expression. IDENT is current protocol name. */ Modified: llvm-gcc-4.0/trunk/gcc/stub-objc.c URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.0/trunk/gcc/stub-objc.c?rev=42287&r1=42286&r2=42287&view=diff ============================================================================== --- llvm-gcc-4.0/trunk/gcc/stub-objc.c (original) +++ llvm-gcc-4.0/trunk/gcc/stub-objc.c Mon Sep 24 21:51:18 2007 @@ -548,3 +548,13 @@ return false; } /* APPLE LOCAL end radar 4985544 */ + +/* APPLE LOCAL begin - LLVM radar 5476262 */ +#ifdef ENABLE_LLVM +bool +objc_is_protocol_reference (const char * ARG_UNUSED(name)) +{ + return false; +} +#endif +/* APPLE LOCAL end - LLVM radar 5476262 */ _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits