K&R compiler fixes
[external/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
660                                       | EFA_PARISC_2_0
661                                       /* The GNU tools have trapped without
662                                          option since 1993, so need to take
663                                          a step backwards with the ELF
664                                          based toolchains.  */
665                                       | EF_PARISC_TRAPNIL);
666 }
667
668 /* Return true if SYM represents a local label symbol.  */
669
670 static boolean
671 elf_hppa_is_local_label_name (abfd, name)
672      bfd *abfd ATTRIBUTE_UNUSED;
673      const char *name;
674 {
675   return (name[0] == 'L' && name[1] == '$');
676 }
677
678 /* Set the correct type for an ELF section.  We do this by the
679    section name, which is a hack, but ought to work.  */
680
681 static boolean
682 elf_hppa_fake_sections (abfd, hdr, sec)
683      bfd *abfd;
684      Elf64_Internal_Shdr *hdr;
685      asection *sec;
686 {
687   register const char *name;
688
689   name = bfd_get_section_name (abfd, sec);
690
691   if (strcmp (name, ".PARISC.unwind") == 0)
692     {
693       int indx;
694       asection *sec;
695       hdr->sh_type = SHT_LOPROC + 1;
696       /* ?!? How are unwinds supposed to work for symbols in arbitrary
697          sections?  Or what if we have multiple .text sections in a single
698          .o file?  HP really messed up on this one.
699
700          Ugh.  We can not use elf_section_data (sec)->this_idx at this
701          point because it is not initialized yet.
702
703          So we (gasp) recompute it here.  Hopefully nobody ever changes the
704          way sections are numbered in elf.c!  */
705       for (sec = abfd->sections, indx = 1; sec; sec = sec->next, indx++)
706         {
707           if (sec->name && strcmp (sec->name, ".text") == 0)
708             {
709               hdr->sh_info = indx;
710               break;
711             }
712         }
713
714       /* I have no idea if this is really necessary or what it means.  */
715       hdr->sh_entsize = 4;
716     }
717   return true;
718 }
719
720 /* Hook called by the linker routine which adds symbols from an object
721    file.  HP's libraries define symbols with HP specific section
722    indices, which we have to handle.  */
723
724 static boolean
725 elf_hppa_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
726      bfd *abfd;
727      struct bfd_link_info *info ATTRIBUTE_UNUSED;
728      const Elf_Internal_Sym *sym;
729      const char **namep ATTRIBUTE_UNUSED;
730      flagword *flagsp ATTRIBUTE_UNUSED;
731      asection **secp;
732      bfd_vma *valp;
733 {
734   int index = sym->st_shndx;
735
736   switch (index)
737     {
738     case SHN_PARISC_ANSI_COMMON:
739       *secp = bfd_make_section_old_way (abfd, ".PARISC.ansi.common");
740       (*secp)->flags |= SEC_IS_COMMON;
741       *valp = sym->st_size;
742       break;
743
744     case SHN_PARISC_HUGE_COMMON:
745       *secp = bfd_make_section_old_way (abfd, ".PARISC.huge.common");
746       (*secp)->flags |= SEC_IS_COMMON;
747       *valp = sym->st_size;
748       break;
749     }
750
751   return true;
752 }
753
754 static boolean
755 elf_hppa_unmark_useless_dynamic_symbols (h, data)
756      struct elf_link_hash_entry *h;
757      PTR data;
758 {
759   struct bfd_link_info *info = (struct bfd_link_info *)data;
760
761   /* If we are not creating a shared library, and this symbol is
762      referenced by a shared library but is not defined anywhere, then
763      the generic code will warn that it is undefined.
764
765      This behavior is undesirable on HPs since the standard shared
766      libraries contain reerences to undefined symbols.
767
768      So we twiddle the flags associated with such symbols so that they
769      will not trigger the warning.  ?!? FIXME.  This is horribly fraglie.
770
771      Ultimately we should have better controls over the generic ELF BFD
772      linker code.  */
773   if (! info->relocateable
774       && ! (info->shared
775             && !info->no_undefined)
776       && h->root.type == bfd_link_hash_undefined
777       && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0
778       && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0)
779     {
780       h->elf_link_hash_flags &= ~ELF_LINK_HASH_REF_DYNAMIC;
781       h->elf_link_hash_flags |= 0x8000;
782     }
783
784   return true;
785 }
786
787
788 static boolean
789 elf_hppa_remark_useless_dynamic_symbols (h, data)
790      struct elf_link_hash_entry *h;
791      PTR data;
792 {
793   struct bfd_link_info *info = (struct bfd_link_info *)data;
794
795   /* If we are not creating a shared library, and this symbol is
796      referenced by a shared library but is not defined anywhere, then
797      the generic code will warn that it is undefined.
798
799      This behavior is undesirable on HPs since the standard shared
800      libraries contain reerences to undefined symbols.
801
802      So we twiddle the flags associated with such symbols so that they
803      will not trigger the warning.  ?!? FIXME.  This is horribly fragile.
804
805      Ultimately we should have better controls over the generic ELF BFD
806      linker code.  */
807   if (! info->relocateable
808       && ! (info->shared
809             && !info->no_undefined)
810       && h->root.type == bfd_link_hash_undefined
811       && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
812       && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0
813       && (h->elf_link_hash_flags & 0x8000) != 0)
814     {
815       h->elf_link_hash_flags |= ELF_LINK_HASH_REF_DYNAMIC;
816       h->elf_link_hash_flags &= ~0x8000;
817     }
818
819   return true;
820 }
821
822 /* Record the lowest address for the data and text segments.  */
823 static void
824 elf_hppa_record_segment_addrs (abfd, section, data)
825      bfd *abfd ATTRIBUTE_UNUSED;
826      asection *section;
827      PTR data;
828 {
829   struct elf64_hppa_link_hash_table *hppa_info;
830   bfd_vma value;
831  
832   hppa_info = (struct elf64_hppa_link_hash_table *)data;
833
834   value = section->vma - section->filepos;
835
836   if ((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY)
837        == (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
838       && value < hppa_info->text_segment_base)
839     hppa_info->text_segment_base = value;
840   else if ((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY)
841        == (SEC_ALLOC | SEC_LOAD))
842       && value < hppa_info->data_segment_base)
843     hppa_info->data_segment_base = value;
844 }
845
846 /* Called after we have seen all the input files/sections, but before
847    final symbol resolution and section placement has been determined.
848
849    We use this hook to (possibly) provide a value for __gp, then we
850    fall back to the generic ELF final link routine.  */
851
852 static boolean
853 elf_hppa_final_link (abfd, info)
854      bfd *abfd;
855      struct bfd_link_info *info;
856 {
857   boolean retval;
858
859   if (! info->relocateable)
860     {
861       struct elf_link_hash_entry *gp;
862       bfd_vma gp_val;
863       struct elf64_hppa_link_hash_table *hppa_info;
864
865       hppa_info = elf64_hppa_hash_table (info);
866
867       /* The linker script defines a value for __gp iff it was referenced
868          by one of the objects being linked.  First try to find the symbol
869          in the hash table.  If that fails, just compute the value __gp
870          should have had.  */
871       gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false,
872                                  false, false);
873
874       if (gp)
875         {
876
877           /* Adjust the value of __gp as we may want to slide it into the
878              .plt section so that the stubs can access PLT entries without
879              using an addil sequence.  */
880           gp->root.u.def.value += elf64_hppa_hash_table (info)->gp_offset;
881
882           gp_val = (gp->root.u.def.section->output_section->vma
883                     + gp->root.u.def.section->output_offset
884                     + gp->root.u.def.value);
885         }
886       else
887         {
888           asection *sec;
889   
890
891           /* First look for a .plt section.  If found, then __gp is the
892              address of the .plt + gp_offset.
893
894              If no .plt is found, then look for .dlt, .opd and .data (in
895              that order) and set __gp to the base address of whichever section
896             is found first.  */
897
898           sec = hppa_info->plt_sec;
899           if (sec)
900             gp_val = (sec->output_offset
901                       + sec->output_section->vma
902                       + hppa_info->gp_offset);
903           else
904             {
905               sec = hppa_info->dlt_sec;
906               if (!sec)
907                 sec = hppa_info->opd_sec;
908               if (!sec)
909                 sec = bfd_get_section_by_name (abfd, ".data");
910               if (!sec)
911                 return false;
912
913               gp_val = sec->output_offset + sec->output_section->vma;
914             }
915         }
916
917       /* Install whatever value we found/computed for __gp.  */
918       _bfd_set_gp_value (abfd, gp_val);
919     }
920
921   /* We need to know the base of the text and data segments so that we
922      can perform SEGREL relocations.  We will recore the base addresses
923      when we encounter the first SEGREL relocation.  */
924   elf64_hppa_hash_table (info)->text_segment_base = (bfd_vma)-1;
925   elf64_hppa_hash_table (info)->data_segment_base = (bfd_vma)-1;
926
927   /* HP's shared libraries have references to symbols that are not
928      defined anywhere.  The generic ELF BFD linker code will complaim
929      about such symbols.
930
931      So we detect the losing case and arrange for the flags on the symbol
932      to indicate that it was never referenced.  This keeps the generic
933      ELF BFD link code happy and appears to not create any secondary
934      problems.  Ultimately we need a way to control the behavior of the
935      generic ELF BFD link code better.  */
936   elf_link_hash_traverse (elf_hash_table (info),
937                           elf_hppa_unmark_useless_dynamic_symbols,
938                           info);
939
940   /* Invoke the regular ELF backend linker to do all the work.  */
941   retval = bfd_elf_bfd_final_link (abfd, info);
942
943   elf_link_hash_traverse (elf_hash_table (info),
944                           elf_hppa_remark_useless_dynamic_symbols,
945                           info);
946
947   return retval;
948 }
949
950 /* Relocate an HPPA ELF section.  */
951
952 static boolean
953 elf_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
954                            contents, relocs, local_syms, local_sections)
955      bfd *output_bfd;
956      struct bfd_link_info *info;
957      bfd *input_bfd;
958      asection *input_section;
959      bfd_byte *contents;
960      Elf_Internal_Rela *relocs;
961      Elf_Internal_Sym *local_syms;
962      asection **local_sections;
963 {
964   Elf_Internal_Shdr *symtab_hdr;
965   Elf_Internal_Rela *rel;
966   Elf_Internal_Rela *relend;
967   struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
968
969   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
970
971   rel = relocs;
972   relend = relocs + input_section->reloc_count;
973   for (; rel < relend; rel++)
974     {
975       int r_type;
976       reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
977       unsigned long r_symndx;
978       struct elf_link_hash_entry *h;
979       Elf_Internal_Sym *sym;
980       asection *sym_sec;
981       bfd_vma relocation;
982       bfd_reloc_status_type r;
983       const char *sym_name;
984       char *dyn_name;
985       char *dynh_buf = NULL;
986       size_t dynh_buflen = 0;
987       struct elf64_hppa_dyn_hash_entry *dyn_h = NULL;
988
989       r_type = ELF_R_TYPE (rel->r_info);
990       if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
991         {
992           bfd_set_error (bfd_error_bad_value);
993           return false;
994         }
995
996       r_symndx = ELF_R_SYM (rel->r_info);
997
998       if (info->relocateable)
999         {
1000           /* This is a relocateable link.  We don't have to change
1001              anything, unless the reloc is against a section symbol,
1002              in which case we have to adjust according to where the
1003              section symbol winds up in the output section.  */
1004           if (r_symndx < symtab_hdr->sh_info)
1005             {
1006               sym = local_syms + r_symndx;
1007               if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1008                 {
1009                   sym_sec = local_sections[r_symndx];
1010                   rel->r_addend += sym_sec->output_offset;
1011                 }
1012             }
1013
1014           continue;
1015         }
1016
1017       /* This is a final link.  */
1018       h = NULL;
1019       sym = NULL;
1020       sym_sec = NULL;
1021       if (r_symndx < symtab_hdr->sh_info)
1022         {
1023           /* This is a local symbol.  */
1024           sym = local_syms + r_symndx;
1025           sym_sec = local_sections[r_symndx];
1026           relocation = ((ELF_ST_TYPE (sym->st_info) == STT_SECTION
1027                            ? 0 : sym->st_value)
1028                          + sym_sec->output_offset
1029                          + sym_sec->output_section->vma);
1030
1031           /* If this symbol has an entry in the PA64 dynamic hash
1032              table, then get it.  */
1033           dyn_name = get_dyn_name (input_bfd, h, rel,
1034                                    &dynh_buf, &dynh_buflen);
1035           dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1036                                               dyn_name, false, false);
1037
1038         }
1039       else
1040         {
1041           /* This is not a local symbol.  */
1042           long indx;
1043
1044           indx = r_symndx - symtab_hdr->sh_info;
1045           h = elf_sym_hashes (input_bfd)[indx];
1046           while (h->root.type == bfd_link_hash_indirect
1047                  || h->root.type == bfd_link_hash_warning)
1048             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1049           if (h->root.type == bfd_link_hash_defined
1050               || h->root.type == bfd_link_hash_defweak)
1051             {
1052               sym_sec = h->root.u.def.section;
1053
1054               /* If this symbol has an entry in the PA64 dynamic hash
1055                  table, then get it.  */
1056               dyn_name = get_dyn_name (input_bfd, h, rel,
1057                                        &dynh_buf, &dynh_buflen);
1058               dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1059                                                   dyn_name, false, false);
1060
1061               /* If we have a relocation against a symbol defined in a
1062                  shared library and we have not created an entry in the
1063                  PA64 dynamic symbol hash table for it, then we lose.  */
1064               if (sym_sec->output_section == NULL && dyn_h == NULL)
1065                 {
1066                   (*_bfd_error_handler)
1067                     (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1068                      bfd_get_filename (input_bfd), h->root.root.string,
1069                      bfd_get_section_name (input_bfd, input_section));
1070                   relocation = 0;
1071                 }
1072               else if (sym_sec->output_section)
1073                 relocation = (h->root.u.def.value
1074                               + sym_sec->output_offset
1075                               + sym_sec->output_section->vma);
1076               /* Value will be provided via one of the offsets in the
1077                  dyn_h hash table entry.  */
1078               else
1079                 relocation = 0;
1080             }
1081           /* Allow undefined symbols in shared libraries.  */
1082           else if (info->shared && !info->no_undefined)
1083             {
1084               if (info->symbolic)
1085                 (*info->callbacks->undefined_symbol)
1086                   (info, h->root.root.string, input_bfd,
1087                    input_section, rel->r_offset, false);
1088
1089               /* If this symbol has an entry in the PA64 dynamic hash
1090                  table, then get it.  */
1091               dyn_name = get_dyn_name (input_bfd, h, rel,
1092                                        &dynh_buf, &dynh_buflen);
1093               dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1094                                                   dyn_name, false, false);
1095
1096               if (dyn_h == NULL)
1097                 {
1098                   (*_bfd_error_handler)
1099                     (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1100                      bfd_get_filename (input_bfd), h->root.root.string,
1101                      bfd_get_section_name (input_bfd, input_section));
1102                   relocation = 0;
1103                 }
1104               relocation = 0;
1105             }
1106           else if (h->root.type == bfd_link_hash_undefweak)
1107             relocation = 0;
1108           else
1109             {
1110               if (!((*info->callbacks->undefined_symbol)
1111                     (info, h->root.root.string, input_bfd,
1112                      input_section, rel->r_offset, true)))
1113                 return false;
1114               break;
1115             }
1116         }
1117
1118       if (h != NULL)
1119         sym_name = h->root.root.string;
1120       else
1121         {
1122           sym_name = bfd_elf_string_from_elf_section (input_bfd,
1123                                                       symtab_hdr->sh_link,
1124                                                       sym->st_name);
1125           if (sym_name == NULL)
1126             return false;
1127           if (*sym_name == '\0')
1128             sym_name = bfd_section_name (input_bfd, sym_sec);
1129         }
1130
1131       r = elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
1132                                         input_section, contents,
1133                                         relocation, info, sym_sec,
1134                                         h, dyn_h);
1135
1136       if (r != bfd_reloc_ok)
1137         {
1138           switch (r)
1139             {
1140             default:
1141               abort ();
1142             case bfd_reloc_overflow:
1143               {
1144                 if (!((*info->callbacks->reloc_overflow)
1145                       (info, sym_name, howto->name, (bfd_vma) 0,
1146                         input_bfd, input_section, rel->r_offset)))
1147                   return false;
1148               }
1149               break;
1150             }
1151         }
1152     }
1153   return true;
1154 }
1155
1156
1157 /* Compute the value for a relocation (REL) during a final link stage,
1158    then insert the value into the proper location in CONTENTS. 
1159
1160    VALUE is a tentative value for the relocation and may be overridden
1161    and modified here based on the specific relocation to be performed.
1162
1163    For example we do conversions for PC-relative branches in this routine
1164    or redirection of calls to external routines to stubs. 
1165
1166    The work of actually applying the relocation is left to a helper
1167    routine in an attempt to reduce the complexity and size of this
1168    function.  */
1169
1170 static bfd_reloc_status_type
1171 elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
1172                               input_section, contents, value,
1173                               info, sym_sec, h, dyn_h)
1174      Elf_Internal_Rela *rel;
1175      bfd *input_bfd;
1176      bfd *output_bfd;
1177      asection *input_section;
1178      bfd_byte *contents;
1179      bfd_vma value;
1180      struct bfd_link_info *info;
1181      asection *sym_sec;
1182      struct elf_link_hash_entry *h;
1183      struct elf64_hppa_dyn_hash_entry *dyn_h;
1184 {
1185   unsigned long insn;
1186   bfd_vma offset = rel->r_offset;
1187   bfd_vma addend = rel->r_addend;
1188   reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
1189   unsigned long r_type = howto->type;
1190   unsigned long r_field = e_fsel;
1191   bfd_byte *hit_data = contents + offset;
1192   struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
1193
1194   insn = bfd_get_32 (input_bfd, hit_data);
1195
1196   switch (r_type)
1197     {
1198     case R_PARISC_NONE:
1199       break;
1200
1201     /* Random PC relative relocs.  */
1202     case R_PARISC_PCREL21L:
1203     case R_PARISC_PCREL14R:
1204     case R_PARISC_PCREL14F:
1205     case R_PARISC_PCREL14WR:
1206     case R_PARISC_PCREL14DR:
1207     case R_PARISC_PCREL16F:
1208     case R_PARISC_PCREL16WF:
1209     case R_PARISC_PCREL16DF:
1210       {
1211         if (r_type == R_PARISC_PCREL21L)
1212           r_field = e_lsel;
1213         else if (r_type == R_PARISC_PCREL14F
1214                  || r_type == R_PARISC_PCREL16F
1215                  || r_type == R_PARISC_PCREL16WF
1216                  || r_type == R_PARISC_PCREL16DF)
1217           r_field = e_fsel;
1218         else
1219           r_field = e_rsel;
1220
1221         /* If this is a call to a function defined in another dynamic
1222            library, then redirect the call to the local stub for this
1223            function.  */
1224         if (sym_sec == NULL || sym_sec->output_section == NULL)
1225           value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1226                    + hppa_info->stub_sec->output_section->vma);
1227   
1228         /* Turn VALUE into a proper PC relative address.  */
1229         value -= (offset + input_section->output_offset
1230                   + input_section->output_section->vma);
1231
1232         /* Adjust for any field selectors.  */
1233         value = hppa_field_adjust (value, -8 + addend, r_field);
1234
1235         /* Apply the relocation to the given instruction.  */
1236         insn = elf_hppa_relocate_insn (insn, value, r_type);
1237         break;
1238       }
1239
1240     /* Basic function call support.  I'm not entirely sure if PCREL14F is
1241        actually needed or even handled correctly.
1242
1243        Note for a call to a function defined in another dynamic library
1244        we want to redirect the call to a stub.  */
1245     case R_PARISC_PCREL22F:
1246     case R_PARISC_PCREL17F:
1247     case R_PARISC_PCREL22C:
1248     case R_PARISC_PCREL17C:
1249     case R_PARISC_PCREL17R:
1250       {
1251         if (r_type == R_PARISC_PCREL17R)
1252           r_field = e_rsel;
1253         else
1254           r_field = e_fsel;
1255
1256         /* If this is a call to a function defined in another dynamic
1257            library, then redirect the call to the local stub for this
1258            function.  */
1259         if (sym_sec == NULL || sym_sec->output_section == NULL)
1260           value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1261                    + hppa_info->stub_sec->output_section->vma);
1262   
1263         /* Turn VALUE into a proper PC relative address.  */
1264         value -= (offset + input_section->output_offset
1265                   + input_section->output_section->vma);
1266
1267         /* Adjust for any field selectors.  */
1268         value = hppa_field_adjust (value, -8 + addend, e_fsel);
1269
1270         /* All branches are implicitly shifted by 2 places.  */
1271         value >>= 2;
1272
1273         /* Apply the relocation to the given instruction.  */
1274         insn = elf_hppa_relocate_insn (insn, value, r_type);
1275         break;
1276       }
1277
1278     /* Indirect references to data through the DLT.  */
1279     case R_PARISC_DLTIND14R:
1280     case R_PARISC_DLTIND14F:
1281     case R_PARISC_DLTIND14DR:
1282     case R_PARISC_DLTIND14WR:
1283     case R_PARISC_DLTIND21L:
1284     case R_PARISC_LTOFF_FPTR14R:
1285     case R_PARISC_LTOFF_FPTR14DR:
1286     case R_PARISC_LTOFF_FPTR14WR:
1287     case R_PARISC_LTOFF_FPTR21L:
1288     case R_PARISC_LTOFF_FPTR16F:
1289     case R_PARISC_LTOFF_FPTR16WF:
1290     case R_PARISC_LTOFF_FPTR16DF:
1291     case R_PARISC_LTOFF_TP21L:
1292     case R_PARISC_LTOFF_TP14R:
1293     case R_PARISC_LTOFF_TP14F:
1294     case R_PARISC_LTOFF_TP14WR:
1295     case R_PARISC_LTOFF_TP14DR:
1296     case R_PARISC_LTOFF_TP16F:
1297     case R_PARISC_LTOFF_TP16WF:
1298     case R_PARISC_LTOFF_TP16DF:
1299     case R_PARISC_LTOFF16F:
1300     case R_PARISC_LTOFF16WF:
1301     case R_PARISC_LTOFF16DF:
1302       {
1303         /* If this relocation was against a local symbol, then we still
1304            have not set up the DLT entry (it's not convienent to do so
1305            in the "finalize_dlt" routine because it is difficult to get
1306            to the local symbol's value).
1307
1308            So, if this is a local symbol (h == NULL), then we need to
1309            fill in its DLT entry. 
1310
1311            Similarly we may still need to set up an entry in .opd for
1312            a local function which had its address taken.  */
1313         if (dyn_h->h == NULL)
1314           {
1315             bfd_put_64 (hppa_info->dlt_sec->owner,
1316                         value,
1317                         hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
1318
1319             /* Now handle .opd creation if needed.  */
1320             if (r_type == R_PARISC_LTOFF_FPTR14R
1321                 || r_type == R_PARISC_LTOFF_FPTR14DR
1322                 || r_type == R_PARISC_LTOFF_FPTR14WR
1323                 || r_type == R_PARISC_LTOFF_FPTR21L
1324                 || r_type == R_PARISC_LTOFF_FPTR16F
1325                 || r_type == R_PARISC_LTOFF_FPTR16WF
1326                 || r_type == R_PARISC_LTOFF_FPTR16DF)
1327               {
1328                 /* The first two words of an .opd entry are zero.  */
1329                 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset,
1330                         0, 16);
1331
1332                 /* The next word is the address of the function.  */
1333                 bfd_put_64 (hppa_info->opd_sec->owner, value,
1334                             (hppa_info->opd_sec->contents
1335                              + dyn_h->opd_offset + 16));
1336
1337                 /* The last word is our local __gp value.  */
1338                 value = _bfd_get_gp_value
1339                           (hppa_info->opd_sec->output_section->owner);
1340                 bfd_put_64 (hppa_info->opd_sec->owner, value,
1341                             (hppa_info->opd_sec->contents
1342                              + dyn_h->opd_offset + 24));
1343               }
1344           }
1345
1346         /* We want the value of the DLT offset for this symbol, not
1347            the symbol's actual address.  Note that __gp may not point
1348            to the start of the DLT, so we have to compute the absolute
1349            address, then subtract out the value of __gp.  */
1350         value = (dyn_h->dlt_offset
1351                  + hppa_info->dlt_sec->output_offset
1352                  + hppa_info->dlt_sec->output_section->vma);
1353         value -= _bfd_get_gp_value (output_bfd);
1354
1355
1356         /* All DLTIND 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_DLTIND21L
1360             || r_type == R_PARISC_LTOFF_FPTR21L
1361             || r_type == R_PARISC_LTOFF_TP21L)
1362           value = hppa_field_adjust (value, addend, e_lrsel);
1363         else if (r_type == R_PARISC_DLTIND14F
1364                  || r_type == R_PARISC_LTOFF_FPTR16F
1365                  || r_type == R_PARISC_LTOFF_FPTR16WF
1366                  || r_type == R_PARISC_LTOFF_FPTR16DF
1367                  || r_type == R_PARISC_LTOFF16F
1368                  || r_type == R_PARISC_LTOFF16DF
1369                  || r_type == R_PARISC_LTOFF16WF
1370                  || r_type == R_PARISC_LTOFF_TP16F
1371                  || r_type == R_PARISC_LTOFF_TP16WF
1372                  || r_type == R_PARISC_LTOFF_TP16DF)
1373           value = hppa_field_adjust (value, addend, e_fsel);
1374         else
1375           value = hppa_field_adjust (value, addend, e_rrsel);
1376
1377         insn = elf_hppa_relocate_insn (insn, value, r_type);
1378         break;
1379       }
1380
1381     case R_PARISC_DLTREL14R:
1382     case R_PARISC_DLTREL14F:
1383     case R_PARISC_DLTREL14DR:
1384     case R_PARISC_DLTREL14WR:
1385     case R_PARISC_DLTREL21L:
1386     case R_PARISC_DPREL21L:
1387     case R_PARISC_DPREL14WR:
1388     case R_PARISC_DPREL14DR:
1389     case R_PARISC_DPREL14R:
1390     case R_PARISC_DPREL14F:
1391     case R_PARISC_GPREL16F:
1392     case R_PARISC_GPREL16WF:
1393     case R_PARISC_GPREL16DF:
1394       {
1395         /* Subtract out the global pointer value to make value a DLT
1396            relative address.  */
1397         value -= _bfd_get_gp_value (output_bfd);
1398
1399         /* All DLTREL relocations are basically the same at this point,
1400            except that we need different field selectors for the 21bit
1401            version vs the 14bit versions.  */
1402         if (r_type == R_PARISC_DLTREL21L
1403             || r_type == R_PARISC_DPREL21L)
1404           value = hppa_field_adjust (value, addend, e_lrsel);
1405         else if (r_type == R_PARISC_DLTREL14F
1406                  || r_type == R_PARISC_DPREL14F
1407                  || r_type == R_PARISC_GPREL16F
1408                  || r_type == R_PARISC_GPREL16WF
1409                  || r_type == R_PARISC_GPREL16DF)
1410           value = hppa_field_adjust (value, addend, e_fsel);
1411         else
1412           value = hppa_field_adjust (value, addend, e_rrsel);
1413
1414         insn = elf_hppa_relocate_insn (insn, value, r_type);
1415         break;
1416       }
1417
1418     case R_PARISC_DIR21L:
1419     case R_PARISC_DIR17R:
1420     case R_PARISC_DIR17F:
1421     case R_PARISC_DIR14R:
1422     case R_PARISC_DIR14WR:
1423     case R_PARISC_DIR14DR:
1424     case R_PARISC_DIR16F:
1425     case R_PARISC_DIR16WF:
1426     case R_PARISC_DIR16DF:
1427       {
1428         /* All DIR relocations are basically the same at this point,
1429            except that we need different field selectors for the 21bit
1430            version vs the 14bit versions.  */
1431         if (r_type == R_PARISC_DIR21L)
1432           value = hppa_field_adjust (value, addend, e_lrsel);
1433         else if (r_type == R_PARISC_DIR17F
1434                  || r_type == R_PARISC_DIR16F
1435                  || r_type == R_PARISC_DIR16WF
1436                  || r_type == R_PARISC_DIR16DF)
1437           value = hppa_field_adjust (value, addend, e_fsel);
1438         else
1439           value = hppa_field_adjust (value, addend, e_rrsel);
1440
1441         insn = elf_hppa_relocate_insn (insn, value, r_type);
1442         break;
1443       }
1444
1445     case R_PARISC_PLTOFF21L:
1446     case R_PARISC_PLTOFF14R:
1447     case R_PARISC_PLTOFF14F:
1448     case R_PARISC_PLTOFF14WR:
1449     case R_PARISC_PLTOFF14DR:
1450     case R_PARISC_PLTOFF16F:
1451     case R_PARISC_PLTOFF16WF:
1452     case R_PARISC_PLTOFF16DF:
1453       {
1454         /* We want the value of the PLT offset for this symbol, not
1455            the symbol's actual address.  Note that __gp may not point
1456            to the start of the DLT, so we have to compute the absolute
1457            address, then subtract out the value of __gp.  */
1458         value = (dyn_h->plt_offset
1459                  + hppa_info->plt_sec->output_offset
1460                  + hppa_info->plt_sec->output_section->vma);
1461         value -= _bfd_get_gp_value (output_bfd);
1462
1463         /* All PLTOFF relocations are basically the same at this point,
1464            except that we need different field selectors for the 21bit
1465            version vs the 14bit versions.  */
1466         if (r_type == R_PARISC_PLTOFF21L)
1467           value = hppa_field_adjust (value, addend, e_lrsel);
1468         else if (r_type == R_PARISC_PLTOFF14F
1469                  || r_type == R_PARISC_PLTOFF16F
1470                  || r_type == R_PARISC_PLTOFF16WF
1471                  || r_type == R_PARISC_PLTOFF16DF)
1472           value = hppa_field_adjust (value, addend, e_fsel);
1473         else
1474           value = hppa_field_adjust (value, addend, e_rrsel);
1475
1476         insn = elf_hppa_relocate_insn (insn, value, r_type);
1477         break;
1478       }
1479
1480     case R_PARISC_LTOFF_FPTR32:
1481       {
1482         /* We may still need to create the FPTR itself if it was for
1483            a local symbol.  */
1484         if (dyn_h->h == NULL)
1485           {
1486             /* The first two words of an .opd entry are zero.  */
1487             memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1488
1489             /* The next word is the address of the function.  */
1490             bfd_put_64 (hppa_info->opd_sec->owner, value,
1491                         (hppa_info->opd_sec->contents
1492                          + dyn_h->opd_offset + 16));
1493
1494             /* The last word is our local __gp value.  */
1495             value = _bfd_get_gp_value
1496                       (hppa_info->opd_sec->output_section->owner);
1497             bfd_put_64 (hppa_info->opd_sec->owner, value,
1498                         hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1499           }
1500
1501         /* We want the value of the DLT offset for this symbol, not
1502            the symbol's actual address.  Note that __gp may not point
1503            to the start of the DLT, so we have to compute the absolute
1504            address, then subtract out the value of __gp.  */
1505         value = (dyn_h->dlt_offset
1506                  + hppa_info->dlt_sec->output_offset
1507                  + hppa_info->dlt_sec->output_section->vma);
1508         value -= _bfd_get_gp_value (output_bfd);
1509         bfd_put_32 (input_bfd, value, hit_data);
1510         return bfd_reloc_ok;
1511       }
1512
1513     case R_PARISC_LTOFF_FPTR64:
1514     case R_PARISC_LTOFF_TP64:
1515       {
1516         /* We may still need to create the FPTR itself if it was for
1517            a local symbol.  */
1518         if (dyn_h->h == NULL && r_type == R_PARISC_LTOFF_FPTR64)
1519           {
1520             /* The first two words of an .opd entry are zero.  */
1521             memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1522
1523             /* The next word is the address of the function.  */
1524             bfd_put_64 (hppa_info->opd_sec->owner, value,
1525                         (hppa_info->opd_sec->contents
1526                          + dyn_h->opd_offset + 16));
1527
1528             /* The last word is our local __gp value.  */
1529             value = _bfd_get_gp_value
1530                       (hppa_info->opd_sec->output_section->owner);
1531             bfd_put_64 (hppa_info->opd_sec->owner, value,
1532                         hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1533           }
1534
1535         /* We want the value of the DLT offset for this symbol, not
1536            the symbol's actual address.  Note that __gp may not point
1537            to the start of the DLT, so we have to compute the absolute
1538            address, then subtract out the value of __gp.  */
1539         value = (dyn_h->dlt_offset
1540                  + hppa_info->dlt_sec->output_offset
1541                  + hppa_info->dlt_sec->output_section->vma);
1542         value -= _bfd_get_gp_value (output_bfd);
1543         bfd_put_64 (input_bfd, value, hit_data);
1544         return bfd_reloc_ok;
1545       }
1546
1547     case R_PARISC_DIR32:
1548       bfd_put_32 (input_bfd, value + addend, hit_data);
1549       return bfd_reloc_ok;
1550
1551     case R_PARISC_DIR64:
1552       bfd_put_64 (input_bfd, value + addend, hit_data);
1553       return bfd_reloc_ok;
1554
1555     case R_PARISC_GPREL64:
1556       /* Subtract out the global pointer value to make value a DLT
1557          relative address.  */
1558       value -= _bfd_get_gp_value (output_bfd);
1559       value += addend;
1560
1561       bfd_put_64 (input_bfd, value + addend, hit_data);
1562       return bfd_reloc_ok;
1563
1564     case R_PARISC_LTOFF64:
1565         /* We want the value of the DLT offset for this symbol, not
1566            the symbol's actual address.  Note that __gp may not point
1567            to the start of the DLT, so we have to compute the absolute
1568            address, then subtract out the value of __gp.  */
1569       value = (dyn_h->dlt_offset
1570                + hppa_info->dlt_sec->output_offset
1571                + hppa_info->dlt_sec->output_section->vma);
1572       value -= _bfd_get_gp_value (output_bfd);
1573
1574       bfd_put_64 (input_bfd, value + addend, hit_data);
1575       return bfd_reloc_ok;
1576
1577     case R_PARISC_PCREL32:
1578       {
1579         /* If this is a call to a function defined in another dynamic
1580            library, then redirect the call to the local stub for this
1581            function.  */
1582         if (sym_sec == NULL || sym_sec->output_section == NULL)
1583           value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1584                    + hppa_info->stub_sec->output_section->vma);
1585   
1586         /* Turn VALUE into a proper PC relative address.  */
1587         value -= (offset + input_section->output_offset
1588                   + input_section->output_section->vma);
1589
1590         value += addend;
1591         value -= 8;
1592         bfd_put_64 (input_bfd, value, hit_data);
1593         return bfd_reloc_ok;
1594       }
1595
1596     case R_PARISC_PCREL64:
1597       {
1598         /* If this is a call to a function defined in another dynamic
1599            library, then redirect the call to the local stub for this
1600            function.  */
1601         if (sym_sec == NULL || sym_sec->output_section == NULL)
1602           value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1603                    + hppa_info->stub_sec->output_section->vma);
1604   
1605   
1606         /* Turn VALUE into a proper PC relative address.  */
1607         value -= (offset + input_section->output_offset
1608                   + input_section->output_section->vma);
1609
1610         value += addend;
1611         value -= 8;
1612         bfd_put_64 (input_bfd, value, hit_data);
1613         return bfd_reloc_ok;
1614       }
1615
1616
1617     case R_PARISC_FPTR64:
1618       {
1619         /* We may still need to create the FPTR itself if it was for
1620            a local symbol.  */
1621         if (dyn_h->h == NULL)
1622           {
1623             /* The first two words of an .opd entry are zero.  */
1624             memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1625
1626             /* The next word is the address of the function.  */
1627             bfd_put_64 (hppa_info->opd_sec->owner, value,
1628                         (hppa_info->opd_sec->contents
1629                          + dyn_h->opd_offset + 16));
1630
1631             /* The last word is our local __gp value.  */
1632             value = _bfd_get_gp_value
1633                       (hppa_info->opd_sec->output_section->owner);
1634             bfd_put_64 (hppa_info->opd_sec->owner, value,
1635                         hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1636           }
1637
1638         /* We want the value of the OPD offset for this symbol, not
1639            the symbol's actual address.  */
1640         value = (dyn_h->opd_offset
1641                  + hppa_info->opd_sec->output_offset
1642                  + hppa_info->opd_sec->output_section->vma);
1643                
1644         bfd_put_64 (input_bfd, value + addend, hit_data);
1645         return bfd_reloc_ok;
1646       }
1647
1648     case R_PARISC_SECREL32:
1649       bfd_put_32 (input_bfd,
1650                   (value + addend
1651                    - sym_sec->output_section->vma),
1652                   hit_data);
1653       return bfd_reloc_ok;
1654
1655     case R_PARISC_SEGREL32:
1656     case R_PARISC_SEGREL64:
1657       {
1658         /* If this is the first SEGREL relocation, then initialize
1659            the segment base values.  */
1660         if (hppa_info->text_segment_base == (bfd_vma) -1)
1661           bfd_map_over_sections (output_bfd, elf_hppa_record_segment_addrs,
1662                                  elf64_hppa_hash_table (info));
1663
1664         /* VALUE holds the absolute address.  We want to include the
1665            addend, then turn it into a segment relative address.
1666
1667            The segment is derived from SYM_SEC.  We assume that there are
1668            only two segments of note in the resulting executable/shlib.
1669            A readonly segment (.text) and a readwrite segment (.data).  */
1670         value += addend;
1671
1672         if (sym_sec->flags & SEC_CODE)
1673           value -= hppa_info->text_segment_base;
1674         else
1675           value -= hppa_info->data_segment_base;
1676
1677         if (r_type == R_PARISC_SEGREL32)
1678           bfd_put_32 (input_bfd, value, hit_data);
1679         else
1680           bfd_put_64 (input_bfd, value, hit_data);
1681         return bfd_reloc_ok;
1682       }
1683       
1684
1685     /* Something we don't know how to handle.  */
1686     default:
1687       return bfd_reloc_notsupported;
1688     }
1689
1690   /* Update the instruction word.  */
1691   bfd_put_32 (input_bfd, insn, hit_data);
1692   return (bfd_reloc_ok);
1693 }
1694
1695 /* Relocate the given INSN.  VALUE should be the actual value we want
1696    to insert into the instruction, ie by this point we should not be
1697    concerned with computing an offset relative to the DLT, PC, etc.
1698    Instead this routine is meant to handle the bit manipulations needed
1699    to insert the relocation into the given instruction.  */
1700
1701 static unsigned long
1702 elf_hppa_relocate_insn (insn, sym_value, r_type)
1703      unsigned long insn;
1704      long sym_value;
1705      unsigned long r_type;
1706 {
1707   switch (r_type)
1708     {
1709     /* This is any 22bit branch.  In PA2.0 syntax it corresponds to
1710        the "B" instruction.  */
1711     case R_PARISC_PCREL22F:
1712     case R_PARISC_PCREL22C:
1713       {
1714         unsigned int w3, w2, w1, w;
1715
1716         /* These are 22 bit branches.  Mask off bits we do not care
1717            about.  */
1718         sym_value &= 0x3fffff;
1719
1720         /* Now extract the W1, W2, W3 and W fields from the value.  */
1721         dis_assemble_22 (sym_value, &w3, &w1, &w2, &w);
1722
1723         /* Mask out bits for the value in the instruction.  */
1724         insn &= 0xfc00e002;
1725
1726         /* Insert the bits for the W1, W2 and W fields into the
1727            instruction.  */
1728         insn |= (w3 << 21) | (w2 << 2) | (w1 << 16) | w;
1729         return insn;
1730        }
1731
1732     /* This is any 17bit branch.  In PA2.0 syntax it also corresponds to
1733        the "B" instruction as well as BE.  */
1734     case R_PARISC_PCREL17F:
1735     case R_PARISC_DIR17F:
1736     case R_PARISC_DIR17R:
1737     case R_PARISC_PCREL17C:
1738     case R_PARISC_PCREL17R:
1739       {
1740         unsigned int w2, w1, w;
1741
1742         /* These are 17 bit branches.  Mask off bits we do not care
1743            about.  */
1744         sym_value &= 0x1ffff;
1745
1746         /* Now extract the W1, W2 and W fields from the value.  */
1747         dis_assemble_17 (sym_value, &w1, &w2, &w);
1748
1749         /* Mask out bits for the value in the instruction.  */
1750         insn &= 0xffe0e002;
1751
1752         /* Insert the bits for the W1, W2 and W fields into the
1753            instruction.  */
1754         insn |= (w2 << 2) | (w1 << 16) | w;
1755         return insn;
1756       }
1757
1758     /* ADDIL or LDIL instructions.  */
1759     case R_PARISC_DLTREL21L:
1760     case R_PARISC_DLTIND21L:
1761     case R_PARISC_LTOFF_FPTR21L:
1762     case R_PARISC_PCREL21L:
1763     case R_PARISC_LTOFF_TP21L:
1764     case R_PARISC_DPREL21L:
1765     case R_PARISC_PLTOFF21L:
1766     case R_PARISC_DIR21L:
1767       {
1768         int w;
1769
1770         /* Mask off bits in INSN we do not want.  */
1771         insn &= 0xffe00000;
1772
1773         /* Turn the 21bit value into the proper format.  */
1774         dis_assemble_21 (sym_value, &w);
1775
1776         /* And insert the proper bits into INSN.  */
1777         return insn | w;
1778       }
1779
1780     /* LDO and integer loads/stores with 14bit displacements.  */
1781     case R_PARISC_DLTREL14R:
1782     case R_PARISC_DLTREL14F:
1783     case R_PARISC_DLTIND14R:
1784     case R_PARISC_DLTIND14F:
1785     case R_PARISC_LTOFF_FPTR14R:
1786     case R_PARISC_LTOFF_FPTR16F:
1787     case R_PARISC_PCREL14R:
1788     case R_PARISC_PCREL14F:
1789     case R_PARISC_PCREL16F:
1790     case R_PARISC_LTOFF_TP14R:
1791     case R_PARISC_LTOFF_TP14F:
1792     case R_PARISC_LTOFF_TP16F:
1793     case R_PARISC_DPREL14R:
1794     case R_PARISC_DPREL14F:
1795     case R_PARISC_GPREL16F:
1796     case R_PARISC_PLTOFF14R:
1797     case R_PARISC_PLTOFF14F:
1798     case R_PARISC_PLTOFF16F:
1799     case R_PARISC_DIR14R:
1800     case R_PARISC_DIR16F:
1801     case R_PARISC_LTOFF16F:
1802       {
1803         int w;
1804
1805         /* Mask off bits in INSN we do not want.  */
1806         insn &= 0xffffc000;
1807
1808         /* Turn the 14bit value into the proper format.  */
1809         low_sign_unext (sym_value, 14, &w);
1810
1811         /* And insert the proper bits into INSN.  */
1812         return insn | w;
1813       }
1814
1815     /* Doubleword loads and stores with a 14bit displacement.  */
1816     case R_PARISC_DLTREL14DR:
1817     case R_PARISC_DLTIND14DR:
1818     case R_PARISC_LTOFF_FPTR14DR:
1819     case R_PARISC_LTOFF_FPTR16DF:
1820     case R_PARISC_PCREL14DR:
1821     case R_PARISC_PCREL16DF:
1822     case R_PARISC_LTOFF_TP14DR:
1823     case R_PARISC_LTOFF_TP16DF:
1824     case R_PARISC_DPREL14DR:
1825     case R_PARISC_GPREL16DF:
1826     case R_PARISC_PLTOFF14DR:
1827     case R_PARISC_PLTOFF16DF:
1828     case R_PARISC_DIR14DR:
1829     case R_PARISC_DIR16DF:
1830     case R_PARISC_LTOFF16DF:
1831       {
1832         /* Mask off bits in INSN we do not want.  */
1833         insn &= 0xffffc00e;
1834
1835         /* The sign bit at 14 moves into bit zero in the destination.  */
1836         insn |= ((sym_value & 0x2000) >> 13);
1837
1838         /* Turn off the bits in sym_value we do not care about.  */
1839         sym_value &= 0x1ff8;
1840
1841         /* Now shift it one bit position left so that it lines up with the
1842            destination field in INSN.  */
1843         sym_value <<= 1;
1844
1845         return insn | sym_value;
1846       }
1847
1848     /* Floating point single word load/store instructions.  */
1849     case R_PARISC_DLTREL14WR:
1850     case R_PARISC_DLTIND14WR:
1851     case R_PARISC_LTOFF_FPTR14WR:
1852     case R_PARISC_LTOFF_FPTR16WF:
1853     case R_PARISC_PCREL14WR:
1854     case R_PARISC_PCREL16WF:
1855     case R_PARISC_LTOFF_TP14WR:
1856     case R_PARISC_LTOFF_TP16WF:
1857     case R_PARISC_DPREL14WR:
1858     case R_PARISC_GPREL16WF:
1859     case R_PARISC_PLTOFF14WR:
1860     case R_PARISC_PLTOFF16WF:
1861     case R_PARISC_DIR16WF:
1862     case R_PARISC_DIR14WR:
1863     case R_PARISC_LTOFF16WF:
1864       {
1865         /* Mask off bits in INSN we do not want.  */
1866         insn &= 0xffffc006;
1867
1868         /* The sign bit at 14 moves into bit zero in the destination.  */
1869         insn |= ((sym_value & 0x2000) >> 13);
1870
1871         /* Turn off the bits in sym_value we do not care about.  */
1872         sym_value &= 0x1ffc;
1873
1874         /* Now shift it one bit position left so that it lines up with the
1875            destination field in INSN.  */
1876         sym_value <<= 1;
1877
1878         return insn | sym_value;
1879       }
1880
1881     default:
1882       return insn;
1883     }
1884 }