diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3f374681d84..854a569ffc9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2001-06-27 Stan Shebs + + * objc/objc-act.c (handle_impent): Rewrite to be more portable + and to use ASM_DECLARE_CLASS_REFERENCE. + * config/darwin.h (ASM_DECLARE_CLASS_REFERENCE): Rename from + undocumented DECLARE_CLASS_REFERENCE, add file argument. + * doc/tm.texi (ASM_DECLARE_CLASS_REFERENCE): Document. + Wed Jun 27 18:01:09 2001 Jeffrey A Law (law@cygnus.com) * simplify-rtx.c (simplify_rtx): Canonicalize commutative expressions @@ -1122,7 +1130,7 @@ Tue Jun 12 12:20:12 CEST 2001 Jan Hubicka 2001-06-11 Stan Shebs - * darwin.h (ASM_FILE_END): Remove decl of language_string. + * config/darwin.h (ASM_FILE_END): Remove decl of language_string. 2001-06-11 Stephane Carrez @@ -1178,7 +1186,7 @@ Tue Jun 12 12:20:12 CEST 2001 Jan Hubicka 2001-06-11 Stan Shebs - * darwin.c (darwin_encode_section_info): Rewrite to simplify + * config/darwin.c (darwin_encode_section_info): Rewrite to simplify and fix coding mistakes. 2001-06-11 Nick Clifton diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h index d90af772a2a..c3a0a91c613 100644 --- a/gcc/config/darwin.h +++ b/gcc/config/darwin.h @@ -663,12 +663,12 @@ void alias_section (name, alias) \ } \ } while (0) -#define DECLARE_CLASS_REFERENCE(NAME) \ - do { extern FILE* asm_out_file; \ - if (asm_out_file) { \ - fprintf (asm_out_file, "\t"); \ - assemble_name (asm_out_file, NAME); \ - fprintf (asm_out_file, "=0\n"); \ +#define ASM_DECLARE_CLASS_REFERENCE(FILE,NAME) \ + do { \ + if (FILE) { \ + fprintf (FILE, "\t"); \ + assemble_name (FILE, NAME); \ + fprintf (FILE, "=0\n"); \ assemble_global (NAME); \ } \ } while (0) diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 124a05f345e..991672cd353 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -6374,6 +6374,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_CLASS_REFERENCE +@item ASM_DECLARE_CLASS_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 +Objective-C class reference. This is only needed for targets whose +linkers have special support for NeXT-style runtimes. + @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 diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index af9a8bb858d..f059472112a 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -8392,6 +8392,8 @@ static void handle_impent (impent) struct imp_entry *impent; { + char *string; + implementation_context = impent->imp_context; implementation_template = impent->imp_template; @@ -8399,62 +8401,45 @@ handle_impent (impent) { const char *class_name = IDENTIFIER_POINTER (CLASS_NAME (impent->imp_context)); - char *string = (char *) alloca (strlen (class_name) + 30); - if (flag_next_runtime) - { - /* Grossly unportable. - People should know better than to assume - such things about assembler syntax! */ - sprintf (string, ".objc_class_name_%s=0", class_name); - assemble_asm (my_build_string (strlen (string) + 1, string)); + string = (char *) alloca (strlen (class_name) + 30); - sprintf (string, ".globl .objc_class_name_%s", class_name); - assemble_asm (my_build_string (strlen (string) + 1, string)); - } - - else - { - sprintf (string, "%sobjc_class_name_%s", - (flag_next_runtime ? "." : "__"), class_name); - assemble_global (string); - assemble_label (string); - } + sprintf (string, "*%sobjc_class_name_%s", + (flag_next_runtime ? "." : "__"), class_name); } - else if (TREE_CODE (impent->imp_context) == CATEGORY_IMPLEMENTATION_TYPE) { const char *class_name = IDENTIFIER_POINTER (CLASS_NAME (impent->imp_context)); const char *class_super_name = - IDENTIFIER_POINTER (CLASS_SUPER_NAME (impent->imp_context)); - char *string = (char *) alloca (strlen (class_name) - + strlen (class_super_name) + 30); + IDENTIFIER_POINTER (CLASS_SUPER_NAME (impent->imp_context)); - /* Do the same for categories. Even though no references to these - symbols are generated automatically by the compiler, it gives - you a handle to pull them into an archive by hand. */ - if (flag_next_runtime) - { - /* Grossly unportable. */ - sprintf (string, ".objc_category_name_%s_%s=0", - class_name, class_super_name); - assemble_asm (my_build_string (strlen (string) + 1, string)); + string = (char *) alloca (strlen (class_name) + + strlen (class_super_name) + 30); - sprintf (string, ".globl .objc_category_name_%s_%s", - class_name, class_super_name); - assemble_asm (my_build_string (strlen (string) + 1, string)); - } - - else - { - sprintf (string, "%sobjc_category_name_%s_%s", - (flag_next_runtime ? "." : "__"), - class_name, class_super_name); - assemble_global (string); - assemble_label (string); - } + /* Do the same for categories. Even though no references to + these symbols are generated automatically by the compiler, it + gives you a handle to pull them into an archive by hand. */ + sprintf (string, "*%sobjc_category_name_%s_%s", + (flag_next_runtime ? "." : "__"), class_name, class_super_name); } + else + return; + +#ifdef ASM_DECLARE_CLASS_REFERENCE + if (flag_next_runtime) + { + ASM_DECLARE_CLASS_REFERENCE (asm_out_file, string); + return; + } +#endif + + /* (Should this be a routine in varasm.c?) */ + readonly_data_section (); + assemble_global (string); + assemble_align (UNITS_PER_WORD); + assemble_label (string); + assemble_zeros (UNITS_PER_WORD); } void