[llvm-commits] [llvm-gcc-4.2] r54772 - in /llvm-gcc-4.2/trunk/gcc: config/darwin.c config/darwin.h objc/objc-act.c testsuite/objc.dg/property-metadata-1.m

Dale Johannesen dalej at apple.com
Wed Aug 13 18:20:01 PDT 2008


Author: johannes
Date: Wed Aug 13 20:20:00 2008
New Revision: 54772

URL: http://llvm.org/viewvc/llvm-project?rev=54772&view=rev
Log:
Use 'l' not 'L' as the prefix on some ObjC magic
symbols that go in the __data section.  A request
from Darwin's linker guys, shouldn't affect any
other target.


Modified:
    llvm-gcc-4.2/trunk/gcc/config/darwin.c
    llvm-gcc-4.2/trunk/gcc/config/darwin.h
    llvm-gcc-4.2/trunk/gcc/objc/objc-act.c
    llvm-gcc-4.2/trunk/gcc/testsuite/objc.dg/property-metadata-1.m

Modified: llvm-gcc-4.2/trunk/gcc/config/darwin.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/darwin.c?rev=54772&r1=54771&r2=54772&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/darwin.c (original)
+++ llvm-gcc-4.2/trunk/gcc/config/darwin.c Wed Aug 13 20:20:00 2008
@@ -1535,30 +1535,7 @@
 
 /* LLVM LOCAL begin */
 #ifdef ENABLE_LLVM
-const char *darwin_objc_llvm_implicit_target_global_var_section(tree decl) {
-  const char *name;
-
-  if (TREE_CODE(decl) == CONST_DECL) {
-    extern int flag_next_runtime;
-    tree typename = TYPE_NAME(TREE_TYPE(decl));
-    if (TREE_CODE(typename) == TYPE_DECL)
-      typename = DECL_NAME(typename);
-    
-    if (!strcmp(IDENTIFIER_POINTER(typename), "__builtin_ObjCString")) {
-      if (flag_next_runtime)
-        return "__OBJC, __cstring_object,regular,no_dead_strip";
-      else
-        return "__OBJC, __string_object,no_dead_strip";
-    } else if (!strcmp(IDENTIFIER_POINTER(typename), "__builtin_CFString")) {
-      return "__DATA, __cfstring";
-    } else {
-      return 0;
-    }
-  }
-  
-  /* Get a pointer to the name, past the L_OBJC_ prefix. */
-  name = IDENTIFIER_POINTER (DECL_NAME (decl))+7;
-  
+const char *darwin_objc_llvm_special_name_section(const char* name) {
   if (!strncmp (name, "CLASS_METHODS_", 14))
     return "__OBJC,__cls_meth,regular,no_dead_strip";
   else if (!strncmp (name, "INSTANCE_METHODS_", 17))
@@ -1579,6 +1556,8 @@
     return "__TEXT,__cstring,cstring_literals";
   else if (!strncmp (name, "METH_VAR_TYPE_", 14))
     return "__TEXT,__cstring,cstring_literals";
+  else if (!strncmp (name, "PROP_NAME_ATTR_", 15))
+    return "__TEXT,__cstring,cstring_literals";
   else if (!strncmp (name, "CLASS_REFERENCES", 16))
     return "__OBJC,__cls_refs,literal_pointers,no_dead_strip";
   else if (!strncmp (name, "CLASS_", 6))
@@ -1632,10 +1611,35 @@
       return "__DATA, __objc_nlcatlist, regular, no_dead_strip";
     else if (!strncmp (name, "PROTOCOL_REFERENCE_", 19))
       return "__DATA, __objc_protorefs, regular, no_dead_strip";
-    else 
+  }
+  return 0;
+}
+
+const char *darwin_objc_llvm_implicit_target_global_var_section(tree decl) {
+  const char *name;
+
+  if (TREE_CODE(decl) == CONST_DECL) {
+    extern int flag_next_runtime;
+    tree typename = TYPE_NAME(TREE_TYPE(decl));
+    if (TREE_CODE(typename) == TYPE_DECL)
+      typename = DECL_NAME(typename);
+    
+    if (!strcmp(IDENTIFIER_POINTER(typename), "__builtin_ObjCString")) {
+      if (flag_next_runtime)
+        return "__OBJC, __cstring_object,regular,no_dead_strip";
+      else
+        return "__OBJC, __string_object,no_dead_strip";
+    } else if (!strcmp(IDENTIFIER_POINTER(typename), "__builtin_CFString")) {
+      return "__DATA, __cfstring";
+    } else {
       return 0;
-  } else
-    return 0;
+    }
+  }
+  
+  /* Get a pointer to the name, past the L_OBJC_ prefix. */
+  name = IDENTIFIER_POINTER (DECL_NAME (decl))+7;
+
+  return darwin_objc_llvm_special_name_section(name);
 }
 #endif
 /* LLVM LOCAL end */

