pa.c (hppa_encode_label): New variable "permanent" to where/how memory is allocated...
authorJeff Law <law@gcc.gnu.org>
Sun, 21 May 1995 05:05:25 +0000 (23:05 -0600)
committerJeff Law <law@gcc.gnu.org>
Sun, 21 May 1995 05:05:25 +0000 (23:05 -0600)
       * pa.c (hppa_encode_label): New variable "permanent" to
        where/how memory is allocated for the new label.  All
        callers changed.

From-SVN: r9759

gcc/config/pa/pa.c
gcc/config/pa/pa.h

index be95729..b402396 100644 (file)
@@ -4247,15 +4247,26 @@ extern struct obstack *saveable_obstack;
 /* In HPUX 8.0's shared library scheme, special relocations are needed
    for function labels if they might be passed to a function
    in a shared library (because shared libraries don't live in code
-   space), and special magic is needed to construct their address. */
+   space), and special magic is needed to construct their address.
+
+   For reasons too disgusting to describe storage for the new name
+   is allocated either on the saveable_obstack (released at function
+   exit) or via malloc for things that can never change (libcall names
+   for example). */
 
 void
-hppa_encode_label (sym)
+hppa_encode_label (sym, permanent)
      rtx sym;
+     int permanent;
 {
   char *str = XSTR (sym, 0);
   int len = strlen (str);
-  char *newstr = obstack_alloc (saveable_obstack, len + 2) ;
+  char *newstr;
+
+  if (permanent)
+    newstr = malloc (len + 2);
+  else
+    newstr = obstack_alloc (saveable_obstack, len + 2);
 
   if (str[0] == '*')
     *newstr++ = *str++;
index 8ab2021..62a1ae8 100644 (file)
@@ -1511,7 +1511,7 @@ do                                                        \
          _rtl = TREE_CST_RTL (DECL);                   \
        SYMBOL_REF_FLAG (XEXP (_rtl, 0)) = 1;           \
        if (TREE_CODE (DECL) == FUNCTION_DECL)          \
-         hppa_encode_label (XEXP (DECL_RTL (DECL), 0));\
+         hppa_encode_label (XEXP (DECL_RTL (DECL), 0), 0);\
       }                                                        \
   }                                                    \
 while (0)
@@ -1897,7 +1897,7 @@ readonly_data ()                                                  \
 #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, RTL) \
   do { fputs ("\t.IMPORT ", FILE);                                     \
        if (!function_label_operand (RTL, VOIDmode))                    \
-        hppa_encode_label (RTL);                                       \
+        hppa_encode_label (RTL, 1);                                    \
        assemble_name (FILE, XSTR ((RTL), 0));                          \
        fputs (",CODE\n", FILE);                                                \
      } while (0)