b55e1c4e5bc1111f238c2e38128794d6edf8e42b
[deliverable/binutils-gdb.git] / bfd / elf-hppa.h
1 /* Common code for PA ELF implementations.
2 Copyright (C) 1999 Free Software Foundation, Inc.
3
4 This file is part of BFD, the Binary File Descriptor library.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19
20 #define ELF_HOWTO_TABLE_SIZE R_PARISC_UNIMPLEMENTED + 1
21
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. */
28 #if ARCH_SIZE == 64
29 #define ELF_R_TYPE(X) ELF64_R_TYPE(X)
30 #define ELF_R_SYM(X) ELF64_R_SYM(X)
31 #define _bfd_elf_hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type
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
35 #endif
36 #if ARCH_SIZE == 32
37 #define ELF_R_TYPE(X) ELF32_R_TYPE(X)
38 #define ELF_R_SYM(X) ELF32_R_SYM(X)
39 #define _bfd_elf_hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type
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
43 #endif
44
45 static boolean
46 elf_hppa_relocate_section
47 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
48 bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
49
50 static bfd_reloc_status_type elf_hppa_final_link_relocate
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 *));
55
56 static unsigned long elf_hppa_relocate_insn
57 PARAMS ((unsigned long, long, unsigned long));
58
59 static boolean elf_hppa_add_symbol_hook
60 PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
61 const char **, flagword *, asection **, bfd_vma *));
62
63 static boolean elf_hppa_final_link
64 PARAMS ((bfd *, struct bfd_link_info *));
65
66 static boolean elf_hppa_unmark_useless_dynamic_symbols
67 PARAMS ((struct elf_link_hash_entry *, PTR));
68
69 static boolean elf_hppa_remark_useless_dynamic_symbols
70 PARAMS ((struct elf_link_hash_entry *, PTR));
71
72 static void elf_hppa_record_segment_addrs
73 PARAMS ((bfd *, asection *, PTR));
74
75 /* ELF/PA relocation howto entries. */
76
77 static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
78 {
79 {R_PARISC_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_NONE"},
80
81 /* The values in DIR32 are to placate the check in
82 _bfd_stab_section_find_nearest_line. */
83 {R_PARISC_DIR32, 0, 2, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR32", false, 0, 0xffffffff, false},
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"},
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"},
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"},
194 {R_PARISC_LTOFF16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF"},
195 {R_PARISC_LTOFF16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF"},
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"},
337 };
338
339 #define OFFSET_14R_FROM_21L 4
340 #define OFFSET_14F_FROM_21L 5
341
342 /* Return one (or more) BFD relocations which implement the base
343 relocation with modifications based on format and field. */
344
345 elf_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;
351 int ignore;
352 asymbol *sym;
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 {
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:
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:
398 final_type = R_PARISC_DLTIND14R;
399 break;
400 case e_rtpsel:
401 final_type = R_PARISC_LTOFF_FPTR14DR;
402 break;
403 case e_tsel:
404 final_type = R_PARISC_DLTIND14F;
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:
437 final_type = R_PARISC_DLTIND21L;
438 break;
439 case e_ltpsel:
440 final_type = R_PARISC_LTOFF_FPTR21L;
441 break;
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;
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;
460 break;
461 case e_psel:
462 final_type = R_PARISC_PLABEL32;
463 break;
464 default:
465 return NULL;
466 }
467 break;
468
469 case 64:
470 switch (field)
471 {
472 case e_fsel:
473 final_type = R_PARISC_DIR64;
474 break;
475 case e_psel:
476 final_type = R_PARISC_FPTR64;
477 break;
478 default:
479 return NULL;
480 }
481 break;
482
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:
497 final_type = base_type + OFFSET_14R_FROM_21L;
498 break;
499 case e_fsel:
500 final_type = base_type + OFFSET_14F_FROM_21L;
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:
512 final_type = base_type;
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
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
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
586 case R_PARISC_SEGREL32:
587 case R_PARISC_SEGBASE:
588 /* The defaults are fine for these cases. */
589 break;
590
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
600 static void
601 elf_hppa_info_to_howto (abfd, bfd_reloc, elf_reloc)
602 bfd *abfd;
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
613 static void
614 elf_hppa_info_to_howto_rel (abfd, bfd_reloc, elf_reloc)
615 bfd *abfd;
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
627 static reloc_howto_type *
628 elf_hppa_reloc_type_lookup (abfd, code)
629 bfd *abfd;
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 }
639
640 static void
641 elf_hppa_final_write_processing (abfd, linker)
642 bfd *abfd;
643 boolean linker;
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)
657 elf_elfheader (abfd)->e_flags |= EFA_PARISC_2_0;
658 else if (mach == 25)
659 elf_elfheader (abfd)->e_flags |= (EF_PARISC_WIDE
660 | EFA_PARISC_2_0
661 /* The GNU tools have trapped without
662 option since 1993, so need to take
663 a step backwards with the ELF
664 based toolchains. */
665 | EF_PARISC_TRAPNIL);
666 }
667
668 /* Return true if SYM represents a local label symbol. */
669
670 static boolean
671 elf_hppa_is_local_label_name (abfd, name)
672 bfd *abfd ATTRIBUTE_UNUSED;
673 const char *name;
674 {
675 return (name[0] == 'L' && name[1] == '$');
676 }
677
678 /* Set the correct type for an ELF section. We do this by the
679 section name, which is a hack, but ought to work. */
680
681 static boolean
682 elf_hppa_fake_sections (abfd, hdr, sec)
683 bfd *abfd;
684 Elf64_Internal_Shdr *hdr;
685 asection *sec;
686 {
687 register const char *name;
688
689 name = bfd_get_section_name (abfd, sec);
690
691 if (strcmp (name, ".PARISC.unwind") == 0)
692 {
693 int indx;
694 asection *sec;
695 hdr->sh_type = SHT_LOPROC + 1;
696 /* ?!? How are unwinds supposed to work for symbols in arbitrary
697 sections? Or what if we have multiple .text sections in a single
698 .o file? HP really messed up on this one.
699
700 Ugh. We can not use elf_section_data (sec)->this_idx at this
701 point because it is not initialized yet.
702
703 So we (gasp) recompute it here. Hopefully nobody ever changes the
704 way sections are numbered in elf.c! */
705 for (sec = abfd->sections, indx = 1; sec; sec = sec->next, indx++)
706 {
707 if (sec->name && strcmp (sec->name, ".text") == 0)
708 {
709 hdr->sh_info = indx;
710 break;
711 }
712 }
713
714 /* I have no idea if this is really necessary or what it means. */
715 hdr->sh_entsize = 4;
716 }
717 return true;
718 }
719
720 /* Hook called by the linker routine which adds symbols from an object
721 file. HP's libraries define symbols with HP specific section
722 indices, which we have to handle. */
723
724 static boolean
725 elf_hppa_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
726 bfd *abfd;
727 struct bfd_link_info *info ATTRIBUTE_UNUSED;
728 const Elf_Internal_Sym *sym;
729 const char **namep ATTRIBUTE_UNUSED;
730 flagword *flagsp ATTRIBUTE_UNUSED;
731 asection **secp;
732 bfd_vma *valp;
733 {
734 int index = sym->st_shndx;
735
736 switch (index)
737 {
738 case SHN_PARISC_ANSI_COMMON:
739 *secp = bfd_make_section_old_way (abfd, ".PARISC.ansi.common");
740 (*secp)->flags |= SEC_IS_COMMON;
741 *valp = sym->st_size;
742 break;
743
744 case SHN_PARISC_HUGE_COMMON:
745 *secp = bfd_make_section_old_way (abfd, ".PARISC.huge.common");
746 (*secp)->flags |= SEC_IS_COMMON;
747 *valp = sym->st_size;
748 break;
749 }
750
751 return true;
752 }
753
754 static boolean
755 elf_hppa_unmark_useless_dynamic_symbols (h, data)
756 struct elf_link_hash_entry *h;
757 PTR data;
758 {
759 struct bfd_link_info *info = (struct bfd_link_info *)data;
760
761 /* If we are not creating a shared library, and this symbol is
762 referenced by a shared library but is not defined anywhere, then
763 the generic code will warn that it is undefined.
764
765 This behavior is undesirable on HPs since the standard shared
766 libraries contain reerences to undefined symbols.
767
768 So we twiddle the flags associated with such symbols so that they
769 will not trigger the warning. ?!? FIXME. This is horribly fraglie.
770
771 Ultimately we should have better controls over the generic ELF BFD
772 linker code. */
773 if (! info->relocateable
774 && ! (info->shared
775 && !info->no_undefined)
776 && h->root.type == bfd_link_hash_undefined
777 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0
778 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0)
779 {
780 h->elf_link_hash_flags &= ~ELF_LINK_HASH_REF_DYNAMIC;
781 h->elf_link_hash_flags |= 0x8000;
782 }
783
784 return true;
785 }
786
787
788 static boolean
789 elf_hppa_remark_useless_dynamic_symbols (h, data)
790 struct elf_link_hash_entry *h;
791 PTR data;
792 {
793 struct bfd_link_info *info = (struct bfd_link_info *)data;
794
795 /* If we are not creating a shared library, and this symbol is
796 referenced by a shared library but is not defined anywhere, then
797 the generic code will warn that it is undefined.
798
799 This behavior is undesirable on HPs since the standard shared
800 libraries contain reerences to undefined symbols.
801
802 So we twiddle the flags associated with such symbols so that they
803 will not trigger the warning. ?!? FIXME. This is horribly fragile.
804
805 Ultimately we should have better controls over the generic ELF BFD
806 linker code. */
807 if (! info->relocateable
808 && ! (info->shared
809 && !info->no_undefined)
810 && h->root.type == bfd_link_hash_undefined
811 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
812 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0
813 && (h->elf_link_hash_flags & 0x8000) != 0)
814 {
815 h->elf_link_hash_flags |= ELF_LINK_HASH_REF_DYNAMIC;
816 h->elf_link_hash_flags &= ~0x8000;
817 }
818
819 return true;
820 }
821
822 /* Record the lowest address for the data and text segments. */
823 static void
824 elf_hppa_record_segment_addrs (abfd, section, data)
825 bfd *abfd ATTRIBUTE_UNUSED;
826 asection *section;
827 PTR data;
828 {
829 struct elf64_hppa_link_hash_table *hppa_info;
830 bfd_vma value;
831
832 hppa_info = (struct elf64_hppa_link_hash_table *)data;
833
834 value = section->vma - section->filepos;
835
836 if ((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY)
837 == (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
838 && value < hppa_info->text_segment_base)
839 hppa_info->text_segment_base = value;
840 else if ((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY)
841 == (SEC_ALLOC | SEC_LOAD))
842 && value < hppa_info->data_segment_base)
843 hppa_info->data_segment_base = value;
844 }
845
846 /* Called after we have seen all the input files/sections, but before
847 final symbol resolution and section placement has been determined.
848
849 We use this hook to (possibly) provide a value for __gp, then we
850 fall back to the generic ELF final link routine. */
851
852 static boolean
853 elf_hppa_final_link (abfd, info)
854 bfd *abfd;
855 struct bfd_link_info *info;
856 {
857 boolean retval;
858
859 if (! info->relocateable)
860 {
861 struct elf_link_hash_entry *gp;
862 bfd_vma gp_val;
863 struct elf64_hppa_link_hash_table *hppa_info;
864
865 hppa_info = elf64_hppa_hash_table (info);
866
867 /* The linker script defines a value for __gp iff it was referenced
868 by one of the objects being linked. First try to find the symbol
869 in the hash table. If that fails, just compute the value __gp
870 should have had. */
871 gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false,
872 false, false);
873
874 if (gp)
875 {
876
877 /* Adjust the value of __gp as we may want to slide it into the
878 .plt section so that the stubs can access PLT entries without
879 using an addil sequence. */
880 gp->root.u.def.value += elf64_hppa_hash_table (info)->gp_offset;
881
882 gp_val = (gp->root.u.def.section->output_section->vma
883 + gp->root.u.def.section->output_offset
884 + gp->root.u.def.value);
885 }
886 else
887 {
888 asection *sec;
889
890
891 /* First look for a .plt section. If found, then __gp is the
892 address of the .plt + gp_offset.
893
894 If no .plt is found, then look for .dlt, .opd and .data (in
895 that order) and set __gp to the base address of whichever section
896 is found first. */
897
898 sec = hppa_info->plt_sec;
899 if (sec)
900 gp_val = (sec->output_offset
901 + sec->output_section->vma
902 + hppa_info->gp_offset);
903 else
904 {
905 sec = hppa_info->dlt_sec;
906 if (!sec)
907 sec = hppa_info->opd_sec;
908 if (!sec)
909 sec = bfd_get_section_by_name (abfd, ".data");
910 if (!sec)
911 return false;
912
913 gp_val = sec->output_offset + sec->output_section->vma;
914 }
915 }
916
917 /* Install whatever value we found/computed for __gp. */
918 _bfd_set_gp_value (abfd, gp_val);
919 }
920
921 /* We need to know the base of the text and data segments so that we
922 can perform SEGREL relocations. We will recore the base addresses
923 when we encounter the first SEGREL relocation. */
924 elf64_hppa_hash_table (info)->text_segment_base = (bfd_vma)-1;
925 elf64_hppa_hash_table (info)->data_segment_base = (bfd_vma)-1;
926
927 /* HP's shared libraries have references to symbols that are not
928 defined anywhere. The generic ELF BFD linker code will complaim
929 about such symbols.
930
931 So we detect the losing case and arrange for the flags on the symbol
932 to indicate that it was never referenced. This keeps the generic
933 ELF BFD link code happy and appears to not create any secondary
934 problems. Ultimately we need a way to control the behavior of the
935 generic ELF BFD link code better. */
936 elf_link_hash_traverse (elf_hash_table (info),
937 elf_hppa_unmark_useless_dynamic_symbols,
938 info);
939
940 /* Invoke the regular ELF backend linker to do all the work. */
941 retval = bfd_elf_bfd_final_link (abfd, info);
942
943 elf_link_hash_traverse (elf_hash_table (info),
944 elf_hppa_remark_useless_dynamic_symbols,
945 info);
946
947 return retval;
948 }
949
950 /* Relocate an HPPA ELF section. */
951
952 static boolean
953 elf_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
954 contents, relocs, local_syms, local_sections)
955 bfd *output_bfd;
956 struct bfd_link_info *info;
957 bfd *input_bfd;
958 asection *input_section;
959 bfd_byte *contents;
960 Elf_Internal_Rela *relocs;
961 Elf_Internal_Sym *local_syms;
962 asection **local_sections;
963 {
964 Elf_Internal_Shdr *symtab_hdr;
965 Elf_Internal_Rela *rel;
966 Elf_Internal_Rela *relend;
967 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
968
969 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
970
971 rel = relocs;
972 relend = relocs + input_section->reloc_count;
973 for (; rel < relend; rel++)
974 {
975 int r_type;
976 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
977 unsigned long r_symndx;
978 struct elf_link_hash_entry *h;
979 Elf_Internal_Sym *sym;
980 asection *sym_sec;
981 bfd_vma relocation;
982 bfd_reloc_status_type r;
983 const char *sym_name;
984 char *dyn_name;
985 char *dynh_buf = NULL;
986 size_t dynh_buflen = 0;
987 struct elf64_hppa_dyn_hash_entry *dyn_h = NULL;
988
989 r_type = ELF_R_TYPE (rel->r_info);
990 if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
991 {
992 bfd_set_error (bfd_error_bad_value);
993 return false;
994 }
995
996 r_symndx = ELF_R_SYM (rel->r_info);
997
998 if (info->relocateable)
999 {
1000 /* This is a relocateable link. We don't have to change
1001 anything, unless the reloc is against a section symbol,
1002 in which case we have to adjust according to where the
1003 section symbol winds up in the output section. */
1004 if (r_symndx < symtab_hdr->sh_info)
1005 {
1006 sym = local_syms + r_symndx;
1007 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1008 {
1009 sym_sec = local_sections[r_symndx];
1010 rel->r_addend += sym_sec->output_offset;
1011 }
1012 }
1013
1014 continue;
1015 }
1016
1017 /* This is a final link. */
1018 h = NULL;
1019 sym = NULL;
1020 sym_sec = NULL;
1021 if (r_symndx < symtab_hdr->sh_info)
1022 {
1023 /* This is a local symbol. */
1024 sym = local_syms + r_symndx;
1025 sym_sec = local_sections[r_symndx];
1026 relocation = ((ELF_ST_TYPE (sym->st_info) == STT_SECTION
1027 ? 0 : sym->st_value)
1028 + sym_sec->output_offset
1029 + sym_sec->output_section->vma);
1030
1031 /* If this symbol has an entry in the PA64 dynamic hash
1032 table, then get it. */
1033 dyn_name = get_dyn_name (input_bfd, h, rel,
1034 &dynh_buf, &dynh_buflen);
1035 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1036 dyn_name, false, false);
1037
1038 }
1039 else
1040 {
1041 /* This is not a local symbol. */
1042 long indx;
1043
1044 indx = r_symndx - symtab_hdr->sh_info;
1045 h = elf_sym_hashes (input_bfd)[indx];
1046 while (h->root.type == bfd_link_hash_indirect
1047 || h->root.type == bfd_link_hash_warning)
1048 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1049 if (h->root.type == bfd_link_hash_defined
1050 || h->root.type == bfd_link_hash_defweak)
1051 {
1052 sym_sec = h->root.u.def.section;
1053
1054 /* If this symbol has an entry in the PA64 dynamic hash
1055 table, then get it. */
1056 dyn_name = get_dyn_name (input_bfd, h, rel,
1057 &dynh_buf, &dynh_buflen);
1058 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1059 dyn_name, false, false);
1060
1061 /* If we have a relocation against a symbol defined in a
1062 shared library and we have not created an entry in the
1063 PA64 dynamic symbol hash table for it, then we lose. */
1064 if (sym_sec->output_section == NULL && dyn_h == NULL)
1065 {
1066 (*_bfd_error_handler)
1067 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1068 bfd_get_filename (input_bfd), h->root.root.string,
1069 bfd_get_section_name (input_bfd, input_section));
1070 relocation = 0;
1071 }
1072 else if (sym_sec->output_section)
1073 relocation = (h->root.u.def.value
1074 + sym_sec->output_offset
1075 + sym_sec->output_section->vma);
1076 /* Value will be provided via one of the offsets in the
1077 dyn_h hash table entry. */
1078 else
1079 relocation = 0;
1080 }
1081 /* Allow undefined symbols in shared libraries. */
1082 else if (info->shared && !info->no_undefined)
1083 {
1084 if (info->symbolic)
1085 (*info->callbacks->undefined_symbol)
1086 (info, h->root.root.string, input_bfd,
1087 input_section, rel->r_offset, false);
1088
1089 /* If this symbol has an entry in the PA64 dynamic hash
1090 table, then get it. */
1091 dyn_name = get_dyn_name (input_bfd, h, rel,
1092 &dynh_buf, &dynh_buflen);
1093 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1094 dyn_name, false, false);
1095
1096 if (dyn_h == NULL)
1097 {
1098 (*_bfd_error_handler)
1099 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1100 bfd_get_filename (input_bfd), h->root.root.string,
1101 bfd_get_section_name (input_bfd, input_section));
1102 relocation = 0;
1103 }
1104 relocation = 0;
1105 }
1106 else if (h->root.type == bfd_link_hash_undefweak)
1107 relocation = 0;
1108 else
1109 {
1110 if (!((*info->callbacks->undefined_symbol)
1111 (info, h->root.root.string, input_bfd,
1112 input_section, rel->r_offset, true)))
1113 return false;
1114 break;
1115 }
1116 }
1117
1118 if (h != NULL)
1119 sym_name = h->root.root.string;
1120 else
1121 {
1122 sym_name = bfd_elf_string_from_elf_section (input_bfd,
1123 symtab_hdr->sh_link,
1124 sym->st_name);
1125 if (sym_name == NULL)
1126 return false;
1127 if (*sym_name == '\0')
1128 sym_name = bfd_section_name (input_bfd, sym_sec);
1129 }
1130
1131 r = elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
1132 input_section, contents,
1133 relocation, info, sym_sec,
1134 h, dyn_h);
1135
1136 if (r != bfd_reloc_ok)
1137 {
1138 switch (r)
1139 {
1140 default:
1141 abort ();
1142 case bfd_reloc_overflow:
1143 {
1144 if (!((*info->callbacks->reloc_overflow)
1145 (info, sym_name, howto->name, (bfd_vma) 0,
1146 input_bfd, input_section, rel->r_offset)))
1147 return false;
1148 }
1149 break;
1150 }
1151 }
1152 }
1153 return true;
1154 }
1155
1156
1157 /* Compute the value for a relocation (REL) during a final link stage,
1158 then insert the value into the proper location in CONTENTS.
1159
1160 VALUE is a tentative value for the relocation and may be overridden
1161 and modified here based on the specific relocation to be performed.
1162
1163 For example we do conversions for PC-relative branches in this routine
1164 or redirection of calls to external routines to stubs.
1165
1166 The work of actually applying the relocation is left to a helper
1167 routine in an attempt to reduce the complexity and size of this
1168 function. */
1169
1170 static bfd_reloc_status_type
1171 elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
1172 input_section, contents, value,
1173 info, sym_sec, h, dyn_h)
1174 Elf_Internal_Rela *rel;
1175 bfd *input_bfd;
1176 bfd *output_bfd;
1177 asection *input_section;
1178 bfd_byte *contents;
1179 bfd_vma value;
1180 struct bfd_link_info *info;
1181 asection *sym_sec;
1182 struct elf_link_hash_entry *h;
1183 struct elf64_hppa_dyn_hash_entry *dyn_h;
1184 {
1185 unsigned long insn;
1186 bfd_vma offset = rel->r_offset;
1187 bfd_vma addend = rel->r_addend;
1188 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
1189 unsigned long r_type = howto->type;
1190 unsigned long r_field = e_fsel;
1191 bfd_byte *hit_data = contents + offset;
1192 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
1193
1194 insn = bfd_get_32 (input_bfd, hit_data);
1195
1196 switch (r_type)
1197 {
1198 case R_PARISC_NONE:
1199 break;
1200
1201 /* Random PC relative relocs. */
1202 case R_PARISC_PCREL21L:
1203 case R_PARISC_PCREL14R:
1204 case R_PARISC_PCREL14F:
1205 case R_PARISC_PCREL14WR:
1206 case R_PARISC_PCREL14DR:
1207 case R_PARISC_PCREL16F:
1208 case R_PARISC_PCREL16WF:
1209 case R_PARISC_PCREL16DF:
1210 {
1211 if (r_type == R_PARISC_PCREL21L)
1212 r_field = e_lsel;
1213 else if (r_type == R_PARISC_PCREL14F
1214 || r_type == R_PARISC_PCREL16F
1215 || r_type == R_PARISC_PCREL16WF
1216 || r_type == R_PARISC_PCREL16DF)
1217 r_field = e_fsel;
1218 else
1219 r_field = e_rsel;
1220
1221 /* If this is a call to a function defined in another dynamic
1222 library, then redirect the call to the local stub for this
1223 function. */
1224 if (sym_sec == NULL || sym_sec->output_section == NULL)
1225 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1226 + hppa_info->stub_sec->output_section->vma);
1227
1228 /* Turn VALUE into a proper PC relative address. */
1229 value -= (offset + input_section->output_offset
1230 + input_section->output_section->vma);
1231
1232 /* Adjust for any field selectors. */
1233 value = hppa_field_adjust (value, -8 + addend, r_field);
1234
1235 /* Apply the relocation to the given instruction. */
1236 insn = elf_hppa_relocate_insn (insn, value, r_type);
1237 break;
1238 }
1239
1240 /* Basic function call support. I'm not entirely sure if PCREL14F is
1241 actually needed or even handled correctly.
1242
1243 Note for a call to a function defined in another dynamic library
1244 we want to redirect the call to a stub. */
1245 case R_PARISC_PCREL22F:
1246 case R_PARISC_PCREL17F:
1247 case R_PARISC_PCREL22C:
1248 case R_PARISC_PCREL17C:
1249 case R_PARISC_PCREL17R:
1250 {
1251 if (r_type == R_PARISC_PCREL17R)
1252 r_field = e_rsel;
1253 else
1254 r_field = e_fsel;
1255
1256 /* If this is a call to a function defined in another dynamic
1257 library, then redirect the call to the local stub for this
1258 function. */
1259 if (sym_sec == NULL || sym_sec->output_section == NULL)
1260 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1261 + hppa_info->stub_sec->output_section->vma);
1262
1263 /* Turn VALUE into a proper PC relative address. */
1264 value -= (offset + input_section->output_offset
1265 + input_section->output_section->vma);
1266
1267 /* Adjust for any field selectors. */
1268 value = hppa_field_adjust (value, -8 + addend, e_fsel);
1269
1270 /* All branches are implicitly shifted by 2 places. */
1271 value >>= 2;
1272
1273 /* Apply the relocation to the given instruction. */
1274 insn = elf_hppa_relocate_insn (insn, value, r_type);
1275 break;
1276 }
1277
1278 /* Indirect references to data through the DLT. */
1279 case R_PARISC_DLTIND14R:
1280 case R_PARISC_DLTIND14F:
1281 case R_PARISC_DLTIND14DR:
1282 case R_PARISC_DLTIND14WR:
1283 case R_PARISC_DLTIND21L:
1284 case R_PARISC_LTOFF_FPTR14R:
1285 case R_PARISC_LTOFF_FPTR14DR:
1286 case R_PARISC_LTOFF_FPTR14WR:
1287 case R_PARISC_LTOFF_FPTR21L:
1288 case R_PARISC_LTOFF_FPTR16F:
1289 case R_PARISC_LTOFF_FPTR16WF:
1290 case R_PARISC_LTOFF_FPTR16DF:
1291 case R_PARISC_LTOFF_TP21L:
1292 case R_PARISC_LTOFF_TP14R:
1293 case R_PARISC_LTOFF_TP14F:
1294 case R_PARISC_LTOFF_TP14WR:
1295 case R_PARISC_LTOFF_TP14DR:
1296 case R_PARISC_LTOFF_TP16F:
1297 case R_PARISC_LTOFF_TP16WF:
1298 case R_PARISC_LTOFF_TP16DF:
1299 case R_PARISC_LTOFF16F:
1300 case R_PARISC_LTOFF16WF:
1301 case R_PARISC_LTOFF16DF:
1302 {
1303 /* If this relocation was against a local symbol, then we still
1304 have not set up the DLT entry (it's not convienent to do so
1305 in the "finalize_dlt" routine because it is difficult to get
1306 to the local symbol's value).
1307
1308 So, if this is a local symbol (h == NULL), then we need to
1309 fill in its DLT entry.
1310
1311 Similarly we may still need to set up an entry in .opd for
1312 a local function which had its address taken. */
1313 if (dyn_h->h == NULL)
1314 {
1315 bfd_put_64 (hppa_info->dlt_sec->owner,
1316 value,
1317 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
1318
1319 /* Now handle .opd creation if needed. */
1320 if (r_type == R_PARISC_LTOFF_FPTR14R
1321 || r_type == R_PARISC_LTOFF_FPTR14DR
1322 || r_type == R_PARISC_LTOFF_FPTR14WR
1323 || r_type == R_PARISC_LTOFF_FPTR21L
1324 || r_type == R_PARISC_LTOFF_FPTR16F
1325 || r_type == R_PARISC_LTOFF_FPTR16WF
1326 || r_type == R_PARISC_LTOFF_FPTR16DF)
1327 {
1328 /* The first two words of an .opd entry are zero. */
1329 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset,
1330 0, 16);
1331
1332 /* The next word is the address of the function. */
1333 bfd_put_64 (hppa_info->opd_sec->owner, value,
1334 (hppa_info->opd_sec->contents
1335 + dyn_h->opd_offset + 16));
1336
1337 /* The last word is our local __gp value. */
1338 value = _bfd_get_gp_value
1339 (hppa_info->opd_sec->output_section->owner);
1340 bfd_put_64 (hppa_info->opd_sec->owner, value,
1341 (hppa_info->opd_sec->contents
1342 + dyn_h->opd_offset + 24));
1343 }
1344 }
1345
1346 /* We want the value of the DLT offset for this symbol, not
1347 the symbol's actual address. Note that __gp may not point
1348 to the start of the DLT, so we have to compute the absolute
1349 address, then subtract out the value of __gp. */
1350 value = (dyn_h->dlt_offset
1351 + hppa_info->dlt_sec->output_offset
1352 + hppa_info->dlt_sec->output_section->vma);
1353 value -= _bfd_get_gp_value (output_bfd);
1354
1355
1356 /* All DLTIND relocations are basically the same at this point,
1357 except that we need different field selectors for the 21bit
1358 version vs the 14bit versions. */
1359 if (r_type == R_PARISC_DLTIND21L
1360 || r_type == R_PARISC_LTOFF_FPTR21L
1361 || r_type == R_PARISC_LTOFF_TP21L)
1362 value = hppa_field_adjust (value, addend, e_lrsel);
1363 else if (r_type == R_PARISC_DLTIND14F
1364 || r_type == R_PARISC_LTOFF_FPTR16F
1365 || r_type == R_PARISC_LTOFF_FPTR16WF
1366 || r_type == R_PARISC_LTOFF_FPTR16DF
1367 || r_type == R_PARISC_LTOFF16F
1368 || r_type == R_PARISC_LTOFF16DF
1369 || r_type == R_PARISC_LTOFF16WF
1370 || r_type == R_PARISC_LTOFF_TP16F
1371 || r_type == R_PARISC_LTOFF_TP16WF
1372 || r_type == R_PARISC_LTOFF_TP16DF)
1373 value = hppa_field_adjust (value, addend, e_fsel);
1374 else
1375 value = hppa_field_adjust (value, addend, e_rrsel);
1376
1377 insn = elf_hppa_relocate_insn (insn, value, r_type);
1378 break;
1379 }
1380
1381 case R_PARISC_DLTREL14R:
1382 case R_PARISC_DLTREL14F:
1383 case R_PARISC_DLTREL14DR:
1384 case R_PARISC_DLTREL14WR:
1385 case R_PARISC_DLTREL21L:
1386 case R_PARISC_DPREL21L:
1387 case R_PARISC_DPREL14WR:
1388 case R_PARISC_DPREL14DR:
1389 case R_PARISC_DPREL14R:
1390 case R_PARISC_DPREL14F:
1391 case R_PARISC_GPREL16F:
1392 case R_PARISC_GPREL16WF:
1393 case R_PARISC_GPREL16DF:
1394 {
1395 /* Subtract out the global pointer value to make value a DLT
1396 relative address. */
1397 value -= _bfd_get_gp_value (output_bfd);
1398
1399 /* All DLTREL relocations are basically the same at this point,
1400 except that we need different field selectors for the 21bit
1401 version vs the 14bit versions. */
1402 if (r_type == R_PARISC_DLTREL21L
1403 || r_type == R_PARISC_DPREL21L)
1404 value = hppa_field_adjust (value, addend, e_lrsel);
1405 else if (r_type == R_PARISC_DLTREL14F
1406 || r_type == R_PARISC_DPREL14F
1407 || r_type == R_PARISC_GPREL16F
1408 || r_type == R_PARISC_GPREL16WF
1409 || r_type == R_PARISC_GPREL16DF)
1410 value = hppa_field_adjust (value, addend, e_fsel);
1411 else
1412 value = hppa_field_adjust (value, addend, e_rrsel);
1413
1414 insn = elf_hppa_relocate_insn (insn, value, r_type);
1415 break;
1416 }
1417
1418 case R_PARISC_DIR21L:
1419 case R_PARISC_DIR17R:
1420 case R_PARISC_DIR17F:
1421 case R_PARISC_DIR14R:
1422 case R_PARISC_DIR14WR:
1423 case R_PARISC_DIR14DR:
1424 case R_PARISC_DIR16F:
1425 case R_PARISC_DIR16WF:
1426 case R_PARISC_DIR16DF:
1427 {
1428 /* All DIR relocations are basically the same at this point,
1429 except that we need different field selectors for the 21bit
1430 version vs the 14bit versions. */
1431 if (r_type == R_PARISC_DIR21L)
1432 value = hppa_field_adjust (value, addend, e_lrsel);
1433 else if (r_type == R_PARISC_DIR17F
1434 || r_type == R_PARISC_DIR16F
1435 || r_type == R_PARISC_DIR16WF
1436 || r_type == R_PARISC_DIR16DF)
1437 value = hppa_field_adjust (value, addend, e_fsel);
1438 else
1439 value = hppa_field_adjust (value, addend, e_rrsel);
1440
1441 insn = elf_hppa_relocate_insn (insn, value, r_type);
1442 break;
1443 }
1444
1445 case R_PARISC_PLTOFF21L:
1446 case R_PARISC_PLTOFF14R:
1447 case R_PARISC_PLTOFF14F:
1448 case R_PARISC_PLTOFF14WR:
1449 case R_PARISC_PLTOFF14DR:
1450 case R_PARISC_PLTOFF16F:
1451 case R_PARISC_PLTOFF16WF:
1452 case R_PARISC_PLTOFF16DF:
1453 {
1454 /* We want the value of the PLT offset for this symbol, not
1455 the symbol's actual address. Note that __gp may not point
1456 to the start of the DLT, so we have to compute the absolute
1457 address, then subtract out the value of __gp. */
1458 value = (dyn_h->plt_offset
1459 + hppa_info->plt_sec->output_offset
1460 + hppa_info->plt_sec->output_section->vma);
1461 value -= _bfd_get_gp_value (output_bfd);
1462
1463 /* All PLTOFF relocations are basically the same at this point,
1464 except that we need different field selectors for the 21bit
1465 version vs the 14bit versions. */
1466 if (r_type == R_PARISC_PLTOFF21L)
1467 value = hppa_field_adjust (value, addend, e_lrsel);
1468 else if (r_type == R_PARISC_PLTOFF14F
1469 || r_type == R_PARISC_PLTOFF16F
1470 || r_type == R_PARISC_PLTOFF16WF
1471 || r_type == R_PARISC_PLTOFF16DF)
1472 value = hppa_field_adjust (value, addend, e_fsel);
1473 else
1474 value = hppa_field_adjust (value, addend, e_rrsel);
1475
1476 insn = elf_hppa_relocate_insn (insn, value, r_type);
1477 break;
1478 }
1479
1480 case R_PARISC_LTOFF_FPTR32:
1481 {
1482 /* We may still need to create the FPTR itself if it was for
1483 a local symbol. */
1484 if (dyn_h->h == NULL)
1485 {
1486 /* The first two words of an .opd entry are zero. */
1487 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1488
1489 /* The next word is the address of the function. */
1490 bfd_put_64 (hppa_info->opd_sec->owner, value,
1491 (hppa_info->opd_sec->contents
1492 + dyn_h->opd_offset + 16));
1493
1494 /* The last word is our local __gp value. */
1495 value = _bfd_get_gp_value
1496 (hppa_info->opd_sec->output_section->owner);
1497 bfd_put_64 (hppa_info->opd_sec->owner, value,
1498 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1499 }
1500
1501 /* We want the value of the DLT offset for this symbol, not
1502 the symbol's actual address. Note that __gp may not point
1503 to the start of the DLT, so we have to compute the absolute
1504 address, then subtract out the value of __gp. */
1505 value = (dyn_h->dlt_offset
1506 + hppa_info->dlt_sec->output_offset
1507 + hppa_info->dlt_sec->output_section->vma);
1508 value -= _bfd_get_gp_value (output_bfd);
1509 bfd_put_32 (input_bfd, value, hit_data);
1510 return bfd_reloc_ok;
1511 }
1512
1513 case R_PARISC_LTOFF_FPTR64:
1514 case R_PARISC_LTOFF_TP64:
1515 {
1516 /* We may still need to create the FPTR itself if it was for
1517 a local symbol. */
1518 if (dyn_h->h == NULL && r_type == R_PARISC_LTOFF_FPTR64)
1519 {
1520 /* The first two words of an .opd entry are zero. */
1521 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1522
1523 /* The next word is the address of the function. */
1524 bfd_put_64 (hppa_info->opd_sec->owner, value,
1525 (hppa_info->opd_sec->contents
1526 + dyn_h->opd_offset + 16));
1527
1528 /* The last word is our local __gp value. */
1529 value = _bfd_get_gp_value
1530 (hppa_info->opd_sec->output_section->owner);
1531 bfd_put_64 (hppa_info->opd_sec->owner, value,
1532 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1533 }
1534
1535 /* We want the value of the DLT offset for this symbol, not
1536 the symbol's actual address. Note that __gp may not point
1537 to the start of the DLT, so we have to compute the absolute
1538 address, then subtract out the value of __gp. */
1539 value = (dyn_h->dlt_offset
1540 + hppa_info->dlt_sec->output_offset
1541 + hppa_info->dlt_sec->output_section->vma);
1542 value -= _bfd_get_gp_value (output_bfd);
1543 bfd_put_64 (input_bfd, value, hit_data);
1544 return bfd_reloc_ok;
1545 }
1546
1547 case R_PARISC_DIR32:
1548 bfd_put_32 (input_bfd, value + addend, hit_data);
1549 return bfd_reloc_ok;
1550
1551 case R_PARISC_DIR64:
1552 bfd_put_64 (input_bfd, value + addend, hit_data);
1553 return bfd_reloc_ok;
1554
1555 case R_PARISC_GPREL64:
1556 /* Subtract out the global pointer value to make value a DLT
1557 relative address. */
1558 value -= _bfd_get_gp_value (output_bfd);
1559 value += addend;
1560
1561 bfd_put_64 (input_bfd, value + addend, hit_data);
1562 return bfd_reloc_ok;
1563
1564 case R_PARISC_LTOFF64:
1565 /* We want the value of the DLT offset for this symbol, not
1566 the symbol's actual address. Note that __gp may not point
1567 to the start of the DLT, so we have to compute the absolute
1568 address, then subtract out the value of __gp. */
1569 value = (dyn_h->dlt_offset
1570 + hppa_info->dlt_sec->output_offset
1571 + hppa_info->dlt_sec->output_section->vma);
1572 value -= _bfd_get_gp_value (output_bfd);
1573
1574 bfd_put_64 (input_bfd, value + addend, hit_data);
1575 return bfd_reloc_ok;
1576
1577 case R_PARISC_PCREL32:
1578 {
1579 /* If this is a call to a function defined in another dynamic
1580 library, then redirect the call to the local stub for this
1581 function. */
1582 if (sym_sec == NULL || sym_sec->output_section == NULL)
1583 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1584 + hppa_info->stub_sec->output_section->vma);
1585
1586 /* Turn VALUE into a proper PC relative address. */
1587 value -= (offset + input_section->output_offset
1588 + input_section->output_section->vma);
1589
1590 value += addend;
1591 value -= 8;
1592 bfd_put_64 (input_bfd, value, hit_data);
1593 return bfd_reloc_ok;
1594 }
1595
1596 case R_PARISC_PCREL64:
1597 {
1598 /* If this is a call to a function defined in another dynamic
1599 library, then redirect the call to the local stub for this
1600 function. */
1601 if (sym_sec == NULL || sym_sec->output_section == NULL)
1602 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1603 + hppa_info->stub_sec->output_section->vma);
1604
1605
1606 /* Turn VALUE into a proper PC relative address. */
1607 value -= (offset + input_section->output_offset
1608 + input_section->output_section->vma);
1609
1610 value += addend;
1611 value -= 8;
1612 bfd_put_64 (input_bfd, value, hit_data);
1613 return bfd_reloc_ok;
1614 }
1615
1616
1617 case R_PARISC_FPTR64:
1618 {
1619 /* We may still need to create the FPTR itself if it was for
1620 a local symbol. */
1621 if (dyn_h->h == NULL)
1622 {
1623 /* The first two words of an .opd entry are zero. */
1624 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1625
1626 /* The next word is the address of the function. */
1627 bfd_put_64 (hppa_info->opd_sec->owner, value,
1628 (hppa_info->opd_sec->contents
1629 + dyn_h->opd_offset + 16));
1630
1631 /* The last word is our local __gp value. */
1632 value = _bfd_get_gp_value
1633 (hppa_info->opd_sec->output_section->owner);
1634 bfd_put_64 (hppa_info->opd_sec->owner, value,
1635 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1636 }
1637
1638 /* We want the value of the OPD offset for this symbol, not
1639 the symbol's actual address. */
1640 value = (dyn_h->opd_offset
1641 + hppa_info->opd_sec->output_offset
1642 + hppa_info->opd_sec->output_section->vma);
1643
1644 bfd_put_64 (input_bfd, value + addend, hit_data);
1645 return bfd_reloc_ok;
1646 }
1647
1648 case R_PARISC_SECREL32:
1649 bfd_put_32 (input_bfd,
1650 (value + addend
1651 - sym_sec->output_section->vma),
1652 hit_data);
1653 return bfd_reloc_ok;
1654
1655 case R_PARISC_SEGREL32:
1656 case R_PARISC_SEGREL64:
1657 {
1658 /* If this is the first SEGREL relocation, then initialize
1659 the segment base values. */
1660 if (hppa_info->text_segment_base == (bfd_vma) -1)
1661 bfd_map_over_sections (output_bfd, elf_hppa_record_segment_addrs,
1662 elf64_hppa_hash_table (info));
1663
1664 /* VALUE holds the absolute address. We want to include the
1665 addend, then turn it into a segment relative address.
1666
1667 The segment is derived from SYM_SEC. We assume that there are
1668 only two segments of note in the resulting executable/shlib.
1669 A readonly segment (.text) and a readwrite segment (.data). */
1670 value += addend;
1671
1672 if (sym_sec->flags & SEC_CODE)
1673 value -= hppa_info->text_segment_base;
1674 else
1675 value -= hppa_info->data_segment_base;
1676
1677 if (r_type == R_PARISC_SEGREL32)
1678 bfd_put_32 (input_bfd, value, hit_data);
1679 else
1680 bfd_put_64 (input_bfd, value, hit_data);
1681 return bfd_reloc_ok;
1682 }
1683
1684
1685 /* Something we don't know how to handle. */
1686 default:
1687 return bfd_reloc_notsupported;
1688 }
1689
1690 /* Update the instruction word. */
1691 bfd_put_32 (input_bfd, insn, hit_data);
1692 return (bfd_reloc_ok);
1693 }
1694
1695 /* Relocate the given INSN. VALUE should be the actual value we want
1696 to insert into the instruction, ie by this point we should not be
1697 concerned with computing an offset relative to the DLT, PC, etc.
1698 Instead this routine is meant to handle the bit manipulations needed
1699 to insert the relocation into the given instruction. */
1700
1701 static unsigned long
1702 elf_hppa_relocate_insn (insn, sym_value, r_type)
1703 unsigned long insn;
1704 long sym_value;
1705 unsigned long r_type;
1706 {
1707 switch (r_type)
1708 {
1709 /* This is any 22bit branch. In PA2.0 syntax it corresponds to
1710 the "B" instruction. */
1711 case R_PARISC_PCREL22F:
1712 case R_PARISC_PCREL22C:
1713 {
1714 unsigned int w3, w2, w1, w;
1715
1716 /* These are 22 bit branches. Mask off bits we do not care
1717 about. */
1718 sym_value &= 0x3fffff;
1719
1720 /* Now extract the W1, W2, W3 and W fields from the value. */
1721 dis_assemble_22 (sym_value, &w3, &w1, &w2, &w);
1722
1723 /* Mask out bits for the value in the instruction. */
1724 insn &= 0xfc00e002;
1725
1726 /* Insert the bits for the W1, W2 and W fields into the
1727 instruction. */
1728 insn |= (w3 << 21) | (w2 << 2) | (w1 << 16) | w;
1729 return insn;
1730 }
1731
1732 /* This is any 17bit branch. In PA2.0 syntax it also corresponds to
1733 the "B" instruction as well as BE. */
1734 case R_PARISC_PCREL17F:
1735 case R_PARISC_DIR17F:
1736 case R_PARISC_DIR17R:
1737 case R_PARISC_PCREL17C:
1738 case R_PARISC_PCREL17R:
1739 {
1740 unsigned int w2, w1, w;
1741
1742 /* These are 17 bit branches. Mask off bits we do not care
1743 about. */
1744 sym_value &= 0x1ffff;
1745
1746 /* Now extract the W1, W2 and W fields from the value. */
1747 dis_assemble_17 (sym_value, &w1, &w2, &w);
1748
1749 /* Mask out bits for the value in the instruction. */
1750 insn &= 0xffe0e002;
1751
1752 /* Insert the bits for the W1, W2 and W fields into the
1753 instruction. */
1754 insn |= (w2 << 2) | (w1 << 16) | w;
1755 return insn;
1756 }
1757
1758 /* ADDIL or LDIL instructions. */
1759 case R_PARISC_DLTREL21L:
1760 case R_PARISC_DLTIND21L:
1761 case R_PARISC_LTOFF_FPTR21L:
1762 case R_PARISC_PCREL21L:
1763 case R_PARISC_LTOFF_TP21L:
1764 case R_PARISC_DPREL21L:
1765 case R_PARISC_PLTOFF21L:
1766 case R_PARISC_DIR21L:
1767 {
1768 int w;
1769
1770 /* Mask off bits in INSN we do not want. */
1771 insn &= 0xffe00000;
1772
1773 /* Turn the 21bit value into the proper format. */
1774 dis_assemble_21 (sym_value, &w);
1775
1776 /* And insert the proper bits into INSN. */
1777 return insn | w;
1778 }
1779
1780 /* LDO and integer loads/stores with 14bit displacements. */
1781 case R_PARISC_DLTREL14R:
1782 case R_PARISC_DLTREL14F:
1783 case R_PARISC_DLTIND14R:
1784 case R_PARISC_DLTIND14F:
1785 case R_PARISC_LTOFF_FPTR14R:
1786 case R_PARISC_LTOFF_FPTR16F:
1787 case R_PARISC_PCREL14R:
1788 case R_PARISC_PCREL14F:
1789 case R_PARISC_PCREL16F:
1790 case R_PARISC_LTOFF_TP14R:
1791 case R_PARISC_LTOFF_TP14F:
1792 case R_PARISC_LTOFF_TP16F:
1793 case R_PARISC_DPREL14R:
1794 case R_PARISC_DPREL14F:
1795 case R_PARISC_GPREL16F:
1796 case R_PARISC_PLTOFF14R:
1797 case R_PARISC_PLTOFF14F:
1798 case R_PARISC_PLTOFF16F:
1799 case R_PARISC_DIR14R:
1800 case R_PARISC_DIR16F:
1801 case R_PARISC_LTOFF16F:
1802 {
1803 int w;
1804
1805 /* Mask off bits in INSN we do not want. */
1806 insn &= 0xffffc000;
1807
1808 /* Turn the 14bit value into the proper format. */
1809 low_sign_unext (sym_value, 14, &w);
1810
1811 /* And insert the proper bits into INSN. */
1812 return insn | w;
1813 }
1814
1815 /* Doubleword loads and stores with a 14bit displacement. */
1816 case R_PARISC_DLTREL14DR:
1817 case R_PARISC_DLTIND14DR:
1818 case R_PARISC_LTOFF_FPTR14DR:
1819 case R_PARISC_LTOFF_FPTR16DF:
1820 case R_PARISC_PCREL14DR:
1821 case R_PARISC_PCREL16DF:
1822 case R_PARISC_LTOFF_TP14DR:
1823 case R_PARISC_LTOFF_TP16DF:
1824 case R_PARISC_DPREL14DR:
1825 case R_PARISC_GPREL16DF:
1826 case R_PARISC_PLTOFF14DR:
1827 case R_PARISC_PLTOFF16DF:
1828 case R_PARISC_DIR14DR:
1829 case R_PARISC_DIR16DF:
1830 case R_PARISC_LTOFF16DF:
1831 {
1832 /* Mask off bits in INSN we do not want. */
1833 insn &= 0xffffc00e;
1834
1835 /* The sign bit at 14 moves into bit zero in the destination. */
1836 insn |= ((sym_value & 0x2000) >> 13);
1837
1838 /* Turn off the bits in sym_value we do not care about. */
1839 sym_value &= 0x1ff8;
1840
1841 /* Now shift it one bit position left so that it lines up with the
1842 destination field in INSN. */
1843 sym_value <<= 1;
1844
1845 return insn | sym_value;
1846 }
1847
1848 /* Floating point single word load/store instructions. */
1849 case R_PARISC_DLTREL14WR:
1850 case R_PARISC_DLTIND14WR:
1851 case R_PARISC_LTOFF_FPTR14WR:
1852 case R_PARISC_LTOFF_FPTR16WF:
1853 case R_PARISC_PCREL14WR:
1854 case R_PARISC_PCREL16WF:
1855 case R_PARISC_LTOFF_TP14WR:
1856 case R_PARISC_LTOFF_TP16WF:
1857 case R_PARISC_DPREL14WR:
1858 case R_PARISC_GPREL16WF:
1859 case R_PARISC_PLTOFF14WR:
1860 case R_PARISC_PLTOFF16WF:
1861 case R_PARISC_DIR16WF:
1862 case R_PARISC_DIR14WR:
1863 case R_PARISC_LTOFF16WF:
1864 {
1865 /* Mask off bits in INSN we do not want. */
1866 insn &= 0xffffc006;
1867
1868 /* The sign bit at 14 moves into bit zero in the destination. */
1869 insn |= ((sym_value & 0x2000) >> 13);
1870
1871 /* Turn off the bits in sym_value we do not care about. */
1872 sym_value &= 0x1ffc;
1873
1874 /* Now shift it one bit position left so that it lines up with the
1875 destination field in INSN. */
1876 sym_value <<= 1;
1877
1878 return insn | sym_value;
1879 }
1880
1881 default:
1882 return insn;
1883 }
1884 }
This page took 0.083723 seconds and 4 git commands to generate.