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