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