From 28df0b5ae3b6d7905de50fad4b5091dc7eb695a3 Mon Sep 17 00:00:00 2001 From: Stan Shebs Date: Sun, 29 Apr 2001 00:12:51 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 ++++ gcc/config/darwin.h | 14 +++++------ gcc/objc/objc-act.c | 61 +++++++++++++++++++++------------------------ gcc/tm.texi | 7 ++++++ 4 files changed, 48 insertions(+), 39 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dc3261a6cb7..3327ea4ce62 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2001-04-28 Stan Shebs + * 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 fa902410625..4de7078ed2c 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 75789bf3e5f..d29c6f20ab9 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 7d0242e169f..bbc8cf2fdfc 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 -- 2.30.2