On Jan 9, 2008, at 5:57 PM, Chris Lattner <[EMAIL PROTECTED]> wrote:
> > On Jan 9, 2008, at 5:28 PM, Bill Wendling wrote: > >> Author: void >> Date: Wed Jan 9 19:28:25 2008 >> New Revision: 45804 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=45804&view=rev >> Log: >> We're creating incorrect metadata. LLVM gives this for class >> references: > > Hey Bill, > > Is it possible to avoid having the llvm-front-end called on the objc > metadata before its fully formed? It might be possible. I'm just not sure how much work it will take. The LLVM front end is called a lot during metadata creation. Though in the end it would probably be the best thing to do. > Alternatively, perhaps the objc > front-end should set the early version of the metadata as being an > extern instead of definition? > I can try this and see if it has the same effect. -bw > -Chris > >> >> L_OBJC_CLASS_REFERENCES_0: >> .space 4 >> .. >> L_OBJC_CLASS_NAME_0: >> ... >> >> while GCC gives: >> >> L_OBJC_CLASS_REFERENCES_0: >> .long L_OBJC_CLASS_NAME_0 >> .. >> L_OBJC_CLASS_NAME_0: >> ... >> >> which is correct. What's happening is that the reference is being >> created and >> LLVM is setting it's initializer to "null" because it's not pointing >> to >> something at that time. But then reference is modified to point to >> some >> object. However, LLVM wasn't updating its initializer information at >> that point. >> >> >> 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=45804&r1=45803&r2=45804&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> === >> =================================================================== >> --- llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp (original) >> +++ llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp Wed Jan 9 19:28:25 2008 >> @@ -798,6 +798,17 @@ >> } >> } >> >> +/// reset_initializer_llvm - Change the initializer for a global >> variable. >> +void reset_initializer_llvm(tree decl) { >> + // Get or create the global variable now. >> + GlobalVariable *GV = cast<GlobalVariable>(DECL_LLVM(decl)); >> + >> + // Convert the initializer over. >> + Constant *Init = TreeConstantToLLVM::Convert(DECL_INITIAL(decl)); >> + >> + // 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 >> >> 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=45804&r1=45803&r2=45804&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> === >> =================================================================== >> --- llvm-gcc-4.2/trunk/gcc/llvm.h (original) >> +++ llvm-gcc-4.2/trunk/gcc/llvm.h Wed Jan 9 19:28:25 2008 >> @@ -44,12 +44,15 @@ >> /* make_decl_llvm - This is also defined in tree.h and used by >> macros there. */ >> void make_decl_llvm(union tree_node*); >> >> +/* reset_initializer_llvm - Change the initializer for a global >> variable. */ >> +void reset_initializer_llvm(union tree_node*); >> + >> /* emit_global_to_llvm - Emit the specified VAR_DECL to LLVM as a >> global >> * variable. >> */ >> void emit_global_to_llvm(union tree_node*); >> >> -/* emit_global_to_llvm - Emit the specified alias to LLVM >> +/* emit_alias_to_llvm - Emit the specified alias to LLVM >> */ >> void emit_alias_to_llvm(union tree_node*, union tree_node*, 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=45804&r1=45803&r2=45804&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> === >> =================================================================== >> --- llvm-gcc-4.2/trunk/gcc/objc/objc-act.c (original) >> +++ llvm-gcc-4.2/trunk/gcc/objc/objc-act.c Wed Jan 9 19:28:25 2008 >> @@ -76,6 +76,9 @@ >> #include "langhooks-def.h" >> /* APPLE LOCAL optimization pragmas 3124235/3420242 */ >> #include "opts.h" >> +#ifdef ENABLE_LLVM >> +#include "llvm.h" /* for reset_initializer_llvm */ >> +#endif >> >> #define OBJC_VOID_AT_END void_list_node >> >> @@ -5541,6 +5544,13 @@ >> { >> decl = TREE_PURPOSE (chain); >> finish_var_decl (decl, expr); >> + /* APPLE LOCAL LLVM begin - radar 5676233 */ >> +#ifdef ENABLE_LLVM >> + /* Reset the initializer for this reference as it most >> likely >> + changed. */ >> + reset_initializer_llvm(decl); >> +#endif >> + /* APPLE LOCAL LLVM end - radar 5676233 */ >> } >> else >> { >> @@ -18172,8 +18182,16 @@ >> for (chain = cls_ref_chain; chain; chain = TREE_CHAIN (chain)) >> { >> handle_class_ref (chain); >> - if (TREE_PURPOSE (chain)) >> + /* APPLE LOCAL LLVM begin - radar 5676233 */ >> + if (TREE_PURPOSE (chain)) { >> generate_classref_translation_entry (chain); >> +#ifdef ENABLE_LLVM >> + /* Reset the initializer for this reference as it most >> likely >> + changed. */ >> + reset_initializer_llvm(TREE_PURPOSE (chain)); >> +#endif >> + } >> + /* APPLE LOCAL LLVM end - radar 5676233 */ >> } >> >> for (impent = imp_list; impent; impent = impent->next) >> >> >> _______________________________________________ >> llvm-commits mailing list >> llvm-commits@cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > > _______________________________________________ > llvm-commits mailing list > llvm-commits@cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits