* emulparms/elf64hppa.h (OTHER_READWRITE_SECTIONS): No longer combine
[deliverable/binutils-gdb.git] / bfd / elf-hppa.h
CommitLineData
9e103c9c 1/* Common code for PA ELF implementations.
5f771d47 2 Copyright (C) 1999 Free Software Foundation, Inc.
9e103c9c
JL
3
4This file is part of BFD, the Binary File Descriptor library.
5
6This program is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2 of the License, or
9(at your option) any later version.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with this program; if not, write to the Free Software
18Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19
20#define ELF_HOWTO_TABLE_SIZE R_PARISC_UNIMPLEMENTED + 1
21
2eb429af
JL
22/* This file is included by multiple PA ELF BFD backends with different
23 sizes.
24
25 Most of the routines are written to be size independent, but sometimes
26 external constraints require 32 or 64 bit specific code. We remap
27 the definitions/functions as necessary here. */
9e103c9c
JL
28#if ARCH_SIZE == 64
29#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
2eb429af 30#define ELF_R_SYM(X) ELF64_R_SYM(X)
9e103c9c 31#define _bfd_elf_hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type
2eb429af
JL
32#define elf_hppa_relocate_section elf64_hppa_relocate_section
33#define bfd_elf_bfd_final_link bfd_elf64_bfd_final_link
34#define elf_hppa_final_link elf64_hppa_final_link
9e103c9c
JL
35#endif
36#if ARCH_SIZE == 32
37#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
2eb429af 38#define ELF_R_SYM(X) ELF32_R_SYM(X)
9e103c9c 39#define _bfd_elf_hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type
2eb429af
JL
40#define elf_hppa_relocate_section elf32_hppa_relocate_section
41#define bfd_elf_bfd_final_link bfd_elf32_bfd_final_link
42#define elf_hppa_final_link elf32_hppa_final_link
9e103c9c
JL
43#endif
44
2eb429af
JL
45static boolean
46elf_hppa_relocate_section
47 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
48 bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
49
50static bfd_reloc_status_type elf_hppa_final_link_relocate
be7582f3
JL
51 PARAMS ((Elf_Internal_Rela *, bfd *, bfd *, asection *,
52 bfd_byte *, bfd_vma, struct bfd_link_info *,
53 asection *, struct elf_link_hash_entry *,
54 struct elf64_hppa_dyn_hash_entry *));
2eb429af
JL
55
56static unsigned long elf_hppa_relocate_insn
be7582f3 57 PARAMS ((unsigned long, long, unsigned long));
2eb429af
JL
58
59static boolean elf_hppa_add_symbol_hook
f273939b 60 PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
2eb429af
JL
61 const char **, flagword *, asection **, bfd_vma *));
62
63static boolean elf_hppa_final_link
64 PARAMS ((bfd *, struct bfd_link_info *));
65
af7dc644
JL
66static boolean elf_hppa_unmark_useless_dynamic_symbols
67 PARAMS ((struct elf_link_hash_entry *, PTR));
68
69static boolean elf_hppa_remark_useless_dynamic_symbols
70 PARAMS ((struct elf_link_hash_entry *, PTR));
71
2ec0dd12
JL
72static void elf_hppa_record_segment_addrs
73 PARAMS ((bfd *, asection *, PTR));
74
9e103c9c
JL
75/* ELF/PA relocation howto entries. */
76
77static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
78{
be7582f3 79 {R_PARISC_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_NONE"},
9e103c9c
JL
80
81 /* The values in DIR32 are to placate the check in
82 _bfd_stab_section_find_nearest_line. */
caf3d37c 83 {R_PARISC_DIR32, 0, 2, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR32", false, 0, 0xffffffff, false},
be7582f3
JL
84 {R_PARISC_DIR21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR21L"},
85 {R_PARISC_DIR17R, 0, 0, 17, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR17R"},
86 {R_PARISC_DIR17F, 0, 0, 17, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR17F"},
87 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
88 {R_PARISC_DIR14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR14R"},
89 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
90 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
91 {R_PARISC_PCREL32, 0, 0, 32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL32"},
92
93 {R_PARISC_PCREL21L, 0, 0, 21, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL21L"},
94 {R_PARISC_PCREL17R, 0, 0, 17, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL17R"},
95 {R_PARISC_PCREL17F, 0, 0, 17, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL17F"},
96 {R_PARISC_PCREL17C, 0, 0, 17, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL17C"},
97 {R_PARISC_PCREL14R, 0, 0, 14, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL14R"},
98 {R_PARISC_PCREL14F, 0, 0, 14, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL14F"},
99 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
100 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
101 {R_PARISC_DPREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DPREL21L"},
102 {R_PARISC_DPREL14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DPREL14WR"},
103
104 {R_PARISC_DPREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DPREL14DR"},
105 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
106 {R_PARISC_DPREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DPREL14R"},
107 {R_PARISC_DPREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DPREL14F"},
108 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
109 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
110 {R_PARISC_DLTREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTREL21L"},
111 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
112 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
113 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
114
115 {R_PARISC_DLTREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTREL14R"},
116 {R_PARISC_DLTREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTREL14F"},
117 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
118 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
119 {R_PARISC_DLTIND21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTIND21L"},
120 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
121 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
122 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
123 {R_PARISC_DLTIND14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTIND14R"},
124 {R_PARISC_DLTIND14F, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTIND14F"},
125
126 {R_PARISC_SETBASE, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SETBASE"},
127 {R_PARISC_SECREL32, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SECREL32"},
128 {R_PARISC_BASEREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL21L"},
129 {R_PARISC_BASEREL17R, 0, 0, 17, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL17R"},
130 {R_PARISC_BASEREL17F, 0, 0, 17, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL17F"},
131 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
132 {R_PARISC_BASEREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL14R"},
133 {R_PARISC_BASEREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL14F"},
134 {R_PARISC_SEGBASE, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SEGBASE"},
135 {R_PARISC_SEGREL32, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SEGREL32"},
136
137 {R_PARISC_PLTOFF21L, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF21L"},
138 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
139 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
140 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
141 {R_PARISC_PLTOFF14R, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF14R"},
142 {R_PARISC_PLTOFF14F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF14F"},
143 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
144 {R_PARISC_LTOFF_FPTR32, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR32"},
145 {R_PARISC_LTOFF_FPTR21L, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR21L"},
146 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
147
148 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
149 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
150 {R_PARISC_LTOFF_FPTR14R, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14R"},
151 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
152 {R_PARISC_FPTR64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_FPTR64"},
153 {R_PARISC_PLABEL32, 0, 0, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLABEL32"},
154 {R_PARISC_PLABEL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLABEL21L"},
155 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
156 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
157 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
158
159 {R_PARISC_PLABEL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLABEL14R"},
160 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
161 {R_PARISC_PCREL64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL64"},
162 {R_PARISC_PCREL22C, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL22C"},
163 {R_PARISC_PCREL22F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL22F"},
164 {R_PARISC_PCREL14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL14WR"},
165 {R_PARISC_PCREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL14DR"},
166 {R_PARISC_PCREL16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL16F"},
167 {R_PARISC_PCREL16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL16WF"},
168 {R_PARISC_PCREL16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL16DF"},
169
170 {R_PARISC_DIR64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR64"},
b7263961
JL
171 {R_PARISC_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_NONE"},
172 {R_PARISC_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_NONE"},
be7582f3
JL
173 {R_PARISC_DIR14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR14WR"},
174 {R_PARISC_DIR14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR14DR"},
175 {R_PARISC_DIR16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR16F"},
176 {R_PARISC_DIR16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR16WF"},
177 {R_PARISC_DIR16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR16DF"},
178 {R_PARISC_GPREL64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_GPREL64"},
179 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
180
181 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
182 {R_PARISC_DLTREL14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTREL14WR"},
183 {R_PARISC_DLTREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTREL14DR"},
184 {R_PARISC_GPREL16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_GPREL16F"},
185 {R_PARISC_GPREL16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_GPREL16WF"},
186 {R_PARISC_GPREL16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_GPREL16DF"},
187 {R_PARISC_LTOFF64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF64"},
188 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
189 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
190 {R_PARISC_DLTIND14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTIND14WR"},
191
192 {R_PARISC_DLTIND14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTIND14DR"},
193 {R_PARISC_LTOFF16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF16F"},
b7263961 194 {R_PARISC_LTOFF16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF"},
be7582f3 195 {R_PARISC_LTOFF16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF"},
be7582f3
JL
196 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
197 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
198 {R_PARISC_BASEREL14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BSEREL14WR"},
199 {R_PARISC_BASEREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL14DR"},
200 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
201 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
202
203 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
204 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
205 {R_PARISC_SEGREL64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SEGREL64"},
206 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
207 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
208 {R_PARISC_PLTOFF14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF14WR"},
209 {R_PARISC_PLTOFF14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF14DR"},
210 {R_PARISC_PLTOFF16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF16F"},
211 {R_PARISC_PLTOFF16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF16WF"},
212 {R_PARISC_PLTOFF16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF16DF"},
213
214 {R_PARISC_LTOFF_FPTR64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
215 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
216 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
217 {R_PARISC_LTOFF_FPTR14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14WR"},
218 {R_PARISC_LTOFF_FPTR14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14DR"},
219 {R_PARISC_LTOFF_FPTR16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16F"},
220 {R_PARISC_LTOFF_FPTR16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16WF"},
221 {R_PARISC_LTOFF_FPTR16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
222 {R_PARISC_COPY, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_COPY"},
223 {R_PARISC_IPLT, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_IPLT"},
224
225 {R_PARISC_EPLT, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_EPLT"},
226 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
227 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
228 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
229 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
230 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
231 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
232 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
233 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
234 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
235
236 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
237 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
238 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
239 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
240 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
241 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
242 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
243 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
244 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
245 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
246
247 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
248 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
249 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
250 {R_PARISC_TPREL32, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_TPREL32"},
251 {R_PARISC_TPREL21L, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_TPREL21L"},
252 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
253 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
254 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
255 {R_PARISC_TPREL14R, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_TPREL14R"},
256 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
257
258 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
259 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
260 {R_PARISC_LTOFF_TP21L, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP21L"},
261 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
262 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
263 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
264 {R_PARISC_LTOFF_TP14R, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
265 {R_PARISC_LTOFF_TP14F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14F"},
266 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
267 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
268
269 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
270 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
271 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
272 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
273 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
274 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
275 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
276 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
277 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
278 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
279
280 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
281 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
282 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
283 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
284 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
285 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
286 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
287 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
288 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
289 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
290
291 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
292 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
293 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
294 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
295 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
296 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
297 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
298 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
299 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
300 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
301
302 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
303 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
304 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
305 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
306 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
307 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
308 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
309 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
310 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
311 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
312
313 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
314 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
315 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
316 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
317 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
318 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
319 {R_PARISC_TPREL64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_TPREL64"},
320 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
321 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
322 {R_PARISC_TPREL14WR, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_TPREL14WR"},
323
324 {R_PARISC_TPREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_TPREL14DR"},
325 {R_PARISC_TPREL16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_TPREL16F"},
326 {R_PARISC_TPREL16WF, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_TPREL16WF"},
327 {R_PARISC_TPREL16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_TPREL16DF"},
328 {R_PARISC_LTOFF_TP64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP64"},
329 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
330 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
331 {R_PARISC_LTOFF_TP14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14WR"},
332 {R_PARISC_LTOFF_TP14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14DR"},
333 {R_PARISC_LTOFF_TP16F, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_LTOFF_TP16F"},
334
335 {R_PARISC_LTOFF_TP16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16WF"},
336 {R_PARISC_LTOFF_TP16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16DF"},
9e103c9c
JL
337};
338
6e2bf930
JL
339#define OFFSET_14R_FROM_21L 4
340#define OFFSET_14F_FROM_21L 5
341
9e103c9c
JL
342/* Return one (or more) BFD relocations which implement the base
343 relocation with modifications based on format and field. */
344
345elf_hppa_reloc_type **
346_bfd_elf_hppa_gen_reloc_type (abfd, base_type, format, field, ignore, sym)
347 bfd *abfd;
348 elf_hppa_reloc_type base_type;
349 int format;
350 int field;
be7582f3
JL
351 int ignore;
352 asymbol *sym;
9e103c9c
JL
353{
354 elf_hppa_reloc_type *finaltype;
355 elf_hppa_reloc_type **final_types;
356
357 /* Allocate slots for the BFD relocation. */
358 final_types = ((elf_hppa_reloc_type **)
359 bfd_alloc (abfd, sizeof (elf_hppa_reloc_type *) * 2));
360 if (final_types == NULL)
361 return NULL;
362
363 /* Allocate space for the relocation itself. */
364 finaltype = ((elf_hppa_reloc_type *)
365 bfd_alloc (abfd, sizeof (elf_hppa_reloc_type)));
366 if (finaltype == NULL)
367 return NULL;
368
369 /* Some reasonable defaults. */
370 final_types[0] = finaltype;
371 final_types[1] = NULL;
372
373#define final_type finaltype[0]
374
375 final_type = base_type;
376
377 /* Just a tangle of nested switch statements to deal with the braindamage
378 that a different field selector means a completely different relocation
379 for PA ELF. */
380 switch (base_type)
381 {
0d571602
JL
382 /* We have been using generic relocation types. However, that may not
383 really make sense. Anyway, we need to support both R_PARISC_DIR64
384 and R_PARISC_DIR32 here. */
385 case R_PARISC_DIR32:
386 case R_PARISC_DIR64:
9e103c9c
JL
387 case R_HPPA_ABS_CALL:
388 switch (format)
389 {
390 case 14:
391 switch (field)
392 {
393 case e_rsel:
394 case e_rrsel:
395 final_type = R_PARISC_DIR14R;
396 break;
397 case e_rtsel:
f31cedf7 398 final_type = R_PARISC_DLTIND14R;
9e103c9c 399 break;
36860900
JL
400 case e_rtpsel:
401 final_type = R_PARISC_LTOFF_FPTR14DR;
402 break;
9e103c9c 403 case e_tsel:
f31cedf7 404 final_type = R_PARISC_DLTIND14F;
9e103c9c
JL
405 break;
406 case e_rpsel:
407 final_type = R_PARISC_PLABEL14R;
408 break;
409 default:
410 return NULL;
411 }
412 break;
413
414 case 17:
415 switch (field)
416 {
417 case e_fsel:
418 final_type = R_PARISC_DIR17F;
419 break;
420 case e_rsel:
421 case e_rrsel:
422 final_type = R_PARISC_DIR17R;
423 break;
424 default:
425 return NULL;
426 }
427 break;
428
429 case 21:
430 switch (field)
431 {
432 case e_lsel:
433 case e_lrsel:
434 final_type = R_PARISC_DIR21L;
435 break;
436 case e_ltsel:
f31cedf7 437 final_type = R_PARISC_DLTIND21L;
9e103c9c 438 break;
36860900
JL
439 case e_ltpsel:
440 final_type = R_PARISC_LTOFF_FPTR21L;
441 break;
9e103c9c
JL
442 case e_lpsel:
443 final_type = R_PARISC_PLABEL21L;
444 break;
445 default:
446 return NULL;
447 }
448 break;
449
450 case 32:
451 switch (field)
452 {
453 case e_fsel:
454 final_type = R_PARISC_DIR32;
432bdd91
JL
455 /* When in 64bit mode, a 32bit relocation is supposed to
456 be a section relative relocation. Dwarf2 (for example)
457 uses 32bit section relative relocations. */
458 if (bfd_get_arch_info (abfd)->bits_per_address != 32)
459 final_type = R_PARISC_SECREL32;
9e103c9c
JL
460 break;
461 case e_psel:
462 final_type = R_PARISC_PLABEL32;
463 break;
464 default:
465 return NULL;
466 }
467 break;
468
6e2bf930
JL
469 case 64:
470 switch (field)
471 {
472 case e_fsel:
473 final_type = R_PARISC_DIR64;
474 break;
475 case e_psel:
36860900
JL
476 final_type = R_PARISC_FPTR64;
477 break;
6e2bf930
JL
478 default:
479 return NULL;
480 }
481 break;
482
9e103c9c
JL
483 default:
484 return NULL;
485 }
486 break;
487
488
489 case R_HPPA_GOTOFF:
490 switch (format)
491 {
492 case 14:
493 switch (field)
494 {
495 case e_rsel:
496 case e_rrsel:
6e2bf930 497 final_type = base_type + OFFSET_14R_FROM_21L;
9e103c9c
JL
498 break;
499 case e_fsel:
6e2bf930 500 final_type = base_type + OFFSET_14F_FROM_21L;
9e103c9c
JL
501 break;
502 default:
503 return NULL;
504 }
505 break;
506
507 case 21:
508 switch (field)
509 {
510 case e_lrsel:
511 case e_lsel:
6e2bf930 512 final_type = base_type;
9e103c9c
JL
513 break;
514 default:
515 return NULL;
516 }
517 break;
518
519 default:
520 return NULL;
521 }
522 break;
523
524
525 case R_HPPA_PCREL_CALL:
526 switch (format)
527 {
528 case 14:
529 switch (field)
530 {
531 case e_rsel:
532 case e_rrsel:
533 final_type = R_PARISC_PCREL14R;
534 break;
535 case e_fsel:
536 final_type = R_PARISC_PCREL14F;
537 break;
538 default:
539 return NULL;
540 }
541 break;
542
543 case 17:
544 switch (field)
545 {
546 case e_rsel:
547 case e_rrsel:
548 final_type = R_PARISC_PCREL17R;
549 break;
550 case e_fsel:
551 final_type = R_PARISC_PCREL17F;
552 break;
553 default:
554 return NULL;
555 }
556 break;
557
341362b5
JL
558 case 22:
559 switch (field)
560 {
561 case e_fsel:
562 final_type = R_PARISC_PCREL22F;
563 break;
564 default:
565 return NULL;
566 }
567 break;
568
9e103c9c
JL
569 case 21:
570 switch (field)
571 {
572 case e_lsel:
573 case e_lrsel:
574 final_type = R_PARISC_PCREL21L;
575 break;
576 default:
577 return NULL;
578 }
579 break;
580
581 default:
582 return NULL;
583 }
584 break;
585
fc91f658
JL
586 case R_PARISC_SEGREL32:
587 case R_PARISC_SEGBASE:
588 /* The defaults are fine for these cases. */
589 break;
590
9e103c9c
JL
591 default:
592 return NULL;
593 }
594
595 return final_types;
596}
597
598/* Translate from an elf into field into a howto relocation pointer. */
599
600static void
601elf_hppa_info_to_howto (abfd, bfd_reloc, elf_reloc)
be7582f3 602 bfd *abfd;
9e103c9c
JL
603 arelent *bfd_reloc;
604 Elf_Internal_Rela *elf_reloc;
605{
606 BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info)
607 < (unsigned int) R_PARISC_UNIMPLEMENTED);
608 bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
609}
610
611/* Translate from an elf into field into a howto relocation pointer. */
612
613static void
614elf_hppa_info_to_howto_rel (abfd, bfd_reloc, elf_reloc)
be7582f3 615 bfd *abfd;
9e103c9c
JL
616 arelent *bfd_reloc;
617 Elf_Internal_Rel *elf_reloc;
618{
619 BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info)
620 < (unsigned int) R_PARISC_UNIMPLEMENTED);
621 bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
622}
623
624/* Return the address of the howto table entry to perform the CODE
625 relocation for an ARCH machine. */
626
627static reloc_howto_type *
628elf_hppa_reloc_type_lookup (abfd, code)
be7582f3 629 bfd *abfd;
9e103c9c
JL
630 bfd_reloc_code_real_type code;
631{
632 if ((int) code < (int) R_PARISC_UNIMPLEMENTED)
633 {
634 BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code);
635 return &elf_hppa_howto_table[(int) code];
636 }
637 return NULL;
638}
95cbae0b
JL
639
640static void
641elf_hppa_final_write_processing (abfd, linker)
642 bfd *abfd;
be7582f3 643 boolean linker;
95cbae0b
JL
644{
645 int mach = bfd_get_mach (abfd);
646
647 elf_elfheader (abfd)->e_flags &= ~(EF_PARISC_ARCH | EF_PARISC_TRAPNIL
648 | EF_PARISC_EXT | EF_PARISC_LSB
649 | EF_PARISC_WIDE | EF_PARISC_NO_KABP
650 | EF_PARISC_LAZYSWAP);
651
652 if (mach == 10)
653 elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_0;
654 else if (mach == 11)
655 elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_1;
656 else if (mach == 20)
3a9acac8
JL
657 elf_elfheader (abfd)->e_flags |= EFA_PARISC_2_0;
658 else if (mach == 25)
659 elf_elfheader (abfd)->e_flags |= EF_PARISC_WIDE | EFA_PARISC_2_0;
95cbae0b 660}
432bdd91
JL
661
662/* Return true if SYM represents a local label symbol. */
663
664static boolean
665elf_hppa_is_local_label_name (abfd, name)
666 bfd *abfd ATTRIBUTE_UNUSED;
667 const char *name;
668{
669 return (name[0] == 'L' && name[1] == '$');
670}
671
052e120f
JL
672/* Set the correct type for an ELF section. We do this by the
673 section name, which is a hack, but ought to work. */
674
675static boolean
676elf_hppa_fake_sections (abfd, hdr, sec)
677 bfd *abfd;
678 Elf64_Internal_Shdr *hdr;
679 asection *sec;
680{
681 register const char *name;
682
683 name = bfd_get_section_name (abfd, sec);
684
685 if (strcmp (name, ".PARISC.unwind") == 0)
686 {
1ca74062 687 int indx;
183df869 688 asection *sec;
052e120f
JL
689 hdr->sh_type = SHT_LOPROC + 1;
690 /* ?!? How are unwinds supposed to work for symbols in arbitrary
691 sections? Or what if we have multiple .text sections in a single
be7582f3 692 .o file? HP really messed up on this one.
052e120f 693
1ca74062
JL
694 Ugh. We can not use elf_section_data (sec)->this_idx at this
695 point because it is not initialized yet.
696
697 So we (gasp) recompute it here. Hopefully nobody ever changes the
698 way sections are numbered in elf.c! */
699 for (sec = abfd->sections, indx = 1; sec; sec = sec->next, indx++)
700 {
701 if (sec->name && strcmp (sec->name, ".text") == 0)
702 {
703 hdr->sh_info = indx;
704 break;
705 }
706 }
be7582f3 707
052e120f
JL
708 /* I have no idea if this is really necessary or what it means. */
709 hdr->sh_entsize = 4;
710 }
711 return true;
712}
713
2eb429af
JL
714/* Hook called by the linker routine which adds symbols from an object
715 file. HP's libraries define symbols with HP specific section
716 indices, which we have to handle. */
717
718static boolean
719elf_hppa_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
720 bfd *abfd;
721 struct bfd_link_info *info ATTRIBUTE_UNUSED;
722 const Elf_Internal_Sym *sym;
723 const char **namep ATTRIBUTE_UNUSED;
724 flagword *flagsp ATTRIBUTE_UNUSED;
725 asection **secp;
726 bfd_vma *valp;
727{
728 int index = sym->st_shndx;
be7582f3 729
2eb429af
JL
730 switch (index)
731 {
732 case SHN_PARISC_ANSI_COMMON:
733 *secp = bfd_make_section_old_way (abfd, ".PARISC.ansi.common");
734 (*secp)->flags |= SEC_IS_COMMON;
735 *valp = sym->st_size;
736 break;
be7582f3 737
2eb429af
JL
738 case SHN_PARISC_HUGE_COMMON:
739 *secp = bfd_make_section_old_way (abfd, ".PARISC.huge.common");
740 (*secp)->flags |= SEC_IS_COMMON;
741 *valp = sym->st_size;
742 break;
743 }
744
745 return true;
746}
747
af7dc644
JL
748static boolean
749elf_hppa_unmark_useless_dynamic_symbols (h, data)
750 struct elf_link_hash_entry *h;
751 PTR data;
752{
753 struct bfd_link_info *info = (struct bfd_link_info *)data;
754
755 /* If we are not creating a shared library, and this symbol is
756 referenced by a shared library but is not defined anywhere, then
757 the generic code will warn that it is undefined.
758
759 This behavior is undesirable on HPs since the standard shared
760 libraries contain reerences to undefined symbols.
761
762 So we twiddle the flags associated with such symbols so that they
763 will not trigger the warning. ?!? FIXME. This is horribly fraglie.
764
765 Ultimately we should have better controls over the generic ELF BFD
766 linker code. */
767 if (! info->relocateable
768 && ! (info->shared
769 && !info->no_undefined)
770 && h->root.type == bfd_link_hash_undefined
771 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0
772 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0)
773 {
774 h->elf_link_hash_flags &= ~ELF_LINK_HASH_REF_DYNAMIC;
775 h->elf_link_hash_flags |= 0x8000;
776 }
777
778 return true;
779}
780
781
782static boolean
783elf_hppa_remark_useless_dynamic_symbols (h, data)
784 struct elf_link_hash_entry *h;
785 PTR data;
786{
787 struct bfd_link_info *info = (struct bfd_link_info *)data;
788
789 /* If we are not creating a shared library, and this symbol is
790 referenced by a shared library but is not defined anywhere, then
791 the generic code will warn that it is undefined.
792
793 This behavior is undesirable on HPs since the standard shared
794 libraries contain reerences to undefined symbols.
795
796 So we twiddle the flags associated with such symbols so that they
228d307f 797 will not trigger the warning. ?!? FIXME. This is horribly fragile.
af7dc644
JL
798
799 Ultimately we should have better controls over the generic ELF BFD
800 linker code. */
801 if (! info->relocateable
802 && ! (info->shared
803 && !info->no_undefined)
804 && h->root.type == bfd_link_hash_undefined
805 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
806 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0
807 && (h->elf_link_hash_flags & 0x8000) != 0)
808 {
809 h->elf_link_hash_flags |= ELF_LINK_HASH_REF_DYNAMIC;
810 h->elf_link_hash_flags &= ~0x8000;
811 }
812
813 return true;
814}
815
2ec0dd12
JL
816/* Record the lowest address for the data and text segments. */
817static void
818elf_hppa_record_segment_addrs (abfd, section, data)
819 bfd *abfd ATTRIBUTE_UNUSED;
820 asection *section;
821 PTR data;
822{
823 struct elf64_hppa_link_hash_table *hppa_info;
824 bfd_vma value;
825
826 hppa_info = (struct elf64_hppa_link_hash_table *)data;
827
828 value = section->vma - section->filepos;
829
830 if ((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY)
831 == (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
832 && value < hppa_info->text_segment_base)
833 hppa_info->text_segment_base = value;
834 else if ((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY)
835 == (SEC_ALLOC | SEC_LOAD))
836 && value < hppa_info->data_segment_base)
837 hppa_info->data_segment_base = value;
838}
839
2eb429af
JL
840/* Called after we have seen all the input files/sections, but before
841 final symbol resolution and section placement has been determined.
842
843 We use this hook to (possibly) provide a value for __gp, then we
844 fall back to the generic ELF final link routine. */
845
846static boolean
847elf_hppa_final_link (abfd, info)
848 bfd *abfd;
849 struct bfd_link_info *info;
850{
af7dc644
JL
851 boolean retval;
852
2eb429af
JL
853 /* Make sure we've got ourselves a suitable __gp value. */
854 if (!info->relocateable)
855 {
2eb429af
JL
856 struct elf_link_hash_entry *gp;
857 bfd_vma gp_val = 0;
858 asection *os;
859
be7582f3
JL
860 /* Find the .opd section. __gp's value should be the same as
861 the start of .PARISC.global section. */
2eb429af
JL
862 for (os = abfd->sections; os ; os = os->next)
863 {
2eb429af
JL
864 /* This would be cleaner if we marked sections with an attribute
865 indicating they are short sections. */
be7582f3
JL
866 if (strcmp (os->name, ".PARISC.global") == 0)
867 break;
2eb429af
JL
868 }
869
be7582f3 870 BFD_ASSERT (os != NULL)
2eb429af 871
be7582f3
JL
872 gp_val = (os->output_section->vma + os->output_offset);
873
874 gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", true,
875 true, false);
876 gp->root.type = bfd_link_hash_defined;
877 gp->root.u.def.section = os;
878 gp->root.u.def.value = 0;
2eb429af
JL
879 _bfd_set_gp_value (abfd, gp_val);
880 }
881
2ec0dd12
JL
882 /* We need to know the base of the text and data segments so that we
883 can perform SEGREL relocations. We will recore the base addresses
884 when we encounter the first SEGREL relocation. */
885 elf64_hppa_hash_table (info)->text_segment_base = (bfd_vma)-1;
886 elf64_hppa_hash_table (info)->data_segment_base = (bfd_vma)-1;
887
af7dc644
JL
888 /* HP's shared libraries have references to symbols that are not
889 defined anywhere. The generic ELF BFD linker code will complaim
890 about such symbols.
891
892 So we detect the losing case and arrange for the flags on the symbol
893 to indicate that it was never referenced. This keeps the generic
894 ELF BFD link code happy and appears to not create any secondary
895 problems. Ultimately we need a way to control the behavior of the
896 generic ELF BFD link code better. */
897 elf_link_hash_traverse (elf_hash_table (info),
898 elf_hppa_unmark_useless_dynamic_symbols,
899 info);
900
2eb429af 901 /* Invoke the regular ELF backend linker to do all the work. */
af7dc644
JL
902 retval = bfd_elf_bfd_final_link (abfd, info);
903
904 elf_link_hash_traverse (elf_hash_table (info),
905 elf_hppa_remark_useless_dynamic_symbols,
906 info);
907
908 return retval;
2eb429af
JL
909}
910
911/* Relocate an HPPA ELF section. */
912
913static boolean
914elf_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
915 contents, relocs, local_syms, local_sections)
916 bfd *output_bfd;
917 struct bfd_link_info *info;
918 bfd *input_bfd;
919 asection *input_section;
920 bfd_byte *contents;
921 Elf_Internal_Rela *relocs;
922 Elf_Internal_Sym *local_syms;
923 asection **local_sections;
924{
925 Elf_Internal_Shdr *symtab_hdr;
926 Elf_Internal_Rela *rel;
927 Elf_Internal_Rela *relend;
be7582f3 928 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
2eb429af
JL
929
930 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
931
932 rel = relocs;
933 relend = relocs + input_section->reloc_count;
934 for (; rel < relend; rel++)
935 {
936 int r_type;
b2e311df 937 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
2eb429af
JL
938 unsigned long r_symndx;
939 struct elf_link_hash_entry *h;
940 Elf_Internal_Sym *sym;
941 asection *sym_sec;
942 bfd_vma relocation;
943 bfd_reloc_status_type r;
944 const char *sym_name;
be7582f3
JL
945 char *dyn_name;
946 char *dynh_buf = NULL;
947 size_t dynh_buflen = 0;
948 struct elf64_hppa_dyn_hash_entry *dyn_h = NULL;
2eb429af
JL
949
950 r_type = ELF_R_TYPE (rel->r_info);
951 if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
952 {
953 bfd_set_error (bfd_error_bad_value);
954 return false;
955 }
2eb429af
JL
956
957 r_symndx = ELF_R_SYM (rel->r_info);
958
959 if (info->relocateable)
960 {
961 /* This is a relocateable link. We don't have to change
962 anything, unless the reloc is against a section symbol,
963 in which case we have to adjust according to where the
964 section symbol winds up in the output section. */
965 if (r_symndx < symtab_hdr->sh_info)
966 {
967 sym = local_syms + r_symndx;
968 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
969 {
970 sym_sec = local_sections[r_symndx];
971 rel->r_addend += sym_sec->output_offset;
972 }
973 }
974
975 continue;
976 }
977
978 /* This is a final link. */
979 h = NULL;
980 sym = NULL;
981 sym_sec = NULL;
982 if (r_symndx < symtab_hdr->sh_info)
983 {
be7582f3 984 /* This is a local symbol. */
2eb429af
JL
985 sym = local_syms + r_symndx;
986 sym_sec = local_sections[r_symndx];
987 relocation = ((ELF_ST_TYPE (sym->st_info) == STT_SECTION
988 ? 0 : sym->st_value)
989 + sym_sec->output_offset
990 + sym_sec->output_section->vma);
be7582f3
JL
991
992 /* If this symbol has an entry in the PA64 dynamic hash
993 table, then get it. */
994 dyn_name = get_dyn_name (input_bfd, h, rel,
995 &dynh_buf, &dynh_buflen);
996 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
997 dyn_name, false, false);
998
2eb429af
JL
999 }
1000 else
1001 {
be7582f3 1002 /* This is not a local symbol. */
2eb429af
JL
1003 long indx;
1004
1005 indx = r_symndx - symtab_hdr->sh_info;
1006 h = elf_sym_hashes (input_bfd)[indx];
1007 while (h->root.type == bfd_link_hash_indirect
1008 || h->root.type == bfd_link_hash_warning)
1009 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1010 if (h->root.type == bfd_link_hash_defined
1011 || h->root.type == bfd_link_hash_defweak)
1012 {
1013 sym_sec = h->root.u.def.section;
be7582f3
JL
1014
1015
1016 /* If this symbol has an entry in the PA64 dynamic hash
1017 table, then get it. */
1018 dyn_name = get_dyn_name (input_bfd, h, rel,
1019 &dynh_buf, &dynh_buflen);
1020 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1021 dyn_name, false, false);
1022
1023 /* If we have a relocation against a symbol defined in a
1024 shared library and we have not created an entry in the
1025 PA64 dynamic symbol hash table for it, then we lose. */
1026 if (sym_sec->output_section == NULL && dyn_h == NULL)
1027 {
1028 (*_bfd_error_handler)
1029 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1030 bfd_get_filename (input_bfd), h->root.root.string,
1031 bfd_get_section_name (input_bfd, input_section));
1032 relocation = 0;
1033 }
1034 else if (sym_sec->output_section)
1035 relocation = (h->root.u.def.value
1036 + sym_sec->output_offset
1037 + sym_sec->output_section->vma);
1038 /* Value will be provided via one of the offsets in the
1039 dyn_h hash table entry. */
1040 else
1041 relocation = 0;
2eb429af
JL
1042 }
1043 else if (h->root.type == bfd_link_hash_undefweak)
1044 relocation = 0;
1045 else
1046 {
1047 if (!((*info->callbacks->undefined_symbol)
1048 (info, h->root.root.string, input_bfd,
1049 input_section, rel->r_offset)))
1050 return false;
1051 break;
1052 }
1053 }
1054
1055 if (h != NULL)
1056 sym_name = h->root.root.string;
1057 else
1058 {
1059 sym_name = bfd_elf_string_from_elf_section (input_bfd,
1060 symtab_hdr->sh_link,
1061 sym->st_name);
1062 if (sym_name == NULL)
1063 return false;
1064 if (*sym_name == '\0')
1065 sym_name = bfd_section_name (input_bfd, sym_sec);
1066 }
1067
be7582f3 1068 r = elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
2eb429af 1069 input_section, contents,
be7582f3
JL
1070 relocation, info, sym_sec,
1071 h, dyn_h);
2eb429af
JL
1072
1073 if (r != bfd_reloc_ok)
1074 {
1075 switch (r)
1076 {
1077 default:
1078 abort ();
1079 case bfd_reloc_overflow:
1080 {
1081 if (!((*info->callbacks->reloc_overflow)
1082 (info, sym_name, howto->name, (bfd_vma) 0,
1083 input_bfd, input_section, rel->r_offset)))
1084 return false;
1085 }
1086 break;
1087 }
1088 }
1089 }
1090 return true;
1091}
1092
1093
be7582f3
JL
1094/* Compute the value for a relocation (REL) during a final link stage,
1095 then insert the value into the proper location in CONTENTS.
1096
1097 VALUE is a tentative value for the relocation and may be overridden
1098 and modified here based on the specific relocation to be performed.
1099
1100 For example we do conversions for PC-relative branches in this routine
1101 or redirection of calls to external routines to stubs.
1102
1103 The work of actually applying the relocation is left to a helper
1104 routine in an attempt to reduce the complexity and size of this
1105 function. */
2eb429af
JL
1106
1107static bfd_reloc_status_type
be7582f3
JL
1108elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
1109 input_section, contents, value,
1110 info, sym_sec, h, dyn_h)
1111 Elf_Internal_Rela *rel;
2eb429af 1112 bfd *input_bfd;
be7582f3 1113 bfd *output_bfd;
2eb429af
JL
1114 asection *input_section;
1115 bfd_byte *contents;
2eb429af 1116 bfd_vma value;
2eb429af
JL
1117 struct bfd_link_info *info;
1118 asection *sym_sec;
be7582f3
JL
1119 struct elf_link_hash_entry *h;
1120 struct elf64_hppa_dyn_hash_entry *dyn_h;
2eb429af
JL
1121{
1122 unsigned long insn;
be7582f3
JL
1123 bfd_vma offset = rel->r_offset;
1124 bfd_vma addend = rel->r_addend;
1125 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
2eb429af 1126 unsigned long r_type = howto->type;
2eb429af
JL
1127 unsigned long r_field = e_fsel;
1128 bfd_byte *hit_data = contents + offset;
be7582f3 1129 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
2eb429af
JL
1130
1131 insn = bfd_get_32 (input_bfd, hit_data);
1132
2eb429af
JL
1133 switch (r_type)
1134 {
1135 case R_PARISC_NONE:
1136 break;
1137
571047ad 1138 /* Random PC relative relocs. */
b233eaab
JL
1139 case R_PARISC_PCREL21L:
1140 case R_PARISC_PCREL14R:
1141 case R_PARISC_PCREL14F:
571047ad
JL
1142 case R_PARISC_PCREL14WR:
1143 case R_PARISC_PCREL14DR:
1144 case R_PARISC_PCREL16F:
1145 case R_PARISC_PCREL16WF:
1146 case R_PARISC_PCREL16DF:
1147 {
1148 if (r_type == R_PARISC_PCREL21L)
1149 r_field = e_lsel;
1150 else if (r_type == R_PARISC_PCREL14F
1151 || r_type == R_PARISC_PCREL16F
1152 || r_type == R_PARISC_PCREL16WF
1153 || r_type == R_PARISC_PCREL16DF)
1154 r_field = e_fsel;
1155 else
1156 r_field = e_rsel;
1157
1158 /* If this is a call to a function defined in another dynamic
1159 library, then redirect the call to the local stub for this
1160 function. */
1161 if (sym_sec->output_section == NULL)
1162 value = dyn_h->stub_offset;
1163
1164 /* Turn VALUE into a proper PC relative address. */
1165 value -= (offset + input_section->output_offset
1166 + input_section->output_section->vma);
1167
1168 /* Adjust for any field selectors. */
1169 value = hppa_field_adjust (value, -8 + addend, r_field);
1170
1171 /* Apply the relocation to the given instruction. */
1172 insn = elf_hppa_relocate_insn (insn, value, r_type);
1173 break;
1174 }
1175
be7582f3
JL
1176 /* Basic function call support. I'm not entirely sure if PCREL14F is
1177 actually needed or even handled correctly.
1178
1179 Note for a call to a function defined in another dynamic library
1180 we want to redirect the call to a stub. */
2eb429af
JL
1181 case R_PARISC_PCREL22F:
1182 case R_PARISC_PCREL17F:
571047ad
JL
1183 case R_PARISC_PCREL22C:
1184 case R_PARISC_PCREL17C:
1185 case R_PARISC_PCREL17R:
2eb429af 1186 {
571047ad
JL
1187 if (r_type == R_PARISC_PCREL17R)
1188 r_field = e_rsel;
1189 else
1190 r_field = e_fsel;
1191
be7582f3
JL
1192 /* If this is a call to a function defined in another dynamic
1193 library, then redirect the call to the local stub for this
1194 function. */
1195 if (sym_sec->output_section == NULL)
6a0b9871
JL
1196 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1197 + hppa_info->stub_sec->output_section->vma);
be7582f3
JL
1198
1199 /* Turn VALUE into a proper PC relative address. */
1200 value -= (offset + input_section->output_offset
1201 + input_section->output_section->vma);
1202
1203 /* Adjust for any field selectors. */
571047ad 1204 value = hppa_field_adjust (value, -8 + addend, e_fsel);
2eb429af 1205
be7582f3
JL
1206 /* All branches are implicitly shifted by 2 places. */
1207 value >>= 2;
2eb429af 1208
be7582f3
JL
1209 /* Apply the relocation to the given instruction. */
1210 insn = elf_hppa_relocate_insn (insn, value, r_type);
2eb429af
JL
1211 break;
1212 }
1213
be7582f3
JL
1214 /* Indirect references to data through the DLT. */
1215 case R_PARISC_DLTIND14R:
571047ad 1216 case R_PARISC_DLTIND14F:
be7582f3
JL
1217 case R_PARISC_DLTIND14DR:
1218 case R_PARISC_DLTIND14WR:
1219 case R_PARISC_DLTIND21L:
e5bb3efc
JL
1220 case R_PARISC_LTOFF_FPTR14R:
1221 case R_PARISC_LTOFF_FPTR14DR:
1222 case R_PARISC_LTOFF_FPTR14WR:
1223 case R_PARISC_LTOFF_FPTR21L:
1224 case R_PARISC_LTOFF_FPTR16F:
1225 case R_PARISC_LTOFF_FPTR16WF:
1226 case R_PARISC_LTOFF_FPTR16DF:
b233eaab
JL
1227 case R_PARISC_LTOFF_TP21L:
1228 case R_PARISC_LTOFF_TP14R:
1229 case R_PARISC_LTOFF_TP14F:
1230 case R_PARISC_LTOFF_TP14WR:
1231 case R_PARISC_LTOFF_TP14DR:
1232 case R_PARISC_LTOFF_TP16F:
1233 case R_PARISC_LTOFF_TP16WF:
1234 case R_PARISC_LTOFF_TP16DF:
b7263961
JL
1235 case R_PARISC_LTOFF16F:
1236 case R_PARISC_LTOFF16WF:
1237 case R_PARISC_LTOFF16DF:
c8933571 1238 {
6a0b9871
JL
1239 /* If this relocation was against a local symbol, then we still
1240 have not set up the DLT entry (it's not convienent to do so
1241 in the "finalize_dlt" routine because it is difficult to get
1242 to the local symbol's value).
1243
1244 So, if this is a local symbol (h == NULL), then we need to
e48c661e
JL
1245 fill in its DLT entry.
1246
1247 Similarly we may still need to set up an entry in .opd for
1248 a local function which had its address taken. */
6a0b9871
JL
1249 if (dyn_h->h == NULL)
1250 {
1251 bfd_put_64 (hppa_info->dlt_sec->owner,
1252 value,
1253 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
e48c661e
JL
1254
1255 /* Now handle .opd creation if needed. */
1256 if (r_type == R_PARISC_LTOFF_FPTR14R
1257 || r_type == R_PARISC_LTOFF_FPTR14DR
1258 || r_type == R_PARISC_LTOFF_FPTR14WR
1259 || r_type == R_PARISC_LTOFF_FPTR21L
1260 || r_type == R_PARISC_LTOFF_FPTR16F
1261 || r_type == R_PARISC_LTOFF_FPTR16WF
1262 || r_type == R_PARISC_LTOFF_FPTR16DF)
1263 {
1264 /* The first two words of an .opd entry are zero. */
1265 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset,
1266 0, 16);
1267
1268 /* The next word is the address of the function. */
1269 bfd_put_64 (hppa_info->opd_sec->owner, value,
1270 (hppa_info->opd_sec->contents
1271 + dyn_h->opd_offset + 16));
1272
1273 /* The last word is our local __gp value. */
1274 value = _bfd_get_gp_value
1275 (hppa_info->opd_sec->output_section->owner);
1276 bfd_put_64 (hppa_info->opd_sec->owner, value,
1277 (hppa_info->opd_sec->contents
1278 + dyn_h->opd_offset + 24));
1279 }
6a0b9871
JL
1280 }
1281
be7582f3
JL
1282 /* We want the value of the DLT offset for this symbol, not
1283 the symbol's actual address. */
1284 value = dyn_h->dlt_offset + hppa_info->dlt_sec->output_offset;
1285
1286 /* All DLTIND relocations are basically the same at this point,
1287 except that we need different field selectors for the 21bit
1288 version vs the 14bit versions. */
e5bb3efc 1289 if (r_type == R_PARISC_DLTIND21L
b233eaab
JL
1290 || r_type == R_PARISC_LTOFF_FPTR21L
1291 || r_type == R_PARISC_LTOFF_TP21L)
be7582f3 1292 value = hppa_field_adjust (value, addend, e_lrsel);
571047ad
JL
1293 else if (r_type == R_PARISC_DLTIND14F
1294 || r_type == R_PARISC_LTOFF_FPTR16F
1295 || r_type == R_PARISC_LTOFF_FPTR16WF
b233eaab 1296 || r_type == R_PARISC_LTOFF_FPTR16DF
b7263961
JL
1297 || r_type == R_PARISC_LTOFF16F
1298 || r_type == R_PARISC_LTOFF16DF
1299 || r_type == R_PARISC_LTOFF16WF
b233eaab
JL
1300 || r_type == R_PARISC_LTOFF_TP16F
1301 || r_type == R_PARISC_LTOFF_TP16WF
1302 || r_type == R_PARISC_LTOFF_TP16DF)
e5bb3efc 1303 value = hppa_field_adjust (value, addend, e_fsel);
be7582f3
JL
1304 else
1305 value = hppa_field_adjust (value, addend, e_rrsel);
1306
1307 insn = elf_hppa_relocate_insn (insn, value, r_type);
c8933571
JL
1308 break;
1309 }
1310
be7582f3 1311 case R_PARISC_DLTREL14R:
571047ad 1312 case R_PARISC_DLTREL14F:
be7582f3
JL
1313 case R_PARISC_DLTREL14DR:
1314 case R_PARISC_DLTREL14WR:
c8933571 1315 case R_PARISC_DLTREL21L:
6849fb4d
JL
1316 case R_PARISC_DPREL21L:
1317 case R_PARISC_DPREL14WR:
1318 case R_PARISC_DPREL14DR:
1319 case R_PARISC_DPREL14R:
1320 case R_PARISC_DPREL14F:
1321 case R_PARISC_GPREL16F:
1322 case R_PARISC_GPREL16WF:
1323 case R_PARISC_GPREL16DF:
c8933571 1324 {
be7582f3
JL
1325 /* Subtract out the global pointer value to make value a DLT
1326 relative address. */
1327 value -= _bfd_get_gp_value (output_bfd);
1328
1329 /* All DLTREL relocations are basically the same at this point,
1330 except that we need different field selectors for the 21bit
1331 version vs the 14bit versions. */
6849fb4d
JL
1332 if (r_type == R_PARISC_DLTREL21L
1333 || r_type == R_PARISC_DPREL21L)
be7582f3 1334 value = hppa_field_adjust (value, addend, e_lrsel);
6849fb4d
JL
1335 else if (r_type == R_PARISC_DLTREL14F
1336 || r_type == R_PARISC_DPREL14F
1337 || r_type == R_PARISC_GPREL16F
1338 || r_type == R_PARISC_GPREL16WF
1339 || r_type == R_PARISC_GPREL16DF)
571047ad 1340 value = hppa_field_adjust (value, addend, e_fsel);
be7582f3
JL
1341 else
1342 value = hppa_field_adjust (value, addend, e_rrsel);
1343
1344 insn = elf_hppa_relocate_insn (insn, value, r_type);
c8933571
JL
1345 break;
1346 }
1347
b7263961
JL
1348 case R_PARISC_DIR21L:
1349 case R_PARISC_DIR17R:
1350 case R_PARISC_DIR17F:
1351 case R_PARISC_DIR14R:
1352 case R_PARISC_DIR14WR:
1353 case R_PARISC_DIR14DR:
1354 case R_PARISC_DIR16F:
1355 case R_PARISC_DIR16WF:
1356 case R_PARISC_DIR16DF:
1357 {
1358 /* All DIR relocations are basically the same at this point,
1359 except that we need different field selectors for the 21bit
1360 version vs the 14bit versions. */
1361 if (r_type == R_PARISC_DIR21L)
1362 value = hppa_field_adjust (value, addend, e_lrsel);
1363 else if (r_type == R_PARISC_DIR17F
1364 || r_type == R_PARISC_DIR16F
1365 || r_type == R_PARISC_DIR16WF
1366 || r_type == R_PARISC_DIR16DF)
1367 value = hppa_field_adjust (value, addend, e_fsel);
1368 else
1369 value = hppa_field_adjust (value, addend, e_rrsel);
1370
1371 insn = elf_hppa_relocate_insn (insn, value, r_type);
1372 break;
1373 }
1374
8267b155
JL
1375 case R_PARISC_PLTOFF21L:
1376 case R_PARISC_PLTOFF14R:
1377 case R_PARISC_PLTOFF14F:
1378 case R_PARISC_PLTOFF14WR:
1379 case R_PARISC_PLTOFF14DR:
1380 case R_PARISC_PLTOFF16F:
1381 case R_PARISC_PLTOFF16WF:
1382 case R_PARISC_PLTOFF16DF:
1383 {
1384 /* We want the value of the PLT offset for this symbol, not
1385 the symbol's actual address. */
1386 value = dyn_h->plt_offset + hppa_info->plt_sec->output_offset;
1387
1388 /* All PLTOFF relocations are basically the same at this point,
1389 except that we need different field selectors for the 21bit
1390 version vs the 14bit versions. */
1391 if (r_type == R_PARISC_PLTOFF21L)
1392 value = hppa_field_adjust (value, addend, e_lrsel);
1393 else if (r_type == R_PARISC_PLTOFF14F
1394 || r_type == R_PARISC_PLTOFF16F
1395 || r_type == R_PARISC_PLTOFF16WF
1396 || r_type == R_PARISC_PLTOFF16DF)
1397 value = hppa_field_adjust (value, addend, e_fsel);
1398 else
1399 value = hppa_field_adjust (value, addend, e_rrsel);
1400
1401 insn = elf_hppa_relocate_insn (insn, value, r_type);
1402 break;
1403 }
1404
e5bb3efc
JL
1405 case R_PARISC_LTOFF_FPTR32:
1406 {
e48c661e
JL
1407 /* We may still need to create the FPTR itself if it was for
1408 a local symbol. */
1409 if (dyn_h->h == NULL)
1410 {
1411 /* The first two words of an .opd entry are zero. */
1412 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1413
1414 /* The next word is the address of the function. */
1415 bfd_put_64 (hppa_info->opd_sec->owner, value,
1416 (hppa_info->opd_sec->contents
1417 + dyn_h->opd_offset + 16));
1418
1419 /* The last word is our local __gp value. */
1420 value = _bfd_get_gp_value
1421 (hppa_info->opd_sec->output_section->owner);
1422 bfd_put_64 (hppa_info->opd_sec->owner, value,
1423 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1424 }
1425
e5bb3efc
JL
1426 /* We want the value of the DLT offset for this symbol, not
1427 the symbol's actual address. */
1428 value = dyn_h->dlt_offset + hppa_info->dlt_sec->output_offset;
1429 bfd_put_32 (input_bfd, value, hit_data);
1430 return bfd_reloc_ok;
1431 }
1432
e5bb3efc 1433 case R_PARISC_LTOFF_FPTR64:
b233eaab 1434 case R_PARISC_LTOFF_TP64:
e5bb3efc 1435 {
e48c661e
JL
1436 /* We may still need to create the FPTR itself if it was for
1437 a local symbol. */
1438 if (dyn_h->h == NULL && r_type == R_PARISC_LTOFF_FPTR64)
1439 {
1440 /* The first two words of an .opd entry are zero. */
1441 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1442
1443 /* The next word is the address of the function. */
1444 bfd_put_64 (hppa_info->opd_sec->owner, value,
1445 (hppa_info->opd_sec->contents
1446 + dyn_h->opd_offset + 16));
1447
1448 /* The last word is our local __gp value. */
1449 value = _bfd_get_gp_value
1450 (hppa_info->opd_sec->output_section->owner);
1451 bfd_put_64 (hppa_info->opd_sec->owner, value,
1452 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1453 }
1454
e5bb3efc
JL
1455 /* We want the value of the DLT offset for this symbol, not
1456 the symbol's actual address. */
1457 value = dyn_h->dlt_offset + hppa_info->dlt_sec->output_offset;
1458 bfd_put_64 (input_bfd, value, hit_data);
1459 return bfd_reloc_ok;
1460 }
1461
1462 case R_PARISC_DIR32:
571047ad 1463 bfd_put_32 (input_bfd, value + addend, hit_data);
e5bb3efc
JL
1464 return bfd_reloc_ok;
1465
1466 case R_PARISC_DIR64:
571047ad 1467 bfd_put_64 (input_bfd, value + addend, hit_data);
e5bb3efc
JL
1468 return bfd_reloc_ok;
1469
6849fb4d
JL
1470 case R_PARISC_GPREL64:
1471 /* Subtract out the global pointer value to make value a DLT
1472 relative address. */
1473 value -= _bfd_get_gp_value (output_bfd);
1474 value += addend;
1475
1476 bfd_put_64 (input_bfd, value + addend, hit_data);
1477 return bfd_reloc_ok;
1478
b7263961
JL
1479 case R_PARISC_LTOFF64:
1480 /* We want the value of the DLT offset for this symbol, not
1481 the symbol's actual address. */
1482 value = dyn_h->dlt_offset + hppa_info->dlt_sec->output_offset;
1483
1484 bfd_put_64 (input_bfd, value + addend, hit_data);
1485 return bfd_reloc_ok;
1486
571047ad
JL
1487 case R_PARISC_PCREL32:
1488 {
1489 /* If this is a call to a function defined in another dynamic
1490 library, then redirect the call to the local stub for this
1491 function. */
1492 if (sym_sec->output_section == NULL)
1493 value = dyn_h->stub_offset;
1494
1495 /* Turn VALUE into a proper PC relative address. */
1496 value -= (offset + input_section->output_offset
1497 + input_section->output_section->vma);
1498
b233eaab 1499 value += addend;
571047ad
JL
1500 value -= 8;
1501 bfd_put_64 (input_bfd, value, hit_data);
1502 return bfd_reloc_ok;
1503 }
1504
1505 case R_PARISC_PCREL64:
1506 {
1507 /* If this is a call to a function defined in another dynamic
1508 library, then redirect the call to the local stub for this
1509 function. */
1510 if (sym_sec->output_section == NULL)
1511 value = dyn_h->stub_offset;
1512
1513 /* Turn VALUE into a proper PC relative address. */
1514 value -= (offset + input_section->output_offset
1515 + input_section->output_section->vma);
1516
b233eaab 1517 value += addend;
571047ad
JL
1518 value -= 8;
1519 bfd_put_64 (input_bfd, value, hit_data);
1520 return bfd_reloc_ok;
1521 }
1522
1523
e5bb3efc 1524 case R_PARISC_FPTR64:
e48c661e
JL
1525 {
1526 /* We may still need to create the FPTR itself if it was for
1527 a local symbol. */
1528 if (dyn_h->h == NULL)
1529 {
1530 /* The first two words of an .opd entry are zero. */
1531 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1532
1533 /* The next word is the address of the function. */
1534 bfd_put_64 (hppa_info->opd_sec->owner, value,
1535 (hppa_info->opd_sec->contents
1536 + dyn_h->opd_offset + 16));
1537
1538 /* The last word is our local __gp value. */
1539 value = _bfd_get_gp_value
1540 (hppa_info->opd_sec->output_section->owner);
1541 bfd_put_64 (hppa_info->opd_sec->owner, value,
1542 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1543 }
1544
1545 /* We want the value of the OPD offset for this symbol, not
1546 the symbol's actual address. */
1547 value = (dyn_h->opd_offset
1548 + hppa_info->opd_sec->output_offset
1549 + hppa_info->opd_sec->output_section->vma);
6a0b9871 1550
e48c661e
JL
1551 bfd_put_64 (input_bfd, value + addend, hit_data);
1552 return bfd_reloc_ok;
1553 }
e5bb3efc 1554
228d307f
JL
1555 case R_PARISC_SECREL32:
1556 bfd_put_32 (input_bfd,
1557 (value + addend
1558 - sym_sec->output_section->vma),
1559 hit_data);
1560 return bfd_reloc_ok;
1561
1562 case R_PARISC_SEGREL32:
2ec0dd12
JL
1563 case R_PARISC_SEGREL64:
1564 {
1565 /* If this is the first SEGREL relocation, then initialize
1566 the segment base values. */
1567 if (hppa_info->text_segment_base == (bfd_vma) -1)
1568 bfd_map_over_sections (output_bfd, elf_hppa_record_segment_addrs,
1569 elf64_hppa_hash_table (info));
1570
1571 /* VALUE holds the absolute address. We want to include the
1572 addend, then turn it into a segment relative address.
1573
1574 The segment is derived from SYM_SEC. We assume that there are
1575 only two segments of note in the resulting executable/shlib.
1576 A readonly segment (.text) and a readwrite segment (.data). */
1577 value += addend;
1578
1579 if (sym_sec->flags & SEC_CODE)
1580 value -= hppa_info->text_segment_base;
1581 else
1582 value -= hppa_info->data_segment_base;
1583
1584 if (r_type == R_PARISC_SEGREL32)
1585 bfd_put_32 (input_bfd, value, hit_data);
1586 else
1587 bfd_put_64 (input_bfd, value, hit_data);
1588 return bfd_reloc_ok;
1589 }
1590
228d307f 1591
2eb429af
JL
1592 /* Something we don't know how to handle. */
1593 default:
228d307f 1594 return bfd_reloc_notsupported;
2eb429af
JL
1595 }
1596
1597 /* Update the instruction word. */
1598 bfd_put_32 (input_bfd, insn, hit_data);
1599 return (bfd_reloc_ok);
1600}
1601
be7582f3
JL
1602/* Relocate the given INSN. VALUE should be the actual value we want
1603 to insert into the instruction, ie by this point we should not be
1604 concerned with computing an offset relative to the DLT, PC, etc.
1605 Instead this routine is meant to handle the bit manipulations needed
1606 to insert the relocation into the given instruction. */
2eb429af
JL
1607
1608static unsigned long
be7582f3 1609elf_hppa_relocate_insn (insn, sym_value, r_type)
2eb429af 1610 unsigned long insn;
2eb429af 1611 long sym_value;
c8933571 1612 unsigned long r_type;
2eb429af 1613{
c8933571 1614 switch (r_type)
2eb429af 1615 {
be7582f3
JL
1616 /* This is any 22bit branch. In PA2.0 syntax it corresponds to
1617 the "B" instruction. */
c8933571 1618 case R_PARISC_PCREL22F:
571047ad 1619 case R_PARISC_PCREL22C:
be7582f3
JL
1620 {
1621 unsigned int w3, w2, w1, w;
2eb429af 1622
be7582f3
JL
1623 /* These are 22 bit branches. Mask off bits we do not care
1624 about. */
1625 sym_value &= 0x3fffff;
2eb429af 1626
be7582f3
JL
1627 /* Now extract the W1, W2, W3 and W fields from the value. */
1628 dis_assemble_22 (sym_value, &w3, &w1, &w2, &w);
2eb429af 1629
be7582f3
JL
1630 /* Mask out bits for the value in the instruction. */
1631 insn &= 0xfc00e002;
2eb429af 1632
be7582f3
JL
1633 /* Insert the bits for the W1, W2 and W fields into the
1634 instruction. */
1635 insn |= (w3 << 21) | (w2 << 2) | (w1 << 16) | w;
1636 return insn;
1637 }
2eb429af 1638
be7582f3
JL
1639 /* This is any 17bit branch. In PA2.0 syntax it also corresponds to
1640 the "B" instruction as well as BE. */
1641 case R_PARISC_PCREL17F:
c8933571 1642 case R_PARISC_DIR17F:
b7263961 1643 case R_PARISC_DIR17R:
571047ad
JL
1644 case R_PARISC_PCREL17C:
1645 case R_PARISC_PCREL17R:
2eb429af
JL
1646 {
1647 unsigned int w2, w1, w;
1648
2eb429af
JL
1649 /* These are 17 bit branches. Mask off bits we do not care
1650 about. */
1651 sym_value &= 0x1ffff;
1652
1653 /* Now extract the W1, W2 and W fields from the value. */
1654 dis_assemble_17 (sym_value, &w1, &w2, &w);
1655
1656 /* Mask out bits for the value in the instruction. */
1657 insn &= 0xffe0e002;
1658
1659 /* Insert the bits for the W1, W2 and W fields into the
1660 instruction. */
1661 insn |= (w2 << 2) | (w1 << 16) | w;
1662 return insn;
1663 }
1664
be7582f3 1665 /* ADDIL or LDIL instructions. */
c8933571 1666 case R_PARISC_DLTREL21L:
be7582f3 1667 case R_PARISC_DLTIND21L:
e5bb3efc 1668 case R_PARISC_LTOFF_FPTR21L:
b233eaab
JL
1669 case R_PARISC_PCREL21L:
1670 case R_PARISC_LTOFF_TP21L:
6849fb4d 1671 case R_PARISC_DPREL21L:
8267b155 1672 case R_PARISC_PLTOFF21L:
b7263961 1673 case R_PARISC_DIR21L:
c8933571
JL
1674 {
1675 int w;
1676
c8933571
JL
1677 /* Mask off bits in INSN we do not want. */
1678 insn &= 0xffe00000;
1679
1680 /* Turn the 21bit value into the proper format. */
1681 dis_assemble_21 (sym_value, &w);
1682
1683 /* And insert the proper bits into INSN. */
1684 return insn | w;
1685 }
be7582f3
JL
1686
1687 /* LDO and integer loads/stores with 14bit displacements. */
c8933571 1688 case R_PARISC_DLTREL14R:
084d930b 1689 case R_PARISC_DLTREL14F:
be7582f3
JL
1690 case R_PARISC_DLTIND14R:
1691 case R_PARISC_DLTIND14F:
e5bb3efc
JL
1692 case R_PARISC_LTOFF_FPTR14R:
1693 case R_PARISC_LTOFF_FPTR16F:
b233eaab 1694 case R_PARISC_PCREL14R:
571047ad
JL
1695 case R_PARISC_PCREL14F:
1696 case R_PARISC_PCREL16F:
b233eaab
JL
1697 case R_PARISC_LTOFF_TP14R:
1698 case R_PARISC_LTOFF_TP14F:
1699 case R_PARISC_LTOFF_TP16F:
6849fb4d
JL
1700 case R_PARISC_DPREL14R:
1701 case R_PARISC_DPREL14F:
1702 case R_PARISC_GPREL16F:
8267b155
JL
1703 case R_PARISC_PLTOFF14R:
1704 case R_PARISC_PLTOFF14F:
1705 case R_PARISC_PLTOFF16F:
b7263961
JL
1706 case R_PARISC_DIR14R:
1707 case R_PARISC_DIR16F:
1708 case R_PARISC_LTOFF16F:
c8933571
JL
1709 {
1710 int w;
1711
c8933571
JL
1712 /* Mask off bits in INSN we do not want. */
1713 insn &= 0xffffc000;
1714
1715 /* Turn the 14bit value into the proper format. */
1716 low_sign_unext (sym_value, 14, &w);
1717
1718 /* And insert the proper bits into INSN. */
1719 return insn | w;
1720 }
be7582f3
JL
1721
1722 /* Doubleword loads and stores with a 14bit displacement. */
11c19a4e 1723 case R_PARISC_DLTREL14DR:
be7582f3 1724 case R_PARISC_DLTIND14DR:
e5bb3efc
JL
1725 case R_PARISC_LTOFF_FPTR14DR:
1726 case R_PARISC_LTOFF_FPTR16DF:
571047ad
JL
1727 case R_PARISC_PCREL14DR:
1728 case R_PARISC_PCREL16DF:
b233eaab
JL
1729 case R_PARISC_LTOFF_TP14DR:
1730 case R_PARISC_LTOFF_TP16DF:
6849fb4d
JL
1731 case R_PARISC_DPREL14DR:
1732 case R_PARISC_GPREL16DF:
8267b155
JL
1733 case R_PARISC_PLTOFF14DR:
1734 case R_PARISC_PLTOFF16DF:
b7263961
JL
1735 case R_PARISC_DIR14DR:
1736 case R_PARISC_DIR16DF:
1737 case R_PARISC_LTOFF16DF:
11c19a4e 1738 {
11c19a4e
JL
1739 /* Mask off bits in INSN we do not want. */
1740 insn &= 0xffffc00e;
1741
1742 /* The sign bit at 14 moves into bit zero in the destination. */
1743 insn |= ((sym_value & 0x2000) >> 13);
1744
1745 /* Turn off the bits in sym_value we do not care about. */
1746 sym_value &= 0x1ff8;
1747
1748 /* Now shift it one bit position left so that it lines up with the
1749 destination field in INSN. */
1750 sym_value <<= 1;
1751
1752 return insn | sym_value;
1753 }
1754
be7582f3 1755 /* Floating point single word load/store instructions. */
11c19a4e 1756 case R_PARISC_DLTREL14WR:
be7582f3 1757 case R_PARISC_DLTIND14WR:
e5bb3efc
JL
1758 case R_PARISC_LTOFF_FPTR14WR:
1759 case R_PARISC_LTOFF_FPTR16WF:
571047ad
JL
1760 case R_PARISC_PCREL14WR:
1761 case R_PARISC_PCREL16WF:
b233eaab
JL
1762 case R_PARISC_LTOFF_TP14WR:
1763 case R_PARISC_LTOFF_TP16WF:
6849fb4d
JL
1764 case R_PARISC_DPREL14WR:
1765 case R_PARISC_GPREL16WF:
8267b155
JL
1766 case R_PARISC_PLTOFF14WR:
1767 case R_PARISC_PLTOFF16WF:
b7263961
JL
1768 case R_PARISC_DIR16WF:
1769 case R_PARISC_DIR14WR:
1770 case R_PARISC_LTOFF16WF:
11c19a4e 1771 {
11c19a4e
JL
1772 /* Mask off bits in INSN we do not want. */
1773 insn &= 0xffffc006;
1774
1775 /* The sign bit at 14 moves into bit zero in the destination. */
1776 insn |= ((sym_value & 0x2000) >> 13);
1777
1778 /* Turn off the bits in sym_value we do not care about. */
1779 sym_value &= 0x1ffc;
1780
1781 /* Now shift it one bit position left so that it lines up with the
1782 destination field in INSN. */
1783 sym_value <<= 1;
1784
1785 return insn | sym_value;
1786 }
be7582f3 1787
2eb429af
JL
1788 default:
1789 return insn;
1790 }
1791}
This page took 0.122665 seconds and 4 git commands to generate.