aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorStan Shebs <shebs@apple.com>2001-04-29 00:12:51 +0000
committerStan Shebs <shebs@gcc.gnu.org>2001-04-29 00:12:51 +0000
commit28df0b5ae3b6d7905de50fad4b5091dc7eb695a3 (patch)
treec3a72e15a098bd16c87919299d256399f54003cf /gcc
parentf37f462aa63f3290f973f7b30288ea70373969a8 (diff)
downloadgcc-28df0b5ae3b6d7905de50fad4b5091dc7eb695a3.zip
gcc-28df0b5ae3b6d7905de50fad4b5091dc7eb695a3.tar.gz
gcc-28df0b5ae3b6d7905de50fad4b5091dc7eb695a3.tar.bz2
objc-act.c (handle_class_ref): Rewrite to flush target specific code and use new macro...
* objc/objc-act.c (handle_class_ref): Rewrite to flush target specific code and use new macro ASM_DECLARE_UNRESOLVED_REFERENCE. * config/darwin.h (ASM_DECLARE_UNRESOLVED_REFERENCE): Define. * tm.texi (ASM_DECLARE_UNRESOLVED_REFERENCE): Document. From-SVN: r41666
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/darwin.h14
-rw-r--r--gcc/objc/objc-act.c61
-rw-r--r--gcc/tm.texi7
4 files changed, 48 insertions, 39 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index dc3261a..3327ea4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2001-04-28 Stan Shebs <shebs@apple.com>
+ * objc/objc-act.c (handle_class_ref): Rewrite to flush target
+ specific code and use new macro ASM_DECLARE_UNRESOLVED_REFERENCE.
+ * config/darwin.h (ASM_DECLARE_UNRESOLVED_REFERENCE): Define.
+ * tm.texi (ASM_DECLARE_UNRESOLVED_REFERENCE): Document.
+
* config/darwin.h (STANDARD_EXEC_PREFIX): Don't define.
(NEXT_OBJC_RUNTIME): Define.
diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h
index fa90241..4de7078 100644
--- a/gcc/config/darwin.h
+++ b/gcc/config/darwin.h
@@ -648,15 +648,15 @@ void alias_section (name, alias) \
} \
while (0)
-#define DECLARE_UNRESOLVED_REFERENCE(NAME) \
- do { extern FILE* asm_out_file; \
- if (asm_out_file) { \
+#define ASM_DECLARE_UNRESOLVED_REFERENCE(FILE,NAME) \
+ do { \
+ if (FILE) { \
if (flag_pic) \
- fprintf (asm_out_file, "\t.lazy_reference "); \
+ fprintf (FILE, "\t.lazy_reference "); \
else \
- fprintf (asm_out_file, "\t.reference "); \
- assemble_name (asm_out_file, NAME); \
- fprintf (asm_out_file, "\n"); \
+ fprintf (FILE, "\t.reference "); \
+ assemble_name (FILE, NAME); \
+ fprintf (FILE, "\n"); \
} \
} while (0)
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index 75789bf..d29c6f2 100644
--- a/gcc/objc/objc-act.c
+++ b/gcc/objc/objc-act.c
@@ -8355,46 +8355,43 @@ handle_class_ref (chain)
tree chain;
{
const char *name = IDENTIFIER_POINTER (TREE_VALUE (chain));
- if (! flag_next_runtime)
- {
- tree decl;
- char *string = (char *) alloca (strlen (name) + 30);
- tree exp;
+ char *string = (char *) alloca (strlen (name) + 30);
+ tree decl;
+ tree exp;
- sprintf (string, "%sobjc_class_name_%s",
- (flag_next_runtime ? "." : "__"), name);
+ sprintf (string, "%sobjc_class_name_%s",
+ (flag_next_runtime ? "." : "__"), name);
- /* Make a decl for this name, so we can use its address in a tree. */
- decl = build_decl (VAR_DECL, get_identifier (string), char_type_node);
- DECL_EXTERNAL (decl) = 1;
- TREE_PUBLIC (decl) = 1;
+#ifdef ASM_DECLARE_UNRESOLVED_REFERENCE
+ if (flag_next_runtime)
+ {
+ ASM_DECLARE_UNRESOLVED_REFERENCE (asm_out_file, string);
+ return;
+ }
+#endif
- pushdecl (decl);
- rest_of_decl_compilation (decl, 0, 0, 0);
+ /* Make a decl for this name, so we can use its address in a tree. */
+ decl = build_decl (VAR_DECL, get_identifier (string), char_type_node);
+ DECL_EXTERNAL (decl) = 1;
+ TREE_PUBLIC (decl) = 1;
+
+ pushdecl (decl);
+ rest_of_decl_compilation (decl, 0, 0, 0);
- /* Make following constant read-only (why not)? */
- readonly_data_section ();
+ /* Make following constant read-only, but only for GNU runtime. */
+ if (!flag_next_runtime)
+ readonly_data_section ();
- exp = build1 (ADDR_EXPR, string_type_node, decl);
+ exp = build1 (ADDR_EXPR, string_type_node, decl);
- /* Align the section properly. */
- assemble_constant_align (exp);
+ /* Align the section properly. */
+ assemble_constant_align (exp);
- /* Inform the assembler about this new external thing. */
- assemble_external (decl);
+ /* Inform the assembler about this new external thing. */
+ assemble_external (decl);
- /* Output a constant to reference this address. */
- output_constant (exp, int_size_in_bytes (string_type_node));
- }
- else
- {
- /* This overreliance on our assembler (i.e. lack of portability)
- should be dealt with at some point. The GNU strategy (above)
- won't work either, but it is a start. */
- char *string = (char *) alloca (strlen (name) + 30);
- sprintf (string, ".reference .objc_class_name_%s", name);
- assemble_asm (my_build_string (strlen (string) + 1, string));
- }
+ /* Output a constant to reference this address. */
+ output_constant (exp, int_size_in_bytes (string_type_node));
}
static void
diff --git a/gcc/tm.texi b/gcc/tm.texi
index 7d0242e..bbc8cf2 100644
--- a/gcc/tm.texi
+++ b/gcc/tm.texi
@@ -6270,6 +6270,13 @@ in a category); and @var{sel_name} is the name of the selector.
On systems where the assembler can handle quoted names, you can use this
macro to provide more human-readable names.
+
+@findex ASM_DECLARE_UNRESOLVED_REFERENCE
+@item ASM_DECLARE_UNRESOLVED_REFERENCE (@var{stream}, @var{name})
+A C statement (sans semicolon) to output to the stdio stream
+@var{stream} commands to declare that the label @var{name} is an
+unresolved Objective-C class reference. This is only needed for targets
+whose linkers have special support for NeXT-style runtimes.
@end table
@node Initialization