Modified: llvm-gcc-4.2/trunk/gcc/config/darwin.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/darwin.h?rev=54772&r1=54771&r2=54772&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/darwin.h (original)
+++ llvm-gcc-4.2/trunk/gcc/config/darwin.h Wed Aug 13 20:20:00 2008
@@ -1419,10 +1419,12 @@
   (((DECL_NAME (decl) &&                                                \
     TREE_CODE (DECL_NAME (decl)) == IDENTIFIER_NODE &&                  \
     IDENTIFIER_POINTER (DECL_NAME (decl)) &&                            \
-    !strncmp (IDENTIFIER_POINTER (DECL_NAME (decl)), "L_OBJC_", 7)) ||  \
+    (!strncmp (IDENTIFIER_POINTER (DECL_NAME (decl)), "L_OBJC_", 7) ||  \
+     !strncmp (IDENTIFIER_POINTER (DECL_NAME (decl)), "l_OBJC_", 7))) ||  \
    TREE_CODE(decl) == CONST_DECL) ?                                     \
      darwin_objc_llvm_implicit_target_global_var_section(decl) : 0)
 const char *darwin_objc_llvm_implicit_target_global_var_section(tree);
+const char *darwin_objc_llvm_special_name_section(const char*);
 
 /* Darwin X86-64 only supports PIC code generation. */
 #if defined (TARGET_386)

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=54772&r1=54771&r2=54772&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/objc/objc-act.c (original)
+++ llvm-gcc-4.2/trunk/gcc/objc/objc-act.c Wed Aug 13 20:20:00 2008
@@ -4081,12 +4081,22 @@
   /* LLVM LOCAL begin */
   tree var = NULL_TREE;
 #ifdef ENABLE_LLVM
-  /* Darwin linker prefers to use 'L' as a prefix. GCC codegen handles this
-     later while emitting symbols, but fix it here for llvm.  */
+  /* Prefer to use 'L' as a prefix so symbols can be stripped at assembly
+     time. GCC codegen handles this later while emitting symbols, but fix
+     it here for llvm.  */
+  /* Special ObjC symbols in __data should use 'l' so the assembler
+     will not strip the symbol; the linker needs to see these, but
+     strip them after use. */
   char *new_name;
   if (name && strncmp (name, "_OBJC_", 6) == 0) {
     new_name = alloca (strlen (name) + 2);
+#if TARGET_MACHO
+    const char* section = darwin_objc_llvm_special_name_section(name+6);
+    new_name[0] = (section==0 || strcmp(section, "__DATA,__data")==0) 
+                  ? 'l' : 'L';
+#else
     new_name[0] = 'L';
+#endif
     strcpy (new_name + 1, name);
     var = build_decl (VAR_DECL, get_identifier (new_name), type);
     set_user_assembler_name (var, IDENTIFIER_POINTER (DECL_NAME (var)));
@@ -6379,6 +6389,7 @@
   {
     /* Darwin linker prefers to use 'L' as a prefix. GCC codegen handles this
        later while emitting symbols, but fix it here for llvm.  */
+    /* All these are in cstring, so none use 'l'. */
     char *tbuf = alloca (strlen (buf) + 2);
     tbuf[0] = 'L';
     strcpy (tbuf + 1, buf);

Modified: llvm-gcc-4.2/trunk/gcc/testsuite/objc.dg/property-metadata-1.m
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/testsuite/objc.dg/property-metadata-1.m?rev=54772&r1=54771&r2=54772&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/testsuite/objc.dg/property-metadata-1.m (original)
+++ llvm-gcc-4.2/trunk/gcc/testsuite/objc.dg/property-metadata-1.m Wed Aug 13 20:20:00 2008
@@ -22,5 +22,5 @@
 @dynamic referenceCount;
 @end
 
-/* { dg-final { scan-assembler "L_OBJC_\\\$_PROP_LIST_GCObject:" } } */
-/* { dg-final { scan-assembler "L_OBJC_\\\$_PROP_PROTO_LIST_GCObject:" } } */
+/* { dg-final { scan-assembler "(L|l)_OBJC_\\\$_PROP_LIST_GCObject:" } } */
+/* { dg-final { scan-assembler "(L|l)_OBJC_\\\$_PROP_PROTO_LIST_GCObject:" } } */





More information about the llvm-commits mailing list