aboutsummaryrefslogtreecommitdiff
path: root/gas/config/tc-hppa.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2002-02-12 11:08:54 +0000
committerAlan Modra <amodra@gmail.com>2002-02-12 11:08:54 +0000
commit3dcfe21d78014aff95d5ea419933edb5a9570a83 (patch)
tree0bc522e34aa73a7b43690253025d272b3e8cb8e0 /gas/config/tc-hppa.c
parent189c656394b363dd914e9ab167c5cc8da45cd927 (diff)
downloadgdb-3dcfe21d78014aff95d5ea419933edb5a9570a83.zip
gdb-3dcfe21d78014aff95d5ea419933edb5a9570a83.tar.gz
gdb-3dcfe21d78014aff95d5ea419933edb5a9570a83.tar.bz2
* config/tc-hppa.c (hppa_fix_adjustable): Don't adjust final types
that implicitly use LR and RR selectors.
Diffstat (limited to 'gas/config/tc-hppa.c')
-rw-r--r--gas/config/tc-hppa.c57
1 files changed, 54 insertions, 3 deletions
diff --git a/gas/config/tc-hppa.c b/gas/config/tc-hppa.c
index 3ec1bf3..5c0f709 100644
--- a/gas/config/tc-hppa.c
+++ b/gas/config/tc-hppa.c
@@ -57,8 +57,10 @@ typedef elf_symbol_type obj_symbol_type;
#if TARGET_ARCH_SIZE == 64
/* How to generate a relocation. */
#define hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type
+#define elf_hppa_reloc_final_type elf64_hppa_reloc_final_type
#else
#define hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type
+#define elf_hppa_reloc_final_type elf32_hppa_reloc_final_type
#endif
/* ELF objects can have versions, but apparently do not have anywhere
@@ -8373,6 +8375,7 @@ int
hppa_fix_adjustable (fixp)
fixS *fixp;
{
+ reloc_type code;
struct hppa_fix_struct *hppa_fix;
hppa_fix = (struct hppa_fix_struct *) fixp->tc_fix_data;
@@ -8384,9 +8387,57 @@ hppa_fix_adjustable (fixp)
#endif
#ifdef OBJ_ELF
- if (fixp->fx_r_type == (int) R_PARISC_GNU_VTINHERIT
- || fixp->fx_r_type == (int) R_PARISC_GNU_VTENTRY)
- return 0;
+ /* LR/RR selectors are implicitly used for a number of different relocation
+ types. We must ensure that none of these types are adjusted (see below)
+ even if they occur with a different selector. */
+ code = elf_hppa_reloc_final_type (stdoutput, fixp->fx_r_type,
+ hppa_fix->fx_r_format,
+ hppa_fix->fx_r_field);
+
+ switch (code)
+ {
+ /* Relocation types which use e_lrsel. */
+ case R_PARISC_DIR21L:
+ case R_PARISC_DLTIND21L:
+ case R_PARISC_DLTREL21L:
+ case R_PARISC_DPREL21L:
+ case R_PARISC_LTOFF_FPTR21L:
+ case R_PARISC_LTOFF_TP21L:
+ case R_PARISC_PCREL21L:
+ case R_PARISC_PLABEL21L:
+ case R_PARISC_PLTOFF21L:
+
+ /* Relocation types which use e_rrsel. */
+ case R_PARISC_DIR14R:
+ case R_PARISC_DIR14DR:
+ case R_PARISC_DIR14WR:
+ case R_PARISC_DIR17R:
+ case R_PARISC_DLTIND14R:
+ case R_PARISC_DLTIND14DR:
+ case R_PARISC_DLTIND14WR:
+ case R_PARISC_DLTREL14R:
+ case R_PARISC_DLTREL14DR:
+ case R_PARISC_DLTREL14WR:
+ case R_PARISC_DPREL14R:
+ case R_PARISC_DPREL14DR:
+ case R_PARISC_DPREL14WR:
+ case R_PARISC_PCREL14R:
+ case R_PARISC_PCREL17R:
+ case R_PARISC_PLABEL14R:
+ case R_PARISC_LTOFF_FPTR14R:
+ case R_PARISC_LTOFF_FPTR14DR:
+ case R_PARISC_LTOFF_FPTR14WR:
+ case R_PARISC_LTOFF_TP14R:
+ case R_PARISC_LTOFF_TP14DR:
+ case R_PARISC_LTOFF_TP14WR:
+
+ /* Other types that we reject for reduction. */
+ case R_PARISC_GNU_VTENTRY:
+ case R_PARISC_GNU_VTINHERIT:
+ return 0;
+ default:
+ break;
+ }
#endif
if (fixp->fx_addsy && (S_IS_EXTERNAL (fixp->fx_addsy)