Author: johannes Date: Thu Jan 24 19:44:38 2008 New Revision: 46340 URL: http://llvm.org/viewvc/llvm-project?rev=46340&view=rev Log: Fix more missing ObjC metadata at -O0. This one is a little trickier since the type needs to be redone also.
Modified: llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp llvm-gcc-4.2/trunk/gcc/llvm.h llvm-gcc-4.2/trunk/gcc/objc/objc-act.c Modified: llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp?rev=46340&r1=46339&r2=46340&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp Thu Jan 24 19:44:38 2008 @@ -815,6 +815,48 @@ GV->setInitializer(Init); } +/// reset_type_and_initializer_llvm - Change the type and initializer for +/// a global variable. +void reset_type_and_initializer_llvm(tree decl) { + // If there were earlier errors we can get here when DECL_LLVM has not + // been set. Don't crash. + if ((errorcount || sorrycount) && !DECL_LLVM(decl)) + return; + + // Get or create the global variable now. + GlobalVariable *GV = cast<GlobalVariable>(DECL_LLVM(decl)); + + // Temporary to avoid infinite recursion (see comments emit_global_to_llvm) + GV->setInitializer(UndefValue::get(GV->getType()->getElementType())); + + // Convert the initializer over. + Constant *Init = TreeConstantToLLVM::Convert(DECL_INITIAL(decl)); + + // If we had a forward definition that has a type that disagrees with our + // initializer, insert a cast now. This sort of thing occurs when we have a + // global union, and the LLVM type followed a union initializer that is + // different from the union element used for the type. + if (GV->getType()->getElementType() != Init->getType()) { + GV->removeFromParent(); + GlobalVariable *NGV = new GlobalVariable(Init->getType(), GV->isConstant(), + GV->getLinkage(), 0, + GV->getName(), TheModule); + NGV->setVisibility(GV->getVisibility()); + GV->replaceAllUsesWith(ConstantExpr::getBitCast(NGV, GV->getType())); + if (AttributeUsedGlobals.count(GV)) { + AttributeUsedGlobals.remove(GV); + AttributeUsedGlobals.insert(NGV); + } + changeLLVMValue(GV, NGV); + delete GV; + SET_DECL_LLVM(decl, NGV); + GV = NGV; + } + + // Set the initializer. + GV->setInitializer(Init); +} + /// emit_global_to_llvm - Emit the specified VAR_DECL or aggregate CONST_DECL to /// LLVM as a global variable. This function implements the end of /// assemble_variable. Modified: llvm-gcc-4.2/trunk/gcc/llvm.h URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm.h?rev=46340&r1=46339&r2=46340&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm.h (original) +++ llvm-gcc-4.2/trunk/gcc/llvm.h Thu Jan 24 19:44:38 2008 @@ -44,6 +44,11 @@ /* make_decl_llvm - This is also defined in tree.h and used by macros there. */ void make_decl_llvm(union tree_node*); +/* reset_type_and_initializer_llvm - Change the initializer for a global + * variable. + */ +void reset_type_and_initializer_llvm(union tree_node*); + /* reset_initializer_llvm - Change the initializer for a global variable. */ void reset_initializer_llvm(union tree_node*); Modified: llvm-gcc-4.2/trunk/gcc/objc/objc-act.c URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/objc/objc-act.c?rev=46340&r1=46339&r2=46340&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/objc/objc-act.c (original) +++ llvm-gcc-4.2/trunk/gcc/objc/objc-act.c Thu Jan 24 19:44:38 2008 @@ -12269,6 +12269,11 @@ build_fold_addr_expr (UOBJC_V2_VTABLE_decl)); finish_var_decl (class_decl, initlist); + /* LLVM LOCAL begin */ + /* At -O0, we may have emitted references to the decl earlier. */ + if (!optimize) + reset_type_and_initializer_llvm(class_decl); + /* LLVM LOCAL end */ objc_add_to_class_list_chain (class_decl); if (CLASS_OR_CATEGORY_HAS_LOAD_IMPL (objc_implementation_context) != NULL_TREE) objc_add_to_nonlazy_class_list_chain (class_decl); _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits