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? Alternatively, perhaps the objc front-end should set the early version of the metadata as being an extern instead of definition? -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