Partial Fix PR/10129
authorAndrew Pinski <pinskia@physics.uc.edu>
Wed, 16 Jul 2003 19:05:53 +0000 (19:05 +0000)
committerAndrew Pinski <pinskia@gcc.gnu.org>
Wed, 16 Jul 2003 19:05:53 +0000 (12:05 -0700)
2003-07-17  Andrew Pinski  <pinskia@physics.uc.edu>

        Partial Fix PR/10129
        * config/darwin.c (machopic_function_base_name): Only Return "<pic base>".
        (machopic_output_function_base_name): New; print the true pic label.
        (machopic_classify_ident): Pic Base is always a defined data.
        * config/darwin.h (ASM_OUTPUT_LABELREF): Support the pic base label.
        * config/darwin-proto.h (machopic_output_function_base_name): Prototype.

From-SVN: r69472

gcc/ChangeLog
gcc/config/darwin-protos.h
gcc/config/darwin.c
gcc/config/darwin.h

index 5778c5c8e1f4570185a3b8ec55a5367282ceffc2..5a893d24b95ee92e38d4cce81156f6e9dd520f68 100644 (file)
@@ -1,3 +1,12 @@
+2003-07-17  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       Partial Fix PR/10129
+       * config/darwin.c (machopic_function_base_name): Only Return "<pic base>".
+       (machopic_output_function_base_name): New; print the true pic label.
+       (machopic_classify_ident): Pic Base is always a defined data.
+       * config/darwin.h (ASM_OUTPUT_LABELREF): Support the pic base label.
+       * config/darwin-proto.h (machopic_output_function_base_name): Prototype.
+
 2003-07-16  Andrew Pinski  <pinskia@physics.uc.edu>
 
        * gcse.c (gcse_constant_p): COMPARE of the same registers is a constant
index ad8b2340ae6ebd27a8c9185892f446d9540d7bdb..f17f5ab81968d2ca3136dc15185ad7273ec71bab 100644 (file)
@@ -23,6 +23,7 @@ extern int name_needs_quotes PARAMS ((const char *));
 extern void machopic_validate_stub_or_non_lazy_ptr PARAMS ((const char *, int));
 
 extern const char *machopic_function_base_name PARAMS ((void));
+extern void machopic_output_function_base_name (FILE *);
 extern const char *machopic_non_lazy_ptr_name PARAMS ((const char*));
 extern const char *machopic_stub_name PARAMS ((const char*));
 
index d57c293eadab06ac8927fb9e9676278ce62708fb..ab438ecfc1750de250cff907d4b68c0887039cb4 100644 (file)
@@ -81,6 +81,10 @@ machopic_classify_ident (ident)
                     && name[4] == 'C'
                     && name[5] == '_'));
   tree temp;
+  
+  /* The PIC base symbol is always defined. */
+  if (! strcmp (name, "<pic base>"))
+    return MACHOPIC_DEFINED_DATA;
 
   if (name[0] != '!')
     {
@@ -218,54 +222,46 @@ machopic_define_name (name)
   machopic_define_ident (get_identifier (name));
 }
 
-/* This is a static to make inline functions work.  The rtx
-   representing the PIC base symbol always points to here.  
-
-   FIXME: The rest of the compiler doesn't expect strings to change.  */
-
 static GTY(()) char * function_base;
-static GTY(()) const char * function_base_func_name;
-static GTY(()) int current_pic_label_num;
 
 const char *
 machopic_function_base_name ()
 {
   const char *current_name;
-
   /* if dynamic-no-pic is on, we should not get here */
   if (MACHO_DYNAMIC_NO_PIC_P)
     abort ();
   current_name = 
     IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (current_function_decl));
 
-  if (function_base_func_name != current_name)
-    {
-      current_function_uses_pic_offset_table = 1;
+  if (function_base == NULL)
+    function_base = 
+      (char *) ggc_alloc_string ("<pic base>", sizeof ("<pic base>"));
 
-      /* Save mucho space and time.  Some of the C++ mangled names are over
-        700 characters long!  Note that we produce a label containing a '-'
-        if the function we're compiling is an Objective-C method, as evinced
-        by the incredibly scientific test below.  This is because code in
-        rs6000.c makes the same ugly test when loading the PIC reg.  */
-      /* It's hard to describe just how ugly this is.  The reason for
-         the '%011d' is that after a PCH load, we can't change the
-         size of the string, because PCH will have uniqued it and
-         allocated it in the string pool.  */
-      if (function_base == NULL)
-       function_base = 
-         (char *) ggc_alloc_string ("", sizeof ("*\"L12345678901$pb\""));
+  current_function_uses_pic_offset_table = 1;
 
-      ++current_pic_label_num;
-      if (*current_name == '+' || *current_name == '-')
-       sprintf (function_base, "*\"L-%010d$pb\"", current_pic_label_num);
-      else
-       sprintf (function_base, "*\"L%011d$pb\"", current_pic_label_num);
+  return function_base;
+}
+
+static GTY(()) const char * function_base_func_name;
+static GTY(()) int current_pic_label_num;
+
+void
+machopic_output_function_base_name (FILE *file)
+{
+  const char *current_name;
 
+  /* If dynamic-no-pic is on, we should not get here. */
+  if (MACHO_DYNAMIC_NO_PIC_P)
+    abort ();
+  current_name = 
+    IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (current_function_decl));
+  if (function_base_func_name != current_name)
+    {
+      ++current_pic_label_num;
       function_base_func_name = current_name;
     }
-
-  return function_base;
+  fprintf (file, "\"L%011d$pb\"", current_pic_label_num);
 }
 
 static GTY(()) tree machopic_non_lazy_pointers;
index 8a959090c56f270437afea6922671906db30d7b5..4f9b487fc8c51f754e831ca4bb2795739264dde0 100644 (file)
@@ -396,7 +396,9 @@ do { text_section ();                                                       \
 #define ASM_OUTPUT_LABELREF(FILE,NAME)                                      \
   do {                                                                      \
        const char *xname = darwin_strip_name_encoding (NAME);               \
-       if (xname[0] == '&' || xname[0] == '*')                              \
+       if (! strcmp (xname, "<pic base>"))                                  \
+         machopic_output_function_base_name(FILE);                           \
+       else if (xname[0] == '&' || xname[0] == '*')                         \
          {                                                                  \
            int len = strlen (xname);                                        \
           if (len > 6 && !strcmp ("$stub", xname + len - 5))                \