[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 17:28:25 PST 2008


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:

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)





More information about the llvm-commits mailing list