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