* elf-hppa.h (elf_hppa_unmark_useless_dynamic_symbols): New function.
[deliverable/binutils-gdb.git] / bfd / elf-hppa.h
CommitLineData
9e103c9c 1/* Common code for PA ELF implementations.
5f771d47 2 Copyright (C) 1999 Free Software Foundation, Inc.
9e103c9c
JL
3
4This file is part of BFD, the Binary File Descriptor library.
5
6This program is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2 of the License, or
9(at your option) any later version.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with this program; if not, write to the Free Software
18Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19
20#define ELF_HOWTO_TABLE_SIZE R_PARISC_UNIMPLEMENTED + 1
21
2eb429af
JL
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. */
9e103c9c
JL
28#if ARCH_SIZE == 64
29#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
2eb429af 30#define ELF_R_SYM(X) ELF64_R_SYM(X)
9e103c9c 31#define _bfd_elf_hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type
2eb429af
JL
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
9e103c9c
JL
35#endif
36#if ARCH_SIZE == 32
37#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
2eb429af 38#define ELF_R_SYM(X) ELF32_R_SYM(X)
9e103c9c 39#define _bfd_elf_hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type
2eb429af
JL
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
9e103c9c
JL
43#endif
44
2eb429af
JL
45static boolean
46elf_hppa_relocate_section
47 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
48 bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
49
50static bfd_reloc_status_type elf_hppa_final_link_relocate
be7582f3
JL
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 *));
2eb429af
JL
55
56static unsigned long elf_hppa_relocate_insn
be7582f3 57 PARAMS ((unsigned long, long, unsigned long));
2eb429af
JL
58
59static boolean elf_hppa_add_symbol_hook
f273939b 60 PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
2eb429af
JL
61 const char **, flagword *, asection **, bfd_vma *));
62
63static boolean elf_hppa_final_link
64 PARAMS ((bfd *, struct bfd_link_info *));
65
af7dc644
JL
66static boolean elf_hppa_unmark_useless_dynamic_symbols
67 PARAMS ((struct elf_link_hash_entry *, PTR));
68
69static boolean elf_hppa_remark_useless_dynamic_symbols
70 PARAMS ((struct elf_link_hash_entry *, PTR));
71
9e103c9c
JL
72/* ELF/PA relocation howto entries. */
73
74static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
75{
be7582f3 76 {R_PARISC_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_NONE"},
9e103c9c
JL
77
78 /* The values in DIR32 are to placate the check in
79 _bfd_stab_section_find_nearest_line. */
caf3d37c 80 {R_PARISC_DIR32, 0, 2, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR32", false, 0, 0xffffffff, false},
be7582f3
JL
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"},
b7263961
JL
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"},
be7582f3
JL
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"},
b7263961 191 {R_PARISC_LTOFF16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF"},
be7582f3 192 {R_PARISC_LTOFF16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF"},
be7582f3
JL
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"},
9e103c9c
JL
334};
335
6e2bf930
JL
336#define OFFSET_14R_FROM_21L 4
337#define OFFSET_14F_FROM_21L 5
338
9e103c9c
JL
339/* Return one (or more) BFD relocations which implement the base
340 relocation with modifications based on format and field. */
341
342elf_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;
be7582f3
JL
348 int ignore;
349 asymbol *sym;
9e103c9c
JL
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 {
0d571602
JL
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:
9e103c9c
JL
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:
f31cedf7 395 final_type = R_PARISC_DLTIND14R;
9e103c9c 396 break;
36860900
JL
397 case e_rtpsel:
398 final_type = R_PARISC_LTOFF_FPTR14DR;
399 break;
9e103c9c 400 case e_tsel:
f31cedf7 401 final_type = R_PARISC_DLTIND14F;
9e103c9c
JL
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:
f31cedf7 434 final_type = R_PARISC_DLTIND21L;
9e103c9c 435 break;
36860900
JL
436 case e_ltpsel:
437 final_type = R_PARISC_LTOFF_FPTR21L;
438 break;
9e103c9c
JL
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;
432bdd91
JL
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;
9e103c9c
JL
457 break;
458 case e_psel:
459 final_type = R_PARISC_PLABEL32;
460 break;
461 default:
462 return NULL;
463 }
464 break;
465
6e2bf930
JL
466 case 64:
467 switch (field)
468 {
469 case e_fsel:
470 final_type = R_PARISC_DIR64;
471 break;
472 case e_psel:
36860900
JL
473 final_type = R_PARISC_FPTR64;
474 break;
6e2bf930
JL
475 default:
476 return NULL;
477 }
478 break;
479
9e103c9c
JL
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:
6e2bf930 494 final_type = base_type + OFFSET_14R_FROM_21L;
9e103c9c
JL
495 break;
496 case e_fsel:
6e2bf930 497 final_type = base_type + OFFSET_14F_FROM_21L;
9e103c9c
JL
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:
6e2bf930 509 final_type = base_type;
9e103c9c
JL
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
341362b5
JL
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
9e103c9c
JL
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
fc91f658
JL
583 case R_PARISC_SEGREL32:
584 case R_PARISC_SEGBASE:
585 /* The defaults are fine for these cases. */
586 break;
587
9e103c9c
JL
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
597static void
598elf_hppa_info_to_howto (abfd, bfd_reloc, elf_reloc)
be7582f3 599 bfd *abfd;
9e103c9c
JL
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
610static void
611elf_hppa_info_to_howto_rel (abfd, bfd_reloc, elf_reloc)
be7582f3 612 bfd *abfd;
9e103c9c
JL
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
624static reloc_howto_type *
625elf_hppa_reloc_type_lookup (abfd, code)
be7582f3 626 bfd *abfd;
9e103c9c
JL
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}
95cbae0b
JL
636
637static void
638elf_hppa_final_write_processing (abfd, linker)
639 bfd *abfd;
be7582f3 640 boolean linker;
95cbae0b
JL
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)
3a9acac8
JL
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;
95cbae0b 657}
432bdd91
JL
658
659/* Return true if SYM represents a local label symbol. */
660
661static boolean
662elf_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
052e120f
JL
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
672static boolean
673elf_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 {
1ca74062 684 int indx;
183df869 685 asection *sec;
052e120f
JL
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
be7582f3 689 .o file? HP really messed up on this one.
052e120f 690
1ca74062
JL
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 }
be7582f3 704
052e120f
JL
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
2eb429af
JL
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
715static boolean
716elf_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;
be7582f3 726
2eb429af
JL
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;
be7582f3 734
2eb429af
JL
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
af7dc644
JL
745static boolean
746elf_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
779static boolean
780elf_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 fraglie.
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
2eb429af
JL
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
819static boolean
820elf_hppa_final_link (abfd, info)
821 bfd *abfd;
822 struct bfd_link_info *info;
823{
af7dc644
JL
824 boolean retval;
825
2eb429af
JL
826 /* Make sure we've got ourselves a suitable __gp value. */
827 if (!info->relocateable)
828 {
f273939b 829 bfd_vma min_short_vma = (bfd_vma) -1, max_short_vma = 0;
2eb429af
JL
830 struct elf_link_hash_entry *gp;
831 bfd_vma gp_val = 0;
832 asection *os;
833
be7582f3
JL
834 /* Find the .opd section. __gp's value should be the same as
835 the start of .PARISC.global section. */
2eb429af
JL
836 for (os = abfd->sections; os ; os = os->next)
837 {
838 bfd_vma lo, hi;
839
2eb429af
JL
840 /* This would be cleaner if we marked sections with an attribute
841 indicating they are short sections. */
be7582f3
JL
842 if (strcmp (os->name, ".PARISC.global") == 0)
843 break;
2eb429af
JL
844 }
845
be7582f3 846 BFD_ASSERT (os != NULL)
2eb429af 847
be7582f3
JL
848 gp_val = (os->output_section->vma + os->output_offset);
849
850 gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", true,
851 true, false);
852 gp->root.type = bfd_link_hash_defined;
853 gp->root.u.def.section = os;
854 gp->root.u.def.value = 0;
2eb429af
JL
855 _bfd_set_gp_value (abfd, gp_val);
856 }
857
af7dc644
JL
858 /* HP's shared libraries have references to symbols that are not
859 defined anywhere. The generic ELF BFD linker code will complaim
860 about such symbols.
861
862 So we detect the losing case and arrange for the flags on the symbol
863 to indicate that it was never referenced. This keeps the generic
864 ELF BFD link code happy and appears to not create any secondary
865 problems. Ultimately we need a way to control the behavior of the
866 generic ELF BFD link code better. */
867 elf_link_hash_traverse (elf_hash_table (info),
868 elf_hppa_unmark_useless_dynamic_symbols,
869 info);
870
2eb429af 871 /* Invoke the regular ELF backend linker to do all the work. */
af7dc644
JL
872 retval = bfd_elf_bfd_final_link (abfd, info);
873
874 elf_link_hash_traverse (elf_hash_table (info),
875 elf_hppa_remark_useless_dynamic_symbols,
876 info);
877
878 return retval;
2eb429af
JL
879}
880
881/* Relocate an HPPA ELF section. */
882
883static boolean
884elf_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
885 contents, relocs, local_syms, local_sections)
886 bfd *output_bfd;
887 struct bfd_link_info *info;
888 bfd *input_bfd;
889 asection *input_section;
890 bfd_byte *contents;
891 Elf_Internal_Rela *relocs;
892 Elf_Internal_Sym *local_syms;
893 asection **local_sections;
894{
895 Elf_Internal_Shdr *symtab_hdr;
896 Elf_Internal_Rela *rel;
897 Elf_Internal_Rela *relend;
be7582f3 898 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
2eb429af
JL
899
900 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
901
902 rel = relocs;
903 relend = relocs + input_section->reloc_count;
904 for (; rel < relend; rel++)
905 {
906 int r_type;
907 reloc_howto_type *howto;
908 unsigned long r_symndx;
909 struct elf_link_hash_entry *h;
910 Elf_Internal_Sym *sym;
911 asection *sym_sec;
912 bfd_vma relocation;
913 bfd_reloc_status_type r;
914 const char *sym_name;
be7582f3
JL
915 char *dyn_name;
916 char *dynh_buf = NULL;
917 size_t dynh_buflen = 0;
918 struct elf64_hppa_dyn_hash_entry *dyn_h = NULL;
2eb429af
JL
919
920 r_type = ELF_R_TYPE (rel->r_info);
921 if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
922 {
923 bfd_set_error (bfd_error_bad_value);
924 return false;
925 }
2eb429af
JL
926
927 r_symndx = ELF_R_SYM (rel->r_info);
928
929 if (info->relocateable)
930 {
931 /* This is a relocateable link. We don't have to change
932 anything, unless the reloc is against a section symbol,
933 in which case we have to adjust according to where the
934 section symbol winds up in the output section. */
935 if (r_symndx < symtab_hdr->sh_info)
936 {
937 sym = local_syms + r_symndx;
938 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
939 {
940 sym_sec = local_sections[r_symndx];
941 rel->r_addend += sym_sec->output_offset;
942 }
943 }
944
945 continue;
946 }
947
948 /* This is a final link. */
949 h = NULL;
950 sym = NULL;
951 sym_sec = NULL;
952 if (r_symndx < symtab_hdr->sh_info)
953 {
be7582f3 954 /* This is a local symbol. */
2eb429af
JL
955 sym = local_syms + r_symndx;
956 sym_sec = local_sections[r_symndx];
957 relocation = ((ELF_ST_TYPE (sym->st_info) == STT_SECTION
958 ? 0 : sym->st_value)
959 + sym_sec->output_offset
960 + sym_sec->output_section->vma);
be7582f3
JL
961
962 /* If this symbol has an entry in the PA64 dynamic hash
963 table, then get it. */
964 dyn_name = get_dyn_name (input_bfd, h, rel,
965 &dynh_buf, &dynh_buflen);
966 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
967 dyn_name, false, false);
968
2eb429af
JL
969 }
970 else
971 {
be7582f3 972 /* This is not a local symbol. */
2eb429af
JL
973 long indx;
974
975 indx = r_symndx - symtab_hdr->sh_info;
976 h = elf_sym_hashes (input_bfd)[indx];
977 while (h->root.type == bfd_link_hash_indirect
978 || h->root.type == bfd_link_hash_warning)
979 h = (struct elf_link_hash_entry *) h->root.u.i.link;
980 if (h->root.type == bfd_link_hash_defined
981 || h->root.type == bfd_link_hash_defweak)
982 {
983 sym_sec = h->root.u.def.section;
be7582f3
JL
984
985
986 /* If this symbol has an entry in the PA64 dynamic hash
987 table, then get it. */
988 dyn_name = get_dyn_name (input_bfd, h, rel,
989 &dynh_buf, &dynh_buflen);
990 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
991 dyn_name, false, false);
992
993 /* If we have a relocation against a symbol defined in a
994 shared library and we have not created an entry in the
995 PA64 dynamic symbol hash table for it, then we lose. */
996 if (sym_sec->output_section == NULL && dyn_h == NULL)
997 {
998 (*_bfd_error_handler)
999 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1000 bfd_get_filename (input_bfd), h->root.root.string,
1001 bfd_get_section_name (input_bfd, input_section));
1002 relocation = 0;
1003 }
1004 else if (sym_sec->output_section)
1005 relocation = (h->root.u.def.value
1006 + sym_sec->output_offset
1007 + sym_sec->output_section->vma);
1008 /* Value will be provided via one of the offsets in the
1009 dyn_h hash table entry. */
1010 else
1011 relocation = 0;
2eb429af
JL
1012 }
1013 else if (h->root.type == bfd_link_hash_undefweak)
1014 relocation = 0;
1015 else
1016 {
1017 if (!((*info->callbacks->undefined_symbol)
1018 (info, h->root.root.string, input_bfd,
1019 input_section, rel->r_offset)))
1020 return false;
1021 break;
1022 }
1023 }
1024
1025 if (h != NULL)
1026 sym_name = h->root.root.string;
1027 else
1028 {
1029 sym_name = bfd_elf_string_from_elf_section (input_bfd,
1030 symtab_hdr->sh_link,
1031 sym->st_name);
1032 if (sym_name == NULL)
1033 return false;
1034 if (*sym_name == '\0')
1035 sym_name = bfd_section_name (input_bfd, sym_sec);
1036 }
1037
be7582f3 1038 r = elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
2eb429af 1039 input_section, contents,
be7582f3
JL
1040 relocation, info, sym_sec,
1041 h, dyn_h);
2eb429af
JL
1042
1043 if (r != bfd_reloc_ok)
1044 {
1045 switch (r)
1046 {
1047 default:
1048 abort ();
1049 case bfd_reloc_overflow:
1050 {
1051 if (!((*info->callbacks->reloc_overflow)
1052 (info, sym_name, howto->name, (bfd_vma) 0,
1053 input_bfd, input_section, rel->r_offset)))
1054 return false;
1055 }
1056 break;
1057 }
1058 }
1059 }
1060 return true;
1061}
1062
1063
be7582f3
JL
1064/* Compute the value for a relocation (REL) during a final link stage,
1065 then insert the value into the proper location in CONTENTS.
1066
1067 VALUE is a tentative value for the relocation and may be overridden
1068 and modified here based on the specific relocation to be performed.
1069
1070 For example we do conversions for PC-relative branches in this routine
1071 or redirection of calls to external routines to stubs.
1072
1073 The work of actually applying the relocation is left to a helper
1074 routine in an attempt to reduce the complexity and size of this
1075 function. */
2eb429af
JL
1076
1077static bfd_reloc_status_type
be7582f3
JL
1078elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
1079 input_section, contents, value,
1080 info, sym_sec, h, dyn_h)
1081 Elf_Internal_Rela *rel;
2eb429af 1082 bfd *input_bfd;
be7582f3 1083 bfd *output_bfd;
2eb429af
JL
1084 asection *input_section;
1085 bfd_byte *contents;
2eb429af 1086 bfd_vma value;
2eb429af
JL
1087 struct bfd_link_info *info;
1088 asection *sym_sec;
be7582f3
JL
1089 struct elf_link_hash_entry *h;
1090 struct elf64_hppa_dyn_hash_entry *dyn_h;
2eb429af
JL
1091{
1092 unsigned long insn;
be7582f3
JL
1093 bfd_vma offset = rel->r_offset;
1094 bfd_vma addend = rel->r_addend;
1095 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
2eb429af
JL
1096 unsigned long r_type = howto->type;
1097 unsigned long r_format = howto->bitsize;
1098 unsigned long r_field = e_fsel;
1099 bfd_byte *hit_data = contents + offset;
be7582f3 1100 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
2eb429af
JL
1101
1102 insn = bfd_get_32 (input_bfd, hit_data);
1103
1104/* For reference here a quick summary of the relocations found in the
1105 HPUX 11.00 PA64 .o and .a files, but not yet implemented. This is mostly
1106 a guide to help prioritize what relocation support is worked on first.
1107 The list will be deleted eventually.
1108
b1d55905 1109 27210 R_PARISC_SEGREL32 */
2eb429af
JL
1110
1111 switch (r_type)
1112 {
1113 case R_PARISC_NONE:
1114 break;
1115
571047ad 1116 /* Random PC relative relocs. */
b233eaab
JL
1117 case R_PARISC_PCREL21L:
1118 case R_PARISC_PCREL14R:
1119 case R_PARISC_PCREL14F:
571047ad
JL
1120 case R_PARISC_PCREL14WR:
1121 case R_PARISC_PCREL14DR:
1122 case R_PARISC_PCREL16F:
1123 case R_PARISC_PCREL16WF:
1124 case R_PARISC_PCREL16DF:
1125 {
1126 if (r_type == R_PARISC_PCREL21L)
1127 r_field = e_lsel;
1128 else if (r_type == R_PARISC_PCREL14F
1129 || r_type == R_PARISC_PCREL16F
1130 || r_type == R_PARISC_PCREL16WF
1131 || r_type == R_PARISC_PCREL16DF)
1132 r_field = e_fsel;
1133 else
1134 r_field = e_rsel;
1135
1136 /* If this is a call to a function defined in another dynamic
1137 library, then redirect the call to the local stub for this
1138 function. */
1139 if (sym_sec->output_section == NULL)
1140 value = dyn_h->stub_offset;
1141
1142 /* Turn VALUE into a proper PC relative address. */
1143 value -= (offset + input_section->output_offset
1144 + input_section->output_section->vma);
1145
1146 /* Adjust for any field selectors. */
1147 value = hppa_field_adjust (value, -8 + addend, r_field);
1148
1149 /* Apply the relocation to the given instruction. */
1150 insn = elf_hppa_relocate_insn (insn, value, r_type);
1151 break;
1152 }
1153
be7582f3
JL
1154 /* Basic function call support. I'm not entirely sure if PCREL14F is
1155 actually needed or even handled correctly.
1156
1157 Note for a call to a function defined in another dynamic library
1158 we want to redirect the call to a stub. */
2eb429af
JL
1159 case R_PARISC_PCREL22F:
1160 case R_PARISC_PCREL17F:
571047ad
JL
1161 case R_PARISC_PCREL22C:
1162 case R_PARISC_PCREL17C:
1163 case R_PARISC_PCREL17R:
2eb429af 1164 {
571047ad
JL
1165 if (r_type == R_PARISC_PCREL17R)
1166 r_field = e_rsel;
1167 else
1168 r_field = e_fsel;
1169
be7582f3
JL
1170 /* If this is a call to a function defined in another dynamic
1171 library, then redirect the call to the local stub for this
1172 function. */
1173 if (sym_sec->output_section == NULL)
1174 value = dyn_h->stub_offset;
1175
1176 /* Turn VALUE into a proper PC relative address. */
1177 value -= (offset + input_section->output_offset
1178 + input_section->output_section->vma);
1179
1180 /* Adjust for any field selectors. */
571047ad 1181 value = hppa_field_adjust (value, -8 + addend, e_fsel);
2eb429af 1182
be7582f3
JL
1183 /* All branches are implicitly shifted by 2 places. */
1184 value >>= 2;
2eb429af 1185
be7582f3
JL
1186 /* Apply the relocation to the given instruction. */
1187 insn = elf_hppa_relocate_insn (insn, value, r_type);
2eb429af
JL
1188 break;
1189 }
1190
be7582f3
JL
1191 /* Indirect references to data through the DLT. */
1192 case R_PARISC_DLTIND14R:
571047ad 1193 case R_PARISC_DLTIND14F:
be7582f3
JL
1194 case R_PARISC_DLTIND14DR:
1195 case R_PARISC_DLTIND14WR:
1196 case R_PARISC_DLTIND21L:
e5bb3efc
JL
1197 case R_PARISC_LTOFF_FPTR14R:
1198 case R_PARISC_LTOFF_FPTR14DR:
1199 case R_PARISC_LTOFF_FPTR14WR:
1200 case R_PARISC_LTOFF_FPTR21L:
1201 case R_PARISC_LTOFF_FPTR16F:
1202 case R_PARISC_LTOFF_FPTR16WF:
1203 case R_PARISC_LTOFF_FPTR16DF:
b233eaab
JL
1204 case R_PARISC_LTOFF_TP21L:
1205 case R_PARISC_LTOFF_TP14R:
1206 case R_PARISC_LTOFF_TP14F:
1207 case R_PARISC_LTOFF_TP14WR:
1208 case R_PARISC_LTOFF_TP14DR:
1209 case R_PARISC_LTOFF_TP16F:
1210 case R_PARISC_LTOFF_TP16WF:
1211 case R_PARISC_LTOFF_TP16DF:
b7263961
JL
1212 case R_PARISC_LTOFF16F:
1213 case R_PARISC_LTOFF16WF:
1214 case R_PARISC_LTOFF16DF:
c8933571 1215 {
be7582f3
JL
1216 /* We want the value of the DLT offset for this symbol, not
1217 the symbol's actual address. */
1218 value = dyn_h->dlt_offset + hppa_info->dlt_sec->output_offset;
1219
1220 /* All DLTIND relocations are basically the same at this point,
1221 except that we need different field selectors for the 21bit
1222 version vs the 14bit versions. */
e5bb3efc 1223 if (r_type == R_PARISC_DLTIND21L
b233eaab
JL
1224 || r_type == R_PARISC_LTOFF_FPTR21L
1225 || r_type == R_PARISC_LTOFF_TP21L)
be7582f3 1226 value = hppa_field_adjust (value, addend, e_lrsel);
571047ad
JL
1227 else if (r_type == R_PARISC_DLTIND14F
1228 || r_type == R_PARISC_LTOFF_FPTR16F
1229 || r_type == R_PARISC_LTOFF_FPTR16WF
b233eaab 1230 || r_type == R_PARISC_LTOFF_FPTR16DF
b7263961
JL
1231 || r_type == R_PARISC_LTOFF16F
1232 || r_type == R_PARISC_LTOFF16DF
1233 || r_type == R_PARISC_LTOFF16WF
b233eaab
JL
1234 || r_type == R_PARISC_LTOFF_TP16F
1235 || r_type == R_PARISC_LTOFF_TP16WF
1236 || r_type == R_PARISC_LTOFF_TP16DF)
e5bb3efc 1237 value = hppa_field_adjust (value, addend, e_fsel);
be7582f3
JL
1238 else
1239 value = hppa_field_adjust (value, addend, e_rrsel);
1240
1241 insn = elf_hppa_relocate_insn (insn, value, r_type);
c8933571
JL
1242 break;
1243 }
1244
be7582f3 1245 case R_PARISC_DLTREL14R:
571047ad 1246 case R_PARISC_DLTREL14F:
be7582f3
JL
1247 case R_PARISC_DLTREL14DR:
1248 case R_PARISC_DLTREL14WR:
c8933571 1249 case R_PARISC_DLTREL21L:
6849fb4d
JL
1250 case R_PARISC_DPREL21L:
1251 case R_PARISC_DPREL14WR:
1252 case R_PARISC_DPREL14DR:
1253 case R_PARISC_DPREL14R:
1254 case R_PARISC_DPREL14F:
1255 case R_PARISC_GPREL16F:
1256 case R_PARISC_GPREL16WF:
1257 case R_PARISC_GPREL16DF:
c8933571 1258 {
be7582f3
JL
1259 /* Subtract out the global pointer value to make value a DLT
1260 relative address. */
1261 value -= _bfd_get_gp_value (output_bfd);
1262
1263 /* All DLTREL relocations are basically the same at this point,
1264 except that we need different field selectors for the 21bit
1265 version vs the 14bit versions. */
6849fb4d
JL
1266 if (r_type == R_PARISC_DLTREL21L
1267 || r_type == R_PARISC_DPREL21L)
be7582f3 1268 value = hppa_field_adjust (value, addend, e_lrsel);
6849fb4d
JL
1269 else if (r_type == R_PARISC_DLTREL14F
1270 || r_type == R_PARISC_DPREL14F
1271 || r_type == R_PARISC_GPREL16F
1272 || r_type == R_PARISC_GPREL16WF
1273 || r_type == R_PARISC_GPREL16DF)
571047ad 1274 value = hppa_field_adjust (value, addend, e_fsel);
be7582f3
JL
1275 else
1276 value = hppa_field_adjust (value, addend, e_rrsel);
1277
1278 insn = elf_hppa_relocate_insn (insn, value, r_type);
c8933571
JL
1279 break;
1280 }
1281
b7263961
JL
1282 case R_PARISC_DIR21L:
1283 case R_PARISC_DIR17R:
1284 case R_PARISC_DIR17F:
1285 case R_PARISC_DIR14R:
1286 case R_PARISC_DIR14WR:
1287 case R_PARISC_DIR14DR:
1288 case R_PARISC_DIR16F:
1289 case R_PARISC_DIR16WF:
1290 case R_PARISC_DIR16DF:
1291 {
1292 /* All DIR relocations are basically the same at this point,
1293 except that we need different field selectors for the 21bit
1294 version vs the 14bit versions. */
1295 if (r_type == R_PARISC_DIR21L)
1296 value = hppa_field_adjust (value, addend, e_lrsel);
1297 else if (r_type == R_PARISC_DIR17F
1298 || r_type == R_PARISC_DIR16F
1299 || r_type == R_PARISC_DIR16WF
1300 || r_type == R_PARISC_DIR16DF)
1301 value = hppa_field_adjust (value, addend, e_fsel);
1302 else
1303 value = hppa_field_adjust (value, addend, e_rrsel);
1304
1305 insn = elf_hppa_relocate_insn (insn, value, r_type);
1306 break;
1307 }
1308
8267b155
JL
1309 case R_PARISC_PLTOFF21L:
1310 case R_PARISC_PLTOFF14R:
1311 case R_PARISC_PLTOFF14F:
1312 case R_PARISC_PLTOFF14WR:
1313 case R_PARISC_PLTOFF14DR:
1314 case R_PARISC_PLTOFF16F:
1315 case R_PARISC_PLTOFF16WF:
1316 case R_PARISC_PLTOFF16DF:
1317 {
1318 /* We want the value of the PLT offset for this symbol, not
1319 the symbol's actual address. */
1320 value = dyn_h->plt_offset + hppa_info->plt_sec->output_offset;
1321
1322 /* All PLTOFF relocations are basically the same at this point,
1323 except that we need different field selectors for the 21bit
1324 version vs the 14bit versions. */
1325 if (r_type == R_PARISC_PLTOFF21L)
1326 value = hppa_field_adjust (value, addend, e_lrsel);
1327 else if (r_type == R_PARISC_PLTOFF14F
1328 || r_type == R_PARISC_PLTOFF16F
1329 || r_type == R_PARISC_PLTOFF16WF
1330 || r_type == R_PARISC_PLTOFF16DF)
1331 value = hppa_field_adjust (value, addend, e_fsel);
1332 else
1333 value = hppa_field_adjust (value, addend, e_rrsel);
1334
1335 insn = elf_hppa_relocate_insn (insn, value, r_type);
1336 break;
1337 }
1338
e5bb3efc
JL
1339 case R_PARISC_LTOFF_FPTR32:
1340 {
1341 /* We want the value of the DLT offset for this symbol, not
1342 the symbol's actual address. */
1343 value = dyn_h->dlt_offset + hppa_info->dlt_sec->output_offset;
1344 bfd_put_32 (input_bfd, value, hit_data);
1345 return bfd_reloc_ok;
1346 }
1347
e5bb3efc 1348 case R_PARISC_LTOFF_FPTR64:
b233eaab 1349 case R_PARISC_LTOFF_TP64:
e5bb3efc
JL
1350 {
1351 /* We want the value of the DLT offset for this symbol, not
1352 the symbol's actual address. */
1353 value = dyn_h->dlt_offset + hppa_info->dlt_sec->output_offset;
1354 bfd_put_64 (input_bfd, value, hit_data);
1355 return bfd_reloc_ok;
1356 }
1357
1358 case R_PARISC_DIR32:
571047ad 1359 bfd_put_32 (input_bfd, value + addend, hit_data);
e5bb3efc
JL
1360 return bfd_reloc_ok;
1361
1362 case R_PARISC_DIR64:
571047ad 1363 bfd_put_64 (input_bfd, value + addend, hit_data);
e5bb3efc
JL
1364 return bfd_reloc_ok;
1365
6849fb4d
JL
1366 case R_PARISC_GPREL64:
1367 /* Subtract out the global pointer value to make value a DLT
1368 relative address. */
1369 value -= _bfd_get_gp_value (output_bfd);
1370 value += addend;
1371
1372 bfd_put_64 (input_bfd, value + addend, hit_data);
1373 return bfd_reloc_ok;
1374
b7263961
JL
1375 case R_PARISC_LTOFF64:
1376 /* We want the value of the DLT offset for this symbol, not
1377 the symbol's actual address. */
1378 value = dyn_h->dlt_offset + hppa_info->dlt_sec->output_offset;
1379
1380 bfd_put_64 (input_bfd, value + addend, hit_data);
1381 return bfd_reloc_ok;
1382
571047ad
JL
1383 case R_PARISC_PCREL32:
1384 {
1385 /* If this is a call to a function defined in another dynamic
1386 library, then redirect the call to the local stub for this
1387 function. */
1388 if (sym_sec->output_section == NULL)
1389 value = dyn_h->stub_offset;
1390
1391 /* Turn VALUE into a proper PC relative address. */
1392 value -= (offset + input_section->output_offset
1393 + input_section->output_section->vma);
1394
b233eaab 1395 value += addend;
571047ad
JL
1396 value -= 8;
1397 bfd_put_64 (input_bfd, value, hit_data);
1398 return bfd_reloc_ok;
1399 }
1400
1401 case R_PARISC_PCREL64:
1402 {
1403 /* If this is a call to a function defined in another dynamic
1404 library, then redirect the call to the local stub for this
1405 function. */
1406 if (sym_sec->output_section == NULL)
1407 value = dyn_h->stub_offset;
1408
1409 /* Turn VALUE into a proper PC relative address. */
1410 value -= (offset + input_section->output_offset
1411 + input_section->output_section->vma);
1412
b233eaab 1413 value += addend;
571047ad
JL
1414 value -= 8;
1415 bfd_put_64 (input_bfd, value, hit_data);
1416 return bfd_reloc_ok;
1417 }
1418
1419
e5bb3efc
JL
1420 /* These do not require any work here. They are simply passed
1421 through as dynamic relocations. */
1422 case R_PARISC_FPTR64:
1423 return bfd_reloc_ok;
1424
2eb429af
JL
1425 /* Something we don't know how to handle. */
1426 default:
1427 /* ?!? This is temporary as we flesh out basic linker support, once
1428 the basic support is functional we will return the not_supported
1429 error conditional appropriately. */
1430#if 0
b7263961 1431 return bfd_reloc_not_supported;
2eb429af 1432#else
b7263961 1433 return bfd_reloc_ok;
2eb429af
JL
1434#endif
1435 }
1436
1437 /* Update the instruction word. */
1438 bfd_put_32 (input_bfd, insn, hit_data);
1439 return (bfd_reloc_ok);
1440}
1441
be7582f3
JL
1442/* Relocate the given INSN. VALUE should be the actual value we want
1443 to insert into the instruction, ie by this point we should not be
1444 concerned with computing an offset relative to the DLT, PC, etc.
1445 Instead this routine is meant to handle the bit manipulations needed
1446 to insert the relocation into the given instruction. */
2eb429af
JL
1447
1448static unsigned long
be7582f3 1449elf_hppa_relocate_insn (insn, sym_value, r_type)
2eb429af 1450 unsigned long insn;
2eb429af 1451 long sym_value;
c8933571 1452 unsigned long r_type;
2eb429af 1453{
2eb429af
JL
1454 long constant_value;
1455
c8933571 1456 switch (r_type)
2eb429af 1457 {
be7582f3
JL
1458 /* This is any 22bit branch. In PA2.0 syntax it corresponds to
1459 the "B" instruction. */
c8933571 1460 case R_PARISC_PCREL22F:
571047ad 1461 case R_PARISC_PCREL22C:
be7582f3
JL
1462 {
1463 unsigned int w3, w2, w1, w;
2eb429af 1464
be7582f3
JL
1465 /* These are 22 bit branches. Mask off bits we do not care
1466 about. */
1467 sym_value &= 0x3fffff;
2eb429af 1468
be7582f3
JL
1469 /* Now extract the W1, W2, W3 and W fields from the value. */
1470 dis_assemble_22 (sym_value, &w3, &w1, &w2, &w);
2eb429af 1471
be7582f3
JL
1472 /* Mask out bits for the value in the instruction. */
1473 insn &= 0xfc00e002;
2eb429af 1474
be7582f3
JL
1475 /* Insert the bits for the W1, W2 and W fields into the
1476 instruction. */
1477 insn |= (w3 << 21) | (w2 << 2) | (w1 << 16) | w;
1478 return insn;
1479 }
2eb429af 1480
be7582f3
JL
1481 /* This is any 17bit branch. In PA2.0 syntax it also corresponds to
1482 the "B" instruction as well as BE. */
1483 case R_PARISC_PCREL17F:
c8933571 1484 case R_PARISC_DIR17F:
b7263961 1485 case R_PARISC_DIR17R:
571047ad
JL
1486 case R_PARISC_PCREL17C:
1487 case R_PARISC_PCREL17R:
2eb429af
JL
1488 {
1489 unsigned int w2, w1, w;
1490
2eb429af
JL
1491 /* These are 17 bit branches. Mask off bits we do not care
1492 about. */
1493 sym_value &= 0x1ffff;
1494
1495 /* Now extract the W1, W2 and W fields from the value. */
1496 dis_assemble_17 (sym_value, &w1, &w2, &w);
1497
1498 /* Mask out bits for the value in the instruction. */
1499 insn &= 0xffe0e002;
1500
1501 /* Insert the bits for the W1, W2 and W fields into the
1502 instruction. */
1503 insn |= (w2 << 2) | (w1 << 16) | w;
1504 return insn;
1505 }
1506
be7582f3 1507 /* ADDIL or LDIL instructions. */
c8933571 1508 case R_PARISC_DLTREL21L:
be7582f3 1509 case R_PARISC_DLTIND21L:
e5bb3efc 1510 case R_PARISC_LTOFF_FPTR21L:
b233eaab
JL
1511 case R_PARISC_PCREL21L:
1512 case R_PARISC_LTOFF_TP21L:
6849fb4d 1513 case R_PARISC_DPREL21L:
8267b155 1514 case R_PARISC_PLTOFF21L:
b7263961 1515 case R_PARISC_DIR21L:
c8933571
JL
1516 {
1517 int w;
1518
c8933571
JL
1519 /* Mask off bits in INSN we do not want. */
1520 insn &= 0xffe00000;
1521
1522 /* Turn the 21bit value into the proper format. */
1523 dis_assemble_21 (sym_value, &w);
1524
1525 /* And insert the proper bits into INSN. */
1526 return insn | w;
1527 }
be7582f3
JL
1528
1529 /* LDO and integer loads/stores with 14bit displacements. */
c8933571 1530 case R_PARISC_DLTREL14R:
084d930b 1531 case R_PARISC_DLTREL14F:
be7582f3
JL
1532 case R_PARISC_DLTIND14R:
1533 case R_PARISC_DLTIND14F:
e5bb3efc
JL
1534 case R_PARISC_LTOFF_FPTR14R:
1535 case R_PARISC_LTOFF_FPTR16F:
b233eaab 1536 case R_PARISC_PCREL14R:
571047ad
JL
1537 case R_PARISC_PCREL14F:
1538 case R_PARISC_PCREL16F:
b233eaab
JL
1539 case R_PARISC_LTOFF_TP14R:
1540 case R_PARISC_LTOFF_TP14F:
1541 case R_PARISC_LTOFF_TP16F:
6849fb4d
JL
1542 case R_PARISC_DPREL14R:
1543 case R_PARISC_DPREL14F:
1544 case R_PARISC_GPREL16F:
8267b155
JL
1545 case R_PARISC_PLTOFF14R:
1546 case R_PARISC_PLTOFF14F:
1547 case R_PARISC_PLTOFF16F:
b7263961
JL
1548 case R_PARISC_DIR14R:
1549 case R_PARISC_DIR16F:
1550 case R_PARISC_LTOFF16F:
c8933571
JL
1551 {
1552 int w;
1553
c8933571
JL
1554 /* Mask off bits in INSN we do not want. */
1555 insn &= 0xffffc000;
1556
1557 /* Turn the 14bit value into the proper format. */
1558 low_sign_unext (sym_value, 14, &w);
1559
1560 /* And insert the proper bits into INSN. */
1561 return insn | w;
1562 }
be7582f3
JL
1563
1564 /* Doubleword loads and stores with a 14bit displacement. */
11c19a4e 1565 case R_PARISC_DLTREL14DR:
be7582f3 1566 case R_PARISC_DLTIND14DR:
e5bb3efc
JL
1567 case R_PARISC_LTOFF_FPTR14DR:
1568 case R_PARISC_LTOFF_FPTR16DF:
571047ad
JL
1569 case R_PARISC_PCREL14DR:
1570 case R_PARISC_PCREL16DF:
b233eaab
JL
1571 case R_PARISC_LTOFF_TP14DR:
1572 case R_PARISC_LTOFF_TP16DF:
6849fb4d
JL
1573 case R_PARISC_DPREL14DR:
1574 case R_PARISC_GPREL16DF:
8267b155
JL
1575 case R_PARISC_PLTOFF14DR:
1576 case R_PARISC_PLTOFF16DF:
b7263961
JL
1577 case R_PARISC_DIR14DR:
1578 case R_PARISC_DIR16DF:
1579 case R_PARISC_LTOFF16DF:
11c19a4e
JL
1580 {
1581 int w;
1582
11c19a4e
JL
1583 /* Mask off bits in INSN we do not want. */
1584 insn &= 0xffffc00e;
1585
1586 /* The sign bit at 14 moves into bit zero in the destination. */
1587 insn |= ((sym_value & 0x2000) >> 13);
1588
1589 /* Turn off the bits in sym_value we do not care about. */
1590 sym_value &= 0x1ff8;
1591
1592 /* Now shift it one bit position left so that it lines up with the
1593 destination field in INSN. */
1594 sym_value <<= 1;
1595
1596 return insn | sym_value;
1597 }
1598
be7582f3 1599 /* Floating point single word load/store instructions. */
11c19a4e 1600 case R_PARISC_DLTREL14WR:
be7582f3 1601 case R_PARISC_DLTIND14WR:
e5bb3efc
JL
1602 case R_PARISC_LTOFF_FPTR14WR:
1603 case R_PARISC_LTOFF_FPTR16WF:
571047ad
JL
1604 case R_PARISC_PCREL14WR:
1605 case R_PARISC_PCREL16WF:
b233eaab
JL
1606 case R_PARISC_LTOFF_TP14WR:
1607 case R_PARISC_LTOFF_TP16WF:
6849fb4d
JL
1608 case R_PARISC_DPREL14WR:
1609 case R_PARISC_GPREL16WF:
8267b155
JL
1610 case R_PARISC_PLTOFF14WR:
1611 case R_PARISC_PLTOFF16WF:
b7263961
JL
1612 case R_PARISC_DIR16WF:
1613 case R_PARISC_DIR14WR:
1614 case R_PARISC_LTOFF16WF:
11c19a4e
JL
1615 {
1616 int w;
1617
11c19a4e
JL
1618 /* Mask off bits in INSN we do not want. */
1619 insn &= 0xffffc006;
1620
1621 /* The sign bit at 14 moves into bit zero in the destination. */
1622 insn |= ((sym_value & 0x2000) >> 13);
1623
1624 /* Turn off the bits in sym_value we do not care about. */
1625 sym_value &= 0x1ffc;
1626
1627 /* Now shift it one bit position left so that it lines up with the
1628 destination field in INSN. */
1629 sym_value <<= 1;
1630
1631 return insn | sym_value;
1632 }
be7582f3 1633
2eb429af
JL
1634 default:
1635 return insn;
1636 }
1637}
This page took 0.105063 seconds and 4 git commands to generate.