aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorSteven Bosscher <steven@gcc.gnu.org>2012-06-19 20:44:47 +0000
committerSteven Bosscher <steven@gcc.gnu.org>2012-06-19 20:44:47 +0000
commit70f42967b3b48d63a8e90bd19b4277a64d6ccd21 (patch)
tree43b24c99ade8c59d05ac05d4aecbdd6ff2c2f406 /gcc/config
parentc85fd25b17ae5b2150c71826b04ffb71045d1b28 (diff)
downloadgcc-70f42967b3b48d63a8e90bd19b4277a64d6ccd21.zip
gcc-70f42967b3b48d63a8e90bd19b4277a64d6ccd21.tar.gz
gcc-70f42967b3b48d63a8e90bd19b4277a64d6ccd21.tar.bz2
tm.texi.in (TARGET_OBJC_DECLARE_UNRESOLVED_CLASS_REFERENCE, [...]): Add @hooks.
gcc/ * doc/tm.texi.in (TARGET_OBJC_DECLARE_UNRESOLVED_CLASS_REFERENCE, TARGET_OBJC_DECLARE_CLASS_DEFINITION): Add @hooks. (ASM_DECLARE_CLASS_REFERENCE, ASM_DECLARE_UNRESOLVED_REFERENCE): Remove. * doc/tm.texi: Regenerate. * config/darwin.h (ASM_OUTPUT_LABELREF): Remove special case for .objc_class_name_*. * config/darwin-c.c: Include target.h. (darwin_objc_declare_unresolved_class_reference): New function. (darwin_objc_declare_class_definition): New function. (TARGET_OBJC_DECLARE_UNRESOLVED_CLASS_REFERENCE): Define. (TARGET_OBJC_DECLARE_CLASS_DEFINITION): Define. c-family/ * c-target.def (objc_declare_unresolved_class_reference, objc_declare_class_definition): Add new hooks. objc/ * objc-next-runtime-abi-01.c: Do not include tm.h and output.h. Include c-family/c-target.h. (handle_next_class_ref): Rewrite to emit top-level asm statements. (handle_next_impent): Likewise. * objc/Make-lang.in: Fix dependencies for objc-next-runtime-abi-01.o. From-SVN: r188793
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/darwin-c.c55
-rw-r--r--gcc/config/darwin.h25
2 files changed, 52 insertions, 28 deletions
diff --git a/gcc/config/darwin-c.c b/gcc/config/darwin-c.c
index 08de2f8..a642f66 100644
--- a/gcc/config/darwin-c.c
+++ b/gcc/config/darwin-c.c
@@ -25,6 +25,7 @@ along with GCC; see the file COPYING3. If not see
#include "tm.h"
#include "cpplib.h"
#include "tree.h"
+#include "target.h"
#include "incpath.h"
#include "c-family/c-common.h"
#include "c-family/c-pragma.h"
@@ -36,6 +37,7 @@ along with GCC; see the file COPYING3. If not see
#include "prefix.h"
#include "c-family/c-target.h"
#include "c-family/c-target-def.h"
+#include "cgraph.h"
/* Pragmas. */
@@ -711,13 +713,60 @@ EXPORTED_CONST format_kind_info darwin_additional_format_types[] = {
}
};
-#undef TARGET_HANDLE_C_OPTION
+
+/* Support routines to dump the class references for NeXT ABI v1, aka
+ 32-bits ObjC-2.0, as top-level asms.
+ The following two functions should only be called from
+ objc/objc-next-runtime-abi-01.c. */
+
+static void
+darwin_objc_declare_unresolved_class_reference (const char *name)
+{
+ const char *lazy_reference = ".lazy_reference\t";
+ const char *hard_reference = ".reference\t";
+ const char *reference = MACHOPIC_INDIRECT ? lazy_reference : hard_reference;
+ size_t len = strlen (reference) + strlen(name) + 2;
+ char *buf = (char *) alloca (len);
+
+ gcc_checking_assert (!strncmp (name, ".objc_class_name_", 17));
+
+ snprintf (buf, len, "%s%s", reference, name);
+ add_asm_node (build_string (strlen (buf), buf));
+}
+
+static void
+darwin_objc_declare_class_definition (const char *name)
+{
+ const char *xname = targetm.strip_name_encoding (name);
+ size_t len = strlen (xname) + 7 + 5;
+ char *buf = (char *) alloca (len);
+
+ gcc_checking_assert (!strncmp (name, ".objc_class_name_", 17)
+ || !strncmp (name, "*.objc_category_name_", 21));
+
+ /* Mimic default_globalize_label. */
+ snprintf (buf, len, ".globl\t%s", xname);
+ add_asm_node (build_string (strlen (buf), buf));
+
+ snprintf (buf, len, "%s = 0", xname);
+ add_asm_node (build_string (strlen (buf), buf));
+}
+
+#undef TARGET_HANDLE_C_OPTION
#define TARGET_HANDLE_C_OPTION handle_c_option
-#undef TARGET_OBJC_CONSTRUCT_STRING_OBJECT
+#undef TARGET_OBJC_CONSTRUCT_STRING_OBJECT
#define TARGET_OBJC_CONSTRUCT_STRING_OBJECT darwin_objc_construct_string
-#undef TARGET_STRING_OBJECT_REF_TYPE_P
+#undef TARGET_OBJC_DECLARE_UNRESOLVED_CLASS_REFERENCE
+#define TARGET_OBJC_DECLARE_UNRESOLVED_CLASS_REFERENCE \
+ darwin_objc_declare_unresolved_class_reference
+
+#undef TARGET_OBJC_DECLARE_CLASS_DEFINITION
+#define TARGET_OBJC_DECLARE_CLASS_DEFINITION \
+ darwin_objc_declare_class_definition
+
+#undef TARGET_STRING_OBJECT_REF_TYPE_P
#define TARGET_STRING_OBJECT_REF_TYPE_P darwin_cfstring_ref_p
#undef TARGET_CHECK_STRING_OBJECT_FORMAT_ARG
diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h
index 5855778..6bc7f73 100644
--- a/gcc/config/darwin.h
+++ b/gcc/config/darwin.h
@@ -616,8 +616,6 @@ int darwin_label_is_anonymous_local_objc_name (const char *name);
fprintf (FILE, "\"%s\"", xname); \
else if (darwin_label_is_anonymous_local_objc_name (xname)) \
fprintf (FILE, "L%s", xname); \
- else if (!strncmp (xname, ".objc_class_name_", 17)) \
- fprintf (FILE, "%s", xname); \
else if (xname[0] != '"' && name_needs_quotes (xname)) \
asm_fprintf (FILE, "\"%U%s\"", xname); \
else \
@@ -700,29 +698,6 @@ extern GTY(()) section * darwin_sections[NUM_DARWIN_SECTIONS];
#undef TARGET_ASM_RELOC_RW_MASK
#define TARGET_ASM_RELOC_RW_MASK machopic_reloc_rw_mask
-
-#define ASM_DECLARE_UNRESOLVED_REFERENCE(FILE,NAME) \
- do { \
- if (FILE) { \
- if (MACHOPIC_INDIRECT) \
- fprintf (FILE, "\t.lazy_reference "); \
- else \
- fprintf (FILE, "\t.reference "); \
- assemble_name (FILE, NAME); \
- fprintf (FILE, "\n"); \
- } \
- } while (0)
-
-#define ASM_DECLARE_CLASS_REFERENCE(FILE,NAME) \
- do { \
- if (FILE) { \
- fprintf (FILE, "\t"); \
- assemble_name (FILE, NAME); \
- fprintf (FILE, "=0\n"); \
- (*targetm.asm_out.globalize_label) (FILE, NAME); \
- } \
- } while (0)
-
/* Globalizing directive for a label. */
#define GLOBAL_ASM_OP "\t.globl "
#define TARGET_ASM_GLOBALIZE_LABEL darwin_globalize_label