1 /* Common code for PA ELF implementations.
2 Copyright (C) 1999 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
20 #define ELF_HOWTO_TABLE_SIZE R_PARISC_UNIMPLEMENTED + 1
22 /* This file is included by multiple PA ELF BFD backends with different
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. */
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
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
46 elf_hppa_relocate_section
47 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
48 bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
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 *));
56 static unsigned long elf_hppa_relocate_insn
57 PARAMS ((unsigned long, long, unsigned long));
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 *));
63 static boolean elf_hppa_final_link
64 PARAMS ((bfd *, struct bfd_link_info *));
66 /* ELF/PA relocation howto entries. */
68 static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
70 {R_PARISC_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_NONE"},
72 /* The values in DIR32 are to placate the check in
73 _bfd_stab_section_find_nearest_line. */
74 {R_PARISC_DIR32, 0, 2, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR32", false, 0, 0xffffffff, false},
75 {R_PARISC_DIR21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR21L"},
76 {R_PARISC_DIR17R, 0, 0, 17, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR17R"},
77 {R_PARISC_DIR17F, 0, 0, 17, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR17F"},
78 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
79 {R_PARISC_DIR14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR14R"},
80 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
81 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
82 {R_PARISC_PCREL32, 0, 0, 32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL32"},
84 {R_PARISC_PCREL21L, 0, 0, 21, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL21L"},
85 {R_PARISC_PCREL17R, 0, 0, 17, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL17R"},
86 {R_PARISC_PCREL17F, 0, 0, 17, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL17F"},
87 {R_PARISC_PCREL17C, 0, 0, 17, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL17C"},
88 {R_PARISC_PCREL14R, 0, 0, 14, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL14R"},
89 {R_PARISC_PCREL14F, 0, 0, 14, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL14F"},
90 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
91 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
92 {R_PARISC_DPREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DPREL21L"},
93 {R_PARISC_DPREL14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DPREL14WR"},
95 {R_PARISC_DPREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DPREL14DR"},
96 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
97 {R_PARISC_DPREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DPREL14R"},
98 {R_PARISC_DPREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DPREL14F"},
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_DLTREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTREL21L"},
102 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
103 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
104 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
106 {R_PARISC_DLTREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTREL14R"},
107 {R_PARISC_DLTREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTREL14F"},
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_DLTIND21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTIND21L"},
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 {R_PARISC_DLTIND14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTIND14R"},
115 {R_PARISC_DLTIND14F, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTIND14F"},
117 {R_PARISC_SETBASE, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SETBASE"},
118 {R_PARISC_SECREL32, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SECREL32"},
119 {R_PARISC_BASEREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL21L"},
120 {R_PARISC_BASEREL17R, 0, 0, 17, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL17R"},
121 {R_PARISC_BASEREL17F, 0, 0, 17, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL17F"},
122 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
123 {R_PARISC_BASEREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL14R"},
124 {R_PARISC_BASEREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL14F"},
125 {R_PARISC_SEGBASE, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SEGBASE"},
126 {R_PARISC_SEGREL32, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SEGREL32"},
128 {R_PARISC_PLTOFF21L, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF21L"},
129 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
130 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
131 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
132 {R_PARISC_PLTOFF14R, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF14R"},
133 {R_PARISC_PLTOFF14F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF14F"},
134 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
135 {R_PARISC_LTOFF_FPTR32, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR32"},
136 {R_PARISC_LTOFF_FPTR21L, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR21L"},
137 {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_LTOFF_FPTR14R, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14R"},
142 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
143 {R_PARISC_FPTR64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_FPTR64"},
144 {R_PARISC_PLABEL32, 0, 0, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLABEL32"},
145 {R_PARISC_PLABEL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLABEL21L"},
146 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
147 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
148 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
150 {R_PARISC_PLABEL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLABEL14R"},
151 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
152 {R_PARISC_PCREL64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL64"},
153 {R_PARISC_PCREL22C, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL22C"},
154 {R_PARISC_PCREL22F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL22F"},
155 {R_PARISC_PCREL14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL14WR"},
156 {R_PARISC_PCREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL14DR"},
157 {R_PARISC_PCREL16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL16F"},
158 {R_PARISC_PCREL16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL16WF"},
159 {R_PARISC_PCREL16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL16DF"},
161 {R_PARISC_DIR64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR64"},
162 {R_PARISC_DIR64WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR64WR"},
163 {R_PARISC_DIR64DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR64DR"},
164 {R_PARISC_DIR14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR14WR"},
165 {R_PARISC_DIR14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR14DR"},
166 {R_PARISC_DIR16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR16F"},
167 {R_PARISC_DIR16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR16WF"},
168 {R_PARISC_DIR16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR16DF"},
169 {R_PARISC_GPREL64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_GPREL64"},
170 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
172 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
173 {R_PARISC_DLTREL14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTREL14WR"},
174 {R_PARISC_DLTREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTREL14DR"},
175 {R_PARISC_GPREL16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_GPREL16F"},
176 {R_PARISC_GPREL16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_GPREL16WF"},
177 {R_PARISC_GPREL16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_GPREL16DF"},
178 {R_PARISC_LTOFF64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF64"},
179 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
180 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
181 {R_PARISC_DLTIND14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTIND14WR"},
183 {R_PARISC_DLTIND14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTIND14DR"},
184 {R_PARISC_LTOFF16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF16F"},
185 {R_PARISC_LTOFF16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF"},
186 {R_PARISC_SECREL64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SECREL64"},
187 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
188 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
189 {R_PARISC_BASEREL14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BSEREL14WR"},
190 {R_PARISC_BASEREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL14DR"},
191 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
192 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
194 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
195 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
196 {R_PARISC_SEGREL64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SEGREL64"},
197 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
198 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
199 {R_PARISC_PLTOFF14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF14WR"},
200 {R_PARISC_PLTOFF14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF14DR"},
201 {R_PARISC_PLTOFF16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF16F"},
202 {R_PARISC_PLTOFF16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF16WF"},
203 {R_PARISC_PLTOFF16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF16DF"},
205 {R_PARISC_LTOFF_FPTR64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
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_LTOFF_FPTR14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14WR"},
209 {R_PARISC_LTOFF_FPTR14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14DR"},
210 {R_PARISC_LTOFF_FPTR16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16F"},
211 {R_PARISC_LTOFF_FPTR16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16WF"},
212 {R_PARISC_LTOFF_FPTR16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
213 {R_PARISC_COPY, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_COPY"},
214 {R_PARISC_IPLT, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_IPLT"},
216 {R_PARISC_EPLT, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_EPLT"},
217 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
218 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
219 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
220 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
221 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
222 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
223 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
224 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
225 {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_dont, NULL, "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_bitfield, bfd_elf_generic_reloc, "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_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
235 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
236 {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_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
239 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
240 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
241 {R_PARISC_TPREL32, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_TPREL32"},
242 {R_PARISC_TPREL21L, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_TPREL21L"},
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_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
245 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
246 {R_PARISC_TPREL14R, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_TPREL14R"},
247 {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_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
251 {R_PARISC_LTOFF_TP21L, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP21L"},
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_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
254 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
255 {R_PARISC_LTOFF_TP14R, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
256 {R_PARISC_LTOFF_TP14F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14F"},
257 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
258 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
260 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
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_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
265 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
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 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
269 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "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_dont, NULL, "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_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
278 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
279 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
280 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "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_dont, NULL, "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_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
289 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
290 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
291 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "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_dont, NULL, "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_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
300 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
301 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
302 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "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_dont, NULL, "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_TPREL64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_TPREL64"},
311 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
312 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
313 {R_PARISC_TPREL14WR, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_TPREL14WR"},
315 {R_PARISC_TPREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_TPREL14DR"},
316 {R_PARISC_TPREL16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_TPREL16F"},
317 {R_PARISC_TPREL16WF, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_TPREL16WF"},
318 {R_PARISC_TPREL16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_TPREL16DF"},
319 {R_PARISC_LTOFF_TP64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP64"},
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_LTOFF_TP14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14WR"},
323 {R_PARISC_LTOFF_TP14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14DR"},
324 {R_PARISC_LTOFF_TP16F, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_LTOFF_TP16F"},
326 {R_PARISC_LTOFF_TP16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16WF"},
327 {R_PARISC_LTOFF_TP16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16DF"},
330 #define OFFSET_14R_FROM_21L 4
331 #define OFFSET_14F_FROM_21L 5
333 /* Return one (or more) BFD relocations which implement the base
334 relocation with modifications based on format and field. */
336 elf_hppa_reloc_type **
337 _bfd_elf_hppa_gen_reloc_type (abfd, base_type, format, field, ignore, sym)
339 elf_hppa_reloc_type base_type;
345 elf_hppa_reloc_type *finaltype;
346 elf_hppa_reloc_type **final_types;
348 /* Allocate slots for the BFD relocation. */
349 final_types = ((elf_hppa_reloc_type **)
350 bfd_alloc (abfd, sizeof (elf_hppa_reloc_type *) * 2));
351 if (final_types == NULL)
354 /* Allocate space for the relocation itself. */
355 finaltype = ((elf_hppa_reloc_type *)
356 bfd_alloc (abfd, sizeof (elf_hppa_reloc_type)));
357 if (finaltype == NULL)
360 /* Some reasonable defaults. */
361 final_types[0] = finaltype;
362 final_types[1] = NULL;
364 #define final_type finaltype[0]
366 final_type = base_type;
368 /* Just a tangle of nested switch statements to deal with the braindamage
369 that a different field selector means a completely different relocation
373 /* We have been using generic relocation types. However, that may not
374 really make sense. Anyway, we need to support both R_PARISC_DIR64
375 and R_PARISC_DIR32 here. */
378 case R_HPPA_ABS_CALL:
386 final_type = R_PARISC_DIR14R;
389 final_type = R_PARISC_DLTIND14R;
392 final_type = R_PARISC_LTOFF_FPTR14DR;
395 final_type = R_PARISC_DLTIND14F;
398 final_type = R_PARISC_PLABEL14R;
409 final_type = R_PARISC_DIR17F;
413 final_type = R_PARISC_DIR17R;
425 final_type = R_PARISC_DIR21L;
428 final_type = R_PARISC_DLTIND21L;
431 final_type = R_PARISC_LTOFF_FPTR21L;
434 final_type = R_PARISC_PLABEL21L;
445 final_type = R_PARISC_DIR32;
446 /* When in 64bit mode, a 32bit relocation is supposed to
447 be a section relative relocation. Dwarf2 (for example)
448 uses 32bit section relative relocations. */
449 if (bfd_get_arch_info (abfd)->bits_per_address != 32)
450 final_type = R_PARISC_SECREL32;
453 final_type = R_PARISC_PLABEL32;
464 final_type = R_PARISC_DIR64;
467 final_type = R_PARISC_FPTR64;
488 final_type = base_type + OFFSET_14R_FROM_21L;
491 final_type = base_type + OFFSET_14F_FROM_21L;
503 final_type = base_type;
516 case R_HPPA_PCREL_CALL:
524 final_type = R_PARISC_PCREL14R;
527 final_type = R_PARISC_PCREL14F;
539 final_type = R_PARISC_PCREL17R;
542 final_type = R_PARISC_PCREL17F;
553 final_type = R_PARISC_PCREL22F;
565 final_type = R_PARISC_PCREL21L;
577 case R_PARISC_SEGREL32:
578 case R_PARISC_SEGBASE:
579 /* The defaults are fine for these cases. */
589 /* Translate from an elf into field into a howto relocation pointer. */
592 elf_hppa_info_to_howto (abfd, bfd_reloc, elf_reloc)
595 Elf_Internal_Rela *elf_reloc;
597 BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info)
598 < (unsigned int) R_PARISC_UNIMPLEMENTED);
599 bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
602 /* Translate from an elf into field into a howto relocation pointer. */
605 elf_hppa_info_to_howto_rel (abfd, bfd_reloc, elf_reloc)
608 Elf_Internal_Rel *elf_reloc;
610 BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info)
611 < (unsigned int) R_PARISC_UNIMPLEMENTED);
612 bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
615 /* Return the address of the howto table entry to perform the CODE
616 relocation for an ARCH machine. */
618 static reloc_howto_type *
619 elf_hppa_reloc_type_lookup (abfd, code)
621 bfd_reloc_code_real_type code;
623 if ((int) code < (int) R_PARISC_UNIMPLEMENTED)
625 BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code);
626 return &elf_hppa_howto_table[(int) code];
632 elf_hppa_final_write_processing (abfd, linker)
636 int mach = bfd_get_mach (abfd);
638 elf_elfheader (abfd)->e_flags &= ~(EF_PARISC_ARCH | EF_PARISC_TRAPNIL
639 | EF_PARISC_EXT | EF_PARISC_LSB
640 | EF_PARISC_WIDE | EF_PARISC_NO_KABP
641 | EF_PARISC_LAZYSWAP);
644 elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_0;
646 elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_1;
648 elf_elfheader (abfd)->e_flags |= EFA_PARISC_2_0;
650 elf_elfheader (abfd)->e_flags |= EF_PARISC_WIDE | EFA_PARISC_2_0;
653 /* Return true if SYM represents a local label symbol. */
656 elf_hppa_is_local_label_name (abfd, name)
657 bfd *abfd ATTRIBUTE_UNUSED;
660 return (name[0] == 'L' && name[1] == '$');
663 /* Set the correct type for an ELF section. We do this by the
664 section name, which is a hack, but ought to work. */
667 elf_hppa_fake_sections (abfd, hdr, sec)
669 Elf64_Internal_Shdr *hdr;
672 register const char *name;
674 name = bfd_get_section_name (abfd, sec);
676 if (strcmp (name, ".PARISC.unwind") == 0)
680 hdr->sh_type = SHT_LOPROC + 1;
681 /* ?!? How are unwinds supposed to work for symbols in arbitrary
682 sections? Or what if we have multiple .text sections in a single
683 .o file? HP really messed up on this one.
685 Ugh. We can not use elf_section_data (sec)->this_idx at this
686 point because it is not initialized yet.
688 So we (gasp) recompute it here. Hopefully nobody ever changes the
689 way sections are numbered in elf.c! */
690 for (sec = abfd->sections, indx = 1; sec; sec = sec->next, indx++)
692 if (sec->name && strcmp (sec->name, ".text") == 0)
699 /* I have no idea if this is really necessary or what it means. */
705 /* Hook called by the linker routine which adds symbols from an object
706 file. HP's libraries define symbols with HP specific section
707 indices, which we have to handle. */
710 elf_hppa_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
712 struct bfd_link_info *info ATTRIBUTE_UNUSED;
713 const Elf_Internal_Sym *sym;
714 const char **namep ATTRIBUTE_UNUSED;
715 flagword *flagsp ATTRIBUTE_UNUSED;
719 int index = sym->st_shndx;
723 case SHN_PARISC_ANSI_COMMON:
724 *secp = bfd_make_section_old_way (abfd, ".PARISC.ansi.common");
725 (*secp)->flags |= SEC_IS_COMMON;
726 *valp = sym->st_size;
729 case SHN_PARISC_HUGE_COMMON:
730 *secp = bfd_make_section_old_way (abfd, ".PARISC.huge.common");
731 (*secp)->flags |= SEC_IS_COMMON;
732 *valp = sym->st_size;
739 /* Called after we have seen all the input files/sections, but before
740 final symbol resolution and section placement has been determined.
742 We use this hook to (possibly) provide a value for __gp, then we
743 fall back to the generic ELF final link routine. */
746 elf_hppa_final_link (abfd, info)
748 struct bfd_link_info *info;
750 /* Make sure we've got ourselves a suitable __gp value. */
751 if (!info->relocateable)
753 bfd_vma min_short_vma = (bfd_vma) -1, max_short_vma = 0;
754 struct elf_link_hash_entry *gp;
758 /* Find the .opd section. __gp's value should be the same as
759 the start of .PARISC.global section. */
760 for (os = abfd->sections; os ; os = os->next)
764 /* This would be cleaner if we marked sections with an attribute
765 indicating they are short sections. */
766 if (strcmp (os->name, ".PARISC.global") == 0)
770 BFD_ASSERT (os != NULL)
772 gp_val = (os->output_section->vma + os->output_offset);
774 gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", true,
776 gp->root.type = bfd_link_hash_defined;
777 gp->root.u.def.section = os;
778 gp->root.u.def.value = 0;
779 _bfd_set_gp_value (abfd, gp_val);
782 /* Invoke the regular ELF backend linker to do all the work. */
783 return bfd_elf_bfd_final_link (abfd, info);
786 /* Relocate an HPPA ELF section. */
789 elf_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
790 contents, relocs, local_syms, local_sections)
792 struct bfd_link_info *info;
794 asection *input_section;
796 Elf_Internal_Rela *relocs;
797 Elf_Internal_Sym *local_syms;
798 asection **local_sections;
800 Elf_Internal_Shdr *symtab_hdr;
801 Elf_Internal_Rela *rel;
802 Elf_Internal_Rela *relend;
803 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
805 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
808 relend = relocs + input_section->reloc_count;
809 for (; rel < relend; rel++)
812 reloc_howto_type *howto;
813 unsigned long r_symndx;
814 struct elf_link_hash_entry *h;
815 Elf_Internal_Sym *sym;
818 bfd_reloc_status_type r;
819 const char *sym_name;
821 char *dynh_buf = NULL;
822 size_t dynh_buflen = 0;
823 struct elf64_hppa_dyn_hash_entry *dyn_h = NULL;
825 r_type = ELF_R_TYPE (rel->r_info);
826 if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
828 bfd_set_error (bfd_error_bad_value);
832 r_symndx = ELF_R_SYM (rel->r_info);
834 if (info->relocateable)
836 /* This is a relocateable link. We don't have to change
837 anything, unless the reloc is against a section symbol,
838 in which case we have to adjust according to where the
839 section symbol winds up in the output section. */
840 if (r_symndx < symtab_hdr->sh_info)
842 sym = local_syms + r_symndx;
843 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
845 sym_sec = local_sections[r_symndx];
846 rel->r_addend += sym_sec->output_offset;
853 /* This is a final link. */
857 if (r_symndx < symtab_hdr->sh_info)
859 /* This is a local symbol. */
860 sym = local_syms + r_symndx;
861 sym_sec = local_sections[r_symndx];
862 relocation = ((ELF_ST_TYPE (sym->st_info) == STT_SECTION
864 + sym_sec->output_offset
865 + sym_sec->output_section->vma);
867 /* If this symbol has an entry in the PA64 dynamic hash
868 table, then get it. */
869 dyn_name = get_dyn_name (input_bfd, h, rel,
870 &dynh_buf, &dynh_buflen);
871 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
872 dyn_name, false, false);
877 /* This is not a local symbol. */
880 indx = r_symndx - symtab_hdr->sh_info;
881 h = elf_sym_hashes (input_bfd)[indx];
882 while (h->root.type == bfd_link_hash_indirect
883 || h->root.type == bfd_link_hash_warning)
884 h = (struct elf_link_hash_entry *) h->root.u.i.link;
885 if (h->root.type == bfd_link_hash_defined
886 || h->root.type == bfd_link_hash_defweak)
888 sym_sec = h->root.u.def.section;
891 /* If this symbol has an entry in the PA64 dynamic hash
892 table, then get it. */
893 dyn_name = get_dyn_name (input_bfd, h, rel,
894 &dynh_buf, &dynh_buflen);
895 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
896 dyn_name, false, false);
898 /* If we have a relocation against a symbol defined in a
899 shared library and we have not created an entry in the
900 PA64 dynamic symbol hash table for it, then we lose. */
901 if (sym_sec->output_section == NULL && dyn_h == NULL)
903 (*_bfd_error_handler)
904 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
905 bfd_get_filename (input_bfd), h->root.root.string,
906 bfd_get_section_name (input_bfd, input_section));
909 else if (sym_sec->output_section)
910 relocation = (h->root.u.def.value
911 + sym_sec->output_offset
912 + sym_sec->output_section->vma);
913 /* Value will be provided via one of the offsets in the
914 dyn_h hash table entry. */
918 else if (h->root.type == bfd_link_hash_undefweak)
922 if (!((*info->callbacks->undefined_symbol)
923 (info, h->root.root.string, input_bfd,
924 input_section, rel->r_offset)))
931 sym_name = h->root.root.string;
934 sym_name = bfd_elf_string_from_elf_section (input_bfd,
937 if (sym_name == NULL)
939 if (*sym_name == '\0')
940 sym_name = bfd_section_name (input_bfd, sym_sec);
943 r = elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
944 input_section, contents,
945 relocation, info, sym_sec,
948 if (r != bfd_reloc_ok)
954 case bfd_reloc_overflow:
956 if (!((*info->callbacks->reloc_overflow)
957 (info, sym_name, howto->name, (bfd_vma) 0,
958 input_bfd, input_section, rel->r_offset)))
969 /* Compute the value for a relocation (REL) during a final link stage,
970 then insert the value into the proper location in CONTENTS.
972 VALUE is a tentative value for the relocation and may be overridden
973 and modified here based on the specific relocation to be performed.
975 For example we do conversions for PC-relative branches in this routine
976 or redirection of calls to external routines to stubs.
978 The work of actually applying the relocation is left to a helper
979 routine in an attempt to reduce the complexity and size of this
982 static bfd_reloc_status_type
983 elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
984 input_section, contents, value,
985 info, sym_sec, h, dyn_h)
986 Elf_Internal_Rela *rel;
989 asection *input_section;
992 struct bfd_link_info *info;
994 struct elf_link_hash_entry *h;
995 struct elf64_hppa_dyn_hash_entry *dyn_h;
998 bfd_vma offset = rel->r_offset;
999 bfd_vma addend = rel->r_addend;
1000 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
1001 unsigned long r_type = howto->type;
1002 unsigned long r_format = howto->bitsize;
1003 unsigned long r_field = e_fsel;
1004 bfd_byte *hit_data = contents + offset;
1005 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
1007 insn = bfd_get_32 (input_bfd, hit_data);
1009 /* For reference here a quick summary of the relocations found in the
1010 HPUX 11.00 PA64 .o and .a files, but not yet implemented. This is mostly
1011 a guide to help prioritize what relocation support is worked on first.
1012 The list will be deleted eventually.
1014 27210 R_PARISC_SEGREL32
1015 1096 R_PARISC_LTOFF_TP14DR
1016 982 R_PARISC_LTOFF_TP21L
1017 791 R_PARISC_GPREL64
1018 772 R_PARISC_PLTOFF14DR
1019 386 R_PARISC_PLTOFF21L
1021 5 R_PARISC_SEGREL64 */
1028 /* Random PC relative relocs. */
1029 case R_PARISC_PCREL21L;
1030 case R_PARISC_PCREL14R;
1031 case R_PARISC_PCREL14F;
1032 case R_PARISC_PCREL14WR:
1033 case R_PARISC_PCREL14DR:
1034 case R_PARISC_PCREL16F:
1035 case R_PARISC_PCREL16WF:
1036 case R_PARISC_PCREL16DF:
1038 if (r_type == R_PARISC_PCREL21L)
1040 else if (r_type == R_PARISC_PCREL14F
1041 || r_type == R_PARISC_PCREL16F
1042 || r_type == R_PARISC_PCREL16WF
1043 || r_type == R_PARISC_PCREL16DF)
1048 /* If this is a call to a function defined in another dynamic
1049 library, then redirect the call to the local stub for this
1051 if (sym_sec->output_section == NULL)
1052 value = dyn_h->stub_offset;
1054 /* Turn VALUE into a proper PC relative address. */
1055 value -= (offset + input_section->output_offset
1056 + input_section->output_section->vma);
1058 /* Adjust for any field selectors. */
1059 value = hppa_field_adjust (value, -8 + addend, r_field);
1061 /* Apply the relocation to the given instruction. */
1062 insn = elf_hppa_relocate_insn (insn, value, r_type);
1066 /* Basic function call support. I'm not entirely sure if PCREL14F is
1067 actually needed or even handled correctly.
1069 Note for a call to a function defined in another dynamic library
1070 we want to redirect the call to a stub. */
1071 case R_PARISC_PCREL22F:
1072 case R_PARISC_PCREL17F:
1073 case R_PARISC_PCREL22C:
1074 case R_PARISC_PCREL17C:
1075 case R_PARISC_PCREL17R:
1077 if (r_type == R_PARISC_PCREL17R)
1082 /* If this is a call to a function defined in another dynamic
1083 library, then redirect the call to the local stub for this
1085 if (sym_sec->output_section == NULL)
1086 value = dyn_h->stub_offset;
1088 /* Turn VALUE into a proper PC relative address. */
1089 value -= (offset + input_section->output_offset
1090 + input_section->output_section->vma);
1092 /* Adjust for any field selectors. */
1093 value = hppa_field_adjust (value, -8 + addend, e_fsel);
1095 /* All branches are implicitly shifted by 2 places. */
1098 /* Apply the relocation to the given instruction. */
1099 insn = elf_hppa_relocate_insn (insn, value, r_type);
1103 /* Indirect references to data through the DLT. */
1104 case R_PARISC_DLTIND14R:
1105 case R_PARISC_DLTIND14F:
1106 case R_PARISC_DLTIND14DR:
1107 case R_PARISC_DLTIND14WR:
1108 case R_PARISC_DLTIND21L:
1109 case R_PARISC_LTOFF_FPTR14R:
1110 case R_PARISC_LTOFF_FPTR14DR:
1111 case R_PARISC_LTOFF_FPTR14WR:
1112 case R_PARISC_LTOFF_FPTR21L:
1113 case R_PARISC_LTOFF_FPTR16F:
1114 case R_PARISC_LTOFF_FPTR16WF:
1115 case R_PARISC_LTOFF_FPTR16DF:
1117 /* We want the value of the DLT offset for this symbol, not
1118 the symbol's actual address. */
1119 value = dyn_h->dlt_offset + hppa_info->dlt_sec->output_offset;
1121 /* All DLTIND relocations are basically the same at this point,
1122 except that we need different field selectors for the 21bit
1123 version vs the 14bit versions. */
1124 if (r_type == R_PARISC_DLTIND21L
1125 || r_type == R_PARISC_LTOFF_FPTR21L)
1126 value = hppa_field_adjust (value, addend, e_lrsel);
1127 else if (r_type == R_PARISC_DLTIND14F
1128 || r_type == R_PARISC_LTOFF_FPTR16F
1129 || r_type == R_PARISC_LTOFF_FPTR16WF
1130 || r_type == R_PARISC_LTOFF_FPTR16DF)
1131 value = hppa_field_adjust (value, addend, e_fsel);
1133 value = hppa_field_adjust (value, addend, e_rrsel);
1135 insn = elf_hppa_relocate_insn (insn, value, r_type);
1139 case R_PARISC_DLTREL14R:
1140 case R_PARISC_DLTREL14F:
1141 case R_PARISC_DLTREL14DR:
1142 case R_PARISC_DLTREL14WR:
1143 case R_PARISC_DLTREL21L:
1145 /* Subtract out the global pointer value to make value a DLT
1146 relative address. */
1147 value -= _bfd_get_gp_value (output_bfd);
1149 /* All DLTREL relocations are basically the same at this point,
1150 except that we need different field selectors for the 21bit
1151 version vs the 14bit versions. */
1152 if (r_type == R_PARISC_DLTREL21L)
1153 value = hppa_field_adjust (value, addend, e_lrsel);
1154 else if (r_type == R_PARISC_DLTREL14F)
1155 value = hppa_field_adjust (value, addend, e_fsel);
1157 value = hppa_field_adjust (value, addend, e_rrsel);
1159 insn = elf_hppa_relocate_insn (insn, value, r_type);
1163 case R_PARISC_LTOFF_FPTR32:
1165 /* We want the value of the DLT offset for this symbol, not
1166 the symbol's actual address. */
1167 value = dyn_h->dlt_offset + hppa_info->dlt_sec->output_offset;
1168 bfd_put_32 (input_bfd, value, hit_data);
1169 return bfd_reloc_ok;
1172 case R_PARISC_LTOFF_FPTR64:
1174 /* We want the value of the DLT offset for this symbol, not
1175 the symbol's actual address. */
1176 value = dyn_h->dlt_offset + hppa_info->dlt_sec->output_offset;
1177 bfd_put_64 (input_bfd, value, hit_data);
1178 return bfd_reloc_ok;
1181 case R_PARISC_DIR32:
1182 bfd_put_32 (input_bfd, value + addend, hit_data);
1183 return bfd_reloc_ok;
1185 case R_PARISC_DIR64:
1186 bfd_put_64 (input_bfd, value + addend, hit_data);
1187 return bfd_reloc_ok;
1189 case R_PARISC_PCREL32:
1191 /* If this is a call to a function defined in another dynamic
1192 library, then redirect the call to the local stub for this
1194 if (sym_sec->output_section == NULL)
1195 value = dyn_h->stub_offset;
1197 /* Turn VALUE into a proper PC relative address. */
1198 value -= (offset + input_section->output_offset
1199 + input_section->output_section->vma);
1203 bfd_put_64 (input_bfd, value, hit_data);
1204 return bfd_reloc_ok;
1207 case R_PARISC_PCREL64:
1209 /* If this is a call to a function defined in another dynamic
1210 library, then redirect the call to the local stub for this
1212 if (sym_sec->output_section == NULL)
1213 value = dyn_h->stub_offset;
1215 /* Turn VALUE into a proper PC relative address. */
1216 value -= (offset + input_section->output_offset
1217 + input_section->output_section->vma);
1221 bfd_put_64 (input_bfd, value, hit_data);
1222 return bfd_reloc_ok;
1226 /* These do not require any work here. They are simply passed
1227 through as dynamic relocations. */
1228 case R_PARISC_FPTR64:
1229 return bfd_reloc_ok;
1231 /* Something we don't know how to handle. */
1233 /* ?!? This is temporary as we flesh out basic linker support, once
1234 the basic support is functional we will return the not_supported
1235 error conditional appropriately. */
1237 return bfd_reloc_not_supported;
1239 return bfd_reloc_ok;
1243 /* Update the instruction word. */
1244 bfd_put_32 (input_bfd, insn, hit_data);
1245 return (bfd_reloc_ok);
1248 /* Relocate the given INSN. VALUE should be the actual value we want
1249 to insert into the instruction, ie by this point we should not be
1250 concerned with computing an offset relative to the DLT, PC, etc.
1251 Instead this routine is meant to handle the bit manipulations needed
1252 to insert the relocation into the given instruction. */
1254 static unsigned long
1255 elf_hppa_relocate_insn (insn, sym_value, r_type)
1258 unsigned long r_type;
1260 long constant_value;
1264 /* This is any 22bit branch. In PA2.0 syntax it corresponds to
1265 the "B" instruction. */
1266 case R_PARISC_PCREL22F:
1267 case R_PARISC_PCREL22C:
1269 unsigned int w3, w2, w1, w;
1271 /* These are 22 bit branches. Mask off bits we do not care
1273 sym_value &= 0x3fffff;
1275 /* Now extract the W1, W2, W3 and W fields from the value. */
1276 dis_assemble_22 (sym_value, &w3, &w1, &w2, &w);
1278 /* Mask out bits for the value in the instruction. */
1281 /* Insert the bits for the W1, W2 and W fields into the
1283 insn |= (w3 << 21) | (w2 << 2) | (w1 << 16) | w;
1287 /* This is any 17bit branch. In PA2.0 syntax it also corresponds to
1288 the "B" instruction as well as BE. */
1289 case R_PARISC_PCREL17F:
1290 case R_PARISC_DIR17F:
1291 case R_PARISC_PCREL17C:
1292 case R_PARISC_PCREL17R:
1294 unsigned int w2, w1, w;
1296 /* These are 17 bit branches. Mask off bits we do not care
1298 sym_value &= 0x1ffff;
1300 /* Now extract the W1, W2 and W fields from the value. */
1301 dis_assemble_17 (sym_value, &w1, &w2, &w);
1303 /* Mask out bits for the value in the instruction. */
1306 /* Insert the bits for the W1, W2 and W fields into the
1308 insn |= (w2 << 2) | (w1 << 16) | w;
1312 /* ADDIL or LDIL instructions. */
1313 case R_PARISC_DLTREL21L:
1314 case R_PARISC_DLTIND21L:
1315 case R_PARISC_LTOFF_FPTR21L:
1316 case R_PARISC_PCREL21L;
1320 /* Mask off bits in INSN we do not want. */
1323 /* Turn the 21bit value into the proper format. */
1324 dis_assemble_21 (sym_value, &w);
1326 /* And insert the proper bits into INSN. */
1330 /* LDO and integer loads/stores with 14bit displacements. */
1331 case R_PARISC_DLTREL14R:
1332 case R_PARISC_DLTREL14F:
1333 case R_PARISC_DLTIND14R:
1334 case R_PARISC_DLTIND14F:
1335 case R_PARISC_LTOFF_FPTR14R:
1336 case R_PARISC_LTOFF_FPTR16F:
1337 case R_PARISC_PCREL14R;
1338 case R_PARISC_PCREL14F:
1339 case R_PARISC_PCREL16F:
1343 /* Mask off bits in INSN we do not want. */
1346 /* Turn the 14bit value into the proper format. */
1347 low_sign_unext (sym_value, 14, &w);
1349 /* And insert the proper bits into INSN. */
1353 /* Doubleword loads and stores with a 14bit displacement. */
1354 case R_PARISC_DLTREL14DR:
1355 case R_PARISC_DLTIND14DR:
1356 case R_PARISC_LTOFF_FPTR14DR:
1357 case R_PARISC_LTOFF_FPTR16DF:
1358 case R_PARISC_PCREL14DR:
1359 case R_PARISC_PCREL16DF:
1363 /* Mask off bits in INSN we do not want. */
1366 /* The sign bit at 14 moves into bit zero in the destination. */
1367 insn |= ((sym_value & 0x2000) >> 13);
1369 /* Turn off the bits in sym_value we do not care about. */
1370 sym_value &= 0x1ff8;
1372 /* Now shift it one bit position left so that it lines up with the
1373 destination field in INSN. */
1376 return insn | sym_value;
1379 /* Floating point single word load/store instructions. */
1380 case R_PARISC_DLTREL14WR:
1381 case R_PARISC_DLTIND14WR:
1382 case R_PARISC_LTOFF_FPTR14WR:
1383 case R_PARISC_LTOFF_FPTR16WF:
1384 case R_PARISC_PCREL14WR:
1385 case R_PARISC_PCREL16WF:
1389 /* Mask off bits in INSN we do not want. */
1392 /* The sign bit at 14 moves into bit zero in the destination. */
1393 insn |= ((sym_value & 0x2000) >> 13);
1395 /* Turn off the bits in sym_value we do not care about. */
1396 sym_value &= 0x1ffc;
1398 /* Now shift it one bit position left so that it lines up with the
1399 destination field in INSN. */
1402 return insn | sym_value;