Support hand-crafted .PARISC.unwind entries
[binutils-gdb.git] / gas / config / tc-hppa.c
index ac258ce307b90f0394b97e045f80d1a23386d141..f87b57a12df3f50134bf54deffc37e2e9ba7ef49 100644 (file)
@@ -4047,14 +4047,6 @@ tc_gen_reloc (section, fixp)
 
       code = *codes[0];
 
-      reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
-      *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
-      reloc->howto = bfd_reloc_type_lookup (stdoutput,
-                                           (bfd_reloc_code_real_type) code);
-      reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
-
-      assert (reloc->howto && (unsigned int) code == reloc->howto->type);
-
       /* Now, do any processing that is dependent on the relocation type.  */
       switch (code)
        {
@@ -4088,10 +4080,24 @@ tc_gen_reloc (section, fixp)
          break;
 #endif
 
+       case R_PARISC_DIR32:
+         /* Facilitate hand-crafted unwind info.  */
+         if (strcmp (section->name, UNWIND_SECTION_NAME) == 0)
+           code = R_PARISC_SEGREL32;
+         /* Fall thru */
+
        default:
          reloc->addend = fixp->fx_offset;
          break;
        }
+
+      reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
+      *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
+      reloc->howto = bfd_reloc_type_lookup (stdoutput,
+                                           (bfd_reloc_code_real_type) code);
+      reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
+
+      assert (reloc->howto && (unsigned int) code == reloc->howto->type);
       break;
     }
 #else /* OBJ_SOM */