* elf-hppa.h (elf_hppa_final_link): If unable to find __gp in the
[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 | EFA_PARISC_2_0;
660 }
661
662 /* Return true if SYM represents a local label symbol. */
663
664 static boolean
665 elf_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
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
675 static boolean
676 elf_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 {
687 int indx;
688 asection *sec;
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
692 .o file? HP really messed up on this one.
693
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 }
707
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
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
718 static boolean
719 elf_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;
729
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;
737
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
748 static boolean
749 elf_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
782 static boolean
783 elf_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
797 will not trigger the warning. ?!? FIXME. This is horribly fragile.
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
816 /* Record the lowest address for the data and text segments. */
817 static void
818 elf_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
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
846 static boolean
847 elf_hppa_final_link (abfd, info)
848 bfd *abfd;
849 struct bfd_link_info *info;
850 {
851 boolean retval;
852
853 if (! info->relocateable)
854 {
855 struct elf_link_hash_entry *gp;
856 bfd_vma gp_val;
857 struct elf64_hppa_link_hash_table *hppa_info;
858
859 hppa_info = elf64_hppa_hash_table (info);
860
861 /* The linker script defines a value for __gp iff it was referenced
862 by one of the objects being linked. First try to find the symbol
863 in the hash table. If that fails, just compute the value __gp
864 should have had. */
865 gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false,
866 false, false);
867
868 if (gp)
869 {
870
871 /* Adjust the value of __gp as we may want to slide it into the
872 .plt section so that the stubs can access PLT entries without
873 using an addil sequence. */
874 gp->root.u.def.value += elf64_hppa_hash_table (info)->gp_offset;
875
876 gp_val = (gp->root.u.def.section->output_section->vma
877 + gp->root.u.def.section->output_offset
878 + gp->root.u.def.value);
879 }
880 else
881 {
882 asection *sec;
883
884
885 /* First look for a .plt section. If found, then __gp is the
886 address of the .plt + gp_offset.
887
888 If no .plt is found, then look for .dlt, .opd and .data (in
889 that order) and set __gp to the base address of whichever section
890 is found first. */
891
892 sec = hppa_info->plt_sec;
893 if (sec)
894 gp_val = (sec->output_offset
895 + sec->output_section->vma
896 + hppa_info->gp_offset);
897 else
898 {
899 sec = hppa_info->dlt_sec;
900 if (!sec)
901 sec = hppa_info->opd_sec;
902 if (!sec)
903 sec = bfd_get_section_by_name (abfd, ".data");
904 if (!sec)
905 return false;
906
907 gp_val = sec->output_offset + sec->output_section->vma;
908 }
909 }
910
911 /* Install whatever value we found/computed for __gp. */
912 _bfd_set_gp_value (abfd, gp_val);
913 }
914
915 /* We need to know the base of the text and data segments so that we
916 can perform SEGREL relocations. We will recore the base addresses
917 when we encounter the first SEGREL relocation. */
918 elf64_hppa_hash_table (info)->text_segment_base = (bfd_vma)-1;
919 elf64_hppa_hash_table (info)->data_segment_base = (bfd_vma)-1;
920
921 /* HP's shared libraries have references to symbols that are not
922 defined anywhere. The generic ELF BFD linker code will complaim
923 about such symbols.
924
925 So we detect the losing case and arrange for the flags on the symbol
926 to indicate that it was never referenced. This keeps the generic
927 ELF BFD link code happy and appears to not create any secondary
928 problems. Ultimately we need a way to control the behavior of the
929 generic ELF BFD link code better. */
930 elf_link_hash_traverse (elf_hash_table (info),
931 elf_hppa_unmark_useless_dynamic_symbols,
932 info);
933
934 /* Invoke the regular ELF backend linker to do all the work. */
935 retval = bfd_elf_bfd_final_link (abfd, info);
936
937 elf_link_hash_traverse (elf_hash_table (info),
938 elf_hppa_remark_useless_dynamic_symbols,
939 info);
940
941 return retval;
942 }
943
944 /* Relocate an HPPA ELF section. */
945
946 static boolean
947 elf_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
948 contents, relocs, local_syms, local_sections)
949 bfd *output_bfd;
950 struct bfd_link_info *info;
951 bfd *input_bfd;
952 asection *input_section;
953 bfd_byte *contents;
954 Elf_Internal_Rela *relocs;
955 Elf_Internal_Sym *local_syms;
956 asection **local_sections;
957 {
958 Elf_Internal_Shdr *symtab_hdr;
959 Elf_Internal_Rela *rel;
960 Elf_Internal_Rela *relend;
961 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
962
963 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
964
965 rel = relocs;
966 relend = relocs + input_section->reloc_count;
967 for (; rel < relend; rel++)
968 {
969 int r_type;
970 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
971 unsigned long r_symndx;
972 struct elf_link_hash_entry *h;
973 Elf_Internal_Sym *sym;
974 asection *sym_sec;
975 bfd_vma relocation;
976 bfd_reloc_status_type r;
977 const char *sym_name;
978 char *dyn_name;
979 char *dynh_buf = NULL;
980 size_t dynh_buflen = 0;
981 struct elf64_hppa_dyn_hash_entry *dyn_h = NULL;
982
983 r_type = ELF_R_TYPE (rel->r_info);
984 if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
985 {
986 bfd_set_error (bfd_error_bad_value);
987 return false;
988 }
989
990 r_symndx = ELF_R_SYM (rel->r_info);
991
992 if (info->relocateable)
993 {
994 /* This is a relocateable link. We don't have to change
995 anything, unless the reloc is against a section symbol,
996 in which case we have to adjust according to where the
997 section symbol winds up in the output section. */
998 if (r_symndx < symtab_hdr->sh_info)
999 {
1000 sym = local_syms + r_symndx;
1001 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1002 {
1003 sym_sec = local_sections[r_symndx];
1004 rel->r_addend += sym_sec->output_offset;
1005 }
1006 }
1007
1008 continue;
1009 }
1010
1011 /* This is a final link. */
1012 h = NULL;
1013 sym = NULL;
1014 sym_sec = NULL;
1015 if (r_symndx < symtab_hdr->sh_info)
1016 {
1017 /* This is a local symbol. */
1018 sym = local_syms + r_symndx;
1019 sym_sec = local_sections[r_symndx];
1020 relocation = ((ELF_ST_TYPE (sym->st_info) == STT_SECTION
1021 ? 0 : sym->st_value)
1022 + sym_sec->output_offset
1023 + sym_sec->output_section->vma);
1024
1025 /* If this symbol has an entry in the PA64 dynamic hash
1026 table, then get it. */
1027 dyn_name = get_dyn_name (input_bfd, h, rel,
1028 &dynh_buf, &dynh_buflen);
1029 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1030 dyn_name, false, false);
1031
1032 }
1033 else
1034 {
1035 /* This is not a local symbol. */
1036 long indx;
1037
1038 indx = r_symndx - symtab_hdr->sh_info;
1039 h = elf_sym_hashes (input_bfd)[indx];
1040 while (h->root.type == bfd_link_hash_indirect
1041 || h->root.type == bfd_link_hash_warning)
1042 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1043 if (h->root.type == bfd_link_hash_defined
1044 || h->root.type == bfd_link_hash_defweak)
1045 {
1046 sym_sec = h->root.u.def.section;
1047
1048 /* If this symbol has an entry in the PA64 dynamic hash
1049 table, then get it. */
1050 dyn_name = get_dyn_name (input_bfd, h, rel,
1051 &dynh_buf, &dynh_buflen);
1052 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1053 dyn_name, false, false);
1054
1055 /* If we have a relocation against a symbol defined in a
1056 shared library and we have not created an entry in the
1057 PA64 dynamic symbol hash table for it, then we lose. */
1058 if (sym_sec->output_section == NULL && dyn_h == NULL)
1059 {
1060 (*_bfd_error_handler)
1061 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1062 bfd_get_filename (input_bfd), h->root.root.string,
1063 bfd_get_section_name (input_bfd, input_section));
1064 relocation = 0;
1065 }
1066 else if (sym_sec->output_section)
1067 relocation = (h->root.u.def.value
1068 + sym_sec->output_offset
1069 + sym_sec->output_section->vma);
1070 /* Value will be provided via one of the offsets in the
1071 dyn_h hash table entry. */
1072 else
1073 relocation = 0;
1074 }
1075 /* Allow undefined symbols in shared libraries. */
1076 else if (info->shared && !info->symbolic && !info->no_undefined)
1077 {
1078 /* If this symbol has an entry in the PA64 dynamic hash
1079 table, then get it. */
1080 dyn_name = get_dyn_name (input_bfd, h, rel,
1081 &dynh_buf, &dynh_buflen);
1082 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1083 dyn_name, false, false);
1084
1085 if (dyn_h == NULL)
1086 {
1087 (*_bfd_error_handler)
1088 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1089 bfd_get_filename (input_bfd), h->root.root.string,
1090 bfd_get_section_name (input_bfd, input_section));
1091 relocation = 0;
1092 }
1093 relocation = 0;
1094 }
1095 else if (h->root.type == bfd_link_hash_undefweak)
1096 relocation = 0;
1097 else
1098 {
1099 if (!((*info->callbacks->undefined_symbol)
1100 (info, h->root.root.string, input_bfd,
1101 input_section, rel->r_offset)))
1102 return false;
1103 break;
1104 }
1105 }
1106
1107 if (h != NULL)
1108 sym_name = h->root.root.string;
1109 else
1110 {
1111 sym_name = bfd_elf_string_from_elf_section (input_bfd,
1112 symtab_hdr->sh_link,
1113 sym->st_name);
1114 if (sym_name == NULL)
1115 return false;
1116 if (*sym_name == '\0')
1117 sym_name = bfd_section_name (input_bfd, sym_sec);
1118 }
1119
1120 r = elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
1121 input_section, contents,
1122 relocation, info, sym_sec,
1123 h, dyn_h);
1124
1125 if (r != bfd_reloc_ok)
1126 {
1127 switch (r)
1128 {
1129 default:
1130 abort ();
1131 case bfd_reloc_overflow:
1132 {
1133 if (!((*info->callbacks->reloc_overflow)
1134 (info, sym_name, howto->name, (bfd_vma) 0,
1135 input_bfd, input_section, rel->r_offset)))
1136 return false;
1137 }
1138 break;
1139 }
1140 }
1141 }
1142 return true;
1143 }
1144
1145
1146 /* Compute the value for a relocation (REL) during a final link stage,
1147 then insert the value into the proper location in CONTENTS.
1148
1149 VALUE is a tentative value for the relocation and may be overridden
1150 and modified here based on the specific relocation to be performed.
1151
1152 For example we do conversions for PC-relative branches in this routine
1153 or redirection of calls to external routines to stubs.
1154
1155 The work of actually applying the relocation is left to a helper
1156 routine in an attempt to reduce the complexity and size of this
1157 function. */
1158
1159 static bfd_reloc_status_type
1160 elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
1161 input_section, contents, value,
1162 info, sym_sec, h, dyn_h)
1163 Elf_Internal_Rela *rel;
1164 bfd *input_bfd;
1165 bfd *output_bfd;
1166 asection *input_section;
1167 bfd_byte *contents;
1168 bfd_vma value;
1169 struct bfd_link_info *info;
1170 asection *sym_sec;
1171 struct elf_link_hash_entry *h;
1172 struct elf64_hppa_dyn_hash_entry *dyn_h;
1173 {
1174 unsigned long insn;
1175 bfd_vma offset = rel->r_offset;
1176 bfd_vma addend = rel->r_addend;
1177 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
1178 unsigned long r_type = howto->type;
1179 unsigned long r_field = e_fsel;
1180 bfd_byte *hit_data = contents + offset;
1181 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
1182
1183 insn = bfd_get_32 (input_bfd, hit_data);
1184
1185 switch (r_type)
1186 {
1187 case R_PARISC_NONE:
1188 break;
1189
1190 /* Random PC relative relocs. */
1191 case R_PARISC_PCREL21L:
1192 case R_PARISC_PCREL14R:
1193 case R_PARISC_PCREL14F:
1194 case R_PARISC_PCREL14WR:
1195 case R_PARISC_PCREL14DR:
1196 case R_PARISC_PCREL16F:
1197 case R_PARISC_PCREL16WF:
1198 case R_PARISC_PCREL16DF:
1199 {
1200 if (r_type == R_PARISC_PCREL21L)
1201 r_field = e_lsel;
1202 else if (r_type == R_PARISC_PCREL14F
1203 || r_type == R_PARISC_PCREL16F
1204 || r_type == R_PARISC_PCREL16WF
1205 || r_type == R_PARISC_PCREL16DF)
1206 r_field = e_fsel;
1207 else
1208 r_field = e_rsel;
1209
1210 /* If this is a call to a function defined in another dynamic
1211 library, then redirect the call to the local stub for this
1212 function. */
1213 if (sym_sec == NULL || sym_sec->output_section == NULL)
1214 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1215 + hppa_info->stub_sec->output_section->vma);
1216
1217 /* Turn VALUE into a proper PC relative address. */
1218 value -= (offset + input_section->output_offset
1219 + input_section->output_section->vma);
1220
1221 /* Adjust for any field selectors. */
1222 value = hppa_field_adjust (value, -8 + addend, r_field);
1223
1224 /* Apply the relocation to the given instruction. */
1225 insn = elf_hppa_relocate_insn (insn, value, r_type);
1226 break;
1227 }
1228
1229 /* Basic function call support. I'm not entirely sure if PCREL14F is
1230 actually needed or even handled correctly.
1231
1232 Note for a call to a function defined in another dynamic library
1233 we want to redirect the call to a stub. */
1234 case R_PARISC_PCREL22F:
1235 case R_PARISC_PCREL17F:
1236 case R_PARISC_PCREL22C:
1237 case R_PARISC_PCREL17C:
1238 case R_PARISC_PCREL17R:
1239 {
1240 if (r_type == R_PARISC_PCREL17R)
1241 r_field = e_rsel;
1242 else
1243 r_field = e_fsel;
1244
1245 /* If this is a call to a function defined in another dynamic
1246 library, then redirect the call to the local stub for this
1247 function. */
1248 if (sym_sec == NULL || sym_sec->output_section == NULL)
1249 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1250 + hppa_info->stub_sec->output_section->vma);
1251
1252 /* Turn VALUE into a proper PC relative address. */
1253 value -= (offset + input_section->output_offset
1254 + input_section->output_section->vma);
1255
1256 /* Adjust for any field selectors. */
1257 value = hppa_field_adjust (value, -8 + addend, e_fsel);
1258
1259 /* All branches are implicitly shifted by 2 places. */
1260 value >>= 2;
1261
1262 /* Apply the relocation to the given instruction. */
1263 insn = elf_hppa_relocate_insn (insn, value, r_type);
1264 break;
1265 }
1266
1267 /* Indirect references to data through the DLT. */
1268 case R_PARISC_DLTIND14R:
1269 case R_PARISC_DLTIND14F:
1270 case R_PARISC_DLTIND14DR:
1271 case R_PARISC_DLTIND14WR:
1272 case R_PARISC_DLTIND21L:
1273 case R_PARISC_LTOFF_FPTR14R:
1274 case R_PARISC_LTOFF_FPTR14DR:
1275 case R_PARISC_LTOFF_FPTR14WR:
1276 case R_PARISC_LTOFF_FPTR21L:
1277 case R_PARISC_LTOFF_FPTR16F:
1278 case R_PARISC_LTOFF_FPTR16WF:
1279 case R_PARISC_LTOFF_FPTR16DF:
1280 case R_PARISC_LTOFF_TP21L:
1281 case R_PARISC_LTOFF_TP14R:
1282 case R_PARISC_LTOFF_TP14F:
1283 case R_PARISC_LTOFF_TP14WR:
1284 case R_PARISC_LTOFF_TP14DR:
1285 case R_PARISC_LTOFF_TP16F:
1286 case R_PARISC_LTOFF_TP16WF:
1287 case R_PARISC_LTOFF_TP16DF:
1288 case R_PARISC_LTOFF16F:
1289 case R_PARISC_LTOFF16WF:
1290 case R_PARISC_LTOFF16DF:
1291 {
1292 /* If this relocation was against a local symbol, then we still
1293 have not set up the DLT entry (it's not convienent to do so
1294 in the "finalize_dlt" routine because it is difficult to get
1295 to the local symbol's value).
1296
1297 So, if this is a local symbol (h == NULL), then we need to
1298 fill in its DLT entry.
1299
1300 Similarly we may still need to set up an entry in .opd for
1301 a local function which had its address taken. */
1302 if (dyn_h->h == NULL)
1303 {
1304 bfd_put_64 (hppa_info->dlt_sec->owner,
1305 value,
1306 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
1307
1308 /* Now handle .opd creation if needed. */
1309 if (r_type == R_PARISC_LTOFF_FPTR14R
1310 || r_type == R_PARISC_LTOFF_FPTR14DR
1311 || r_type == R_PARISC_LTOFF_FPTR14WR
1312 || r_type == R_PARISC_LTOFF_FPTR21L
1313 || r_type == R_PARISC_LTOFF_FPTR16F
1314 || r_type == R_PARISC_LTOFF_FPTR16WF
1315 || r_type == R_PARISC_LTOFF_FPTR16DF)
1316 {
1317 /* The first two words of an .opd entry are zero. */
1318 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset,
1319 0, 16);
1320
1321 /* The next word is the address of the function. */
1322 bfd_put_64 (hppa_info->opd_sec->owner, value,
1323 (hppa_info->opd_sec->contents
1324 + dyn_h->opd_offset + 16));
1325
1326 /* The last word is our local __gp value. */
1327 value = _bfd_get_gp_value
1328 (hppa_info->opd_sec->output_section->owner);
1329 bfd_put_64 (hppa_info->opd_sec->owner, value,
1330 (hppa_info->opd_sec->contents
1331 + dyn_h->opd_offset + 24));
1332 }
1333 }
1334
1335 /* We want the value of the DLT offset for this symbol, not
1336 the symbol's actual address. Note that __gp may not point
1337 to the start of the DLT, so we have to compute the absolute
1338 address, then subtract out the value of __gp. */
1339 value = (dyn_h->dlt_offset
1340 + hppa_info->dlt_sec->output_offset
1341 + hppa_info->dlt_sec->output_section->vma);
1342 value -= _bfd_get_gp_value (output_bfd);
1343
1344
1345 /* All DLTIND relocations are basically the same at this point,
1346 except that we need different field selectors for the 21bit
1347 version vs the 14bit versions. */
1348 if (r_type == R_PARISC_DLTIND21L
1349 || r_type == R_PARISC_LTOFF_FPTR21L
1350 || r_type == R_PARISC_LTOFF_TP21L)
1351 value = hppa_field_adjust (value, addend, e_lrsel);
1352 else if (r_type == R_PARISC_DLTIND14F
1353 || r_type == R_PARISC_LTOFF_FPTR16F
1354 || r_type == R_PARISC_LTOFF_FPTR16WF
1355 || r_type == R_PARISC_LTOFF_FPTR16DF
1356 || r_type == R_PARISC_LTOFF16F
1357 || r_type == R_PARISC_LTOFF16DF
1358 || r_type == R_PARISC_LTOFF16WF
1359 || r_type == R_PARISC_LTOFF_TP16F
1360 || r_type == R_PARISC_LTOFF_TP16WF
1361 || r_type == R_PARISC_LTOFF_TP16DF)
1362 value = hppa_field_adjust (value, addend, e_fsel);
1363 else
1364 value = hppa_field_adjust (value, addend, e_rrsel);
1365
1366 insn = elf_hppa_relocate_insn (insn, value, r_type);
1367 break;
1368 }
1369
1370 case R_PARISC_DLTREL14R:
1371 case R_PARISC_DLTREL14F:
1372 case R_PARISC_DLTREL14DR:
1373 case R_PARISC_DLTREL14WR:
1374 case R_PARISC_DLTREL21L:
1375 case R_PARISC_DPREL21L:
1376 case R_PARISC_DPREL14WR:
1377 case R_PARISC_DPREL14DR:
1378 case R_PARISC_DPREL14R:
1379 case R_PARISC_DPREL14F:
1380 case R_PARISC_GPREL16F:
1381 case R_PARISC_GPREL16WF:
1382 case R_PARISC_GPREL16DF:
1383 {
1384 /* Subtract out the global pointer value to make value a DLT
1385 relative address. */
1386 value -= _bfd_get_gp_value (output_bfd);
1387
1388 /* All DLTREL 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_DLTREL21L
1392 || r_type == R_PARISC_DPREL21L)
1393 value = hppa_field_adjust (value, addend, e_lrsel);
1394 else if (r_type == R_PARISC_DLTREL14F
1395 || r_type == R_PARISC_DPREL14F
1396 || r_type == R_PARISC_GPREL16F
1397 || r_type == R_PARISC_GPREL16WF
1398 || r_type == R_PARISC_GPREL16DF)
1399 value = hppa_field_adjust (value, addend, e_fsel);
1400 else
1401 value = hppa_field_adjust (value, addend, e_rrsel);
1402
1403 insn = elf_hppa_relocate_insn (insn, value, r_type);
1404 break;
1405 }
1406
1407 case R_PARISC_DIR21L:
1408 case R_PARISC_DIR17R:
1409 case R_PARISC_DIR17F:
1410 case R_PARISC_DIR14R:
1411 case R_PARISC_DIR14WR:
1412 case R_PARISC_DIR14DR:
1413 case R_PARISC_DIR16F:
1414 case R_PARISC_DIR16WF:
1415 case R_PARISC_DIR16DF:
1416 {
1417 /* All DIR relocations are basically the same at this point,
1418 except that we need different field selectors for the 21bit
1419 version vs the 14bit versions. */
1420 if (r_type == R_PARISC_DIR21L)
1421 value = hppa_field_adjust (value, addend, e_lrsel);
1422 else if (r_type == R_PARISC_DIR17F
1423 || r_type == R_PARISC_DIR16F
1424 || r_type == R_PARISC_DIR16WF
1425 || r_type == R_PARISC_DIR16DF)
1426 value = hppa_field_adjust (value, addend, e_fsel);
1427 else
1428 value = hppa_field_adjust (value, addend, e_rrsel);
1429
1430 insn = elf_hppa_relocate_insn (insn, value, r_type);
1431 break;
1432 }
1433
1434 case R_PARISC_PLTOFF21L:
1435 case R_PARISC_PLTOFF14R:
1436 case R_PARISC_PLTOFF14F:
1437 case R_PARISC_PLTOFF14WR:
1438 case R_PARISC_PLTOFF14DR:
1439 case R_PARISC_PLTOFF16F:
1440 case R_PARISC_PLTOFF16WF:
1441 case R_PARISC_PLTOFF16DF:
1442 {
1443 /* We want the value of the PLT offset for this symbol, not
1444 the symbol's actual address. Note that __gp may not point
1445 to the start of the DLT, so we have to compute the absolute
1446 address, then subtract out the value of __gp. */
1447 value = (dyn_h->plt_offset
1448 + hppa_info->plt_sec->output_offset
1449 + hppa_info->plt_sec->output_section->vma);
1450 value -= _bfd_get_gp_value (output_bfd);
1451
1452 /* All PLTOFF relocations are basically the same at this point,
1453 except that we need different field selectors for the 21bit
1454 version vs the 14bit versions. */
1455 if (r_type == R_PARISC_PLTOFF21L)
1456 value = hppa_field_adjust (value, addend, e_lrsel);
1457 else if (r_type == R_PARISC_PLTOFF14F
1458 || r_type == R_PARISC_PLTOFF16F
1459 || r_type == R_PARISC_PLTOFF16WF
1460 || r_type == R_PARISC_PLTOFF16DF)
1461 value = hppa_field_adjust (value, addend, e_fsel);
1462 else
1463 value = hppa_field_adjust (value, addend, e_rrsel);
1464
1465 insn = elf_hppa_relocate_insn (insn, value, r_type);
1466 break;
1467 }
1468
1469 case R_PARISC_LTOFF_FPTR32:
1470 {
1471 /* We may still need to create the FPTR itself if it was for
1472 a local symbol. */
1473 if (dyn_h->h == NULL)
1474 {
1475 /* The first two words of an .opd entry are zero. */
1476 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1477
1478 /* The next word is the address of the function. */
1479 bfd_put_64 (hppa_info->opd_sec->owner, value,
1480 (hppa_info->opd_sec->contents
1481 + dyn_h->opd_offset + 16));
1482
1483 /* The last word is our local __gp value. */
1484 value = _bfd_get_gp_value
1485 (hppa_info->opd_sec->output_section->owner);
1486 bfd_put_64 (hppa_info->opd_sec->owner, value,
1487 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1488 }
1489
1490 /* We want the value of the DLT offset for this symbol, not
1491 the symbol's actual address. Note that __gp may not point
1492 to the start of the DLT, so we have to compute the absolute
1493 address, then subtract out the value of __gp. */
1494 value = (dyn_h->dlt_offset
1495 + hppa_info->dlt_sec->output_offset
1496 + hppa_info->dlt_sec->output_section->vma);
1497 value -= _bfd_get_gp_value (output_bfd);
1498 bfd_put_32 (input_bfd, value, hit_data);
1499 return bfd_reloc_ok;
1500 }
1501
1502 case R_PARISC_LTOFF_FPTR64:
1503 case R_PARISC_LTOFF_TP64:
1504 {
1505 /* We may still need to create the FPTR itself if it was for
1506 a local symbol. */
1507 if (dyn_h->h == NULL && r_type == R_PARISC_LTOFF_FPTR64)
1508 {
1509 /* The first two words of an .opd entry are zero. */
1510 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1511
1512 /* The next word is the address of the function. */
1513 bfd_put_64 (hppa_info->opd_sec->owner, value,
1514 (hppa_info->opd_sec->contents
1515 + dyn_h->opd_offset + 16));
1516
1517 /* The last word is our local __gp value. */
1518 value = _bfd_get_gp_value
1519 (hppa_info->opd_sec->output_section->owner);
1520 bfd_put_64 (hppa_info->opd_sec->owner, value,
1521 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1522 }
1523
1524 /* We want the value of the DLT offset for this symbol, not
1525 the symbol's actual address. Note that __gp may not point
1526 to the start of the DLT, so we have to compute the absolute
1527 address, then subtract out the value of __gp. */
1528 value = (dyn_h->dlt_offset
1529 + hppa_info->dlt_sec->output_offset
1530 + hppa_info->dlt_sec->output_section->vma);
1531 value -= _bfd_get_gp_value (output_bfd);
1532 bfd_put_64 (input_bfd, value, hit_data);
1533 return bfd_reloc_ok;
1534 }
1535
1536 case R_PARISC_DIR32:
1537 bfd_put_32 (input_bfd, value + addend, hit_data);
1538 return bfd_reloc_ok;
1539
1540 case R_PARISC_DIR64:
1541 bfd_put_64 (input_bfd, value + addend, hit_data);
1542 return bfd_reloc_ok;
1543
1544 case R_PARISC_GPREL64:
1545 /* Subtract out the global pointer value to make value a DLT
1546 relative address. */
1547 value -= _bfd_get_gp_value (output_bfd);
1548 value += addend;
1549
1550 bfd_put_64 (input_bfd, value + addend, hit_data);
1551 return bfd_reloc_ok;
1552
1553 case R_PARISC_LTOFF64:
1554 /* We want the value of the DLT offset for this symbol, not
1555 the symbol's actual address. Note that __gp may not point
1556 to the start of the DLT, so we have to compute the absolute
1557 address, then subtract out the value of __gp. */
1558 value = (dyn_h->dlt_offset
1559 + hppa_info->dlt_sec->output_offset
1560 + hppa_info->dlt_sec->output_section->vma);
1561 value -= _bfd_get_gp_value (output_bfd);
1562
1563 bfd_put_64 (input_bfd, value + addend, hit_data);
1564 return bfd_reloc_ok;
1565
1566 case R_PARISC_PCREL32:
1567 {
1568 /* If this is a call to a function defined in another dynamic
1569 library, then redirect the call to the local stub for this
1570 function. */
1571 if (sym_sec == NULL || sym_sec->output_section == NULL)
1572 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1573 + hppa_info->stub_sec->output_section->vma);
1574
1575 /* Turn VALUE into a proper PC relative address. */
1576 value -= (offset + input_section->output_offset
1577 + input_section->output_section->vma);
1578
1579 value += addend;
1580 value -= 8;
1581 bfd_put_64 (input_bfd, value, hit_data);
1582 return bfd_reloc_ok;
1583 }
1584
1585 case R_PARISC_PCREL64:
1586 {
1587 /* If this is a call to a function defined in another dynamic
1588 library, then redirect the call to the local stub for this
1589 function. */
1590 if (sym_sec == NULL || sym_sec->output_section == NULL)
1591 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1592 + hppa_info->stub_sec->output_section->vma);
1593
1594
1595 /* Turn VALUE into a proper PC relative address. */
1596 value -= (offset + input_section->output_offset
1597 + input_section->output_section->vma);
1598
1599 value += addend;
1600 value -= 8;
1601 bfd_put_64 (input_bfd, value, hit_data);
1602 return bfd_reloc_ok;
1603 }
1604
1605
1606 case R_PARISC_FPTR64:
1607 {
1608 /* We may still need to create the FPTR itself if it was for
1609 a local symbol. */
1610 if (dyn_h->h == NULL)
1611 {
1612 /* The first two words of an .opd entry are zero. */
1613 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1614
1615 /* The next word is the address of the function. */
1616 bfd_put_64 (hppa_info->opd_sec->owner, value,
1617 (hppa_info->opd_sec->contents
1618 + dyn_h->opd_offset + 16));
1619
1620 /* The last word is our local __gp value. */
1621 value = _bfd_get_gp_value
1622 (hppa_info->opd_sec->output_section->owner);
1623 bfd_put_64 (hppa_info->opd_sec->owner, value,
1624 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1625 }
1626
1627 /* We want the value of the OPD offset for this symbol, not
1628 the symbol's actual address. */
1629 value = (dyn_h->opd_offset
1630 + hppa_info->opd_sec->output_offset
1631 + hppa_info->opd_sec->output_section->vma);
1632
1633 bfd_put_64 (input_bfd, value + addend, hit_data);
1634 return bfd_reloc_ok;
1635 }
1636
1637 case R_PARISC_SECREL32:
1638 bfd_put_32 (input_bfd,
1639 (value + addend
1640 - sym_sec->output_section->vma),
1641 hit_data);
1642 return bfd_reloc_ok;
1643
1644 case R_PARISC_SEGREL32:
1645 case R_PARISC_SEGREL64:
1646 {
1647 /* If this is the first SEGREL relocation, then initialize
1648 the segment base values. */
1649 if (hppa_info->text_segment_base == (bfd_vma) -1)
1650 bfd_map_over_sections (output_bfd, elf_hppa_record_segment_addrs,
1651 elf64_hppa_hash_table (info));
1652
1653 /* VALUE holds the absolute address. We want to include the
1654 addend, then turn it into a segment relative address.
1655
1656 The segment is derived from SYM_SEC. We assume that there are
1657 only two segments of note in the resulting executable/shlib.
1658 A readonly segment (.text) and a readwrite segment (.data). */
1659 value += addend;
1660
1661 if (sym_sec->flags & SEC_CODE)
1662 value -= hppa_info->text_segment_base;
1663 else
1664 value -= hppa_info->data_segment_base;
1665
1666 if (r_type == R_PARISC_SEGREL32)
1667 bfd_put_32 (input_bfd, value, hit_data);
1668 else
1669 bfd_put_64 (input_bfd, value, hit_data);
1670 return bfd_reloc_ok;
1671 }
1672
1673
1674 /* Something we don't know how to handle. */
1675 default:
1676 return bfd_reloc_notsupported;
1677 }
1678
1679 /* Update the instruction word. */
1680 bfd_put_32 (input_bfd, insn, hit_data);
1681 return (bfd_reloc_ok);
1682 }
1683
1684 /* Relocate the given INSN. VALUE should be the actual value we want
1685 to insert into the instruction, ie by this point we should not be
1686 concerned with computing an offset relative to the DLT, PC, etc.
1687 Instead this routine is meant to handle the bit manipulations needed
1688 to insert the relocation into the given instruction. */
1689
1690 static unsigned long
1691 elf_hppa_relocate_insn (insn, sym_value, r_type)
1692 unsigned long insn;
1693 long sym_value;
1694 unsigned long r_type;
1695 {
1696 switch (r_type)
1697 {
1698 /* This is any 22bit branch. In PA2.0 syntax it corresponds to
1699 the "B" instruction. */
1700 case R_PARISC_PCREL22F:
1701 case R_PARISC_PCREL22C:
1702 {
1703 unsigned int w3, w2, w1, w;
1704
1705 /* These are 22 bit branches. Mask off bits we do not care
1706 about. */
1707 sym_value &= 0x3fffff;
1708
1709 /* Now extract the W1, W2, W3 and W fields from the value. */
1710 dis_assemble_22 (sym_value, &w3, &w1, &w2, &w);
1711
1712 /* Mask out bits for the value in the instruction. */
1713 insn &= 0xfc00e002;
1714
1715 /* Insert the bits for the W1, W2 and W fields into the
1716 instruction. */
1717 insn |= (w3 << 21) | (w2 << 2) | (w1 << 16) | w;
1718 return insn;
1719 }
1720
1721 /* This is any 17bit branch. In PA2.0 syntax it also corresponds to
1722 the "B" instruction as well as BE. */
1723 case R_PARISC_PCREL17F:
1724 case R_PARISC_DIR17F:
1725 case R_PARISC_DIR17R:
1726 case R_PARISC_PCREL17C:
1727 case R_PARISC_PCREL17R:
1728 {
1729 unsigned int w2, w1, w;
1730
1731 /* These are 17 bit branches. Mask off bits we do not care
1732 about. */
1733 sym_value &= 0x1ffff;
1734
1735 /* Now extract the W1, W2 and W fields from the value. */
1736 dis_assemble_17 (sym_value, &w1, &w2, &w);
1737
1738 /* Mask out bits for the value in the instruction. */
1739 insn &= 0xffe0e002;
1740
1741 /* Insert the bits for the W1, W2 and W fields into the
1742 instruction. */
1743 insn |= (w2 << 2) | (w1 << 16) | w;
1744 return insn;
1745 }
1746
1747 /* ADDIL or LDIL instructions. */
1748 case R_PARISC_DLTREL21L:
1749 case R_PARISC_DLTIND21L:
1750 case R_PARISC_LTOFF_FPTR21L:
1751 case R_PARISC_PCREL21L:
1752 case R_PARISC_LTOFF_TP21L:
1753 case R_PARISC_DPREL21L:
1754 case R_PARISC_PLTOFF21L:
1755 case R_PARISC_DIR21L:
1756 {
1757 int w;
1758
1759 /* Mask off bits in INSN we do not want. */
1760 insn &= 0xffe00000;
1761
1762 /* Turn the 21bit value into the proper format. */
1763 dis_assemble_21 (sym_value, &w);
1764
1765 /* And insert the proper bits into INSN. */
1766 return insn | w;
1767 }
1768
1769 /* LDO and integer loads/stores with 14bit displacements. */
1770 case R_PARISC_DLTREL14R:
1771 case R_PARISC_DLTREL14F:
1772 case R_PARISC_DLTIND14R:
1773 case R_PARISC_DLTIND14F:
1774 case R_PARISC_LTOFF_FPTR14R:
1775 case R_PARISC_LTOFF_FPTR16F:
1776 case R_PARISC_PCREL14R:
1777 case R_PARISC_PCREL14F:
1778 case R_PARISC_PCREL16F:
1779 case R_PARISC_LTOFF_TP14R:
1780 case R_PARISC_LTOFF_TP14F:
1781 case R_PARISC_LTOFF_TP16F:
1782 case R_PARISC_DPREL14R:
1783 case R_PARISC_DPREL14F:
1784 case R_PARISC_GPREL16F:
1785 case R_PARISC_PLTOFF14R:
1786 case R_PARISC_PLTOFF14F:
1787 case R_PARISC_PLTOFF16F:
1788 case R_PARISC_DIR14R:
1789 case R_PARISC_DIR16F:
1790 case R_PARISC_LTOFF16F:
1791 {
1792 int w;
1793
1794 /* Mask off bits in INSN we do not want. */
1795 insn &= 0xffffc000;
1796
1797 /* Turn the 14bit value into the proper format. */
1798 low_sign_unext (sym_value, 14, &w);
1799
1800 /* And insert the proper bits into INSN. */
1801 return insn | w;
1802 }
1803
1804 /* Doubleword loads and stores with a 14bit displacement. */
1805 case R_PARISC_DLTREL14DR:
1806 case R_PARISC_DLTIND14DR:
1807 case R_PARISC_LTOFF_FPTR14DR:
1808 case R_PARISC_LTOFF_FPTR16DF:
1809 case R_PARISC_PCREL14DR:
1810 case R_PARISC_PCREL16DF:
1811 case R_PARISC_LTOFF_TP14DR:
1812 case R_PARISC_LTOFF_TP16DF:
1813 case R_PARISC_DPREL14DR:
1814 case R_PARISC_GPREL16DF:
1815 case R_PARISC_PLTOFF14DR:
1816 case R_PARISC_PLTOFF16DF:
1817 case R_PARISC_DIR14DR:
1818 case R_PARISC_DIR16DF:
1819 case R_PARISC_LTOFF16DF:
1820 {
1821 /* Mask off bits in INSN we do not want. */
1822 insn &= 0xffffc00e;
1823
1824 /* The sign bit at 14 moves into bit zero in the destination. */
1825 insn |= ((sym_value & 0x2000) >> 13);
1826
1827 /* Turn off the bits in sym_value we do not care about. */
1828 sym_value &= 0x1ff8;
1829
1830 /* Now shift it one bit position left so that it lines up with the
1831 destination field in INSN. */
1832 sym_value <<= 1;
1833
1834 return insn | sym_value;
1835 }
1836
1837 /* Floating point single word load/store instructions. */
1838 case R_PARISC_DLTREL14WR:
1839 case R_PARISC_DLTIND14WR:
1840 case R_PARISC_LTOFF_FPTR14WR:
1841 case R_PARISC_LTOFF_FPTR16WF:
1842 case R_PARISC_PCREL14WR:
1843 case R_PARISC_PCREL16WF:
1844 case R_PARISC_LTOFF_TP14WR:
1845 case R_PARISC_LTOFF_TP16WF:
1846 case R_PARISC_DPREL14WR:
1847 case R_PARISC_GPREL16WF:
1848 case R_PARISC_PLTOFF14WR:
1849 case R_PARISC_PLTOFF16WF:
1850 case R_PARISC_DIR16WF:
1851 case R_PARISC_DIR14WR:
1852 case R_PARISC_LTOFF16WF:
1853 {
1854 /* Mask off bits in INSN we do not want. */
1855 insn &= 0xffffc006;
1856
1857 /* The sign bit at 14 moves into bit zero in the destination. */
1858 insn |= ((sym_value & 0x2000) >> 13);
1859
1860 /* Turn off the bits in sym_value we do not care about. */
1861 sym_value &= 0x1ffc;
1862
1863 /* Now shift it one bit position left so that it lines up with the
1864 destination field in INSN. */
1865 sym_value <<= 1;
1866
1867 return insn | sym_value;
1868 }
1869
1870 default:
1871 return insn;
1872 }
1873 }
This page took 0.076257 seconds and 4 git commands to generate.