1 /* BFD back-end for HP PA-RISC ELF files.
2 Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc.
6 Center for Software Science
7 Department of Computer Science
10 This file is part of BFD, the Binary File Descriptor library.
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
33 /* ELF32/HPPA relocation support
35 This file contains ELF32/HPPA relocation support as specified
36 in the Stratus FTX/Golf Object File Format (SED-1762) dated
40 #include "elf32-hppa.h"
42 #include "aout/aout64.h"
43 #include "hppa_stubs.h"
45 /* ELF/PA relocation howto entries */
47 static bfd_reloc_status_type hppa_elf_reloc
48 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
50 static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
52 /* 'bitpos' and 'abs' are obsolete */
53 /* type rs sz bsz pcrel bpos abs ovrf sf name */
54 /* 9.3.4. Address relocation types */
55 {R_HPPA_NONE, 0, 3, 19, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_NONE"},
56 {R_HPPA_32, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_32"},
57 {R_HPPA_11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_11"},
58 {R_HPPA_14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_14"},
59 {R_HPPA_17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_17"},
60 {R_HPPA_L21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_L21"},
61 {R_HPPA_R11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_R11"},
62 {R_HPPA_R14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_R14"},
63 {R_HPPA_R17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_R17"},
64 {R_HPPA_LS21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_LS21"},
65 {R_HPPA_RS11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_RS11"},
66 {R_HPPA_RS14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_RS14"},
67 {R_HPPA_RS17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_RS17"},
68 {R_HPPA_LD21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_LD21"},
69 {R_HPPA_RD11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_RD11"},
70 {R_HPPA_RD14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_RD14"},
71 {R_HPPA_RD17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_RD17"},
72 {R_HPPA_LR21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_LR21"},
73 {R_HPPA_RR14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_RR14"},
74 {R_HPPA_RR17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_RR17"},
75 /* 9.3.5. GOTOFF address relocation types */
76 {R_HPPA_GOTOFF_11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_11"},
77 {R_HPPA_GOTOFF_14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_14"},
78 {R_HPPA_GOTOFF_L21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_L21"},
79 {R_HPPA_GOTOFF_R11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_R11"},
80 {R_HPPA_GOTOFF_R14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_R14"},
81 {R_HPPA_GOTOFF_LS21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_LS21"},
82 {R_HPPA_GOTOFF_RS11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_RS11"},
83 {R_HPPA_GOTOFF_RS14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_RS14"},
84 {R_HPPA_GOTOFF_LD21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_LD21"},
85 {R_HPPA_GOTOFF_RD11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_RD11"},
86 {R_HPPA_GOTOFF_RD14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_RD14"},
87 {R_HPPA_GOTOFF_LR21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_LR21"},
88 {R_HPPA_GOTOFF_RR14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_GOTOFF_RR14"},
89 /* 9.3.6. Absolute call relocation types */
90 {R_HPPA_ABS_CALL_11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_11"},
91 {R_HPPA_ABS_CALL_14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_14"},
92 {R_HPPA_ABS_CALL_17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_17"},
93 {R_HPPA_ABS_CALL_L21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_L21"},
94 {R_HPPA_ABS_CALL_R11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_R11"},
95 {R_HPPA_ABS_CALL_R14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_R14"},
96 {R_HPPA_ABS_CALL_R17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_R17"},
97 {R_HPPA_ABS_CALL_LS21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_LS21"},
98 {R_HPPA_ABS_CALL_RS11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_RS11"},
99 {R_HPPA_ABS_CALL_RS14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_RS14"},
100 {R_HPPA_ABS_CALL_RS17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_RS17"},
101 {R_HPPA_ABS_CALL_LD21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_LD21"},
102 {R_HPPA_ABS_CALL_RD11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_RD11"},
103 {R_HPPA_ABS_CALL_RD14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_RD14"},
104 {R_HPPA_ABS_CALL_RD17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_RD17"},
105 {R_HPPA_ABS_CALL_LR21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_LR21"},
106 {R_HPPA_ABS_CALL_RR14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_RR14"},
107 {R_HPPA_ABS_CALL_RR17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ABS_CALL_RR17"},
108 /* 9.3.7. PC-relative call relocation types */
109 {R_HPPA_PCREL_CALL_11, 0, 3, 11, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_11"},
110 {R_HPPA_PCREL_CALL_14, 0, 3, 14, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_14"},
111 {R_HPPA_PCREL_CALL_17, 0, 3, 17, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_17"},
112 {R_HPPA_PCREL_CALL_12, 0, 3, 12, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_12"},
113 {R_HPPA_PCREL_CALL_L21, 0, 3, 21, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_L21"},
114 {R_HPPA_PCREL_CALL_R11, 0, 3, 11, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_R11"},
115 {R_HPPA_PCREL_CALL_R14, 0, 3, 14, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_R14"},
116 {R_HPPA_PCREL_CALL_R17, 0, 3, 17, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_R17"},
117 {R_HPPA_PCREL_CALL_LS21, 0, 3, 21, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_LS21"},
118 {R_HPPA_PCREL_CALL_RS11, 0, 3, 11, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_RS11"},
119 {R_HPPA_PCREL_CALL_RS14, 0, 3, 14, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_RS14"},
120 {R_HPPA_PCREL_CALL_RS17, 0, 3, 17, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_RS17"},
121 {R_HPPA_PCREL_CALL_LD21, 0, 3, 21, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_LD21"},
122 {R_HPPA_PCREL_CALL_RD11, 0, 3, 11, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_RD11"},
123 {R_HPPA_PCREL_CALL_RD14, 0, 3, 14, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_RD14"},
124 {R_HPPA_PCREL_CALL_RD17, 0, 3, 17, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_RD17"},
125 {R_HPPA_PCREL_CALL_LR21, 0, 3, 21, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_LR21"},
126 {R_HPPA_PCREL_CALL_RR14, 0, 3, 14, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_RR14"},
127 {R_HPPA_PCREL_CALL_RR17, 0, 3, 17, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PCREL_CALL_RR17"},
129 /* 9.3.8. Plabel relocation types */
130 {R_HPPA_PLABEL_32, 0, 3, 32, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PLABEL_32"},
131 {R_HPPA_PLABEL_11, 0, 3, 11, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PLABEL_11"},
132 {R_HPPA_PLABEL_14, 0, 3, 14, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PLABEL_14"},
133 {R_HPPA_PLABEL_L21, 0, 3, 21, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PLABEL_L21"},
134 {R_HPPA_PLABEL_R11, 0, 3, 11, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PLABEL_R11"},
135 {R_HPPA_PLABEL_R14, 0, 3, 14, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_PLABEL_R14"},
137 /* 9.3.9. Data linkage table (DLT) relocation types */
138 {R_HPPA_DLT_32, 0, 3, 32, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_DLT_32"},
139 {R_HPPA_DLT_11, 0, 3, 11, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_DLT_11"},
140 {R_HPPA_DLT_14, 0, 3, 14, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_DLT_14"},
141 {R_HPPA_DLT_L21, 0, 3, 21, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_DLT_L21"},
142 {R_HPPA_DLT_R11, 0, 3, 11, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_DLT_R11"},
143 {R_HPPA_DLT_R14, 0, 3, 14, false, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_DLT_R14"},
145 /* 9.3.10. Relocations for unwinder tables */
146 {R_HPPA_UNWIND_ENTRY, 0, 3, 32, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_UNWIND_ENTRY"},
147 {R_HPPA_UNWIND_ENTRIES, 0, 3, 32, true, 0, complain_overflow_signed, hppa_elf_reloc, "R_HPPA_UNWIND_ENTRIES"},
149 /* 9.3.11. Relocation types for complex expressions */
150 {R_HPPA_PUSH_CONST, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_PUSH_CONST"},
151 {R_HPPA_PUSH_PC, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_PUSH_PC"},
152 {R_HPPA_PUSH_SYM, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_PUSH_SYM"},
153 {R_HPPA_PUSH_GOTOFF, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_PUSH_GOTOFF"},
154 {R_HPPA_PUSH_ABS_CALL, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_PUSH_ABS_CALL"},
155 {R_HPPA_PUSH_PCREL_CALL, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_PUSH_PCREL_CALL"},
156 {R_HPPA_PUSH_PLABEL, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_PUSH_PLABEL"},
157 {R_HPPA_MAX, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_MAX"},
158 {R_HPPA_MIN, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_MIN"},
159 {R_HPPA_ADD, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ADD"},
160 {R_HPPA_SUB, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_SUB"},
161 {R_HPPA_MULT, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_MULT"},
162 {R_HPPA_DIV, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_DIV"},
163 {R_HPPA_MOD, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_MOD"},
164 {R_HPPA_AND, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_AND"},
165 {R_HPPA_OR, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_OR"},
166 {R_HPPA_XOR, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_XOR"},
167 {R_HPPA_NOT, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_NOT"},
168 {R_HPPA_LSHIFT, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_LSHIFT"},
169 {R_HPPA_ARITH_RSHIFT, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_ARITH_RSHIFT"},
170 {R_HPPA_LOGIC_RSHIFT, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_LOGIC_RSHIFT"},
171 {R_HPPA_EXPR_F, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_L"},
172 {R_HPPA_EXPR_L, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_L"},
173 {R_HPPA_EXPR_R, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_R"},
174 {R_HPPA_EXPR_LS, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_LS"},
175 {R_HPPA_EXPR_RS, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_RS"},
176 {R_HPPA_EXPR_LD, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_LD"},
177 {R_HPPA_EXPR_RD, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_RD"},
178 {R_HPPA_EXPR_LR, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_LR"},
179 {R_HPPA_EXPR_RR, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_RR"},
181 {R_HPPA_EXPR_32, 0, 3, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_32"},
182 {R_HPPA_EXPR_21, 0, 3, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_21"},
183 {R_HPPA_EXPR_11, 0, 3, 11, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_11"},
184 {R_HPPA_EXPR_14, 0, 3, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_14"},
185 {R_HPPA_EXPR_17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_17"},
186 {R_HPPA_EXPR_12, 0, 3, 12, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_EXPR_12"},
187 {R_HPPA_STUB_CALL_17, 0, 3, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_HPPA_STUB_CALL_17"},
188 {R_HPPA_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_HPPA_UNIMPLEMENTED"},
191 static symext_chainS *symext_rootP;
192 static symext_chainS *symext_lastP;
193 static boolean symext_chain_built;
196 hppa_elf_rebuild_insn (abfd, insn, value, r_type, r_field, r_format)
200 unsigned short r_type;
201 unsigned short r_field;
202 unsigned short r_format;
204 unsigned long const_part; /* part of the instruction that does not change */
205 unsigned long rebuilt_part;
213 const_part = insn & 0xffffe002;
214 dis_assemble_12 (value, &w1, &w);
215 rebuilt_part = (w1 << 2) | w;
216 return const_part | rebuilt_part;
223 const_part = insn & 0xffffe002;
224 dis_assemble_12 (value, &w1, &w);
225 rebuilt_part = (w1 << 2) | w;
226 return const_part | rebuilt_part;
230 const_part = insn & 0xffffc000;
231 low_sign_unext (value, 14, &rebuilt_part);
232 return const_part | rebuilt_part;
238 const_part = insn & 0xffe0e002;
239 dis_assemble_17 (value, &w1, &w2, &w);
240 rebuilt_part = (w2 << 2) | (w1 << 16) | w;
241 return const_part | rebuilt_part;
245 const_part = insn & 0xffe00000;
246 dis_assemble_21 (value, &rebuilt_part);
247 return const_part | rebuilt_part;
254 fprintf (stderr, "Relocation problem : ");
256 "Unrecognized reloc type %d (fmt=%d,fld=%d), in module %s\n",
257 r_type, r_format, r_field, abfd->filename);
263 hppa_elf_relocate_insn (abfd, input_sect,
264 insn, address, symp, sym_value, r_addend,
265 r_type, r_format, r_field, pcrel)
267 asection *input_sect;
269 unsigned long address;
273 unsigned short r_type;
274 unsigned short r_format;
275 unsigned short r_field;
278 unsigned char opcode = get_opcode (insn);
293 constant_value = HPPA_R_CONSTANT (r_addend);
294 BFD_ASSERT (r_format == 14);
297 sym_value -= address;
298 sym_value = hppa_field_adjust (sym_value, constant_value, r_field);
299 return hppa_elf_rebuild_insn (abfd, insn, sym_value, r_type, r_field, r_format);
302 case SUBI: /* case SUBIO: */
303 case ADDIT: /* case ADDITO: */
304 case ADDI: /* case ADDIO: */
305 BFD_ASSERT (r_format == 11);
307 constant_value = HPPA_R_CONSTANT(r_addend);
308 sym_value = hppa_field_adjust (sym_value, constant_value, r_field);
309 return hppa_elf_rebuild_insn (abfd, insn, sym_value, r_type, r_field, r_format);
313 BFD_ASSERT (r_format == 21);
315 constant_value = HPPA_R_CONSTANT (r_addend);
316 sym_value = hppa_field_adjust (sym_value, constant_value, r_field);
317 return hppa_elf_rebuild_insn (abfd, insn, sym_value, r_type, r_field, r_format);
322 arg_reloc = HPPA_R_ARG_RELOC (r_addend);
324 BFD_ASSERT (r_format == 17);
326 /* XXX computing constant_value is not needed??? */
327 constant_value = assemble_17 ((insn & 0x001f0000) >> 16,
328 (insn & 0x00001ffc) >> 2,
330 /* @@ Assumes only 32 bits. */
331 constant_value = (constant_value << 15) >> 15;
335 address + input_sect->output_offset
336 + input_sect->output_section->vma;
337 sym_value = hppa_field_adjust (sym_value, -8, r_field);
340 sym_value = hppa_field_adjust (sym_value, constant_value, r_field);
342 return hppa_elf_rebuild_insn (abfd, insn, sym_value >> 2, r_type, r_field, r_format);
347 BFD_ASSERT (r_format == 32);
348 constant_value = HPPA_R_CONSTANT (r_addend);
350 return hppa_field_adjust (sym_value, constant_value, r_field);
355 "Unrecognized opcode 0x%02x (fmt=%x,field=%x)\n",
356 opcode, r_format, r_field);
363 hppa_elf_relocate_unwind_table (abfd, input_sect,
364 data, address, symp, sym_value, r_addend,
365 r_type, r_format, r_field, pcrel)
367 asection *input_sect;
369 unsigned long address;
373 unsigned short r_type;
374 unsigned short r_format;
375 unsigned short r_field;
378 bfd_byte *hit_data = address + (bfd_byte *) (data);
381 long relocated_value;
384 BFD_ASSERT (r_format == 32);
385 BFD_ASSERT (r_field == e_fsel);
388 case R_HPPA_UNWIND_ENTRY:
389 start_offset = bfd_get_32 (abfd, hit_data);
390 relocated_value = hppa_field_adjust (sym_value, start_offset, r_field);
391 bfd_put_32 (abfd, relocated_value, hit_data);
393 hit_data += sizeof (unsigned long);
394 end_offset = bfd_get_32 (abfd, hit_data);
395 relocated_value = hppa_field_adjust (sym_value, end_offset, r_field);
396 bfd_put_32 (abfd, relocated_value, hit_data);
399 case R_HPPA_UNWIND_ENTRIES:
400 for (i = 0; i < r_addend; i++, hit_data += 3 * sizeof (unsigned long))
402 unsigned int adjustment;
403 start_offset = bfd_get_32 (abfd, hit_data);
404 /* Stuff the symbol value into the first word */
405 /* of the unwind descriptor */
406 bfd_put_32 (abfd, sym_value, hit_data);
407 adjustment = sym_value - start_offset;
409 hit_data += sizeof (unsigned long);
410 end_offset = adjustment + bfd_get_32 (abfd, hit_data);
411 bfd_put_32 (abfd, end_offset, hit_data);
413 /* If this is not the last unwind entry, */
414 /* adjust the symbol value. */
415 if (i + 1 < r_addend)
417 start_offset = bfd_get_32 (abfd, hit_data + 3 * sizeof (unsigned long));
418 sym_value = start_offset + adjustment;
425 "Unrecognized relocation type 0x%02x (fmt=%x,field=%x)\n",
426 r_type, r_format, r_field);
430 /* Provided the symbol, returns the value reffed */
432 get_symbol_value (symbol)
437 if (symbol == (asymbol *) NULL)
439 else if (symbol->section == &bfd_com_section)
445 relocation = symbol->value +
446 symbol->section->output_section->vma +
447 symbol->section->output_offset;
453 /* This function provides a pretty straight-forward mapping between a */
454 /* base relocation type, format and field into the relocation type */
455 /* that will be emitted in an object file. The only wrinkle in the */
456 /* mapping is that when the T, TR, TL, P, PR, or PL expression */
457 /* prefixes are involved, the type gets promoted to a *_GOTOFF_* */
458 /* relocation (in the case of T, TR, and TL) or a PLABEL relocation */
459 /* (in the case of P, PR, and PL). */
461 /* NOTE: XXX the T, TR, TL, P, PR, and PL expression prefixes are not */
465 hppa_elf_gen_reloc_error (base_type, fmt, field)
466 elf32_hppa_reloc_type base_type;
470 fprintf (stderr, "undefined relocation: base=0x%x,fmt=0x%x,field=0x%x\n",
471 base_type, fmt, field);
474 elf32_hppa_reloc_type **
475 hppa_elf_gen_reloc_type (abfd, base_type, format, field)
477 elf32_hppa_reloc_type base_type;
481 #define UNDEFINED hppa_elf_gen_reloc_error(base_type,format,field)
483 elf32_hppa_reloc_type *finaltype;
484 elf32_hppa_reloc_type **final_types;
487 final_types = (elf32_hppa_reloc_type **) bfd_alloc_by_size_t (abfd, sizeof (elf32_hppa_reloc_type *) * 2);
488 BFD_ASSERT (final_types != 0);
490 finaltype = (elf32_hppa_reloc_type *) bfd_alloc_by_size_t (abfd, sizeof (elf32_hppa_reloc_type));
491 BFD_ASSERT (finaltype != 0);
493 final_types[0] = finaltype;
494 final_types[1] = NULL;
496 #define final_type finaltype[0]
498 final_type = base_type;
509 final_type = R_HPPA_11;
512 final_type = R_HPPA_R11;
515 final_type = R_HPPA_RS11;
518 final_type = R_HPPA_RD11;
522 final_type = R_HPPA_PLABEL_11;
525 final_type = R_HPPA_PLABEL_R11;
528 final_type = R_HPPA_DLT_11;
531 final_type = R_HPPA_DLT_R11;
542 final_type = base_type;
553 final_type = R_HPPA_R14;
556 final_type = R_HPPA_RS14;
559 final_type = R_HPPA_RD14;
562 final_type = R_HPPA_RR14;
566 final_type = R_HPPA_PLABEL_14;
569 final_type = R_HPPA_PLABEL_R14;
572 final_type = R_HPPA_DLT_14;
575 final_type = R_HPPA_DLT_R14;
588 final_type = base_type;
596 final_type = R_HPPA_17;
599 final_type = R_HPPA_R17;
602 final_type = R_HPPA_RS17;
605 final_type = R_HPPA_RD17;
608 final_type = R_HPPA_RR17;
616 final_type = base_type;
624 final_type = R_HPPA_L21;
627 final_type = R_HPPA_LS21;
630 final_type = R_HPPA_LD21;
633 final_type = R_HPPA_LR21;
636 final_type = R_HPPA_PLABEL_L21;
639 final_type = R_HPPA_PLABEL_L21;
648 final_type = base_type;
656 final_type = R_HPPA_32;
659 final_type = R_HPPA_PLABEL_32;
662 final_type = R_HPPA_DLT_32;
666 final_type = base_type;
672 final_type = base_type;
683 final_type = R_HPPA_GOTOFF_R11;
686 final_type = R_HPPA_GOTOFF_RS11;
689 final_type = R_HPPA_GOTOFF_RD11;
692 final_type = R_HPPA_GOTOFF_11;
700 final_type = base_type;
706 final_type = base_type;
712 final_type = R_HPPA_GOTOFF_R14;
715 final_type = R_HPPA_GOTOFF_RS14;
718 final_type = R_HPPA_GOTOFF_RD14;
721 final_type = R_HPPA_GOTOFF_RR14;
724 final_type = R_HPPA_GOTOFF_14;
732 final_type = base_type;
738 final_type = base_type;
744 final_type = R_HPPA_GOTOFF_L21;
747 final_type = R_HPPA_GOTOFF_LS21;
750 final_type = R_HPPA_GOTOFF_LD21;
753 final_type = R_HPPA_GOTOFF_LR21;
762 final_type = base_type;
768 final_type = base_type;
772 final_type = base_type;
776 case R_HPPA_PCREL_CALL:
783 final_type = R_HPPA_PCREL_CALL_R11;
786 final_type = R_HPPA_PCREL_CALL_RS11;
789 final_type = R_HPPA_PCREL_CALL_RD11;
792 final_type = R_HPPA_PCREL_CALL_11;
800 final_type = base_type;
806 final_type = base_type;
812 final_type = R_HPPA_PCREL_CALL_R14;
815 final_type = R_HPPA_PCREL_CALL_RS14;
818 final_type = R_HPPA_PCREL_CALL_RD14;
821 final_type = R_HPPA_PCREL_CALL_RR14;
824 final_type = R_HPPA_PCREL_CALL_14;
832 final_type = base_type;
840 final_type = R_HPPA_PCREL_CALL_R17;
843 final_type = R_HPPA_PCREL_CALL_RS17;
846 final_type = R_HPPA_PCREL_CALL_RD17;
849 final_type = R_HPPA_PCREL_CALL_RR17;
852 final_type = R_HPPA_PCREL_CALL_17;
860 final_type = base_type;
868 final_type = R_HPPA_PCREL_CALL_L21;
871 final_type = R_HPPA_PCREL_CALL_LS21;
874 final_type = R_HPPA_PCREL_CALL_LD21;
877 final_type = R_HPPA_PCREL_CALL_LR21;
886 final_type = base_type;
892 final_type = base_type;
896 final_type = base_type;
907 final_type = R_HPPA_PLABEL_11;
910 final_type = R_HPPA_PLABEL_R11;
914 final_type = base_type;
922 final_type = R_HPPA_PLABEL_14;
925 final_type = R_HPPA_PLABEL_R14;
929 final_type = base_type;
937 final_type = R_HPPA_PLABEL_L21;
941 final_type = base_type;
949 final_type = R_HPPA_PLABEL_32;
953 final_type = base_type;
959 final_type = base_type;
962 case R_HPPA_ABS_CALL:
969 final_type = R_HPPA_ABS_CALL_R11;
972 final_type = R_HPPA_ABS_CALL_RS11;
975 final_type = R_HPPA_ABS_CALL_RD11;
978 final_type = R_HPPA_ABS_CALL_11;
986 final_type = base_type;
992 final_type = base_type;
998 final_type = R_HPPA_ABS_CALL_R14;
1001 final_type = R_HPPA_ABS_CALL_RS14;
1004 final_type = R_HPPA_ABS_CALL_RD14;
1007 final_type = R_HPPA_ABS_CALL_RR14;
1010 final_type = R_HPPA_ABS_CALL_14;
1018 final_type = base_type;
1026 final_type = R_HPPA_ABS_CALL_R17;
1029 final_type = R_HPPA_ABS_CALL_RS17;
1032 final_type = R_HPPA_ABS_CALL_RD17;
1035 final_type = R_HPPA_ABS_CALL_RR17;
1038 final_type = R_HPPA_ABS_CALL_17;
1046 final_type = base_type;
1054 final_type = R_HPPA_ABS_CALL_L21;
1057 final_type = R_HPPA_ABS_CALL_LS21;
1060 final_type = R_HPPA_ABS_CALL_LD21;
1063 final_type = R_HPPA_ABS_CALL_LR21;
1072 final_type = base_type;
1078 final_type = base_type;
1082 final_type = base_type;
1087 final_type = R_HPPA_UNWIND_ENTRY;
1089 case R_HPPA_COMPLEX:
1090 case R_HPPA_COMPLEX_PCREL_CALL:
1091 case R_HPPA_COMPLEX_ABS_CALL:
1092 final_types = (elf32_hppa_reloc_type **) bfd_alloc_by_size_t (abfd, sizeof (elf32_hppa_reloc_type *) * 6);
1093 BFD_ASSERT (final_types != 0);
1095 finaltype = (elf32_hppa_reloc_type *) bfd_alloc_by_size_t (abfd, sizeof (elf32_hppa_reloc_type) * 5);
1096 BFD_ASSERT (finaltype != 0);
1098 for (i = 0; i < 5; i++)
1099 final_types[i] = &finaltype[i];
1101 final_types[5] = NULL;
1103 finaltype[0] = R_HPPA_PUSH_SYM;
1105 if (base_type == R_HPPA_COMPLEX)
1106 finaltype[1] = R_HPPA_PUSH_SYM;
1107 else if (base_type == R_HPPA_COMPLEX_PCREL_CALL)
1108 finaltype[1] = R_HPPA_PUSH_PCREL_CALL;
1109 else /* base_type == R_HPPA_COMPLEX_ABS_CALL */
1110 finaltype[1] = R_HPPA_PUSH_ABS_CALL;
1112 finaltype[2] = R_HPPA_SUB;
1117 finaltype[3] = R_HPPA_EXPR_F;
1120 finaltype[3] = R_HPPA_EXPR_L;
1123 finaltype[3] = R_HPPA_EXPR_R;
1126 finaltype[3] = R_HPPA_EXPR_LS;
1129 finaltype[3] = R_HPPA_EXPR_RS;
1132 finaltype[3] = R_HPPA_EXPR_LD;
1135 finaltype[3] = R_HPPA_EXPR_RD;
1138 finaltype[3] = R_HPPA_EXPR_LR;
1141 finaltype[3] = R_HPPA_EXPR_RR;
1148 finaltype[4] = R_HPPA_EXPR_11;
1151 finaltype[4] = R_HPPA_EXPR_12;
1154 finaltype[4] = R_HPPA_EXPR_14;
1157 finaltype[4] = R_HPPA_EXPR_17;
1160 finaltype[4] = R_HPPA_EXPR_21;
1163 finaltype[4] = R_HPPA_EXPR_32;
1170 final_type = base_type;
1180 /* this function is in charge of performing all the HP PA relocations */
1181 static long global_value;
1182 static long GOT_value; /* XXX: need to calculate this! For HPUX, GOT == DP */
1183 static asymbol *global_symbol;
1184 static int global_sym_defined;
1186 static bfd_reloc_status_type
1187 hppa_elf_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
1190 arelent *reloc_entry;
1193 asection *input_section;
1195 char **error_message;
1199 unsigned long addr = reloc_entry->address;
1200 bfd_byte *hit_data = addr + (bfd_byte *) (data);
1201 unsigned short r_type = reloc_entry->howto->type & 0xFF;
1202 unsigned short r_field = e_fsel;
1203 boolean r_pcrel = reloc_entry->howto->pc_relative;
1204 unsigned r_format = reloc_entry->howto->bitsize;
1205 long r_addend = reloc_entry->addend;
1209 /* Partial linking - do nothing */
1210 reloc_entry->address += input_section->output_offset;
1211 return bfd_reloc_ok;
1214 /* If performing final link and the symbol we're relocating against
1215 is undefined, then return an error. */
1216 if (symbol_in && symbol_in->section == &bfd_und_section)
1217 return bfd_reloc_undefined;
1219 sym_value = get_symbol_value (symbol_in);
1221 /* Compute the value of $global$. */
1222 if (!global_sym_defined)
1226 global_value = (global_symbol->value
1227 + global_symbol->section->output_section->vma
1228 + global_symbol->section->output_offset);
1229 GOT_value = global_value;
1230 global_sym_defined++;
1234 /* Get the instruction word. */
1235 insn = bfd_get_32 (abfd, hit_data);
1237 /* Relocate the value based on one of the basic relocation types
1239 basic_type_1: relocation is relative to $global$
1240 basic_type_2: relocation is relative to the current GOT
1241 basic_type_3: relocation is an absolute call
1242 basic_type_4: relocation is an PC-relative call
1243 basic_type_5: relocation is plabel reference
1244 basic_type_6: relocation is an unwind table relocation
1245 extended_type: unimplemented */
1252 /* Handle all the basic type 1 relocations. */
1255 goto do_basic_type_1;
1258 goto do_basic_type_1;
1261 goto do_basic_type_1;
1264 goto do_basic_type_1;
1267 goto do_basic_type_1;
1270 goto do_basic_type_1;
1273 goto do_basic_type_1;
1276 goto do_basic_type_1;
1279 goto do_basic_type_1;
1282 goto do_basic_type_1;
1285 goto do_basic_type_1;
1288 goto do_basic_type_1;
1291 goto do_basic_type_1;
1294 goto do_basic_type_1;
1297 goto do_basic_type_1;
1300 goto do_basic_type_1;
1303 goto do_basic_type_1;
1306 goto do_basic_type_1;
1311 insn = hppa_elf_relocate_insn (abfd, input_section, insn, addr,
1312 symbol_in, sym_value, r_addend,
1313 r_type, r_format, r_field, r_pcrel);
1316 /* Handle all the basic type 2 relocations. */
1317 case R_HPPA_GOTOFF_11:
1319 goto do_basic_type_2;
1320 case R_HPPA_GOTOFF_14:
1322 goto do_basic_type_2;
1323 case R_HPPA_GOTOFF_L21:
1325 goto do_basic_type_2;
1326 case R_HPPA_GOTOFF_R11:
1328 goto do_basic_type_2;
1329 case R_HPPA_GOTOFF_R14:
1331 goto do_basic_type_2;
1332 case R_HPPA_GOTOFF_LS21:
1334 goto do_basic_type_2;
1335 case R_HPPA_GOTOFF_RS11:
1337 goto do_basic_type_2;
1338 case R_HPPA_GOTOFF_RS14:
1340 goto do_basic_type_2;
1341 case R_HPPA_GOTOFF_LD21:
1343 goto do_basic_type_2;
1344 case R_HPPA_GOTOFF_RD11:
1346 goto do_basic_type_2;
1347 case R_HPPA_GOTOFF_RD14:
1349 goto do_basic_type_2;
1350 case R_HPPA_GOTOFF_LR21:
1352 goto do_basic_type_2;
1353 case R_HPPA_GOTOFF_RR14:
1357 sym_value -= GOT_value;
1358 insn = hppa_elf_relocate_insn (abfd, input_section, insn, addr,
1359 symbol_in, sym_value, r_addend,
1360 r_type, r_format, r_field, r_pcrel);
1363 /* Handle all the basic type 3 relocations. */
1364 case R_HPPA_ABS_CALL_11:
1366 goto do_basic_type_3;
1367 case R_HPPA_ABS_CALL_14:
1369 goto do_basic_type_3;
1370 case R_HPPA_ABS_CALL_17:
1372 goto do_basic_type_3;
1373 case R_HPPA_ABS_CALL_L21:
1375 goto do_basic_type_3;
1376 case R_HPPA_ABS_CALL_R11:
1378 goto do_basic_type_3;
1379 case R_HPPA_ABS_CALL_R14:
1381 goto do_basic_type_3;
1382 case R_HPPA_ABS_CALL_R17:
1384 goto do_basic_type_3;
1385 case R_HPPA_ABS_CALL_LS21:
1387 goto do_basic_type_3;
1388 case R_HPPA_ABS_CALL_RS11:
1390 goto do_basic_type_3;
1391 case R_HPPA_ABS_CALL_RS14:
1393 goto do_basic_type_3;
1394 case R_HPPA_ABS_CALL_RS17:
1396 goto do_basic_type_3;
1397 case R_HPPA_ABS_CALL_LD21:
1399 goto do_basic_type_3;
1400 case R_HPPA_ABS_CALL_RD11:
1402 goto do_basic_type_3;
1403 case R_HPPA_ABS_CALL_RD14:
1405 goto do_basic_type_3;
1406 case R_HPPA_ABS_CALL_RD17:
1408 goto do_basic_type_3;
1409 case R_HPPA_ABS_CALL_LR21:
1411 goto do_basic_type_3;
1412 case R_HPPA_ABS_CALL_RR14:
1414 goto do_basic_type_3;
1415 case R_HPPA_ABS_CALL_RR17:
1419 insn = hppa_elf_relocate_insn (abfd, input_section, insn, addr,
1420 symbol_in, sym_value, r_addend,
1421 r_type, r_format, r_field, r_pcrel);
1424 /* Handle all the basic type 4 relocations. */
1425 case R_HPPA_PCREL_CALL_11:
1427 goto do_basic_type_4;
1428 case R_HPPA_PCREL_CALL_14:
1430 goto do_basic_type_4;
1431 case R_HPPA_PCREL_CALL_17:
1433 goto do_basic_type_4;
1434 case R_HPPA_PCREL_CALL_L21:
1436 goto do_basic_type_4;
1437 case R_HPPA_PCREL_CALL_R11:
1439 goto do_basic_type_4;
1440 case R_HPPA_PCREL_CALL_R14:
1442 goto do_basic_type_4;
1443 case R_HPPA_PCREL_CALL_R17:
1445 goto do_basic_type_4;
1446 case R_HPPA_PCREL_CALL_LS21:
1448 goto do_basic_type_4;
1449 case R_HPPA_PCREL_CALL_RS11:
1451 goto do_basic_type_4;
1452 case R_HPPA_PCREL_CALL_RS14:
1454 goto do_basic_type_4;
1455 case R_HPPA_PCREL_CALL_RS17:
1457 goto do_basic_type_4;
1458 case R_HPPA_PCREL_CALL_LD21:
1460 goto do_basic_type_4;
1461 case R_HPPA_PCREL_CALL_RD11:
1463 goto do_basic_type_4;
1464 case R_HPPA_PCREL_CALL_RD14:
1466 goto do_basic_type_4;
1467 case R_HPPA_PCREL_CALL_RD17:
1469 goto do_basic_type_4;
1470 case R_HPPA_PCREL_CALL_LR21:
1472 goto do_basic_type_4;
1473 case R_HPPA_PCREL_CALL_RR14:
1475 goto do_basic_type_4;
1476 case R_HPPA_PCREL_CALL_RR17:
1480 insn = hppa_elf_relocate_insn (abfd, input_section, insn, addr,
1481 symbol_in, sym_value, r_addend,
1482 r_type, r_format, r_field, r_pcrel);
1485 /* Handle all the basic type 5 relocations. */
1486 case R_HPPA_PLABEL_32:
1487 case R_HPPA_PLABEL_11:
1488 case R_HPPA_PLABEL_14:
1490 goto do_basic_type_5;
1491 case R_HPPA_PLABEL_L21:
1493 goto do_basic_type_5;
1494 case R_HPPA_PLABEL_R11:
1495 case R_HPPA_PLABEL_R14:
1498 insn = hppa_elf_relocate_insn (abfd, input_section, insn, addr,
1499 symbol_in, sym_value, r_addend,
1500 r_type, r_format, r_field, r_pcrel);
1503 /* Handle all basic type 6 relocations. */
1504 case R_HPPA_UNWIND_ENTRY:
1505 case R_HPPA_UNWIND_ENTRIES:
1506 hppa_elf_relocate_unwind_table (abfd, input_section, data, addr,
1507 symbol_in, sym_value, r_addend,
1508 r_type, r_format, r_field, r_pcrel);
1509 return bfd_reloc_ok;
1511 /* Handle the stack operations and similar braindamage. */
1512 case R_HPPA_PUSH_CONST:
1513 case R_HPPA_PUSH_PC:
1514 case R_HPPA_PUSH_SYM:
1515 case R_HPPA_PUSH_GOTOFF:
1516 case R_HPPA_PUSH_ABS_CALL:
1517 case R_HPPA_PUSH_PCREL_CALL:
1518 case R_HPPA_PUSH_PLABEL:
1531 case R_HPPA_ARITH_RSHIFT:
1532 case R_HPPA_LOGIC_RSHIFT:
1536 case R_HPPA_EXPR_LS:
1537 case R_HPPA_EXPR_RS:
1538 case R_HPPA_EXPR_LD:
1539 case R_HPPA_EXPR_RD:
1540 case R_HPPA_EXPR_LR:
1541 case R_HPPA_EXPR_RR:
1542 case R_HPPA_EXPR_32:
1543 case R_HPPA_EXPR_21:
1544 case R_HPPA_EXPR_11:
1545 case R_HPPA_EXPR_14:
1546 case R_HPPA_EXPR_17:
1547 case R_HPPA_EXPR_12:
1548 fprintf (stderr, "Relocation problem: ");
1549 fprintf (stderr, "Unimplemented reloc type %d, in module %s\n",
1550 r_type, abfd->filename);
1551 return bfd_reloc_notsupported;
1553 /* This is a linker internal relocation. */
1554 case R_HPPA_STUB_CALL_17:
1555 /* This relocation is for a branch to a long branch stub.
1556 Change instruction to a BLE,N. It may also be necessary
1557 to change interchange the branch and its delay slot.
1558 The original instruction stream is
1560 bl <foo>,r ; call foo using register r as
1561 ; the return pointer
1562 XXX ; delay slot instruction
1564 The new instruction stream will be:
1566 XXX ; delay slot instruction
1567 ble <foo_stub> ; call the long call stub for foo
1568 ; using r31 as the return pointer
1570 This braindamage is necessary because the compiler may put
1571 an instruction which uses %r31 in the delay slot of the original
1572 call. By changing the call instruction from a "bl" to a "ble"
1573 %r31 gets clobbered before the delay slot executes.
1575 We do not interchange the branch and delay slot if the delay
1576 slot was already nullified, or if the instruction in the delay
1577 slot modifies the return pointer to avoid an unconditional
1578 jump after the call returns (GCC optimization). */
1582 insn = BLE_N_XXX_0_0;
1583 bfd_put_32 (abfd, insn, hit_data);
1584 r_type = R_HPPA_ABS_CALL_17;
1586 insn = hppa_elf_relocate_insn (abfd, input_section, insn,
1587 addr, symbol_in, sym_value,
1588 r_addend, r_type, r_format,
1593 unsigned long old_delay_slot_insn = bfd_get_32 (abfd, hit_data + 4);
1594 unsigned rtn_reg = (insn & 0x03e00000) >> 21;
1596 if (get_opcode (old_delay_slot_insn) == LDO)
1598 unsigned ldo_src_reg = (old_delay_slot_insn & 0x03e00000) >> 21;
1599 unsigned ldo_target_reg = (old_delay_slot_insn & 0x001f0000) >> 16;
1601 /* If the target of the LDO is the same as the return
1602 register then there is no reordering. We can leave the
1603 instuction as a non-nullified BLE in this case. */
1604 if (ldo_target_reg == rtn_reg)
1606 unsigned long new_delay_slot_insn = old_delay_slot_insn;
1608 BFD_ASSERT(ldo_src_reg == ldo_target_reg);
1609 new_delay_slot_insn &= 0xfc00ffff;
1610 new_delay_slot_insn |= ((31 << 21) | (31 << 16));
1611 bfd_put_32 (abfd, new_delay_slot_insn, hit_data + 4);
1613 r_type = R_HPPA_ABS_CALL_17;
1615 insn = hppa_elf_relocate_insn (abfd, input_section, insn,
1616 addr, symbol_in, sym_value,
1617 r_addend, r_type, r_format,
1619 bfd_put_32 (abfd, insn, hit_data);
1620 return bfd_reloc_ok;
1622 else if (rtn_reg == 31)
1624 /* The return register is r31, so this is a millicode
1625 call. Do not perform any instruction reordering. */
1627 r_type = R_HPPA_ABS_CALL_17;
1629 insn = hppa_elf_relocate_insn (abfd, input_section, insn,
1630 addr, symbol_in, sym_value,
1631 r_addend, r_type, r_format,
1633 bfd_put_32 (abfd, insn, hit_data);
1634 return bfd_reloc_ok;
1638 /* Check to see if the delay slot instruction has a
1639 relocation. If so, we need to change the address
1640 field of it, because the instruction it relocates
1641 is going to be moved. */
1642 arelent * next_reloc_entry = reloc_entry+1;
1644 if (next_reloc_entry->address == reloc_entry->address + 4)
1645 next_reloc_entry->address -= 4;
1647 insn = old_delay_slot_insn;
1648 bfd_put_32 (abfd, insn, hit_data);
1649 insn = BLE_N_XXX_0_0;
1650 bfd_put_32 (abfd, insn, hit_data + 4);
1651 r_type = R_HPPA_ABS_CALL_17;
1653 insn = hppa_elf_relocate_insn (abfd, input_section, insn,
1654 addr + 4, symbol_in,
1655 sym_value, r_addend, r_type,
1656 r_format, r_field, r_pcrel);
1657 bfd_put_32 (abfd, insn, hit_data + 4);
1658 return bfd_reloc_ok;
1661 else if (rtn_reg == 31)
1663 /* The return register is r31, so this is a millicode call.
1664 Perform no instruction reordering in this case. */
1666 r_type = R_HPPA_ABS_CALL_17;
1668 insn = hppa_elf_relocate_insn (abfd, input_section, insn,
1669 addr, symbol_in, sym_value,
1670 r_addend, r_type, r_format,
1672 bfd_put_32 (abfd, insn, hit_data);
1673 return bfd_reloc_ok;
1677 /* Check to see if the delay slot instruction has a
1678 relocation. If so, we need to change its address
1679 field because the instruction it relocates is going
1681 arelent * next_reloc_entry = reloc_entry+1;
1683 if (next_reloc_entry->address == reloc_entry->address + 4)
1684 next_reloc_entry->address -= 4;
1686 insn = old_delay_slot_insn;
1687 bfd_put_32 (abfd, insn, hit_data);
1688 insn = BLE_N_XXX_0_0;
1689 bfd_put_32 (abfd, insn, hit_data + 4);
1690 r_type = R_HPPA_ABS_CALL_17;
1692 insn = hppa_elf_relocate_insn (abfd, input_section, insn,
1693 addr + 4, symbol_in, sym_value,
1694 r_addend, r_type, r_format,
1696 bfd_put_32 (abfd, insn, hit_data + 4);
1697 return bfd_reloc_ok;
1703 *error_message = (char *) "Unrecognized reloc";
1704 return bfd_reloc_dangerous;
1707 /* Update the instruction word. */
1708 bfd_put_32 (abfd, insn, hit_data);
1709 return (bfd_reloc_ok);
1712 static const reloc_howto_type *
1713 elf_hppa_reloc_type_lookup (arch, code)
1714 bfd_arch_info_type *arch;
1715 bfd_reloc_code_real_type code;
1717 if ((int) code < (int) R_HPPA_UNIMPLEMENTED)
1719 BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code);
1720 return &elf_hppa_howto_table[(int) code];
1723 return (reloc_howto_type *) 0;
1726 #define bfd_elf32_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
1730 elf_hppa_tc_symbol (abfd, symbolP, sym_idx)
1732 elf_symbol_type *symbolP;
1735 symext_chainS *symextP;
1736 unsigned int arg_reloc;
1738 /* Only functions can have argument relocations. */
1739 if (!(symbolP->symbol.flags & BSF_FUNCTION))
1742 arg_reloc = symbolP->tc_data.hppa_arg_reloc;
1744 /* If there are no argument relocation bits, then no relocation is
1745 necessary. Do not add this to the symextn section. */
1749 symextP = (symext_chainS *) bfd_alloc (abfd, sizeof (symext_chainS) * 2);
1751 symextP[0].entry = ELF32_HPPA_SX_WORD (HPPA_SXT_SYMNDX, sym_idx);
1752 symextP[0].next = &symextP[1];
1754 symextP[1].entry = ELF32_HPPA_SX_WORD (HPPA_SXT_ARG_RELOC, arg_reloc);
1755 symextP[1].next = NULL;
1757 if (symext_rootP == NULL)
1759 symext_rootP = &symextP[0];
1760 symext_lastP = &symextP[1];
1764 symext_lastP->next = &symextP[0];
1765 symext_lastP = &symextP[1];
1769 /* Accessor function for the list of symbol extension records. */
1770 symext_chainS *elf32_hppa_get_symextn_chain()
1772 return symext_rootP;
1775 static symext_entryS *symextn_contents;
1776 static unsigned int symextn_contents_real_size;
1779 elf_hppa_tc_make_sections (abfd, ignored)
1783 symext_chainS *symextP;
1787 void hppa_elf_stub_finish (); /* forward declaration */
1788 asection *symextn_sec;
1790 hppa_elf_stub_finish (abfd);
1792 if (symext_rootP == NULL)
1795 for (n = 0, symextP = symext_rootP; symextP; symextP = symextP->next, ++n)
1798 size = sizeof (symext_entryS) * n;
1799 symextn_sec = bfd_get_section_by_name (abfd, SYMEXTN_SECTION_NAME);
1800 if (symextn_sec == (asection *) 0)
1802 symextn_sec = bfd_make_section (abfd, SYMEXTN_SECTION_NAME);
1803 bfd_set_section_flags (abfd,
1805 SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC | SEC_CODE | SEC_READONLY);
1806 symextn_sec->output_section = symextn_sec;
1807 symextn_sec->output_offset = 0;
1808 bfd_set_section_alignment (abfd, symextn_sec, 2);
1810 symextn_contents = (symext_entryS *) bfd_alloc (abfd, size);
1812 for (i = 0, symextP = symext_rootP; symextP; symextP = symextP->next, ++i)
1813 symextn_contents[i] = symextP->entry;
1814 symextn_contents_real_size = size;
1815 bfd_set_section_size (abfd, symextn_sec, symextn_contents_real_size);
1820 /* Support for HP PA-RISC stub generation.
1824 Center for Software Science
1825 Department of Computer Science
1831 HP-PA calling conventions state:
1833 1. an argument relocation stub is required whenever the callee and
1834 caller argument relocation bits do not match exactly. The exception
1835 to this rule is if either the caller or callee argument relocation
1836 bit are 00 (do not relocate).
1838 2. The linker can optionally add a symbol record for the stub so that
1839 the stub can be reused. The symbol record will be the same as the
1840 original export symbol record, except that the relocation bits will
1841 reflect the input of the stub, the type would be STUB and the symbol
1842 value will be the location of the relocation stub.
1846 Stubs can be inserted *before* the section of the caller. The stubs
1847 can be treated as calls to code that manipulates the arguments.
1854 HPPA_STUB_ARG_RELOC,
1855 HPPA_STUB_LONG_BRANCH
1859 elf32_hppa_get_sym_extn (abfd, sym, type)
1864 /* This function finds the symbol extension record of the */
1865 /* specified type for the specified symbol. It returns the */
1866 /* value of the symbol extension record. */
1867 symext_entryS retval;
1872 retval = (symext_entryS) 0;
1874 case HPPA_SXT_SYMNDX:
1875 retval = (symext_entryS) 0; /* XXX: need to fix this */
1877 case HPPA_SXT_ARG_RELOC:
1879 elf_symbol_type *esymP = (elf_symbol_type *) sym;
1881 retval = (symext_entryS) esymP->tc_data.hppa_arg_reloc;
1884 /* This should never happen. */
1891 typedef struct elf32_hppa_stub_name_list_struct
1893 /* name of this stub */
1895 /* stub description for this stub */
1896 struct elf32_hppa_stub_description_struct *stub_desc;
1897 /* pointer into stub contents */
1899 /* size of this stub */
1901 /* next stub name entry */
1902 struct elf32_hppa_stub_name_list_struct *next;
1903 } elf32_hppa_stub_name_list;
1905 typedef struct elf32_hppa_stub_description_struct
1907 struct elf32_hppa_stub_description_struct *next;
1908 bfd *this_bfd; /* bfd to which this stub applies */
1909 asection *stub_sec; /* stub section for this bfd */
1910 unsigned relocs_allocated_cnt; /* count of relocations for this stub section */
1912 unsigned allocated_size;
1913 int *stub_secp; /* pointer to the next available location in the buffer */
1914 char *stub_contents; /* contents of the stubs for this bfd */
1915 elf32_hppa_stub_name_list *stub_listP;
1916 struct bfd_link_info *link_info;
1918 elf32_hppa_stub_description;
1920 static elf32_hppa_stub_description *elf_hppa_stub_rootP;
1922 /* Locate the stub section information for the given bfd. */
1923 static elf32_hppa_stub_description *
1924 find_stubs (abfd, stub_sec)
1928 elf32_hppa_stub_description *stubP;
1930 for (stubP = elf_hppa_stub_rootP; stubP; stubP = stubP->next)
1932 if (stubP->this_bfd == abfd
1933 && stubP->stub_sec == stub_sec)
1937 return (elf32_hppa_stub_description *) NULL;
1940 static elf32_hppa_stub_description *
1941 new_stub (abfd, stub_sec, link_info)
1944 struct bfd_link_info *link_info;
1946 elf32_hppa_stub_description *stub = find_stubs (abfd, stub_sec);
1951 stub = (elf32_hppa_stub_description *) bfd_zalloc (abfd, sizeof (elf32_hppa_stub_description));
1954 stub->this_bfd = abfd;
1955 stub->stub_sec = stub_sec;
1956 stub->real_size = 0;
1957 stub->allocated_size = 0;
1958 stub->stub_contents = NULL;
1959 stub->stub_secp = NULL;
1960 stub->link_info = link_info;
1962 stub->next = elf_hppa_stub_rootP;
1963 elf_hppa_stub_rootP = stub;
1967 bfd_error = no_memory;
1968 bfd_perror ("new_stub");
1974 /* Locate the stub by the given name. */
1975 static elf32_hppa_stub_name_list *
1976 find_stub_by_name (abfd, stub_sec, name)
1981 elf32_hppa_stub_description *stub = find_stubs (abfd, stub_sec);
1985 elf32_hppa_stub_name_list *name_listP;
1987 for (name_listP = stub->stub_listP; name_listP; name_listP = name_listP->next)
1989 if (!strcmp (name_listP->sym->name, name))
1997 /* Locate the stub by the given name. */
1998 static elf32_hppa_stub_name_list *
1999 add_stub_by_name(abfd, stub_sec, sym, link_info)
2003 struct bfd_link_info *link_info;
2005 elf32_hppa_stub_description *stub = find_stubs (abfd, stub_sec);
2006 elf32_hppa_stub_name_list *stub_entry;
2009 stub = new_stub(abfd, stub_sec, link_info);
2013 stub_entry = (elf32_hppa_stub_name_list *)
2014 bfd_zalloc (abfd, sizeof (elf32_hppa_stub_name_list));
2018 stub_entry->size = 0;
2019 stub_entry->sym = sym;
2020 stub_entry->stub_desc = stub;
2021 /* First byte of this stub is the pointer to
2022 the next available location in the stub buffer. */
2023 stub_entry->stub_secp = stub->stub_secp;
2024 if (stub->stub_listP)
2025 stub_entry->next = stub->stub_listP;
2027 stub_entry->next = NULL;
2028 stub->stub_listP = stub_entry;
2033 bfd_error = no_memory;
2034 bfd_perror("add_stub_by_name");
2038 return (elf32_hppa_stub_name_list *)NULL;
2042 #define RETURN_VALUE 1
2044 #define NO_ARG_RELOC 0
2051 #define ARG_RELOC_ERR 7
2063 /* FP register in arg0/arg1. This value can only appear in the arg0 location. */
2065 /* FP register in arg2/arg3. This value can only appear in the arg2 location. */
2068 #define AR_WARN(type,loc) \
2069 fprintf(stderr,"WARNING: Illegal argument relocation: %s for %s\n", \
2070 reloc_type_strings[type],reloc_loc_strings[loc])
2072 static CONST char *CONST reloc_type_strings[] =
2074 "NONE", "GR->FR", "GR0,GR1->FR1", "GR2,GR3->FR3", "FR->GR", "FR->GR0,GR1", "FR->GR2,GR3", "ERROR"
2077 static CONST char *CONST reloc_loc_strings[] =
2079 "ARG0", "ARG1", "ARG2", "ARG3", "RETVAL"
2082 static CONST char mismatches[6][6] =
2083 { /* CALLEE NONE CALLEE GR CALLEE FR CALLEE FU CALLEE DBL01 CALLEE DBL23 */
2085 {NO_ARG_RELOC, NO_ARG_RELOC, NO_ARG_RELOC, ARG_RELOC_ERR, NO_ARG_RELOC, NO_ARG_RELOC},
2087 {NO_ARG_RELOC, NO_ARG_RELOC, R_TO_FR, ARG_RELOC_ERR, R01_TO_FR, ARG_RELOC_ERR},
2089 {NO_ARG_RELOC, FR_TO_R, NO_ARG_RELOC, ARG_RELOC_ERR, ARG_RELOC_ERR},
2091 {ARG_RELOC_ERR, ARG_RELOC_ERR, ARG_RELOC_ERR, ARG_RELOC_ERR, ARG_RELOC_ERR, ARG_RELOC_ERR},
2093 {NO_ARG_RELOC, FR_TO_R01, NO_ARG_RELOC, ARG_RELOC_ERR, NO_ARG_RELOC, ARG_RELOC_ERR},
2095 {NO_ARG_RELOC, FR_TO_R23, NO_ARG_RELOC, ARG_RELOC_ERR, ARG_RELOC_ERR, NO_ARG_RELOC},
2098 static CONST char retval_mismatches[6][6] =
2099 { /* CALLEE NONE CALLEE GR CALLEE FR CALLEE FU CALLEE DBL01 CALLEE DBL23 */
2101 {NO_ARG_RELOC, NO_ARG_RELOC, NO_ARG_RELOC, ARG_RELOC_ERR, NO_ARG_RELOC, NO_ARG_RELOC},
2103 {NO_ARG_RELOC, NO_ARG_RELOC, FR_TO_R, ARG_RELOC_ERR, FR_TO_R01, ARG_RELOC_ERR},
2105 {NO_ARG_RELOC, R_TO_FR, NO_ARG_RELOC, ARG_RELOC_ERR, ARG_RELOC_ERR, ARG_RELOC_ERR},
2107 {ARG_RELOC_ERR, ARG_RELOC_ERR, ARG_RELOC_ERR, ARG_RELOC_ERR, ARG_RELOC_ERR, ARG_RELOC_ERR},
2109 {NO_ARG_RELOC, R01_TO_FR, NO_ARG_RELOC, ARG_RELOC_ERR, NO_ARG_RELOC, ARG_RELOC_ERR},
2111 {NO_ARG_RELOC, R23_TO_FR, NO_ARG_RELOC, ARG_RELOC_ERR, ARG_RELOC_ERR, NO_ARG_RELOC},
2115 type_of_mismatch (caller_bits, callee_bits, type)
2123 return mismatches[caller_bits][callee_bits];
2125 return retval_mismatches[caller_bits][callee_bits];
2131 #define EXTRACT_ARBITS(ar,which) ((ar) >> (8-(which*2))) & 3
2133 #define NEW_INSTRUCTION(entry,insn) \
2135 *((entry)->stub_desc->stub_secp)++ = (insn); \
2136 (entry)->stub_desc->real_size += sizeof(int); \
2137 (entry)->size += sizeof(int); \
2138 bfd_set_section_size((entry)->stub_desc->this_bfd, \
2139 (entry)->stub_desc->stub_sec, \
2140 (entry)->stub_desc->real_size); \
2143 #define CURRENT_STUB_OFFSET(entry) \
2144 ((int)(entry)->stub_desc->stub_secp \
2145 - (int)(entry)->stub_desc->stub_contents - 4)
2147 static boolean stubs_finished = false;
2150 hppa_elf_stub_finish (output_bfd)
2153 elf32_hppa_stub_description *stub_list = elf_hppa_stub_rootP;
2154 /* All the stubs have been built. Finish up building */
2155 /* stub section. Apply relocations to the section. */
2157 if ( stubs_finished )
2160 for (; stub_list; stub_list = stub_list->next)
2162 if (stub_list->real_size)
2164 bfd *stub_bfd = stub_list->this_bfd;
2165 asection *stub_sec = bfd_get_section_by_name (stub_bfd, ".hppa_linker_stubs");
2166 bfd_size_type reloc_size;
2167 arelent **reloc_vector;
2169 BFD_ASSERT (stub_sec == stub_list->stub_sec);
2170 reloc_size = bfd_get_reloc_upper_bound (stub_bfd, stub_sec);
2171 reloc_vector = (arelent **) alloca (reloc_size);
2173 BFD_ASSERT (stub_sec);
2175 /* We are not relaxing the section, so just copy the size info */
2176 stub_sec->_cooked_size = stub_sec->_raw_size;
2177 stub_sec->reloc_done = true;
2180 if (bfd_canonicalize_reloc (stub_bfd,
2183 output_bfd->outsymbols))
2186 for (parent = reloc_vector; *parent != (arelent *) NULL;
2189 char *err = (char *) NULL;
2190 bfd_reloc_status_type r =
2191 bfd_perform_relocation (stub_bfd,
2193 stub_list->stub_contents,
2194 stub_sec, (bfd *) NULL, &err);
2197 if (r != bfd_reloc_ok)
2199 struct bfd_link_info *link_info = stub_list->link_info;
2203 case bfd_reloc_undefined:
2204 if (! ((*link_info->callbacks->undefined_symbol)
2206 bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
2207 stub_bfd, stub_sec, (*parent)->address)))
2210 case bfd_reloc_dangerous:
2211 if (! ((*link_info->callbacks->reloc_dangerous)
2212 (link_info, err, stub_bfd, stub_sec,
2213 (*parent)->address)))
2216 case bfd_reloc_overflow:
2218 if (! ((*link_info->callbacks->reloc_overflow)
2220 bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
2221 (*parent)->howto->name,
2224 (*parent)->address)))
2228 case bfd_reloc_outofrange:
2237 bfd_set_section_contents (output_bfd,
2239 stub_list->stub_contents,
2241 stub_list->real_size);
2243 free (reloc_vector);
2246 stubs_finished = true;
2250 hppa_elf_stub_branch_reloc (stub_desc, /* the bfd */
2251 output_bfd, /* the output bfd */
2252 target_sym, /* the target symbol */
2253 offset) /* the offset within the stub buffer (pre-calculated) */
2254 elf32_hppa_stub_description *stub_desc;
2256 asymbol *target_sym;
2259 /* Allocate a new relocation entry. */
2263 if (stub_desc->relocs_allocated_cnt == stub_desc->stub_sec->reloc_count)
2265 if (stub_desc->stub_sec->relocation == NULL)
2267 stub_desc->relocs_allocated_cnt = STUB_RELOC_INCR;
2268 size = sizeof (arelent) * stub_desc->relocs_allocated_cnt;
2269 stub_desc->stub_sec->relocation = (arelent *) bfd_zmalloc (size);
2273 stub_desc->relocs_allocated_cnt += STUB_RELOC_INCR;
2274 size = sizeof (arelent) * stub_desc->relocs_allocated_cnt;
2275 stub_desc->stub_sec->relocation = (arelent *) realloc (stub_desc->stub_sec->relocation,
2280 /* Fill in the details. */
2281 relent.address = offset;
2283 relent.sym_ptr_ptr = (asymbol **) bfd_zalloc (stub_desc->this_bfd, sizeof (asymbol *));
2284 BFD_ASSERT (relent.sym_ptr_ptr);
2286 relent.sym_ptr_ptr[0] = target_sym;
2287 relent.howto = bfd_reloc_type_lookup (stub_desc->this_bfd, R_HPPA_PCREL_CALL_17);
2289 /* Save it in the array of relocations for the stub section. */
2291 memcpy (&stub_desc->stub_sec->relocation[stub_desc->stub_sec->reloc_count++],
2297 hppa_elf_stub_reloc (stub_desc, /* the bfd */
2298 output_bfd, /* the output bfd */
2299 target_sym, /* the target symbol */
2300 offset, /* the offset within the stub buffer (pre-calculated) */
2302 elf32_hppa_stub_description *stub_desc;
2304 asymbol *target_sym;
2306 elf32_hppa_reloc_type type;
2308 /* Allocate a new relocation entry. */
2311 Elf_Internal_Shdr *rela_hdr;
2313 if (stub_desc->relocs_allocated_cnt == stub_desc->stub_sec->reloc_count)
2315 if (stub_desc->stub_sec->relocation == NULL)
2317 stub_desc->relocs_allocated_cnt = STUB_RELOC_INCR;
2318 size = sizeof (arelent) * stub_desc->relocs_allocated_cnt;
2319 stub_desc->stub_sec->relocation = (arelent *) bfd_zmalloc (size);
2323 stub_desc->relocs_allocated_cnt += STUB_RELOC_INCR;
2324 size = sizeof (arelent) * stub_desc->relocs_allocated_cnt;
2325 stub_desc->stub_sec->relocation = (arelent *) realloc (stub_desc->stub_sec->relocation,
2330 rela_hdr = &elf_section_data(stub_desc->stub_sec)->rel_hdr;
2331 rela_hdr->sh_size += sizeof(Elf32_External_Rela);
2333 /* Fill in the details. */
2334 relent.address = offset;
2336 relent.sym_ptr_ptr = (asymbol **) bfd_zalloc (stub_desc->this_bfd, sizeof (asymbol *));
2337 BFD_ASSERT (relent.sym_ptr_ptr);
2339 relent.sym_ptr_ptr[0] = target_sym;
2340 relent.howto = bfd_reloc_type_lookup (stub_desc->this_bfd, type);
2342 /* Save it in the array of relocations for the stub section. */
2344 memcpy (&stub_desc->stub_sec->relocation[stub_desc->stub_sec->reloc_count++],
2350 hppa_elf_build_arg_reloc_stub (abfd, output_bfd, link_info, reloc_entry,
2351 stub_types, rtn_adjust, data)
2354 struct bfd_link_info *link_info;
2355 arelent *reloc_entry;
2360 asection *stub_sec = bfd_get_section_by_name (abfd, ".hppa_linker_stubs");
2361 elf32_hppa_stub_description *stub_desc = find_stubs (abfd, stub_sec);
2362 asymbol *stub_sym = NULL;
2363 asymbol *target_sym = reloc_entry->sym_ptr_ptr[0];
2364 asection *output_text_section = bfd_get_section_by_name (output_bfd, ".text");
2366 char stub_sym_name[128];
2367 elf32_hppa_stub_name_list *stub_entry;
2368 unsigned insn = data[0];
2370 /* Perform some additional checks on whether we should really do the
2371 return adjustment. For example, if the instruction is nullified
2372 or if the delay slot contains an instruction that modifies the return
2373 pointer, then the branch instructions should not be rearranged
2374 (rtn_adjust is false). */
2375 if (insn & 2 || insn == 0)
2379 unsigned delay_insn = data[1];
2381 if (get_opcode (delay_insn) == LDO
2382 && (((insn & 0x03e00000) >> 21) == ((delay_insn & 0x001f0000) >> 16)))
2386 /* See if the proper stub entry has already been made. */
2389 BFD_ASSERT (stub_desc == NULL);
2390 stub_sec = bfd_make_section (abfd, ".hppa_linker_stubs");
2391 bfd_set_section_flags (abfd,
2393 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD
2394 | SEC_RELOC | SEC_CODE | SEC_READONLY);
2395 stub_sec->output_section = output_text_section->output_section;
2396 stub_sec->output_offset = 0;
2397 bfd_set_section_alignment (abfd, stub_sec, 2);
2398 stub_desc = new_stub (abfd, stub_sec, link_info);
2401 /* Make the stub if we did not find one already. */
2403 stub_desc = new_stub (abfd, stub_sec, link_info);
2405 /* Allocate space to write the stub.
2406 FIXME. Why using realloc?!? */
2407 if (!stub_desc->stub_contents)
2409 stub_desc->allocated_size = STUB_BUFFER_INCR;
2410 stub_desc->stub_contents = (char *) bfd_xmalloc (STUB_BUFFER_INCR);
2412 else if ((stub_desc->allocated_size - stub_desc->real_size) < STUB_MAX_SIZE)
2414 stub_desc->allocated_size = stub_desc->allocated_size + STUB_BUFFER_INCR;
2415 stub_desc->stub_contents = (char *) realloc (stub_desc->stub_contents,
2416 stub_desc->allocated_size);
2419 stub_desc->stub_secp
2420 = (int *) (stub_desc->stub_contents + stub_desc->real_size);
2422 sprintf (stub_sym_name,
2423 "_stub_%s_%02d_%02d_%02d_%02d_%02d_%s",
2424 reloc_entry->sym_ptr_ptr[0]->name,
2425 stub_types[0], stub_types[1], stub_types[2],
2426 stub_types[3], stub_types[4],
2427 rtn_adjust ? "RA" : "");
2428 stub_entry = find_stub_by_name (abfd, stub_sec, stub_sym_name);
2432 stub_sym = stub_entry->sym;
2433 /* Redirect the original relocation from the old symbol (a function)
2434 to the stub (the stub calls the function). Should we need to
2435 change the relocation type? */
2436 reloc_entry->sym_ptr_ptr = (asymbol **) bfd_zalloc (stub_desc->this_bfd,
2437 sizeof (asymbol *));
2438 reloc_entry->sym_ptr_ptr[0] = stub_sym;
2439 if (reloc_entry->howto->type != R_HPPA_PLABEL_32
2440 && (get_opcode(insn) == BLE
2441 || get_opcode (insn) == BE
2442 || get_opcode (insn) == BL))
2443 reloc_entry->howto = bfd_reloc_type_lookup (abfd, R_HPPA_STUB_CALL_17);
2447 /* Create a new symbol to point to this stub. */
2448 stub_sym = bfd_make_empty_symbol (abfd);
2449 stub_sym->name = bfd_zalloc (abfd, strlen (stub_sym_name) + 1);
2450 strcpy ((char *) stub_sym->name, stub_sym_name);
2452 = (int) stub_desc->stub_secp - (int) stub_desc->stub_contents;
2453 stub_sym->section = stub_sec;
2454 stub_sym->flags = BSF_LOCAL | BSF_FUNCTION;
2455 stub_entry = add_stub_by_name (abfd, stub_sec, stub_sym, link_info);
2457 /* Redirect the original relocation from the old symbol (a function)
2458 to the stub (the stub calls the function). Change the type of
2459 relocation to be the internal use only stub R_HPPA_STUB_CALL_17. */
2460 reloc_entry->sym_ptr_ptr = (asymbol **) bfd_zalloc (stub_desc->this_bfd,
2461 sizeof (asymbol *));
2462 reloc_entry->sym_ptr_ptr[0] = stub_sym;
2463 if (reloc_entry->howto->type != R_HPPA_PLABEL_32
2464 && (get_opcode (insn) == BLE
2465 || get_opcode (insn) == BE
2466 || get_opcode (insn) == BL))
2467 reloc_entry->howto = bfd_reloc_type_lookup (abfd, R_HPPA_STUB_CALL_17);
2469 /* Generate common code for all stubs. */
2471 NEW_INSTRUCTION (stub_entry, LDSID_31_1);
2472 NEW_INSTRUCTION (stub_entry, MTSP_1_SR0);
2473 NEW_INSTRUCTION (stub_entry, ADDI_8_SP);
2475 /* Generate code to move the arguments around. */
2476 for (i = ARG0; i < ARG3; i++)
2478 if (stub_types[i] != NO_ARG_RELOC)
2480 switch (stub_types[i])
2486 NEW_INSTRUCTION (stub_entry, STWS_ARG0_M8SP);
2487 NEW_INSTRUCTION (stub_entry, FLDWS_M8SP_FARG0);
2490 NEW_INSTRUCTION (stub_entry, STWS_ARG1_M8SP);
2491 NEW_INSTRUCTION (stub_entry, FLDWS_M8SP_FARG1);
2494 NEW_INSTRUCTION (stub_entry, STWS_ARG2_M8SP);
2495 NEW_INSTRUCTION (stub_entry, FLDWS_M8SP_FARG2);
2498 NEW_INSTRUCTION (stub_entry, STWS_ARG3_M8SP);
2499 NEW_INSTRUCTION (stub_entry, FLDWS_M8SP_FARG3);
2508 NEW_INSTRUCTION (stub_entry, STWS_ARG0_M4SP);
2509 NEW_INSTRUCTION (stub_entry, STWS_ARG1_M8SP);
2510 NEW_INSTRUCTION (stub_entry, FLDDS_M8SP_FARG1);
2513 AR_WARN (stub_types[i],i);
2522 NEW_INSTRUCTION (stub_entry, STWS_ARG2_M4SP);
2523 NEW_INSTRUCTION (stub_entry, STWS_ARG3_M8SP);
2524 NEW_INSTRUCTION (stub_entry, FLDDS_M8SP_FARG3);
2527 AR_WARN (stub_types[i],i);
2536 NEW_INSTRUCTION (stub_entry, FSTWS_FARG0_M8SP);
2537 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_ARG0);
2540 NEW_INSTRUCTION (stub_entry, FSTWS_FARG1_M8SP);
2541 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_ARG1);
2544 NEW_INSTRUCTION (stub_entry, FSTWS_FARG2_M8SP);
2545 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_ARG2);
2548 NEW_INSTRUCTION (stub_entry, FSTWS_FARG3_M8SP);
2549 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_ARG3);
2558 NEW_INSTRUCTION (stub_entry, FSTDS_FARG1_M8SP);
2559 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_ARG0);
2560 NEW_INSTRUCTION (stub_entry, LDWS_M8SP_ARG1);
2563 AR_WARN (stub_types[i],i);
2572 NEW_INSTRUCTION (stub_entry, FSTDS_FARG3_M8SP);
2573 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_ARG2);
2574 NEW_INSTRUCTION (stub_entry, LDWS_M8SP_ARG3);
2577 AR_WARN (stub_types[i],i);
2586 NEW_INSTRUCTION (stub_entry, ADDI_M8_SP_SP);
2588 /* Adjust the return address if necessary. */
2591 NEW_INSTRUCTION (stub_entry, ADDI_M4_31_RP);
2594 NEW_INSTRUCTION (stub_entry, COPY_31_2);
2596 /* Save the return address. */
2597 NEW_INSTRUCTION (stub_entry, STW_RP_M8SP);
2599 /* Long branch to the target function. */
2600 NEW_INSTRUCTION (stub_entry, LDIL_XXX_31);
2601 hppa_elf_stub_reloc (stub_entry->stub_desc,
2604 CURRENT_STUB_OFFSET (stub_entry),
2606 NEW_INSTRUCTION (stub_entry, BLE_XXX_0_31);
2607 hppa_elf_stub_reloc (stub_entry->stub_desc,
2610 CURRENT_STUB_OFFSET (stub_entry),
2611 R_HPPA_ABS_CALL_R17);
2612 NEW_INSTRUCTION (stub_entry, COPY_31_2);
2615 /* Restore the return address. */
2616 NEW_INSTRUCTION (stub_entry, LDW_M8SP_RP);
2618 /* Generate the code to move the return value around. */
2620 if (stub_types[i] != NO_ARG_RELOC)
2622 switch (stub_types[i])
2625 NEW_INSTRUCTION (stub_entry, STWS_RET0_M8SP);
2626 NEW_INSTRUCTION (stub_entry, FLDWS_M8SP_FRET0);
2630 NEW_INSTRUCTION (stub_entry, FSTWS_FRET0_M8SP);
2631 NEW_INSTRUCTION (stub_entry, LDWS_M4SP_RET0);
2635 NEW_INSTRUCTION (stub_entry, BV_N_0_RP);
2642 hppa_elf_arg_reloc_needed_p (abfd, reloc_entry, stub_types, caller_ar)
2644 arelent *reloc_entry;
2646 symext_entryS caller_ar;
2648 /* If the symbol is still undefined, there is */
2649 /* no way to know if a stub is required. */
2651 if (reloc_entry->sym_ptr_ptr[0] && reloc_entry->sym_ptr_ptr[0]->section != &bfd_und_section)
2653 symext_entryS callee_ar = elf32_hppa_get_sym_extn (abfd,
2654 reloc_entry->sym_ptr_ptr[0],
2655 HPPA_SXT_ARG_RELOC);
2657 /* Now, determine if a stub is */
2658 /* required. A stub is required if they the callee and caller */
2659 /* argument relocation bits are both nonzero and not equal. */
2661 if (caller_ar && callee_ar)
2663 /* Both are non-zero, we need to do further checking. */
2664 /* First, check if there is a return value relocation to be done */
2668 callee_loc[RETVAL] = EXTRACT_ARBITS (callee_ar, RETVAL);
2669 caller_loc[RETVAL] = EXTRACT_ARBITS (caller_ar, RETVAL);
2670 callee_loc[ARG0] = EXTRACT_ARBITS (callee_ar, ARG0);
2671 caller_loc[ARG0] = EXTRACT_ARBITS (caller_ar, ARG0);
2672 callee_loc[ARG1] = EXTRACT_ARBITS (callee_ar, ARG1);
2673 caller_loc[ARG1] = EXTRACT_ARBITS (caller_ar, ARG1);
2674 callee_loc[ARG2] = EXTRACT_ARBITS (callee_ar, ARG2);
2675 caller_loc[ARG2] = EXTRACT_ARBITS (caller_ar, ARG2);
2676 callee_loc[ARG3] = EXTRACT_ARBITS (callee_ar, ARG3);
2677 caller_loc[ARG3] = EXTRACT_ARBITS (caller_ar, ARG3);
2679 /* Check some special combinations. For */
2680 /* example, if FU appears in ARG1 or ARG3, we */
2681 /* can move it to ARG0 or ARG2, respectively. */
2683 if (caller_loc[ARG0] == AR_FU || caller_loc[ARG1] == AR_FU)
2685 caller_loc[ARG0] = AR_DBL01;
2686 caller_loc[ARG1] = AR_NO;
2688 if (caller_loc[ARG2] == AR_FU || caller_loc[ARG3] == AR_FU)
2690 caller_loc[ARG2] = AR_DBL23;
2691 caller_loc[ARG3] = AR_NO;
2693 if (callee_loc[ARG0] == AR_FU || callee_loc[ARG1] == AR_FU)
2695 callee_loc[ARG0] = AR_DBL01;
2696 callee_loc[ARG1] = AR_NO;
2698 if (callee_loc[ARG2] == AR_FU || callee_loc[ARG3] == AR_FU)
2700 callee_loc[ARG2] = AR_DBL23;
2701 callee_loc[ARG3] = AR_NO;
2704 stub_types[ARG0] = type_of_mismatch (caller_loc[ARG0], callee_loc[ARG0], ARGUMENTS);
2705 stub_types[ARG1] = type_of_mismatch (caller_loc[ARG1], callee_loc[ARG1], ARGUMENTS);
2706 stub_types[ARG2] = type_of_mismatch (caller_loc[ARG2], callee_loc[ARG2], ARGUMENTS);
2707 stub_types[ARG3] = type_of_mismatch (caller_loc[ARG3], callee_loc[ARG3], ARGUMENTS);
2708 stub_types[RETVAL] = type_of_mismatch (caller_loc[RETVAL], callee_loc[RETVAL], RETURN_VALUE);
2710 /* Steps involved in building stubs: */
2711 /* 1. Determine what argument registers need to relocated. This */
2712 /* step is already done here. */
2713 /* 2. Build the appropriate stub in the .hppa_linker_stubs section. */
2714 /* This section should never appear in an object file. It is */
2715 /* only used internally. The output_section of the */
2716 /* .hppa_linker_stubs section is the .text section of the */
2718 /* 3. Build a symbol that is used (internally only) as the entry */
2719 /* point of the stub. */
2720 /* 4. Change the instruction of the original branch into a branch to */
2721 /* the stub routine. */
2722 /* 5. Build a relocation entry for the instruction of the original */
2723 /* branch to be R_HPPA_PCREL_CALL to the stub routine. */
2735 fprintf (stderr, "Stub needed for %s @ %s+0x%x: callee/caller ar=0x%x/0x%x ",
2736 reloc_entry->sym_ptr_ptr[0]->name,
2737 abfd->filename, reloc_entry->address,
2738 callee_ar, caller_ar);
2739 for (i = ARG0; i < RETVAL; i++)
2741 if (stub_types[i] != NO_ARG_RELOC)
2743 fprintf (stderr, "%s%d: %s ",
2744 i == RETVAL ? "ret" : "arg",
2745 i == RETVAL ? 0 : i,
2746 reloc_type_strings[stub_types[i]]);
2749 fprintf (stderr, "\n");
2760 hppa_elf_build_long_branch_stub (abfd, output_bfd, link_info, reloc_entry,
2764 struct bfd_link_info *link_info;
2765 arelent *reloc_entry;
2769 asection *stub_sec = bfd_get_section_by_name (abfd, ".hppa_linker_stubs");
2770 elf32_hppa_stub_description *stub_desc = find_stubs (abfd, stub_sec);
2771 asymbol *stub_sym = NULL;
2772 asymbol *target_sym = reloc_entry->sym_ptr_ptr[0];
2773 asection *output_text_section = bfd_get_section_by_name (output_bfd, ".text");
2774 char stub_sym_name[128];
2776 int dyncall = false;
2777 elf32_hppa_stub_name_list *stub_entry;
2778 int rtn_adjust = true;
2782 /* Create the stub section if it does not already exist. */
2785 BFD_ASSERT (stub_desc == NULL);
2786 stub_sec = bfd_make_section (abfd, ".hppa_linker_stubs");
2787 bfd_set_section_flags (abfd,
2789 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD
2790 | SEC_RELOC | SEC_CODE | SEC_READONLY);
2791 stub_sec->output_section = output_text_section->output_section;
2792 stub_sec->output_offset = 0;
2794 /* Set up the ELF section header for this new section. This
2795 is basically the same processing as elf_make_sections().
2796 elf_make_sections is static and therefore not accessable
2799 Elf_Internal_Shdr *this_hdr;
2800 this_hdr = &elf_section_data (stub_sec)->this_hdr;
2802 /* Set the sizes of this section. The contents have already
2804 this_hdr->sh_addr = stub_sec->vma;
2805 this_hdr->sh_size = stub_sec->_raw_size;
2807 /* Set appropriate flags for sections with relocations. */
2808 if (stub_sec->flags & SEC_RELOC)
2810 Elf_Internal_Shdr *rela_hdr;
2811 int use_rela_p = get_elf_backend_data (abfd)->use_rela_p;
2813 rela_hdr = &elf_section_data (stub_sec)->rel_hdr;
2817 rela_hdr->sh_type = SHT_RELA;
2818 rela_hdr->sh_entsize = sizeof (Elf32_External_Rela);
2822 rela_hdr->sh_type = SHT_REL;
2823 rela_hdr->sh_entsize = sizeof (Elf32_External_Rel);
2825 rela_hdr->sh_flags = 0;
2826 rela_hdr->sh_addr = 0;
2827 rela_hdr->sh_offset = 0;
2828 rela_hdr->sh_addralign = 0;
2832 if (stub_sec->flags & SEC_ALLOC)
2834 this_hdr->sh_flags |= SHF_ALLOC;
2835 /* FIXME. If SEC_LOAD is true should we do something with
2839 if (!(stub_sec->flags & SEC_READONLY))
2840 this_hdr->sh_flags |= SHF_WRITE;
2842 if (stub_sec->flags & SEC_CODE)
2843 this_hdr->sh_flags |= SHF_EXECINSTR;
2846 bfd_set_section_alignment (abfd, stub_sec, 2);
2847 stub_desc = new_stub (abfd, stub_sec, link_info);
2851 stub_desc = new_stub (abfd, stub_sec, link_info);
2853 /* Allocate memory to contain the stub. FIXME. Why isn't this using
2854 the BFD memory allocation routines? */
2855 if (!stub_desc->stub_contents)
2857 stub_desc->allocated_size = STUB_BUFFER_INCR;
2858 stub_desc->stub_contents = (char *) malloc (STUB_BUFFER_INCR);
2860 else if ((stub_desc->allocated_size - stub_desc->real_size) < STUB_MAX_SIZE)
2862 stub_desc->allocated_size = stub_desc->allocated_size + STUB_BUFFER_INCR;
2863 stub_desc->stub_contents = (char *) realloc (stub_desc->stub_contents,
2864 stub_desc->allocated_size);
2867 stub_desc->stub_secp
2868 = (int *) (stub_desc->stub_contents + stub_desc->real_size);
2870 /* Is this a millicode call? If so, the return address
2871 comes in on r31 rather than r2 (rp) so a slightly
2872 different code sequence is needed. */
2875 rtn_reg = (insn & 0x03e00000) >> 21;
2879 if (strcmp (symbol->name, "$$dyncall") == 0)
2882 /* If we are creating a call from a stub to another stub, then
2883 never do the instruction reordering. We can tell if we are
2884 going to be calling one stub from another by the fact that
2885 the symbol name has '_stub_' (arg. reloc. stub) or '_lb_stub_'
2886 prepended to the name. Alternatively, the section of the
2887 symbol will be '.hppa_linker_stubs'. */
2889 if ((strncmp (symbol->name, "_stub_", 6) == 0)
2890 || (strncmp (symbol->name, "_lb_stub_", 9) == 0))
2892 BFD_ASSERT (strcmp (symbol->section->name, ".hppa_linker_stubs") == 0);
2896 /* Check to see if we modify the return pointer
2897 in the delay slot of the branch. */
2899 unsigned delay_insn = data[1];
2901 /* If we nullify the delay slot, or if the delay slot contains an
2902 instruction that modifies the return pointer, then no additional
2903 modification of the return pointer is necessary. */
2904 if (insn & 2 || insn == 0)
2908 if (get_opcode (delay_insn) == LDO
2909 && (((delay_insn & 0x001f0000) >> 16) == rtn_reg))
2916 sprintf (stub_sym_name,
2917 "_lb_stub_%s_%s", reloc_entry->sym_ptr_ptr[0]->name,
2918 rtn_adjust ? "RA" : "");
2919 stub_entry = find_stub_by_name(abfd, stub_sec, stub_sym_name);
2921 /* If a copy of this stub already exists re-use it. */
2924 stub_sym = stub_entry->sym;
2926 /* Change symbol associated with the original relocation to point
2929 FIXME. Is there a need to change the relocation type too? */
2930 reloc_entry->sym_ptr_ptr = (asymbol **) bfd_zalloc (stub_desc->this_bfd,
2931 sizeof (asymbol *));
2932 reloc_entry->sym_ptr_ptr[0] = stub_sym;
2933 reloc_entry->howto = bfd_reloc_type_lookup (abfd, R_HPPA_STUB_CALL_17);
2937 /* We will need to allocate a new stub. */
2938 stub_sym = bfd_make_empty_symbol (abfd);
2939 stub_sym->name = bfd_zalloc (abfd, strlen (stub_sym_name) + 1);
2940 strcpy ((char *) stub_sym->name, stub_sym_name);
2942 = (int) stub_desc->stub_secp - (int) stub_desc->stub_contents;
2943 stub_sym->section = stub_sec;
2944 stub_sym->flags = BSF_LOCAL | BSF_FUNCTION;
2945 stub_entry = add_stub_by_name (abfd, stub_sec, stub_sym, link_info);
2947 /* Change symbol associated with the original relocation to point
2950 FIXME. Is there a need to change the relocation type too? */
2951 reloc_entry->sym_ptr_ptr = (asymbol **) bfd_zalloc (stub_desc->this_bfd,
2952 sizeof (asymbol *));
2953 reloc_entry->sym_ptr_ptr[0] = stub_sym;
2954 reloc_entry->howto = bfd_reloc_type_lookup (abfd, R_HPPA_STUB_CALL_17);
2956 /* Build the stub. */
2958 /* 1. initialization for the call. */
2959 NEW_INSTRUCTION (stub_entry, LDSID_31_1);
2960 NEW_INSTRUCTION (stub_entry, MTSP_1_SR0);
2968 NEW_INSTRUCTION (stub_entry, ADDI_M4_31_RP);
2972 NEW_INSTRUCTION (stub_entry, COPY_31_2);
2979 NEW_INSTRUCTION (stub_entry, ADDI_M4_31_1);
2983 NEW_INSTRUCTION (stub_entry, COPY_31_1);
2987 NEW_INSTRUCTION (stub_entry, LDIL_XXX_31);
2988 hppa_elf_stub_reloc (stub_desc,
2991 CURRENT_STUB_OFFSET (stub_entry),
2994 /* 2. Make the call. */
2997 NEW_INSTRUCTION (stub_entry, BE_XXX_0_31);
2998 hppa_elf_stub_reloc (stub_desc,
3001 CURRENT_STUB_OFFSET (stub_entry),
3002 R_HPPA_ABS_CALL_R17);
3003 NEW_INSTRUCTION (stub_entry, COPY_2_31);
3007 NEW_INSTRUCTION (stub_entry, BE_XXX_0_31);
3008 hppa_elf_stub_reloc (stub_desc,
3011 CURRENT_STUB_OFFSET (stub_entry),
3012 R_HPPA_ABS_CALL_R17);
3013 NEW_INSTRUCTION (stub_entry, COPY_1_31);
3018 /* 3. Branch back to the original location.
3019 (For non-millicode calls, this is accomplished with the
3020 COPY_31_2 instruction. For millicode calls, the return
3021 location is already in r2.) */
3024 NEW_INSTRUCTION (stub_entry, ADDI_M4_31_RP);
3026 NEW_INSTRUCTION (stub_entry, LDIL_XXX_31);
3027 hppa_elf_stub_reloc (stub_desc,
3030 CURRENT_STUB_OFFSET (stub_entry),
3033 NEW_INSTRUCTION (stub_entry, BE_XXX_0_31);
3034 hppa_elf_stub_reloc (stub_desc,
3037 CURRENT_STUB_OFFSET (stub_entry),
3038 R_HPPA_ABS_CALL_R17);
3039 NEW_INSTRUCTION (stub_entry, COPY_2_31);
3046 hppa_elf_long_branch_needed_p (abfd, asec, reloc_entry, symbol, insn)
3049 arelent *reloc_entry;
3053 long sym_value = get_symbol_value(symbol);
3054 int fmt = reloc_entry->howto->bitsize;
3055 unsigned char op = get_opcode(insn);
3058 #define too_far(val,num_bits) ((int)(val) > (1<<(num_bits))-1) || ((int)(val) < (-1<<(num_bits)))
3064 reloc_entry->address + asec->output_offset + asec->output_section->vma;
3065 if ( too_far(sym_value - raddr,fmt+1) )
3068 fprintf(stderr,"long_branch needed on BL insn: abfd=%s,sym=%s,distance=0x%x\n",abfd->filename,symbol->name,sym_value - reloc_entry->address);
3077 #define STUB_SYM_BUFFER_INC 5
3080 hppa_look_for_stubs_in_section (stub_bfd, abfd, output_bfd, asec,
3081 syms, new_sym_cnt, link_info)
3088 struct bfd_link_info *link_info;
3092 asymbol *new_syms = (asymbol *) NULL;
3096 /* Relocations are in different places depending on whether this is
3097 an output section or an input section. Also, the relocations are
3098 in different forms. Sigh. Luckily, we have
3099 bfd_canonicalize_reloc() to straighten this out for us . */
3101 if (asec->reloc_count > 0)
3103 arelent **reloc_vector
3104 = (arelent **) alloca (asec->reloc_count * (sizeof (arelent *) + 1));
3106 bfd_canonicalize_reloc (abfd, asec, reloc_vector, syms);
3107 for (i = 0; i < asec->reloc_count; i++)
3109 arelent *rle = reloc_vector[i];
3111 switch (rle->howto->type)
3113 case R_HPPA_ABS_CALL_11:
3114 case R_HPPA_ABS_CALL_14:
3115 case R_HPPA_ABS_CALL_17:
3116 case R_HPPA_ABS_CALL_L21:
3117 case R_HPPA_ABS_CALL_R11:
3118 case R_HPPA_ABS_CALL_R14:
3119 case R_HPPA_ABS_CALL_R17:
3120 case R_HPPA_ABS_CALL_LS21:
3121 case R_HPPA_ABS_CALL_RS11:
3122 case R_HPPA_ABS_CALL_RS14:
3123 case R_HPPA_ABS_CALL_RS17:
3124 case R_HPPA_ABS_CALL_LD21:
3125 case R_HPPA_ABS_CALL_RD11:
3126 case R_HPPA_ABS_CALL_RD14:
3127 case R_HPPA_ABS_CALL_RD17:
3128 case R_HPPA_ABS_CALL_LR21:
3129 case R_HPPA_ABS_CALL_RR14:
3130 case R_HPPA_ABS_CALL_RR17:
3131 case R_HPPA_PCREL_CALL_11:
3132 case R_HPPA_PCREL_CALL_14:
3133 case R_HPPA_PCREL_CALL_17:
3134 case R_HPPA_PCREL_CALL_12:
3135 case R_HPPA_PCREL_CALL_L21:
3136 case R_HPPA_PCREL_CALL_R11:
3137 case R_HPPA_PCREL_CALL_R14:
3138 case R_HPPA_PCREL_CALL_R17:
3139 case R_HPPA_PCREL_CALL_LS21:
3140 case R_HPPA_PCREL_CALL_RS11:
3141 case R_HPPA_PCREL_CALL_RS14:
3142 case R_HPPA_PCREL_CALL_RS17:
3143 case R_HPPA_PCREL_CALL_LD21:
3144 case R_HPPA_PCREL_CALL_RD11:
3145 case R_HPPA_PCREL_CALL_RD14:
3146 case R_HPPA_PCREL_CALL_RD17:
3147 case R_HPPA_PCREL_CALL_LR21:
3148 case R_HPPA_PCREL_CALL_RR14:
3149 case R_HPPA_PCREL_CALL_RR17:
3151 symext_entryS caller_ar
3152 = (symext_entryS) HPPA_R_ARG_RELOC (rle->addend);
3155 bfd_get_section_contents (abfd, asec, insn, rle->address,
3157 if (hppa_elf_arg_reloc_needed_p (abfd, rle, stub_types,
3160 /* Generate a stub and keep track of the new symbol. */
3163 if (new_cnt == new_max)
3165 new_max += STUB_SYM_BUFFER_INC;
3166 new_syms = (asymbol *)
3167 realloc (new_syms, new_max * sizeof (asymbol));
3170 /* The rtn_adjust argument is true here because we
3171 know that we have a branch and (with a few exceptions
3172 detailed under the relocation code for relocation type
3173 R_HPPA_STUB_CALL_17) it will be possible to perform
3174 the code reorientation. */
3175 r = hppa_elf_build_arg_reloc_stub (stub_bfd, output_bfd,
3179 new_syms[new_cnt++] = *r;
3182 /* We need to retrieve the section contents to check for
3183 long branch stubs. */
3184 if (hppa_elf_long_branch_needed_p (abfd, asec, rle,
3185 rle->sym_ptr_ptr[0],
3188 /* Generate a stub and keep track of the new symbol. */
3191 if (new_cnt == new_max)
3193 new_max += STUB_SYM_BUFFER_INC;
3194 new_syms = (asymbol *)
3195 realloc (new_syms, (new_max * sizeof (asymbol)));
3197 r = hppa_elf_build_long_branch_stub (stub_bfd, output_bfd,
3199 rle->sym_ptr_ptr[0],
3201 new_syms[new_cnt++] = *r;
3206 case R_HPPA_PLABEL_32:
3207 case R_HPPA_PLABEL_11:
3208 case R_HPPA_PLABEL_14:
3209 case R_HPPA_PLABEL_L21:
3210 case R_HPPA_PLABEL_R11:
3211 case R_HPPA_PLABEL_R14:
3213 /* On a plabel relocation, assume the arguments of the
3214 caller are set up in general registers.
3215 NOTE: 0x155 = ARGW0=CR,ARGW1=GR,ARGW2=GR,RETVAL=GR */
3216 symext_entryS caller_ar = (symext_entryS) 0x155;
3219 bfd_get_section_contents (abfd, asec, insn, rle->address,
3222 if (hppa_elf_arg_reloc_needed_p (abfd, rle, stub_types,
3225 /* Generate a plabel stub and keep track of the
3230 if (new_cnt == new_max)
3232 new_max += STUB_SYM_BUFFER_INC;
3233 new_syms = (asymbol *) realloc (new_syms, new_max
3234 * sizeof (asymbol));
3237 /* Determine whether a return adjustment
3238 (see the relocation code for relocation type
3239 R_HPPA_STUB_CALL_17) is possible. Basically,
3240 determine whether we are looking at a branch or not. */
3242 if (rle->howto->type == R_HPPA_PLABEL_32)
3246 switch (get_opcode(insn[0]))
3256 r = hppa_elf_build_arg_reloc_stub (stub_bfd, output_bfd,
3260 new_syms[new_cnt++] = *r;
3271 *new_sym_cnt = new_cnt;
3276 char *linker_stubs = NULL;
3277 int linker_stubs_size = 0;
3278 int linker_stubs_max_size = 0;
3279 #define STUB_ALLOC_INCR 100
3282 hppa_elf_set_section_contents (abfd, section, location, offset, count)
3287 bfd_size_type count;
3289 if ( strcmp(section->name, ".hppa_linker_stubs") == 0 )
3291 if ( linker_stubs_max_size < offset + count )
3293 linker_stubs_max_size = offset + count + STUB_ALLOC_INCR;
3294 linker_stubs = (char *)realloc(linker_stubs, linker_stubs_max_size);
3297 if ( offset + count > linker_stubs_size )
3298 linker_stubs_size = offset + count;
3300 memcpy(linker_stubs + offset,location,count);
3304 return bfd_elf32_set_section_contents (abfd, section, location,
3308 /* Get the contents of the given section.
3310 This is special for PA ELF because some sections (such as linker stubs)
3311 may reside in memory rather than on disk, or in the case of the symbol
3312 extension section, the contents may need to be generated from other
3313 information contained in the BFD. */
3316 hppa_elf_get_section_contents (abfd, section, location, offset, count)
3321 bfd_size_type count;
3323 /* If this is the linker stub section, then its contents are contained
3324 in memory rather than on disk. FIXME. Is that always right? What
3325 about the case where a final executable is read in and a user tries
3326 to get the contents of this section? In that case the contents would
3327 be on disk like everything else. */
3328 if (strcmp (section->name, ".hppa_linker_stubs") == 0)
3330 elf32_hppa_stub_description *stub_desc = find_stubs (abfd, section);
3335 /* Sanity check our arguments. */
3336 if ((bfd_size_type) (offset + count) > section->_raw_size
3337 || (bfd_size_type) (offset + count) > stub_desc->real_size)
3340 memcpy (location, stub_desc->stub_contents + offset, count);
3344 /* The symbol extension section also needs special handling. Its
3345 contents might be on the disk, in memory, or still need to
3347 else if (strcmp (section->name, ".hppa_symextn") == 0)
3349 /* If there are no output sections, then read the contents of the
3350 symbol extension section from disk. */
3351 if (section->output_section == NULL
3352 && abfd->direction == read_direction)
3354 return bfd_generic_get_section_contents (abfd, section, location,
3358 /* If this is the first time through, and there are output sections,
3359 then build the symbol extension section based on other information
3360 contained in the BFD. */
3361 else if (! symext_chain_built)
3365 (int *) elf_sym_extra(section->output_section->owner);
3367 for (i = 0; i < section->output_section->owner->symcount; i++ )
3369 elf_hppa_tc_symbol(section->output_section->owner,
3370 ((elf_symbol_type *)
3371 section->output_section->owner->outsymbols[i]),
3374 symext_chain_built++;
3375 elf_hppa_tc_make_sections (section->output_section->owner, NULL);
3378 /* At this point we know that the symbol extension section has been
3379 built. We just need to copy it into the user's buffer. */
3383 /* Sanity check our arguments. */
3384 if ((bfd_size_type) (offset + count) > section->_raw_size
3385 || (bfd_size_type) (offset + count) > symextn_contents_real_size)
3389 ((char *)symextn_contents + section->output_offset + offset),
3394 return bfd_generic_get_section_contents (abfd, section, location,
3399 elf_info_to_howto (abfd, cache_ptr, dst)
3402 Elf32_Internal_Rela *dst;
3404 BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_HPPA_UNIMPLEMENTED);
3405 cache_ptr->howto = &elf_hppa_howto_table[ELF32_R_TYPE(dst->r_info)];
3409 elf32_hppa_backend_symbol_processing (abfd, sym)
3413 /* Is this a definition of $global$? If so, keep it because it will be
3414 needed if any relocations are performed. */
3416 if (!strcmp (sym->name, "$global$")
3417 && sym->section != &bfd_und_section)
3419 global_symbol = sym;
3423 #define elf_backend_symbol_processing elf32_hppa_backend_symbol_processing
3425 struct elf32_hppa_symextn_map_struct
3433 static struct elf32_hppa_symextn_map_struct *elf32_hppa_symextn_map;
3434 static int elf32_hppa_symextn_map_size;
3437 elf32_hppa_backend_symbol_table_processing (abfd, esyms,symcnt)
3439 elf_symbol_type *esyms;
3442 Elf32_Internal_Shdr *symextn_hdr = bfd_elf_find_section (abfd, SYMEXTN_SECTION_NAME);
3444 int current_sym_idx = 0;
3446 /* If the symbol extension section does not exist, all the symbol */
3447 /* all the symbol extension information is assumed to be zero. */
3449 if ( symextn_hdr == NULL )
3451 for ( i = 0; i < symcnt; i++ )
3453 esyms[i].tc_data.hppa_arg_reloc = 0;
3458 /* allocate a buffer of the appropriate size for the symextn section */
3460 symextn_hdr->contents = bfd_zalloc(abfd,symextn_hdr->sh_size);
3461 symextn_hdr->size = symextn_hdr->sh_size;
3463 /* read in the symextn section */
3465 if (bfd_seek (abfd, symextn_hdr->sh_offset, SEEK_SET) == -1)
3467 bfd_error = system_call_error;
3470 if (bfd_read ((PTR) symextn_hdr->contents, 1, symextn_hdr->size, abfd)
3471 != symextn_hdr->size)
3473 free ((PTR)symextn_hdr->contents);
3474 bfd_error = system_call_error;
3478 /* parse the entries, updating the symtab entries as we go */
3480 for ( i = 0; i < symextn_hdr->size / sizeof(symext_entryS); i++ )
3482 symext_entryS *seP = ((symext_entryS *)symextn_hdr->contents) + i;
3483 int se_value = ELF32_HPPA_SX_VAL(*seP);
3484 int se_type = ELF32_HPPA_SX_TYPE(*seP);
3491 case HPPA_SXT_SYMNDX:
3492 if ( se_value >= symcnt )
3494 bfd_error = bad_value;
3495 bfd_perror("elf32_hppa_backend_symbol_table_processing -- symbol index");
3498 current_sym_idx = se_value - 1;
3501 case HPPA_SXT_ARG_RELOC:
3502 esyms[current_sym_idx].tc_data.hppa_arg_reloc = se_value;
3506 bfd_error = bad_value;
3507 bfd_perror("elf32_hppa_backend_symbol_table_processing");
3514 #define elf_backend_symbol_table_processing elf32_hppa_backend_symbol_table_processing
3517 elf32_hppa_backend_section_processing (abfd, secthdr)
3519 Elf32_Internal_Shdr *secthdr;
3523 if ( secthdr->sh_type == SHT_HPPA_SYMEXTN )
3525 for ( i = 0; i < secthdr->size / sizeof(symext_entryS); i++ )
3527 symext_entryS *seP = ((symext_entryS *)secthdr->contents) + i;
3528 int se_value = ELF32_HPPA_SX_VAL(*seP);
3529 int se_type = ELF32_HPPA_SX_TYPE(*seP);
3536 case HPPA_SXT_SYMNDX:
3537 for ( j = 0; j < abfd->symcount; j++ )
3539 /* locate the map entry for this symbol, if there is one. */
3540 /* modify the symbol extension section symbol index entry */
3541 /* to reflect the new symbol table index */
3543 for ( k = 0; k < elf32_hppa_symextn_map_size; k++ )
3545 if ( elf32_hppa_symextn_map[k].old_index == se_value
3546 && elf32_hppa_symextn_map[k].bfd == abfd->outsymbols[j]->the_bfd
3547 && elf32_hppa_symextn_map[k].sym == abfd->outsymbols[j] )
3550 ELF32_HPPA_SX_WORD (HPPA_SXT_SYMNDX, j),
3557 case HPPA_SXT_ARG_RELOC:
3561 bfd_error = bad_value;
3562 bfd_perror("elf32_hppa_backend_section_processing");
3570 #define elf_backend_section_processing elf32_hppa_backend_section_processing
3573 elf32_hppa_backend_section_from_shdr (abfd, hdr, name)
3575 Elf32_Internal_Shdr *hdr;
3580 if ( hdr->sh_type == SHT_HPPA_SYMEXTN )
3582 BFD_ASSERT ( strcmp(name,".hppa_symextn") == 0 );
3584 /* Bits that get saved. This one is real. */
3587 newsect = bfd_make_section (abfd, name);
3588 if (newsect != NULL)
3590 newsect->vma = hdr->sh_addr;
3591 newsect->_raw_size = hdr->sh_size;
3592 newsect->filepos = hdr->sh_offset; /* so we can read back the bits */
3593 newsect->flags |= SEC_HAS_CONTENTS;
3594 newsect->alignment_power = hdr->sh_addralign;
3596 if (hdr->sh_flags & SHF_ALLOC)
3598 newsect->flags |= SEC_ALLOC;
3599 newsect->flags |= SEC_LOAD;
3602 if (!(hdr->sh_flags & SHF_WRITE))
3603 newsect->flags |= SEC_READONLY;
3605 if (hdr->sh_flags & SHF_EXECINSTR)
3606 newsect->flags |= SEC_CODE; /* FIXME: may only contain SOME code */
3608 newsect->flags |= SEC_DATA;
3610 hdr->rawdata = (void *) newsect;
3618 #define elf_backend_section_from_shdr elf32_hppa_backend_section_from_shdr
3621 elf32_hppa_backend_fake_sections (abfd, secthdr, asect)
3623 Elf_Internal_Shdr *secthdr;
3627 if ( strcmp(asect->name, ".hppa_symextn") == 0 )
3629 secthdr->sh_type = SHT_HPPA_SYMEXTN;
3630 secthdr->sh_flags = 0;
3631 secthdr->sh_info = elf_section_data(asect)->rel_hdr.sh_link;
3632 secthdr->sh_link = elf_onesymtab(abfd);
3636 if (!strcmp (asect->name, ".hppa_unwind"))
3638 secthdr->sh_type = SHT_PROGBITS;
3639 /* Unwind descriptors are not part of the program memory image. */
3640 secthdr->sh_flags = 0;
3641 secthdr->sh_info = 0;
3642 secthdr->sh_link = 0;
3643 secthdr->sh_entsize = 16;
3647 /* @@ Should this be CPU specific?? KR */
3648 if (!strcmp (asect->name, ".stabstr"))
3650 secthdr->sh_type = SHT_STRTAB;
3651 secthdr->sh_flags = 0;
3652 secthdr->sh_info = 0;
3653 secthdr->sh_link = 0;
3654 secthdr->sh_entsize = 0;
3661 #define elf_backend_fake_sections elf32_hppa_backend_fake_sections
3664 elf32_hppa_backend_section_from_bfd_section (abfd, hdr, asect, retval)
3666 Elf32_Internal_Shdr *hdr;
3670 if ( hdr->sh_type == SHT_HPPA_SYMEXTN )
3674 if (((struct sec *) (hdr->rawdata)) == asect)
3676 BFD_ASSERT( strcmp(asect->name, ".hppa_symextn") == 0 );
3681 else if ( hdr->sh_type == SHT_STRTAB )
3685 if (((struct sec *) (hdr->rawdata)) == asect)
3687 BFD_ASSERT ( strcmp (asect->name, ".stabstr") == 0);
3696 #define elf_backend_section_from_bfd_section elf32_hppa_backend_section_from_bfd_section
3698 #define bfd_generic_get_section_contents hppa_elf_get_section_contents
3699 #define bfd_elf32_set_section_contents hppa_elf_set_section_contents
3701 #define TARGET_BIG_SYM bfd_elf32_hppa_vec
3702 #define TARGET_BIG_NAME "elf32-hppa"
3703 #define ELF_ARCH bfd_arch_hppa
3704 #define ELF_MACHINE_CODE EM_HPPA
3705 #define ELF_MAXPAGESIZE 0x1000
3707 #include "elf32-target.h"