* config/tc-hppa.c (pa_build_unwind_subspace): Replace start symbol
authorDave Anglin <dave.anglin@nrc.ca>
Fri, 30 Oct 2009 17:05:58 +0000 (17:05 +0000)
committerDave Anglin <dave.anglin@nrc.ca>
Fri, 30 Oct 2009 17:05:58 +0000 (17:05 +0000)
with local symbol.

gas/ChangeLog
gas/config/tc-hppa.c

index b9269cf957f2756d2f8aa6153f60a22fbd94533b..459697b90f285bcf72597fdb7403ca67f4ea7adc 100644 (file)
@@ -1,3 +1,8 @@
+2009-10-30  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+       * config/tc-hppa.c (pa_build_unwind_subspace): Replace start symbol
+       with local symbol.
+
 2009-10-29  Sebastian Pop  <sebastian.pop@amd.com>
 
        * config/tc-i386.c (build_modrm_byte): Do not swap REG and
index 371f9f06dcdc95d3ed6d362d364e07e01f7f34a6..8823db2d27f0566f48d928859226ff7b48c8074a 100644 (file)
@@ -5961,13 +5961,41 @@ pa_build_unwind_subspace (struct call_info *call_info)
   subsegT save_subseg;
   unsigned int unwind;
   int reloc;
-  char *p;
+  char *name, *p;
+  symbolS *symbolP;
 
   if ((bfd_get_section_flags (stdoutput, now_seg)
        & (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
       != (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
     return;
 
+  /* Replace the start symbol with a local symbol that will be reduced
+     to a section offset.  This avoids problems with weak functions with
+     multiple definitions, etc.  */
+  name = xmalloc (strlen ("L$\001start_")
+                 + strlen (S_GET_NAME (call_info->start_symbol))
+                 + 1);
+  strcpy (name, "L$\001start_");
+  strcat (name, S_GET_NAME (call_info->start_symbol));
+
+  /* If we have a .procend preceded by a .exit, then the symbol will have
+     already been defined.  In that case, we don't want another unwind
+     entry.  */
+  symbolP = symbol_find (name);
+  if (symbolP)
+    {
+      xfree (name);
+      return;
+    }
+  else
+    {
+      symbolP = symbol_new (name, now_seg,
+                           S_GET_VALUE (call_info->start_symbol), frag_now);
+      gas_assert (symbolP);
+      S_CLEAR_EXTERNAL (symbolP);
+      symbol_table_insert (symbolP);
+    }
+
   reloc = R_PARISC_SEGREL32;
   save_seg = now_seg;
   save_subseg = now_subseg;
@@ -5993,7 +6021,7 @@ pa_build_unwind_subspace (struct call_info *call_info)
   /* Relocation info. for start offset of the function.  */
   md_number_to_chars (p, 0, 4);
   fix_new_hppa (frag_now, p - frag_now->fr_literal, 4,
-               call_info->start_symbol, (offsetT) 0,
+               symbolP, (offsetT) 0,
                (expressionS *) NULL, 0, reloc,
                e_fsel, 32, 0, 0);