OSDN Git Service

* objc/objc-act.c (handle_class_ref): Rewrite to flush target
authorshebs <shebs@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 29 Apr 2001 00:12:51 +0000 (00:12 +0000)
committershebs <shebs@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 29 Apr 2001 00:12:51 +0000 (00:12 +0000)
        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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@41666 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/darwin.h
gcc/objc/objc-act.c
gcc/tm.texi

index dc3261a..3327ea4 100644 (file)
@@ -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.
        
index fa90241..4de7078 100644 (file)
@@ -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)
 
index 75789bf..d29c6f2 100644 (file)
@@ -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
index 7d0242e..bbc8cf2 100644 (file)
@@ -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