[llvm-commits] [llvm-gcc-4.2] r45804 - in /llvm-gcc-4.2/trunk/gcc: llvm-backend.cpp llvm.h objc/objc-act.c

Bill Wendling isanbard at gmail.com
Wed Jan 9 22:41:03 PST 2008


On Jan 9, 2008, at 5:57 PM, Chris Lattner <clattner at apple.com> 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 at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list