[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