tc-s390.c revision 1.1.1.1 1 1.1 skrll /* tc-s390.c -- Assemble for the S390
2 1.1 skrll Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
3 1.1 skrll Free Software Foundation, Inc.
4 1.1 skrll Contributed by Martin Schwidefsky (schwidefsky (at) de.ibm.com).
5 1.1 skrll
6 1.1 skrll This file is part of GAS, the GNU Assembler.
7 1.1 skrll
8 1.1 skrll GAS is free software; you can redistribute it and/or modify
9 1.1 skrll it under the terms of the GNU General Public License as published by
10 1.1 skrll the Free Software Foundation; either version 3, or (at your option)
11 1.1 skrll any later version.
12 1.1 skrll
13 1.1 skrll GAS is distributed in the hope that it will be useful,
14 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of
15 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 1.1 skrll GNU General Public License for more details.
17 1.1 skrll
18 1.1 skrll You should have received a copy of the GNU General Public License
19 1.1 skrll along with GAS; see the file COPYING. If not, write to the Free
20 1.1 skrll Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 1.1 skrll 02110-1301, USA. */
22 1.1 skrll
23 1.1 skrll #include "as.h"
24 1.1 skrll #include "safe-ctype.h"
25 1.1 skrll #include "subsegs.h"
26 1.1 skrll #include "struc-symbol.h"
27 1.1 skrll #include "dwarf2dbg.h"
28 1.1 skrll #include "dw2gencfi.h"
29 1.1 skrll
30 1.1 skrll #include "opcode/s390.h"
31 1.1 skrll #include "elf/s390.h"
32 1.1 skrll
33 1.1 skrll /* The default architecture. */
34 1.1 skrll #ifndef DEFAULT_ARCH
35 1.1 skrll #define DEFAULT_ARCH "s390"
36 1.1 skrll #endif
37 1.1 skrll static char *default_arch = DEFAULT_ARCH;
38 1.1 skrll /* Either 32 or 64, selects file format. */
39 1.1 skrll static int s390_arch_size = 0;
40 1.1 skrll
41 1.1 skrll static unsigned int current_mode_mask = 0;
42 1.1 skrll static unsigned int current_cpu = -1U;
43 1.1 skrll
44 1.1 skrll /* Whether to use user friendly register names. Default is TRUE. */
45 1.1 skrll #ifndef TARGET_REG_NAMES_P
46 1.1 skrll #define TARGET_REG_NAMES_P TRUE
47 1.1 skrll #endif
48 1.1 skrll
49 1.1 skrll static bfd_boolean reg_names_p = TARGET_REG_NAMES_P;
50 1.1 skrll
51 1.1 skrll /* Set to TRUE if we want to warn about zero base/index registers. */
52 1.1 skrll static bfd_boolean warn_areg_zero = FALSE;
53 1.1 skrll
54 1.1 skrll /* Generic assembler global variables which must be defined by all
55 1.1 skrll targets. */
56 1.1 skrll
57 1.1 skrll const char comment_chars[] = "#";
58 1.1 skrll
59 1.1 skrll /* Characters which start a comment at the beginning of a line. */
60 1.1 skrll const char line_comment_chars[] = "#";
61 1.1 skrll
62 1.1 skrll /* Characters which may be used to separate multiple commands on a
63 1.1 skrll single line. */
64 1.1 skrll const char line_separator_chars[] = ";";
65 1.1 skrll
66 1.1 skrll /* Characters which are used to indicate an exponent in a floating
67 1.1 skrll point number. */
68 1.1 skrll const char EXP_CHARS[] = "eE";
69 1.1 skrll
70 1.1 skrll /* Characters which mean that a number is a floating point constant,
71 1.1 skrll as in 0d1.0. */
72 1.1 skrll const char FLT_CHARS[] = "dD";
73 1.1 skrll
74 1.1 skrll /* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
75 1.1 skrll int s390_cie_data_alignment;
76 1.1 skrll
77 1.1 skrll /* The target specific pseudo-ops which we support. */
78 1.1 skrll
79 1.1 skrll /* Define the prototypes for the pseudo-ops */
80 1.1 skrll static void s390_byte (int);
81 1.1 skrll static void s390_elf_cons (int);
82 1.1 skrll static void s390_bss (int);
83 1.1 skrll static void s390_insn (int);
84 1.1 skrll static void s390_literals (int);
85 1.1 skrll
86 1.1 skrll const pseudo_typeS md_pseudo_table[] =
87 1.1 skrll {
88 1.1 skrll { "align", s_align_bytes, 0 },
89 1.1 skrll /* Pseudo-ops which must be defined. */
90 1.1 skrll { "bss", s390_bss, 0 },
91 1.1 skrll { "insn", s390_insn, 0 },
92 1.1 skrll /* Pseudo-ops which must be overridden. */
93 1.1 skrll { "byte", s390_byte, 0 },
94 1.1 skrll { "short", s390_elf_cons, 2 },
95 1.1 skrll { "long", s390_elf_cons, 4 },
96 1.1 skrll { "quad", s390_elf_cons, 8 },
97 1.1 skrll { "ltorg", s390_literals, 0 },
98 1.1 skrll { "string", stringer, 8 + 1 },
99 1.1 skrll { NULL, NULL, 0 }
100 1.1 skrll };
101 1.1 skrll
102 1.1 skrll
103 1.1 skrll /* Structure to hold information about predefined registers. */
104 1.1 skrll struct pd_reg
105 1.1 skrll {
106 1.1 skrll char *name;
107 1.1 skrll int value;
108 1.1 skrll };
109 1.1 skrll
110 1.1 skrll /* List of registers that are pre-defined:
111 1.1 skrll
112 1.1 skrll Each access register has a predefined name of the form:
113 1.1 skrll a<reg_num> which has the value <reg_num>.
114 1.1 skrll
115 1.1 skrll Each control register has a predefined name of the form:
116 1.1 skrll c<reg_num> which has the value <reg_num>.
117 1.1 skrll
118 1.1 skrll Each general register has a predefined name of the form:
119 1.1 skrll r<reg_num> which has the value <reg_num>.
120 1.1 skrll
121 1.1 skrll Each floating point register a has predefined name of the form:
122 1.1 skrll f<reg_num> which has the value <reg_num>.
123 1.1 skrll
124 1.1 skrll There are individual registers as well:
125 1.1 skrll sp has the value 15
126 1.1 skrll lit has the value 12
127 1.1 skrll
128 1.1 skrll The table is sorted. Suitable for searching by a binary search. */
129 1.1 skrll
130 1.1 skrll static const struct pd_reg pre_defined_registers[] =
131 1.1 skrll {
132 1.1 skrll { "a0", 0 }, /* Access registers */
133 1.1 skrll { "a1", 1 },
134 1.1 skrll { "a10", 10 },
135 1.1 skrll { "a11", 11 },
136 1.1 skrll { "a12", 12 },
137 1.1 skrll { "a13", 13 },
138 1.1 skrll { "a14", 14 },
139 1.1 skrll { "a15", 15 },
140 1.1 skrll { "a2", 2 },
141 1.1 skrll { "a3", 3 },
142 1.1 skrll { "a4", 4 },
143 1.1 skrll { "a5", 5 },
144 1.1 skrll { "a6", 6 },
145 1.1 skrll { "a7", 7 },
146 1.1 skrll { "a8", 8 },
147 1.1 skrll { "a9", 9 },
148 1.1 skrll
149 1.1 skrll { "c0", 0 }, /* Control registers */
150 1.1 skrll { "c1", 1 },
151 1.1 skrll { "c10", 10 },
152 1.1 skrll { "c11", 11 },
153 1.1 skrll { "c12", 12 },
154 1.1 skrll { "c13", 13 },
155 1.1 skrll { "c14", 14 },
156 1.1 skrll { "c15", 15 },
157 1.1 skrll { "c2", 2 },
158 1.1 skrll { "c3", 3 },
159 1.1 skrll { "c4", 4 },
160 1.1 skrll { "c5", 5 },
161 1.1 skrll { "c6", 6 },
162 1.1 skrll { "c7", 7 },
163 1.1 skrll { "c8", 8 },
164 1.1 skrll { "c9", 9 },
165 1.1 skrll
166 1.1 skrll { "f0", 0 }, /* Floating point registers */
167 1.1 skrll { "f1", 1 },
168 1.1 skrll { "f10", 10 },
169 1.1 skrll { "f11", 11 },
170 1.1 skrll { "f12", 12 },
171 1.1 skrll { "f13", 13 },
172 1.1 skrll { "f14", 14 },
173 1.1 skrll { "f15", 15 },
174 1.1 skrll { "f2", 2 },
175 1.1 skrll { "f3", 3 },
176 1.1 skrll { "f4", 4 },
177 1.1 skrll { "f5", 5 },
178 1.1 skrll { "f6", 6 },
179 1.1 skrll { "f7", 7 },
180 1.1 skrll { "f8", 8 },
181 1.1 skrll { "f9", 9 },
182 1.1 skrll
183 1.1 skrll { "lit", 13 }, /* Pointer to literal pool */
184 1.1 skrll
185 1.1 skrll { "r0", 0 }, /* General purpose registers */
186 1.1 skrll { "r1", 1 },
187 1.1 skrll { "r10", 10 },
188 1.1 skrll { "r11", 11 },
189 1.1 skrll { "r12", 12 },
190 1.1 skrll { "r13", 13 },
191 1.1 skrll { "r14", 14 },
192 1.1 skrll { "r15", 15 },
193 1.1 skrll { "r2", 2 },
194 1.1 skrll { "r3", 3 },
195 1.1 skrll { "r4", 4 },
196 1.1 skrll { "r5", 5 },
197 1.1 skrll { "r6", 6 },
198 1.1 skrll { "r7", 7 },
199 1.1 skrll { "r8", 8 },
200 1.1 skrll { "r9", 9 },
201 1.1 skrll
202 1.1 skrll { "sp", 15 }, /* Stack pointer */
203 1.1 skrll
204 1.1 skrll };
205 1.1 skrll
206 1.1 skrll #define REG_NAME_CNT (sizeof (pre_defined_registers) / sizeof (struct pd_reg))
207 1.1 skrll
208 1.1 skrll /* Given NAME, find the register number associated with that name, return
209 1.1 skrll the integer value associated with the given name or -1 on failure. */
210 1.1 skrll
211 1.1 skrll static int
212 1.1 skrll reg_name_search (const struct pd_reg *regs, int regcount, const char *name)
213 1.1 skrll {
214 1.1 skrll int middle, low, high;
215 1.1 skrll int cmp;
216 1.1 skrll
217 1.1 skrll low = 0;
218 1.1 skrll high = regcount - 1;
219 1.1 skrll
220 1.1 skrll do
221 1.1 skrll {
222 1.1 skrll middle = (low + high) / 2;
223 1.1 skrll cmp = strcasecmp (name, regs[middle].name);
224 1.1 skrll if (cmp < 0)
225 1.1 skrll high = middle - 1;
226 1.1 skrll else if (cmp > 0)
227 1.1 skrll low = middle + 1;
228 1.1 skrll else
229 1.1 skrll return regs[middle].value;
230 1.1 skrll }
231 1.1 skrll while (low <= high);
232 1.1 skrll
233 1.1 skrll return -1;
234 1.1 skrll }
235 1.1 skrll
236 1.1 skrll
237 1.1 skrll /*
238 1.1 skrll * Summary of register_name().
239 1.1 skrll *
240 1.1 skrll * in: Input_line_pointer points to 1st char of operand.
241 1.1 skrll *
242 1.1 skrll * out: A expressionS.
243 1.1 skrll * The operand may have been a register: in this case, X_op == O_register,
244 1.1 skrll * X_add_number is set to the register number, and truth is returned.
245 1.1 skrll * Input_line_pointer->(next non-blank) char after operand, or is in its
246 1.1 skrll * original state.
247 1.1 skrll */
248 1.1 skrll
249 1.1 skrll static bfd_boolean
250 1.1 skrll register_name (expressionS *expressionP)
251 1.1 skrll {
252 1.1 skrll int reg_number;
253 1.1 skrll char *name;
254 1.1 skrll char *start;
255 1.1 skrll char c;
256 1.1 skrll
257 1.1 skrll /* Find the spelling of the operand. */
258 1.1 skrll start = name = input_line_pointer;
259 1.1 skrll if (name[0] == '%' && ISALPHA (name[1]))
260 1.1 skrll name = ++input_line_pointer;
261 1.1 skrll else
262 1.1 skrll return FALSE;
263 1.1 skrll
264 1.1 skrll c = get_symbol_end ();
265 1.1 skrll reg_number = reg_name_search (pre_defined_registers, REG_NAME_CNT, name);
266 1.1 skrll
267 1.1 skrll /* Put back the delimiting char. */
268 1.1 skrll *input_line_pointer = c;
269 1.1 skrll
270 1.1 skrll /* Look to see if it's in the register table. */
271 1.1 skrll if (reg_number >= 0)
272 1.1 skrll {
273 1.1 skrll expressionP->X_op = O_register;
274 1.1 skrll expressionP->X_add_number = reg_number;
275 1.1 skrll
276 1.1 skrll /* Make the rest nice. */
277 1.1 skrll expressionP->X_add_symbol = NULL;
278 1.1 skrll expressionP->X_op_symbol = NULL;
279 1.1 skrll return TRUE;
280 1.1 skrll }
281 1.1 skrll
282 1.1 skrll /* Reset the line as if we had not done anything. */
283 1.1 skrll input_line_pointer = start;
284 1.1 skrll return FALSE;
285 1.1 skrll }
286 1.1 skrll
287 1.1 skrll /* Local variables. */
288 1.1 skrll
289 1.1 skrll /* Opformat hash table. */
290 1.1 skrll static struct hash_control *s390_opformat_hash;
291 1.1 skrll
292 1.1 skrll /* Opcode hash table. */
293 1.1 skrll static struct hash_control *s390_opcode_hash;
294 1.1 skrll
295 1.1 skrll /* Flags to set in the elf header */
296 1.1 skrll static flagword s390_flags = 0;
297 1.1 skrll
298 1.1 skrll symbolS *GOT_symbol; /* Pre-defined "_GLOBAL_OFFSET_TABLE_" */
299 1.1 skrll
300 1.1 skrll #ifndef WORKING_DOT_WORD
301 1.1 skrll int md_short_jump_size = 4;
302 1.1 skrll int md_long_jump_size = 4;
303 1.1 skrll #endif
304 1.1 skrll
305 1.1 skrll const char *md_shortopts = "A:m:kVQ:";
306 1.1 skrll struct option md_longopts[] = {
307 1.1 skrll {NULL, no_argument, NULL, 0}
308 1.1 skrll };
309 1.1 skrll size_t md_longopts_size = sizeof (md_longopts);
310 1.1 skrll
311 1.1 skrll /* Initialize the default opcode arch and word size from the default
312 1.1 skrll architecture name if not specified by an option. */
313 1.1 skrll static void
314 1.1 skrll init_default_arch (void)
315 1.1 skrll {
316 1.1 skrll if (strcmp (default_arch, "s390") == 0)
317 1.1 skrll {
318 1.1 skrll if (s390_arch_size == 0)
319 1.1 skrll s390_arch_size = 32;
320 1.1 skrll }
321 1.1 skrll else if (strcmp (default_arch, "s390x") == 0)
322 1.1 skrll {
323 1.1 skrll if (s390_arch_size == 0)
324 1.1 skrll s390_arch_size = 64;
325 1.1 skrll }
326 1.1 skrll else
327 1.1 skrll as_fatal ("Invalid default architecture, broken assembler.");
328 1.1 skrll
329 1.1 skrll if (current_mode_mask == 0)
330 1.1 skrll {
331 1.1 skrll if (s390_arch_size == 32)
332 1.1 skrll current_mode_mask = 1 << S390_OPCODE_ESA;
333 1.1 skrll else
334 1.1 skrll current_mode_mask = 1 << S390_OPCODE_ZARCH;
335 1.1 skrll }
336 1.1 skrll if (current_cpu == -1U)
337 1.1 skrll {
338 1.1 skrll if (current_mode_mask == (1 << S390_OPCODE_ESA))
339 1.1 skrll current_cpu = S390_OPCODE_G5;
340 1.1 skrll else
341 1.1 skrll current_cpu = S390_OPCODE_Z900;
342 1.1 skrll }
343 1.1 skrll }
344 1.1 skrll
345 1.1 skrll /* Called by TARGET_FORMAT. */
346 1.1 skrll const char *
347 1.1 skrll s390_target_format (void)
348 1.1 skrll {
349 1.1 skrll /* We don't get a chance to initialize anything before we're called,
350 1.1 skrll so handle that now. */
351 1.1 skrll init_default_arch ();
352 1.1 skrll
353 1.1 skrll return s390_arch_size == 64 ? "elf64-s390" : "elf32-s390";
354 1.1 skrll }
355 1.1 skrll
356 1.1 skrll int
357 1.1 skrll md_parse_option (int c, char *arg)
358 1.1 skrll {
359 1.1 skrll switch (c)
360 1.1 skrll {
361 1.1 skrll /* -k: Ignore for FreeBSD compatibility. */
362 1.1 skrll case 'k':
363 1.1 skrll break;
364 1.1 skrll case 'm':
365 1.1 skrll if (arg != NULL && strcmp (arg, "regnames") == 0)
366 1.1 skrll reg_names_p = TRUE;
367 1.1 skrll
368 1.1 skrll else if (arg != NULL && strcmp (arg, "no-regnames") == 0)
369 1.1 skrll reg_names_p = FALSE;
370 1.1 skrll
371 1.1 skrll else if (arg != NULL && strcmp (arg, "warn-areg-zero") == 0)
372 1.1 skrll warn_areg_zero = TRUE;
373 1.1 skrll
374 1.1 skrll else if (arg != NULL && strcmp (arg, "31") == 0)
375 1.1 skrll s390_arch_size = 32;
376 1.1 skrll
377 1.1 skrll else if (arg != NULL && strcmp (arg, "64") == 0)
378 1.1 skrll s390_arch_size = 64;
379 1.1 skrll
380 1.1 skrll else if (arg != NULL && strcmp (arg, "esa") == 0)
381 1.1 skrll current_mode_mask = 1 << S390_OPCODE_ESA;
382 1.1 skrll
383 1.1 skrll else if (arg != NULL && strcmp (arg, "zarch") == 0)
384 1.1 skrll current_mode_mask = 1 << S390_OPCODE_ZARCH;
385 1.1 skrll
386 1.1 skrll else if (arg != NULL && strncmp (arg, "arch=", 5) == 0)
387 1.1 skrll {
388 1.1 skrll if (strcmp (arg + 5, "g5") == 0)
389 1.1 skrll current_cpu = S390_OPCODE_G5;
390 1.1 skrll else if (strcmp (arg + 5, "g6") == 0)
391 1.1 skrll current_cpu = S390_OPCODE_G6;
392 1.1 skrll else if (strcmp (arg + 5, "z900") == 0)
393 1.1 skrll current_cpu = S390_OPCODE_Z900;
394 1.1 skrll else if (strcmp (arg + 5, "z990") == 0)
395 1.1 skrll current_cpu = S390_OPCODE_Z990;
396 1.1 skrll else if (strcmp (arg + 5, "z9-109") == 0)
397 1.1 skrll current_cpu = S390_OPCODE_Z9_109;
398 1.1 skrll else if (strcmp (arg + 5, "z9-ec") == 0)
399 1.1 skrll current_cpu = S390_OPCODE_Z9_EC;
400 1.1 skrll else if (strcmp (arg + 5, "z10") == 0)
401 1.1 skrll current_cpu = S390_OPCODE_Z10;
402 1.1 skrll else
403 1.1 skrll {
404 1.1 skrll as_bad (_("invalid switch -m%s"), arg);
405 1.1 skrll return 0;
406 1.1 skrll }
407 1.1 skrll }
408 1.1 skrll
409 1.1 skrll else
410 1.1 skrll {
411 1.1 skrll as_bad (_("invalid switch -m%s"), arg);
412 1.1 skrll return 0;
413 1.1 skrll }
414 1.1 skrll break;
415 1.1 skrll
416 1.1 skrll case 'A':
417 1.1 skrll /* Option -A is deprecated. Still available for compatibility. */
418 1.1 skrll if (arg != NULL && strcmp (arg, "esa") == 0)
419 1.1 skrll current_cpu = S390_OPCODE_G5;
420 1.1 skrll else if (arg != NULL && strcmp (arg, "esame") == 0)
421 1.1 skrll current_cpu = S390_OPCODE_Z900;
422 1.1 skrll else
423 1.1 skrll as_bad ("invalid architecture -A%s", arg);
424 1.1 skrll break;
425 1.1 skrll
426 1.1 skrll /* -V: SVR4 argument to print version ID. */
427 1.1 skrll case 'V':
428 1.1 skrll print_version_id ();
429 1.1 skrll break;
430 1.1 skrll
431 1.1 skrll /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
432 1.1 skrll should be emitted or not. FIXME: Not implemented. */
433 1.1 skrll case 'Q':
434 1.1 skrll break;
435 1.1 skrll
436 1.1 skrll default:
437 1.1 skrll return 0;
438 1.1 skrll }
439 1.1 skrll
440 1.1 skrll return 1;
441 1.1 skrll }
442 1.1 skrll
443 1.1 skrll void
444 1.1 skrll md_show_usage (FILE *stream)
445 1.1 skrll {
446 1.1 skrll fprintf (stream, _("\
447 1.1 skrll S390 options:\n\
448 1.1 skrll -mregnames Allow symbolic names for registers\n\
449 1.1 skrll -mwarn-areg-zero Warn about zero base/index registers\n\
450 1.1 skrll -mno-regnames Do not allow symbolic names for registers\n\
451 1.1 skrll -m31 Set file format to 31 bit format\n\
452 1.1 skrll -m64 Set file format to 64 bit format\n"));
453 1.1 skrll fprintf (stream, _("\
454 1.1 skrll -V print assembler version number\n\
455 1.1 skrll -Qy, -Qn ignored\n"));
456 1.1 skrll }
457 1.1 skrll
458 1.1 skrll /* This function is called when the assembler starts up. It is called
459 1.1 skrll after the options have been parsed and the output file has been
460 1.1 skrll opened. */
461 1.1 skrll
462 1.1 skrll void
463 1.1 skrll md_begin (void)
464 1.1 skrll {
465 1.1 skrll register const struct s390_opcode *op;
466 1.1 skrll const struct s390_opcode *op_end;
467 1.1 skrll bfd_boolean dup_insn = FALSE;
468 1.1 skrll const char *retval;
469 1.1 skrll
470 1.1 skrll /* Give a warning if the combination -m64-bit and -Aesa is used. */
471 1.1 skrll if (s390_arch_size == 64 && current_cpu < S390_OPCODE_Z900)
472 1.1 skrll as_warn ("The 64 bit file format is used without esame instructions.");
473 1.1 skrll
474 1.1 skrll s390_cie_data_alignment = -s390_arch_size / 8;
475 1.1 skrll
476 1.1 skrll /* Set the ELF flags if desired. */
477 1.1 skrll if (s390_flags)
478 1.1 skrll bfd_set_private_flags (stdoutput, s390_flags);
479 1.1 skrll
480 1.1 skrll /* Insert the opcode formats into a hash table. */
481 1.1 skrll s390_opformat_hash = hash_new ();
482 1.1 skrll
483 1.1 skrll op_end = s390_opformats + s390_num_opformats;
484 1.1 skrll for (op = s390_opformats; op < op_end; op++)
485 1.1 skrll {
486 1.1 skrll retval = hash_insert (s390_opformat_hash, op->name, (void *) op);
487 1.1 skrll if (retval != (const char *) NULL)
488 1.1 skrll {
489 1.1 skrll as_bad (_("Internal assembler error for instruction format %s"),
490 1.1 skrll op->name);
491 1.1 skrll dup_insn = TRUE;
492 1.1 skrll }
493 1.1 skrll }
494 1.1 skrll
495 1.1 skrll /* Insert the opcodes into a hash table. */
496 1.1 skrll s390_opcode_hash = hash_new ();
497 1.1 skrll
498 1.1 skrll op_end = s390_opcodes + s390_num_opcodes;
499 1.1 skrll for (op = s390_opcodes; op < op_end; op++)
500 1.1 skrll {
501 1.1 skrll while (op < op_end - 1 && strcmp(op->name, op[1].name) == 0)
502 1.1 skrll {
503 1.1 skrll if (op->min_cpu <= current_cpu && (op->modes & current_mode_mask))
504 1.1 skrll break;
505 1.1 skrll op++;
506 1.1 skrll }
507 1.1 skrll retval = hash_insert (s390_opcode_hash, op->name, (void *) op);
508 1.1 skrll if (retval != (const char *) NULL)
509 1.1 skrll {
510 1.1 skrll as_bad (_("Internal assembler error for instruction %s"),
511 1.1 skrll op->name);
512 1.1 skrll dup_insn = TRUE;
513 1.1 skrll }
514 1.1 skrll while (op < op_end - 1 && strcmp (op->name, op[1].name) == 0)
515 1.1 skrll op++;
516 1.1 skrll }
517 1.1 skrll
518 1.1 skrll if (dup_insn)
519 1.1 skrll abort ();
520 1.1 skrll
521 1.1 skrll record_alignment (text_section, 2);
522 1.1 skrll record_alignment (data_section, 2);
523 1.1 skrll record_alignment (bss_section, 2);
524 1.1 skrll
525 1.1 skrll }
526 1.1 skrll
527 1.1 skrll /* Called after all assembly has been done. */
528 1.1 skrll void
529 1.1 skrll s390_md_end (void)
530 1.1 skrll {
531 1.1 skrll if (s390_arch_size == 64)
532 1.1 skrll bfd_set_arch_mach (stdoutput, bfd_arch_s390, bfd_mach_s390_64);
533 1.1 skrll else
534 1.1 skrll bfd_set_arch_mach (stdoutput, bfd_arch_s390, bfd_mach_s390_31);
535 1.1 skrll }
536 1.1 skrll
537 1.1 skrll /* Insert an operand value into an instruction. */
538 1.1 skrll
539 1.1 skrll static void
540 1.1 skrll s390_insert_operand (unsigned char *insn,
541 1.1 skrll const struct s390_operand *operand,
542 1.1 skrll offsetT val,
543 1.1 skrll char *file,
544 1.1 skrll unsigned int line)
545 1.1 skrll {
546 1.1 skrll addressT uval;
547 1.1 skrll int offset;
548 1.1 skrll
549 1.1 skrll if (operand->flags & (S390_OPERAND_SIGNED|S390_OPERAND_PCREL))
550 1.1 skrll {
551 1.1 skrll offsetT min, max;
552 1.1 skrll
553 1.1 skrll max = ((offsetT) 1 << (operand->bits - 1)) - 1;
554 1.1 skrll min = - ((offsetT) 1 << (operand->bits - 1));
555 1.1 skrll /* Halve PCREL operands. */
556 1.1 skrll if (operand->flags & S390_OPERAND_PCREL)
557 1.1 skrll val >>= 1;
558 1.1 skrll /* Check for underflow / overflow. */
559 1.1 skrll if (val < min || val > max)
560 1.1 skrll {
561 1.1 skrll const char *err =
562 1.1 skrll "operand out of range (%s not between %ld and %ld)";
563 1.1 skrll char buf[100];
564 1.1 skrll
565 1.1 skrll if (operand->flags & S390_OPERAND_PCREL)
566 1.1 skrll {
567 1.1 skrll val <<= 1;
568 1.1 skrll min <<= 1;
569 1.1 skrll max <<= 1;
570 1.1 skrll }
571 1.1 skrll sprint_value (buf, val);
572 1.1 skrll if (file == (char *) NULL)
573 1.1 skrll as_bad (err, buf, (int) min, (int) max);
574 1.1 skrll else
575 1.1 skrll as_bad_where (file, line, err, buf, (int) min, (int) max);
576 1.1 skrll return;
577 1.1 skrll }
578 1.1 skrll /* val is ok, now restrict it to operand->bits bits. */
579 1.1 skrll uval = (addressT) val & ((((addressT) 1 << (operand->bits-1)) << 1) - 1);
580 1.1 skrll /* val is restrict, now check for special case. */
581 1.1 skrll if (operand->bits == 20 && operand->shift == 20)
582 1.1 skrll uval = (uval >> 12) | ((uval & 0xfff) << 8);
583 1.1 skrll }
584 1.1 skrll else
585 1.1 skrll {
586 1.1 skrll addressT min, max;
587 1.1 skrll
588 1.1 skrll max = (((addressT) 1 << (operand->bits - 1)) << 1) - 1;
589 1.1 skrll min = (offsetT) 0;
590 1.1 skrll uval = (addressT) val;
591 1.1 skrll /* Length x in an instructions has real length x+1. */
592 1.1 skrll if (operand->flags & S390_OPERAND_LENGTH)
593 1.1 skrll uval--;
594 1.1 skrll /* Check for underflow / overflow. */
595 1.1 skrll if (uval < min || uval > max)
596 1.1 skrll {
597 1.1 skrll if (operand->flags & S390_OPERAND_LENGTH)
598 1.1 skrll {
599 1.1 skrll uval++;
600 1.1 skrll min++;
601 1.1 skrll max++;
602 1.1 skrll }
603 1.1 skrll
604 1.1 skrll as_bad_value_out_of_range (_("operand"), uval, (offsetT) min, (offsetT) max, file, line);
605 1.1 skrll
606 1.1 skrll return;
607 1.1 skrll }
608 1.1 skrll }
609 1.1 skrll
610 1.1 skrll /* Insert fragments of the operand byte for byte. */
611 1.1 skrll offset = operand->shift + operand->bits;
612 1.1 skrll uval <<= (-offset) & 7;
613 1.1 skrll insn += (offset - 1) / 8;
614 1.1 skrll while (uval != 0)
615 1.1 skrll {
616 1.1 skrll *insn-- |= uval;
617 1.1 skrll uval >>= 8;
618 1.1 skrll }
619 1.1 skrll }
620 1.1 skrll
621 1.1 skrll struct map_tls
622 1.1 skrll {
623 1.1 skrll char *string;
624 1.1 skrll int length;
625 1.1 skrll bfd_reloc_code_real_type reloc;
626 1.1 skrll };
627 1.1 skrll
628 1.1 skrll /* Parse tls marker and return the desired relocation. */
629 1.1 skrll static bfd_reloc_code_real_type
630 1.1 skrll s390_tls_suffix (char **str_p, expressionS *exp_p)
631 1.1 skrll {
632 1.1 skrll static struct map_tls mapping[] =
633 1.1 skrll {
634 1.1 skrll { "tls_load", 8, BFD_RELOC_390_TLS_LOAD },
635 1.1 skrll { "tls_gdcall", 10, BFD_RELOC_390_TLS_GDCALL },
636 1.1 skrll { "tls_ldcall", 10, BFD_RELOC_390_TLS_LDCALL },
637 1.1 skrll { NULL, 0, BFD_RELOC_UNUSED }
638 1.1 skrll };
639 1.1 skrll struct map_tls *ptr;
640 1.1 skrll char *orig_line;
641 1.1 skrll char *str;
642 1.1 skrll char *ident;
643 1.1 skrll int len;
644 1.1 skrll
645 1.1 skrll str = *str_p;
646 1.1 skrll if (*str++ != ':')
647 1.1 skrll return BFD_RELOC_UNUSED;
648 1.1 skrll
649 1.1 skrll ident = str;
650 1.1 skrll while (ISIDNUM (*str))
651 1.1 skrll str++;
652 1.1 skrll len = str - ident;
653 1.1 skrll if (*str++ != ':')
654 1.1 skrll return BFD_RELOC_UNUSED;
655 1.1 skrll
656 1.1 skrll orig_line = input_line_pointer;
657 1.1 skrll input_line_pointer = str;
658 1.1 skrll expression (exp_p);
659 1.1 skrll str = input_line_pointer;
660 1.1 skrll if (&input_line_pointer != str_p)
661 1.1 skrll input_line_pointer = orig_line;
662 1.1 skrll
663 1.1 skrll if (exp_p->X_op != O_symbol)
664 1.1 skrll return BFD_RELOC_UNUSED;
665 1.1 skrll
666 1.1 skrll for (ptr = &mapping[0]; ptr->length > 0; ptr++)
667 1.1 skrll if (len == ptr->length
668 1.1 skrll && strncasecmp (ident, ptr->string, ptr->length) == 0)
669 1.1 skrll {
670 1.1 skrll /* Found a matching tls suffix. */
671 1.1 skrll *str_p = str;
672 1.1 skrll return ptr->reloc;
673 1.1 skrll }
674 1.1 skrll return BFD_RELOC_UNUSED;
675 1.1 skrll }
676 1.1 skrll
677 1.1 skrll /* Structure used to hold suffixes. */
678 1.1 skrll typedef enum
679 1.1 skrll {
680 1.1 skrll ELF_SUFFIX_NONE = 0,
681 1.1 skrll ELF_SUFFIX_GOT,
682 1.1 skrll ELF_SUFFIX_PLT,
683 1.1 skrll ELF_SUFFIX_GOTENT,
684 1.1 skrll ELF_SUFFIX_GOTOFF,
685 1.1 skrll ELF_SUFFIX_GOTPLT,
686 1.1 skrll ELF_SUFFIX_PLTOFF,
687 1.1 skrll ELF_SUFFIX_TLS_GD,
688 1.1 skrll ELF_SUFFIX_TLS_GOTIE,
689 1.1 skrll ELF_SUFFIX_TLS_IE,
690 1.1 skrll ELF_SUFFIX_TLS_LDM,
691 1.1 skrll ELF_SUFFIX_TLS_LDO,
692 1.1 skrll ELF_SUFFIX_TLS_LE
693 1.1 skrll }
694 1.1 skrll elf_suffix_type;
695 1.1 skrll
696 1.1 skrll struct map_bfd
697 1.1 skrll {
698 1.1 skrll char *string;
699 1.1 skrll int length;
700 1.1 skrll elf_suffix_type suffix;
701 1.1 skrll };
702 1.1 skrll
703 1.1 skrll
704 1.1 skrll /* Parse @got/@plt/@gotoff. and return the desired relocation. */
705 1.1 skrll static elf_suffix_type
706 1.1 skrll s390_elf_suffix (char **str_p, expressionS *exp_p)
707 1.1 skrll {
708 1.1 skrll static struct map_bfd mapping[] =
709 1.1 skrll {
710 1.1 skrll { "got", 3, ELF_SUFFIX_GOT },
711 1.1 skrll { "got12", 5, ELF_SUFFIX_GOT },
712 1.1 skrll { "plt", 3, ELF_SUFFIX_PLT },
713 1.1 skrll { "gotent", 6, ELF_SUFFIX_GOTENT },
714 1.1 skrll { "gotoff", 6, ELF_SUFFIX_GOTOFF },
715 1.1 skrll { "gotplt", 6, ELF_SUFFIX_GOTPLT },
716 1.1 skrll { "pltoff", 6, ELF_SUFFIX_PLTOFF },
717 1.1 skrll { "tlsgd", 5, ELF_SUFFIX_TLS_GD },
718 1.1 skrll { "gotntpoff", 9, ELF_SUFFIX_TLS_GOTIE },
719 1.1 skrll { "indntpoff", 9, ELF_SUFFIX_TLS_IE },
720 1.1 skrll { "tlsldm", 6, ELF_SUFFIX_TLS_LDM },
721 1.1 skrll { "dtpoff", 6, ELF_SUFFIX_TLS_LDO },
722 1.1 skrll { "ntpoff", 6, ELF_SUFFIX_TLS_LE },
723 1.1 skrll { NULL, 0, ELF_SUFFIX_NONE }
724 1.1 skrll };
725 1.1 skrll
726 1.1 skrll struct map_bfd *ptr;
727 1.1 skrll char *str = *str_p;
728 1.1 skrll char *ident;
729 1.1 skrll int len;
730 1.1 skrll
731 1.1 skrll if (*str++ != '@')
732 1.1 skrll return ELF_SUFFIX_NONE;
733 1.1 skrll
734 1.1 skrll ident = str;
735 1.1 skrll while (ISALNUM (*str))
736 1.1 skrll str++;
737 1.1 skrll len = str - ident;
738 1.1 skrll
739 1.1 skrll for (ptr = &mapping[0]; ptr->length > 0; ptr++)
740 1.1 skrll if (len == ptr->length
741 1.1 skrll && strncasecmp (ident, ptr->string, ptr->length) == 0)
742 1.1 skrll {
743 1.1 skrll if (exp_p->X_add_number != 0)
744 1.1 skrll as_warn (_("identifier+constant@%s means identifier@%s+constant"),
745 1.1 skrll ptr->string, ptr->string);
746 1.1 skrll /* Now check for identifier@suffix+constant. */
747 1.1 skrll if (*str == '-' || *str == '+')
748 1.1 skrll {
749 1.1 skrll char *orig_line = input_line_pointer;
750 1.1 skrll expressionS new_exp;
751 1.1 skrll
752 1.1 skrll input_line_pointer = str;
753 1.1 skrll expression (&new_exp);
754 1.1 skrll
755 1.1 skrll switch (new_exp.X_op)
756 1.1 skrll {
757 1.1 skrll case O_constant: /* X_add_number (a constant expression). */
758 1.1 skrll exp_p->X_add_number += new_exp.X_add_number;
759 1.1 skrll str = input_line_pointer;
760 1.1 skrll break;
761 1.1 skrll case O_symbol: /* X_add_symbol + X_add_number. */
762 1.1 skrll /* this case is used for e.g. xyz@PLT+.Label. */
763 1.1 skrll exp_p->X_add_number += new_exp.X_add_number;
764 1.1 skrll exp_p->X_op_symbol = new_exp.X_add_symbol;
765 1.1 skrll exp_p->X_op = O_add;
766 1.1 skrll str = input_line_pointer;
767 1.1 skrll break;
768 1.1 skrll case O_uminus: /* (- X_add_symbol) + X_add_number. */
769 1.1 skrll /* this case is used for e.g. xyz (at) PLT-.Label. */
770 1.1 skrll exp_p->X_add_number += new_exp.X_add_number;
771 1.1 skrll exp_p->X_op_symbol = new_exp.X_add_symbol;
772 1.1 skrll exp_p->X_op = O_subtract;
773 1.1 skrll str = input_line_pointer;
774 1.1 skrll break;
775 1.1 skrll default:
776 1.1 skrll break;
777 1.1 skrll }
778 1.1 skrll
779 1.1 skrll /* If s390_elf_suffix has not been called with
780 1.1 skrll &input_line_pointer as first parameter, we have
781 1.1 skrll clobbered the input_line_pointer. We have to
782 1.1 skrll undo that. */
783 1.1 skrll if (&input_line_pointer != str_p)
784 1.1 skrll input_line_pointer = orig_line;
785 1.1 skrll }
786 1.1 skrll *str_p = str;
787 1.1 skrll return ptr->suffix;
788 1.1 skrll }
789 1.1 skrll
790 1.1 skrll return BFD_RELOC_UNUSED;
791 1.1 skrll }
792 1.1 skrll
793 1.1 skrll /* Structure used to hold a literal pool entry. */
794 1.1 skrll struct s390_lpe
795 1.1 skrll {
796 1.1 skrll struct s390_lpe *next;
797 1.1 skrll expressionS ex;
798 1.1 skrll FLONUM_TYPE floatnum; /* used if X_op == O_big && X_add_number <= 0 */
799 1.1 skrll LITTLENUM_TYPE bignum[4]; /* used if X_op == O_big && X_add_number > 0 */
800 1.1 skrll int nbytes;
801 1.1 skrll bfd_reloc_code_real_type reloc;
802 1.1 skrll symbolS *sym;
803 1.1 skrll };
804 1.1 skrll
805 1.1 skrll static struct s390_lpe *lpe_free_list = NULL;
806 1.1 skrll static struct s390_lpe *lpe_list = NULL;
807 1.1 skrll static struct s390_lpe *lpe_list_tail = NULL;
808 1.1 skrll static symbolS *lp_sym = NULL;
809 1.1 skrll static int lp_count = 0;
810 1.1 skrll static int lpe_count = 0;
811 1.1 skrll
812 1.1 skrll static int
813 1.1 skrll s390_exp_compare (expressionS *exp1, expressionS *exp2)
814 1.1 skrll {
815 1.1 skrll if (exp1->X_op != exp2->X_op)
816 1.1 skrll return 0;
817 1.1 skrll
818 1.1 skrll switch (exp1->X_op)
819 1.1 skrll {
820 1.1 skrll case O_constant: /* X_add_number must be equal. */
821 1.1 skrll case O_register:
822 1.1 skrll return exp1->X_add_number == exp2->X_add_number;
823 1.1 skrll
824 1.1 skrll case O_big:
825 1.1 skrll as_bad (_("Can't handle O_big in s390_exp_compare"));
826 1.1 skrll
827 1.1 skrll case O_symbol: /* X_add_symbol & X_add_number must be equal. */
828 1.1 skrll case O_symbol_rva:
829 1.1 skrll case O_uminus:
830 1.1 skrll case O_bit_not:
831 1.1 skrll case O_logical_not:
832 1.1 skrll return (exp1->X_add_symbol == exp2->X_add_symbol)
833 1.1 skrll && (exp1->X_add_number == exp2->X_add_number);
834 1.1 skrll
835 1.1 skrll case O_multiply: /* X_add_symbol,X_op_symbol&X_add_number must be equal. */
836 1.1 skrll case O_divide:
837 1.1 skrll case O_modulus:
838 1.1 skrll case O_left_shift:
839 1.1 skrll case O_right_shift:
840 1.1 skrll case O_bit_inclusive_or:
841 1.1 skrll case O_bit_or_not:
842 1.1 skrll case O_bit_exclusive_or:
843 1.1 skrll case O_bit_and:
844 1.1 skrll case O_add:
845 1.1 skrll case O_subtract:
846 1.1 skrll case O_eq:
847 1.1 skrll case O_ne:
848 1.1 skrll case O_lt:
849 1.1 skrll case O_le:
850 1.1 skrll case O_ge:
851 1.1 skrll case O_gt:
852 1.1 skrll case O_logical_and:
853 1.1 skrll case O_logical_or:
854 1.1 skrll return (exp1->X_add_symbol == exp2->X_add_symbol)
855 1.1 skrll && (exp1->X_op_symbol == exp2->X_op_symbol)
856 1.1 skrll && (exp1->X_add_number == exp2->X_add_number);
857 1.1 skrll default:
858 1.1 skrll return 0;
859 1.1 skrll }
860 1.1 skrll }
861 1.1 skrll
862 1.1 skrll /* Test for @lit and if its present make an entry in the literal pool and
863 1.1 skrll modify the current expression to be an offset into the literal pool. */
864 1.1 skrll static elf_suffix_type
865 1.1 skrll s390_lit_suffix (char **str_p, expressionS *exp_p, elf_suffix_type suffix)
866 1.1 skrll {
867 1.1 skrll bfd_reloc_code_real_type reloc;
868 1.1 skrll char tmp_name[64];
869 1.1 skrll char *str = *str_p;
870 1.1 skrll char *ident;
871 1.1 skrll struct s390_lpe *lpe;
872 1.1 skrll int nbytes, len;
873 1.1 skrll
874 1.1 skrll if (*str++ != ':')
875 1.1 skrll return suffix; /* No modification. */
876 1.1 skrll
877 1.1 skrll /* We look for a suffix of the form "@lit1", "@lit2", "@lit4" or "@lit8". */
878 1.1 skrll ident = str;
879 1.1 skrll while (ISALNUM (*str))
880 1.1 skrll str++;
881 1.1 skrll len = str - ident;
882 1.1 skrll if (len != 4 || strncasecmp (ident, "lit", 3) != 0
883 1.1 skrll || (ident[3]!='1' && ident[3]!='2' && ident[3]!='4' && ident[3]!='8'))
884 1.1 skrll return suffix; /* no modification */
885 1.1 skrll nbytes = ident[3] - '0';
886 1.1 skrll
887 1.1 skrll reloc = BFD_RELOC_UNUSED;
888 1.1 skrll if (suffix == ELF_SUFFIX_GOT)
889 1.1 skrll {
890 1.1 skrll if (nbytes == 2)
891 1.1 skrll reloc = BFD_RELOC_390_GOT16;
892 1.1 skrll else if (nbytes == 4)
893 1.1 skrll reloc = BFD_RELOC_32_GOT_PCREL;
894 1.1 skrll else if (nbytes == 8)
895 1.1 skrll reloc = BFD_RELOC_390_GOT64;
896 1.1 skrll }
897 1.1 skrll else if (suffix == ELF_SUFFIX_PLT)
898 1.1 skrll {
899 1.1 skrll if (nbytes == 4)
900 1.1 skrll reloc = BFD_RELOC_390_PLT32;
901 1.1 skrll else if (nbytes == 8)
902 1.1 skrll reloc = BFD_RELOC_390_PLT64;
903 1.1 skrll }
904 1.1 skrll
905 1.1 skrll if (suffix != ELF_SUFFIX_NONE && reloc == BFD_RELOC_UNUSED)
906 1.1 skrll as_bad (_("Invalid suffix for literal pool entry"));
907 1.1 skrll
908 1.1 skrll /* Search the pool if the new entry is a duplicate. */
909 1.1 skrll if (exp_p->X_op == O_big)
910 1.1 skrll {
911 1.1 skrll /* Special processing for big numbers. */
912 1.1 skrll for (lpe = lpe_list; lpe != NULL; lpe = lpe->next)
913 1.1 skrll {
914 1.1 skrll if (lpe->ex.X_op == O_big)
915 1.1 skrll {
916 1.1 skrll if (exp_p->X_add_number <= 0 && lpe->ex.X_add_number <= 0)
917 1.1 skrll {
918 1.1 skrll if (memcmp (&generic_floating_point_number, &lpe->floatnum,
919 1.1 skrll sizeof (FLONUM_TYPE)) == 0)
920 1.1 skrll break;
921 1.1 skrll }
922 1.1 skrll else if (exp_p->X_add_number == lpe->ex.X_add_number)
923 1.1 skrll {
924 1.1 skrll if (memcmp (generic_bignum, lpe->bignum,
925 1.1 skrll sizeof (LITTLENUM_TYPE)*exp_p->X_add_number) == 0)
926 1.1 skrll break;
927 1.1 skrll }
928 1.1 skrll }
929 1.1 skrll }
930 1.1 skrll }
931 1.1 skrll else
932 1.1 skrll {
933 1.1 skrll /* Processing for 'normal' data types. */
934 1.1 skrll for (lpe = lpe_list; lpe != NULL; lpe = lpe->next)
935 1.1 skrll if (lpe->nbytes == nbytes && lpe->reloc == reloc
936 1.1 skrll && s390_exp_compare (exp_p, &lpe->ex) != 0)
937 1.1 skrll break;
938 1.1 skrll }
939 1.1 skrll
940 1.1 skrll if (lpe == NULL)
941 1.1 skrll {
942 1.1 skrll /* A new literal. */
943 1.1 skrll if (lpe_free_list != NULL)
944 1.1 skrll {
945 1.1 skrll lpe = lpe_free_list;
946 1.1 skrll lpe_free_list = lpe_free_list->next;
947 1.1 skrll }
948 1.1 skrll else
949 1.1 skrll {
950 1.1 skrll lpe = (struct s390_lpe *) xmalloc (sizeof (struct s390_lpe));
951 1.1 skrll }
952 1.1 skrll
953 1.1 skrll lpe->ex = *exp_p;
954 1.1 skrll
955 1.1 skrll if (exp_p->X_op == O_big)
956 1.1 skrll {
957 1.1 skrll if (exp_p->X_add_number <= 0)
958 1.1 skrll lpe->floatnum = generic_floating_point_number;
959 1.1 skrll else if (exp_p->X_add_number <= 4)
960 1.1 skrll memcpy (lpe->bignum, generic_bignum,
961 1.1 skrll exp_p->X_add_number * sizeof (LITTLENUM_TYPE));
962 1.1 skrll else
963 1.1 skrll as_bad (_("Big number is too big"));
964 1.1 skrll }
965 1.1 skrll
966 1.1 skrll lpe->nbytes = nbytes;
967 1.1 skrll lpe->reloc = reloc;
968 1.1 skrll /* Literal pool name defined ? */
969 1.1 skrll if (lp_sym == NULL)
970 1.1 skrll {
971 1.1 skrll sprintf (tmp_name, ".L\001%i", lp_count);
972 1.1 skrll lp_sym = symbol_make (tmp_name);
973 1.1 skrll }
974 1.1 skrll
975 1.1 skrll /* Make name for literal pool entry. */
976 1.1 skrll sprintf (tmp_name, ".L\001%i\002%i", lp_count, lpe_count);
977 1.1 skrll lpe_count++;
978 1.1 skrll lpe->sym = symbol_make (tmp_name);
979 1.1 skrll
980 1.1 skrll /* Add to literal pool list. */
981 1.1 skrll lpe->next = NULL;
982 1.1 skrll if (lpe_list_tail != NULL)
983 1.1 skrll {
984 1.1 skrll lpe_list_tail->next = lpe;
985 1.1 skrll lpe_list_tail = lpe;
986 1.1 skrll }
987 1.1 skrll else
988 1.1 skrll lpe_list = lpe_list_tail = lpe;
989 1.1 skrll }
990 1.1 skrll
991 1.1 skrll /* Now change exp_p to the offset into the literal pool.
992 1.1 skrll Thats the expression: .L^Ax^By-.L^Ax */
993 1.1 skrll exp_p->X_add_symbol = lpe->sym;
994 1.1 skrll exp_p->X_op_symbol = lp_sym;
995 1.1 skrll exp_p->X_op = O_subtract;
996 1.1 skrll exp_p->X_add_number = 0;
997 1.1 skrll
998 1.1 skrll *str_p = str;
999 1.1 skrll
1000 1.1 skrll /* We change the suffix type to ELF_SUFFIX_NONE, because
1001 1.1 skrll the difference of two local labels is just a number. */
1002 1.1 skrll return ELF_SUFFIX_NONE;
1003 1.1 skrll }
1004 1.1 skrll
1005 1.1 skrll /* Like normal .long/.short/.word, except support @got, etc.
1006 1.1 skrll clobbers input_line_pointer, checks end-of-line. */
1007 1.1 skrll static void
1008 1.1 skrll s390_elf_cons (int nbytes /* 1=.byte, 2=.word, 4=.long */)
1009 1.1 skrll {
1010 1.1 skrll expressionS exp;
1011 1.1 skrll elf_suffix_type suffix;
1012 1.1 skrll
1013 1.1 skrll if (is_it_end_of_statement ())
1014 1.1 skrll {
1015 1.1 skrll demand_empty_rest_of_line ();
1016 1.1 skrll return;
1017 1.1 skrll }
1018 1.1 skrll
1019 1.1 skrll do
1020 1.1 skrll {
1021 1.1 skrll expression (&exp);
1022 1.1 skrll
1023 1.1 skrll if (exp.X_op == O_symbol
1024 1.1 skrll && *input_line_pointer == '@'
1025 1.1 skrll && (suffix = s390_elf_suffix (&input_line_pointer, &exp)) != ELF_SUFFIX_NONE)
1026 1.1 skrll {
1027 1.1 skrll bfd_reloc_code_real_type reloc;
1028 1.1 skrll reloc_howto_type *reloc_howto;
1029 1.1 skrll int size;
1030 1.1 skrll char *where;
1031 1.1 skrll
1032 1.1 skrll if (nbytes == 2)
1033 1.1 skrll {
1034 1.1 skrll static bfd_reloc_code_real_type tab2[] =
1035 1.1 skrll {
1036 1.1 skrll BFD_RELOC_UNUSED, /* ELF_SUFFIX_NONE */
1037 1.1 skrll BFD_RELOC_390_GOT16, /* ELF_SUFFIX_GOT */
1038 1.1 skrll BFD_RELOC_UNUSED, /* ELF_SUFFIX_PLT */
1039 1.1 skrll BFD_RELOC_UNUSED, /* ELF_SUFFIX_GOTENT */
1040 1.1 skrll BFD_RELOC_16_GOTOFF, /* ELF_SUFFIX_GOTOFF */
1041 1.1 skrll BFD_RELOC_UNUSED, /* ELF_SUFFIX_GOTPLT */
1042 1.1 skrll BFD_RELOC_390_PLTOFF16, /* ELF_SUFFIX_PLTOFF */
1043 1.1 skrll BFD_RELOC_UNUSED, /* ELF_SUFFIX_TLS_GD */
1044 1.1 skrll BFD_RELOC_UNUSED, /* ELF_SUFFIX_TLS_GOTIE */
1045 1.1 skrll BFD_RELOC_UNUSED, /* ELF_SUFFIX_TLS_IE */
1046 1.1 skrll BFD_RELOC_UNUSED, /* ELF_SUFFIX_TLS_LDM */
1047 1.1 skrll BFD_RELOC_UNUSED, /* ELF_SUFFIX_TLS_LDO */
1048 1.1 skrll BFD_RELOC_UNUSED /* ELF_SUFFIX_TLS_LE */
1049 1.1 skrll };
1050 1.1 skrll reloc = tab2[suffix];
1051 1.1 skrll }
1052 1.1 skrll else if (nbytes == 4)
1053 1.1 skrll {
1054 1.1 skrll static bfd_reloc_code_real_type tab4[] =
1055 1.1 skrll {
1056 1.1 skrll BFD_RELOC_UNUSED, /* ELF_SUFFIX_NONE */
1057 1.1 skrll BFD_RELOC_32_GOT_PCREL, /* ELF_SUFFIX_GOT */
1058 1.1 skrll BFD_RELOC_390_PLT32, /* ELF_SUFFIX_PLT */
1059 1.1 skrll BFD_RELOC_UNUSED, /* ELF_SUFFIX_GOTENT */
1060 1.1 skrll BFD_RELOC_32_GOTOFF, /* ELF_SUFFIX_GOTOFF */
1061 1.1 skrll BFD_RELOC_390_GOTPLT32, /* ELF_SUFFIX_GOTPLT */
1062 1.1 skrll BFD_RELOC_390_PLTOFF32, /* ELF_SUFFIX_PLTOFF */
1063 1.1 skrll BFD_RELOC_390_TLS_GD32, /* ELF_SUFFIX_TLS_GD */
1064 1.1 skrll BFD_RELOC_390_TLS_GOTIE32, /* ELF_SUFFIX_TLS_GOTIE */
1065 1.1 skrll BFD_RELOC_390_TLS_IE32, /* ELF_SUFFIX_TLS_IE */
1066 1.1 skrll BFD_RELOC_390_TLS_LDM32, /* ELF_SUFFIX_TLS_LDM */
1067 1.1 skrll BFD_RELOC_390_TLS_LDO32, /* ELF_SUFFIX_TLS_LDO */
1068 1.1 skrll BFD_RELOC_390_TLS_LE32 /* ELF_SUFFIX_TLS_LE */
1069 1.1 skrll };
1070 1.1 skrll reloc = tab4[suffix];
1071 1.1 skrll }
1072 1.1 skrll else if (nbytes == 8)
1073 1.1 skrll {
1074 1.1 skrll static bfd_reloc_code_real_type tab8[] =
1075 1.1 skrll {
1076 1.1 skrll BFD_RELOC_UNUSED, /* ELF_SUFFIX_NONE */
1077 1.1 skrll BFD_RELOC_390_GOT64, /* ELF_SUFFIX_GOT */
1078 1.1 skrll BFD_RELOC_390_PLT64, /* ELF_SUFFIX_PLT */
1079 1.1 skrll BFD_RELOC_UNUSED, /* ELF_SUFFIX_GOTENT */
1080 1.1 skrll BFD_RELOC_390_GOTOFF64, /* ELF_SUFFIX_GOTOFF */
1081 1.1 skrll BFD_RELOC_390_GOTPLT64, /* ELF_SUFFIX_GOTPLT */
1082 1.1 skrll BFD_RELOC_390_PLTOFF64, /* ELF_SUFFIX_PLTOFF */
1083 1.1 skrll BFD_RELOC_390_TLS_GD64, /* ELF_SUFFIX_TLS_GD */
1084 1.1 skrll BFD_RELOC_390_TLS_GOTIE64, /* ELF_SUFFIX_TLS_GOTIE */
1085 1.1 skrll BFD_RELOC_390_TLS_IE64, /* ELF_SUFFIX_TLS_IE */
1086 1.1 skrll BFD_RELOC_390_TLS_LDM64, /* ELF_SUFFIX_TLS_LDM */
1087 1.1 skrll BFD_RELOC_390_TLS_LDO64, /* ELF_SUFFIX_TLS_LDO */
1088 1.1 skrll BFD_RELOC_390_TLS_LE64 /* ELF_SUFFIX_TLS_LE */
1089 1.1 skrll };
1090 1.1 skrll reloc = tab8[suffix];
1091 1.1 skrll }
1092 1.1 skrll else
1093 1.1 skrll reloc = BFD_RELOC_UNUSED;
1094 1.1 skrll
1095 1.1 skrll if (reloc != BFD_RELOC_UNUSED
1096 1.1 skrll && (reloc_howto = bfd_reloc_type_lookup (stdoutput, reloc)))
1097 1.1 skrll {
1098 1.1 skrll size = bfd_get_reloc_size (reloc_howto);
1099 1.1 skrll if (size > nbytes)
1100 1.1 skrll as_bad (_("%s relocations do not fit in %d bytes"),
1101 1.1 skrll reloc_howto->name, nbytes);
1102 1.1 skrll where = frag_more (nbytes);
1103 1.1 skrll md_number_to_chars (where, 0, size);
1104 1.1 skrll /* To make fixup_segment do the pc relative conversion the
1105 1.1 skrll pcrel parameter on the fix_new_exp call needs to be FALSE. */
1106 1.1 skrll fix_new_exp (frag_now, where - frag_now->fr_literal,
1107 1.1 skrll size, &exp, FALSE, reloc);
1108 1.1 skrll }
1109 1.1 skrll else
1110 1.1 skrll as_bad (_("relocation not applicable"));
1111 1.1 skrll }
1112 1.1 skrll else
1113 1.1 skrll emit_expr (&exp, (unsigned int) nbytes);
1114 1.1 skrll }
1115 1.1 skrll while (*input_line_pointer++ == ',');
1116 1.1 skrll
1117 1.1 skrll input_line_pointer--; /* Put terminator back into stream. */
1118 1.1 skrll demand_empty_rest_of_line ();
1119 1.1 skrll }
1120 1.1 skrll
1121 1.1 skrll /* We need to keep a list of fixups. We can't simply generate them as
1122 1.1 skrll we go, because that would require us to first create the frag, and
1123 1.1 skrll that would screw up references to ``.''. */
1124 1.1 skrll
1125 1.1 skrll struct s390_fixup
1126 1.1 skrll {
1127 1.1 skrll expressionS exp;
1128 1.1 skrll int opindex;
1129 1.1 skrll bfd_reloc_code_real_type reloc;
1130 1.1 skrll };
1131 1.1 skrll
1132 1.1 skrll #define MAX_INSN_FIXUPS (4)
1133 1.1 skrll
1134 1.1 skrll /* This routine is called for each instruction to be assembled. */
1135 1.1 skrll
1136 1.1 skrll static char *
1137 1.1 skrll md_gather_operands (char *str,
1138 1.1 skrll unsigned char *insn,
1139 1.1 skrll const struct s390_opcode *opcode)
1140 1.1 skrll {
1141 1.1 skrll struct s390_fixup fixups[MAX_INSN_FIXUPS];
1142 1.1 skrll const struct s390_operand *operand;
1143 1.1 skrll const unsigned char *opindex_ptr;
1144 1.1 skrll expressionS ex;
1145 1.1 skrll elf_suffix_type suffix;
1146 1.1 skrll bfd_reloc_code_real_type reloc;
1147 1.1 skrll int skip_optional;
1148 1.1 skrll int parentheses;
1149 1.1 skrll char *f;
1150 1.1 skrll int fc, i;
1151 1.1 skrll
1152 1.1 skrll while (ISSPACE (*str))
1153 1.1 skrll str++;
1154 1.1 skrll
1155 1.1 skrll parentheses = 0;
1156 1.1 skrll skip_optional = 0;
1157 1.1 skrll
1158 1.1 skrll /* Gather the operands. */
1159 1.1 skrll fc = 0;
1160 1.1 skrll for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
1161 1.1 skrll {
1162 1.1 skrll char *hold;
1163 1.1 skrll
1164 1.1 skrll operand = s390_operands + *opindex_ptr;
1165 1.1 skrll
1166 1.1 skrll if (skip_optional && (operand->flags & S390_OPERAND_INDEX))
1167 1.1 skrll {
1168 1.1 skrll /* We do an early skip. For D(X,B) constructions the index
1169 1.1 skrll register is skipped (X is optional). For D(L,B) the base
1170 1.1 skrll register will be the skipped operand, because L is NOT
1171 1.1 skrll optional. */
1172 1.1 skrll skip_optional = 0;
1173 1.1 skrll continue;
1174 1.1 skrll }
1175 1.1 skrll
1176 1.1 skrll /* Gather the operand. */
1177 1.1 skrll hold = input_line_pointer;
1178 1.1 skrll input_line_pointer = str;
1179 1.1 skrll
1180 1.1 skrll /* Parse the operand. */
1181 1.1 skrll if (! register_name (&ex))
1182 1.1 skrll expression (&ex);
1183 1.1 skrll
1184 1.1 skrll str = input_line_pointer;
1185 1.1 skrll input_line_pointer = hold;
1186 1.1 skrll
1187 1.1 skrll /* Write the operand to the insn. */
1188 1.1 skrll if (ex.X_op == O_illegal)
1189 1.1 skrll as_bad (_("illegal operand"));
1190 1.1 skrll else if (ex.X_op == O_absent)
1191 1.1 skrll as_bad (_("missing operand"));
1192 1.1 skrll else if (ex.X_op == O_register || ex.X_op == O_constant)
1193 1.1 skrll {
1194 1.1 skrll s390_lit_suffix (&str, &ex, ELF_SUFFIX_NONE);
1195 1.1 skrll
1196 1.1 skrll if (ex.X_op != O_register && ex.X_op != O_constant)
1197 1.1 skrll {
1198 1.1 skrll /* We need to generate a fixup for the
1199 1.1 skrll expression returned by s390_lit_suffix. */
1200 1.1 skrll if (fc >= MAX_INSN_FIXUPS)
1201 1.1 skrll as_fatal (_("too many fixups"));
1202 1.1 skrll fixups[fc].exp = ex;
1203 1.1 skrll fixups[fc].opindex = *opindex_ptr;
1204 1.1 skrll fixups[fc].reloc = BFD_RELOC_UNUSED;
1205 1.1 skrll ++fc;
1206 1.1 skrll }
1207 1.1 skrll else
1208 1.1 skrll {
1209 1.1 skrll if ((operand->flags & S390_OPERAND_INDEX)
1210 1.1 skrll && ex.X_add_number == 0
1211 1.1 skrll && warn_areg_zero)
1212 1.1 skrll as_warn ("index register specified but zero");
1213 1.1 skrll if ((operand->flags & S390_OPERAND_BASE)
1214 1.1 skrll && ex.X_add_number == 0
1215 1.1 skrll && warn_areg_zero)
1216 1.1 skrll as_warn ("base register specified but zero");
1217 1.1 skrll s390_insert_operand (insn, operand, ex.X_add_number, NULL, 0);
1218 1.1 skrll }
1219 1.1 skrll }
1220 1.1 skrll else
1221 1.1 skrll {
1222 1.1 skrll suffix = s390_elf_suffix (&str, &ex);
1223 1.1 skrll suffix = s390_lit_suffix (&str, &ex, suffix);
1224 1.1 skrll reloc = BFD_RELOC_UNUSED;
1225 1.1 skrll
1226 1.1 skrll if (suffix == ELF_SUFFIX_GOT)
1227 1.1 skrll {
1228 1.1 skrll if ((operand->flags & S390_OPERAND_DISP) &&
1229 1.1 skrll (operand->bits == 12))
1230 1.1 skrll reloc = BFD_RELOC_390_GOT12;
1231 1.1 skrll else if ((operand->flags & S390_OPERAND_DISP) &&
1232 1.1 skrll (operand->bits == 20))
1233 1.1 skrll reloc = BFD_RELOC_390_GOT20;
1234 1.1 skrll else if ((operand->flags & S390_OPERAND_SIGNED)
1235 1.1 skrll && (operand->bits == 16))
1236 1.1 skrll reloc = BFD_RELOC_390_GOT16;
1237 1.1 skrll else if ((operand->flags & S390_OPERAND_PCREL)
1238 1.1 skrll && (operand->bits == 32))
1239 1.1 skrll reloc = BFD_RELOC_390_GOTENT;
1240 1.1 skrll }
1241 1.1 skrll else if (suffix == ELF_SUFFIX_PLT)
1242 1.1 skrll {
1243 1.1 skrll if ((operand->flags & S390_OPERAND_PCREL)
1244 1.1 skrll && (operand->bits == 16))
1245 1.1 skrll reloc = BFD_RELOC_390_PLT16DBL;
1246 1.1 skrll else if ((operand->flags & S390_OPERAND_PCREL)
1247 1.1 skrll && (operand->bits == 32))
1248 1.1 skrll reloc = BFD_RELOC_390_PLT32DBL;
1249 1.1 skrll }
1250 1.1 skrll else if (suffix == ELF_SUFFIX_GOTENT)
1251 1.1 skrll {
1252 1.1 skrll if ((operand->flags & S390_OPERAND_PCREL)
1253 1.1 skrll && (operand->bits == 32))
1254 1.1 skrll reloc = BFD_RELOC_390_GOTENT;
1255 1.1 skrll }
1256 1.1 skrll else if (suffix == ELF_SUFFIX_GOTOFF)
1257 1.1 skrll {
1258 1.1 skrll if ((operand->flags & S390_OPERAND_SIGNED)
1259 1.1 skrll && (operand->bits == 16))
1260 1.1 skrll reloc = BFD_RELOC_16_GOTOFF;
1261 1.1 skrll }
1262 1.1 skrll else if (suffix == ELF_SUFFIX_PLTOFF)
1263 1.1 skrll {
1264 1.1 skrll if ((operand->flags & S390_OPERAND_SIGNED)
1265 1.1 skrll && (operand->bits == 16))
1266 1.1 skrll reloc = BFD_RELOC_390_PLTOFF16;
1267 1.1 skrll }
1268 1.1 skrll else if (suffix == ELF_SUFFIX_GOTPLT)
1269 1.1 skrll {
1270 1.1 skrll if ((operand->flags & S390_OPERAND_DISP)
1271 1.1 skrll && (operand->bits == 12))
1272 1.1 skrll reloc = BFD_RELOC_390_GOTPLT12;
1273 1.1 skrll else if ((operand->flags & S390_OPERAND_SIGNED)
1274 1.1 skrll && (operand->bits == 16))
1275 1.1 skrll reloc = BFD_RELOC_390_GOTPLT16;
1276 1.1 skrll else if ((operand->flags & S390_OPERAND_PCREL)
1277 1.1 skrll && (operand->bits == 32))
1278 1.1 skrll reloc = BFD_RELOC_390_GOTPLTENT;
1279 1.1 skrll }
1280 1.1 skrll else if (suffix == ELF_SUFFIX_TLS_GOTIE)
1281 1.1 skrll {
1282 1.1 skrll if ((operand->flags & S390_OPERAND_DISP)
1283 1.1 skrll && (operand->bits == 12))
1284 1.1 skrll reloc = BFD_RELOC_390_TLS_GOTIE12;
1285 1.1 skrll else if ((operand->flags & S390_OPERAND_DISP)
1286 1.1 skrll && (operand->bits == 20))
1287 1.1 skrll reloc = BFD_RELOC_390_TLS_GOTIE20;
1288 1.1 skrll }
1289 1.1 skrll else if (suffix == ELF_SUFFIX_TLS_IE)
1290 1.1 skrll {
1291 1.1 skrll if ((operand->flags & S390_OPERAND_PCREL)
1292 1.1 skrll && (operand->bits == 32))
1293 1.1 skrll reloc = BFD_RELOC_390_TLS_IEENT;
1294 1.1 skrll }
1295 1.1 skrll
1296 1.1 skrll if (suffix != ELF_SUFFIX_NONE && reloc == BFD_RELOC_UNUSED)
1297 1.1 skrll as_bad (_("invalid operand suffix"));
1298 1.1 skrll /* We need to generate a fixup of type 'reloc' for this
1299 1.1 skrll expression. */
1300 1.1 skrll if (fc >= MAX_INSN_FIXUPS)
1301 1.1 skrll as_fatal (_("too many fixups"));
1302 1.1 skrll fixups[fc].exp = ex;
1303 1.1 skrll fixups[fc].opindex = *opindex_ptr;
1304 1.1 skrll fixups[fc].reloc = reloc;
1305 1.1 skrll ++fc;
1306 1.1 skrll }
1307 1.1 skrll
1308 1.1 skrll /* Check the next character. The call to expression has advanced
1309 1.1 skrll str past any whitespace. */
1310 1.1 skrll if (operand->flags & S390_OPERAND_DISP)
1311 1.1 skrll {
1312 1.1 skrll /* After a displacement a block in parentheses can start. */
1313 1.1 skrll if (*str != '(')
1314 1.1 skrll {
1315 1.1 skrll /* Check if parenthesized block can be skipped. If the next
1316 1.1 skrll operand is neiter an optional operand nor a base register
1317 1.1 skrll then we have a syntax error. */
1318 1.1 skrll operand = s390_operands + *(++opindex_ptr);
1319 1.1 skrll if (!(operand->flags & (S390_OPERAND_INDEX|S390_OPERAND_BASE)))
1320 1.1 skrll as_bad (_("syntax error; missing '(' after displacement"));
1321 1.1 skrll
1322 1.1 skrll /* Ok, skip all operands until S390_OPERAND_BASE. */
1323 1.1 skrll while (!(operand->flags & S390_OPERAND_BASE))
1324 1.1 skrll operand = s390_operands + *(++opindex_ptr);
1325 1.1 skrll
1326 1.1 skrll /* If there is a next operand it must be separated by a comma. */
1327 1.1 skrll if (opindex_ptr[1] != '\0')
1328 1.1 skrll {
1329 1.1 skrll if (*str != ',')
1330 1.1 skrll {
1331 1.1 skrll while (opindex_ptr[1] != '\0')
1332 1.1 skrll {
1333 1.1 skrll operand = s390_operands + *(++opindex_ptr);
1334 1.1 skrll if (operand->flags & S390_OPERAND_OPTIONAL)
1335 1.1 skrll continue;
1336 1.1 skrll as_bad (_("syntax error; expected ,"));
1337 1.1 skrll break;
1338 1.1 skrll }
1339 1.1 skrll }
1340 1.1 skrll else
1341 1.1 skrll str++;
1342 1.1 skrll }
1343 1.1 skrll }
1344 1.1 skrll else
1345 1.1 skrll {
1346 1.1 skrll /* We found an opening parentheses. */
1347 1.1 skrll str++;
1348 1.1 skrll for (f = str; *f != '\0'; f++)
1349 1.1 skrll if (*f == ',' || *f == ')')
1350 1.1 skrll break;
1351 1.1 skrll /* If there is no comma until the closing parentheses OR
1352 1.1 skrll there is a comma right after the opening parentheses,
1353 1.1 skrll we have to skip optional operands. */
1354 1.1 skrll if (*f == ',' && f == str)
1355 1.1 skrll {
1356 1.1 skrll /* comma directly after '(' ? */
1357 1.1 skrll skip_optional = 1;
1358 1.1 skrll str++;
1359 1.1 skrll }
1360 1.1 skrll else
1361 1.1 skrll skip_optional = (*f != ',');
1362 1.1 skrll }
1363 1.1 skrll }
1364 1.1 skrll else if (operand->flags & S390_OPERAND_BASE)
1365 1.1 skrll {
1366 1.1 skrll /* After the base register the parenthesed block ends. */
1367 1.1 skrll if (*str++ != ')')
1368 1.1 skrll as_bad (_("syntax error; missing ')' after base register"));
1369 1.1 skrll skip_optional = 0;
1370 1.1 skrll /* If there is a next operand it must be separated by a comma. */
1371 1.1 skrll if (opindex_ptr[1] != '\0')
1372 1.1 skrll {
1373 1.1 skrll if (*str != ',')
1374 1.1 skrll {
1375 1.1 skrll while (opindex_ptr[1] != '\0')
1376 1.1 skrll {
1377 1.1 skrll operand = s390_operands + *(++opindex_ptr);
1378 1.1 skrll if (operand->flags & S390_OPERAND_OPTIONAL)
1379 1.1 skrll continue;
1380 1.1 skrll as_bad (_("syntax error; expected ,"));
1381 1.1 skrll break;
1382 1.1 skrll }
1383 1.1 skrll }
1384 1.1 skrll else
1385 1.1 skrll str++;
1386 1.1 skrll }
1387 1.1 skrll }
1388 1.1 skrll else
1389 1.1 skrll {
1390 1.1 skrll /* We can find an 'early' closing parentheses in e.g. D(L) instead
1391 1.1 skrll of D(L,B). In this case the base register has to be skipped. */
1392 1.1 skrll if (*str == ')')
1393 1.1 skrll {
1394 1.1 skrll operand = s390_operands + *(++opindex_ptr);
1395 1.1 skrll
1396 1.1 skrll if (!(operand->flags & S390_OPERAND_BASE))
1397 1.1 skrll as_bad (_("syntax error; ')' not allowed here"));
1398 1.1 skrll str++;
1399 1.1 skrll }
1400 1.1 skrll /* If there is a next operand it must be separated by a comma. */
1401 1.1 skrll if (opindex_ptr[1] != '\0')
1402 1.1 skrll {
1403 1.1 skrll if (*str != ',')
1404 1.1 skrll {
1405 1.1 skrll while (opindex_ptr[1] != '\0')
1406 1.1 skrll {
1407 1.1 skrll operand = s390_operands + *(++opindex_ptr);
1408 1.1 skrll if (operand->flags & S390_OPERAND_OPTIONAL)
1409 1.1 skrll continue;
1410 1.1 skrll as_bad (_("syntax error; expected ,"));
1411 1.1 skrll break;
1412 1.1 skrll }
1413 1.1 skrll }
1414 1.1 skrll else
1415 1.1 skrll str++;
1416 1.1 skrll }
1417 1.1 skrll }
1418 1.1 skrll }
1419 1.1 skrll
1420 1.1 skrll while (ISSPACE (*str))
1421 1.1 skrll ++str;
1422 1.1 skrll
1423 1.1 skrll /* Check for tls instruction marker. */
1424 1.1 skrll reloc = s390_tls_suffix (&str, &ex);
1425 1.1 skrll if (reloc != BFD_RELOC_UNUSED)
1426 1.1 skrll {
1427 1.1 skrll /* We need to generate a fixup of type 'reloc' for this
1428 1.1 skrll instruction. */
1429 1.1 skrll if (fc >= MAX_INSN_FIXUPS)
1430 1.1 skrll as_fatal (_("too many fixups"));
1431 1.1 skrll fixups[fc].exp = ex;
1432 1.1 skrll fixups[fc].opindex = -1;
1433 1.1 skrll fixups[fc].reloc = reloc;
1434 1.1 skrll ++fc;
1435 1.1 skrll }
1436 1.1 skrll
1437 1.1 skrll if (*str != '\0')
1438 1.1 skrll {
1439 1.1 skrll char *linefeed;
1440 1.1 skrll
1441 1.1 skrll if ((linefeed = strchr (str, '\n')) != NULL)
1442 1.1 skrll *linefeed = '\0';
1443 1.1 skrll as_bad (_("junk at end of line: `%s'"), str);
1444 1.1 skrll if (linefeed != NULL)
1445 1.1 skrll *linefeed = '\n';
1446 1.1 skrll }
1447 1.1 skrll
1448 1.1 skrll /* Write out the instruction. */
1449 1.1 skrll f = frag_more (opcode->oplen);
1450 1.1 skrll memcpy (f, insn, opcode->oplen);
1451 1.1 skrll dwarf2_emit_insn (opcode->oplen);
1452 1.1 skrll
1453 1.1 skrll /* Create any fixups. At this point we do not use a
1454 1.1 skrll bfd_reloc_code_real_type, but instead just use the
1455 1.1 skrll BFD_RELOC_UNUSED plus the operand index. This lets us easily
1456 1.1 skrll handle fixups for any operand type, although that is admittedly
1457 1.1 skrll not a very exciting feature. We pick a BFD reloc type in
1458 1.1 skrll md_apply_fix. */
1459 1.1 skrll for (i = 0; i < fc; i++)
1460 1.1 skrll {
1461 1.1 skrll
1462 1.1 skrll if (fixups[i].opindex < 0)
1463 1.1 skrll {
1464 1.1 skrll /* Create tls instruction marker relocation. */
1465 1.1 skrll fix_new_exp (frag_now, f - frag_now->fr_literal, opcode->oplen,
1466 1.1 skrll &fixups[i].exp, 0, fixups[i].reloc);
1467 1.1 skrll continue;
1468 1.1 skrll }
1469 1.1 skrll
1470 1.1 skrll operand = s390_operands + fixups[i].opindex;
1471 1.1 skrll
1472 1.1 skrll if (fixups[i].reloc != BFD_RELOC_UNUSED)
1473 1.1 skrll {
1474 1.1 skrll reloc_howto_type *reloc_howto;
1475 1.1 skrll fixS *fixP;
1476 1.1 skrll int size;
1477 1.1 skrll
1478 1.1 skrll reloc_howto = bfd_reloc_type_lookup (stdoutput, fixups[i].reloc);
1479 1.1 skrll if (!reloc_howto)
1480 1.1 skrll abort ();
1481 1.1 skrll
1482 1.1 skrll size = bfd_get_reloc_size (reloc_howto);
1483 1.1 skrll
1484 1.1 skrll if (size < 1 || size > 4)
1485 1.1 skrll abort ();
1486 1.1 skrll
1487 1.1 skrll fixP = fix_new_exp (frag_now,
1488 1.1 skrll f - frag_now->fr_literal + (operand->shift/8),
1489 1.1 skrll size, &fixups[i].exp, reloc_howto->pc_relative,
1490 1.1 skrll fixups[i].reloc);
1491 1.1 skrll /* Turn off overflow checking in fixup_segment. This is necessary
1492 1.1 skrll because fixup_segment will signal an overflow for large 4 byte
1493 1.1 skrll quantities for GOT12 relocations. */
1494 1.1 skrll if ( fixups[i].reloc == BFD_RELOC_390_GOT12
1495 1.1 skrll || fixups[i].reloc == BFD_RELOC_390_GOT20
1496 1.1 skrll || fixups[i].reloc == BFD_RELOC_390_GOT16)
1497 1.1 skrll fixP->fx_no_overflow = 1;
1498 1.1 skrll }
1499 1.1 skrll else
1500 1.1 skrll fix_new_exp (frag_now, f - frag_now->fr_literal, 4, &fixups[i].exp,
1501 1.1 skrll (operand->flags & S390_OPERAND_PCREL) != 0,
1502 1.1 skrll ((bfd_reloc_code_real_type)
1503 1.1 skrll (fixups[i].opindex + (int) BFD_RELOC_UNUSED)));
1504 1.1 skrll }
1505 1.1 skrll return str;
1506 1.1 skrll }
1507 1.1 skrll
1508 1.1 skrll /* This routine is called for each instruction to be assembled. */
1509 1.1 skrll
1510 1.1 skrll void
1511 1.1 skrll md_assemble (char *str)
1512 1.1 skrll {
1513 1.1 skrll const struct s390_opcode *opcode;
1514 1.1 skrll unsigned char insn[6];
1515 1.1 skrll char *s;
1516 1.1 skrll
1517 1.1 skrll /* Get the opcode. */
1518 1.1 skrll for (s = str; *s != '\0' && ! ISSPACE (*s); s++)
1519 1.1 skrll ;
1520 1.1 skrll if (*s != '\0')
1521 1.1 skrll *s++ = '\0';
1522 1.1 skrll
1523 1.1 skrll /* Look up the opcode in the hash table. */
1524 1.1 skrll opcode = (struct s390_opcode *) hash_find (s390_opcode_hash, str);
1525 1.1 skrll if (opcode == (const struct s390_opcode *) NULL)
1526 1.1 skrll {
1527 1.1 skrll as_bad (_("Unrecognized opcode: `%s'"), str);
1528 1.1 skrll return;
1529 1.1 skrll }
1530 1.1 skrll else if (!(opcode->modes & current_mode_mask))
1531 1.1 skrll {
1532 1.1 skrll as_bad ("Opcode %s not available in this mode", str);
1533 1.1 skrll return;
1534 1.1 skrll }
1535 1.1 skrll memcpy (insn, opcode->opcode, sizeof (insn));
1536 1.1 skrll md_gather_operands (s, insn, opcode);
1537 1.1 skrll }
1538 1.1 skrll
1539 1.1 skrll #ifndef WORKING_DOT_WORD
1540 1.1 skrll /* Handle long and short jumps. We don't support these */
1541 1.1 skrll void
1542 1.1 skrll md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
1543 1.1 skrll char *ptr;
1544 1.1 skrll addressT from_addr, to_addr;
1545 1.1 skrll fragS *frag;
1546 1.1 skrll symbolS *to_symbol;
1547 1.1 skrll {
1548 1.1 skrll abort ();
1549 1.1 skrll }
1550 1.1 skrll
1551 1.1 skrll void
1552 1.1 skrll md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
1553 1.1 skrll char *ptr;
1554 1.1 skrll addressT from_addr, to_addr;
1555 1.1 skrll fragS *frag;
1556 1.1 skrll symbolS *to_symbol;
1557 1.1 skrll {
1558 1.1 skrll abort ();
1559 1.1 skrll }
1560 1.1 skrll #endif
1561 1.1 skrll
1562 1.1 skrll void
1563 1.1 skrll s390_bss (int ignore ATTRIBUTE_UNUSED)
1564 1.1 skrll {
1565 1.1 skrll /* We don't support putting frags in the BSS segment, we fake it
1566 1.1 skrll by marking in_bss, then looking at s_skip for clues. */
1567 1.1 skrll
1568 1.1 skrll subseg_set (bss_section, 0);
1569 1.1 skrll demand_empty_rest_of_line ();
1570 1.1 skrll }
1571 1.1 skrll
1572 1.1 skrll /* Pseudo-op handling. */
1573 1.1 skrll
1574 1.1 skrll void
1575 1.1 skrll s390_insn (int ignore ATTRIBUTE_UNUSED)
1576 1.1 skrll {
1577 1.1 skrll expressionS exp;
1578 1.1 skrll const struct s390_opcode *opformat;
1579 1.1 skrll unsigned char insn[6];
1580 1.1 skrll char *s;
1581 1.1 skrll
1582 1.1 skrll /* Get the opcode format. */
1583 1.1 skrll s = input_line_pointer;
1584 1.1 skrll while (*s != '\0' && *s != ',' && ! ISSPACE (*s))
1585 1.1 skrll s++;
1586 1.1 skrll if (*s != ',')
1587 1.1 skrll as_bad (_("Invalid .insn format\n"));
1588 1.1 skrll *s++ = '\0';
1589 1.1 skrll
1590 1.1 skrll /* Look up the opcode in the hash table. */
1591 1.1 skrll opformat = (struct s390_opcode *)
1592 1.1 skrll hash_find (s390_opformat_hash, input_line_pointer);
1593 1.1 skrll if (opformat == (const struct s390_opcode *) NULL)
1594 1.1 skrll {
1595 1.1 skrll as_bad (_("Unrecognized opcode format: `%s'"), input_line_pointer);
1596 1.1 skrll return;
1597 1.1 skrll }
1598 1.1 skrll input_line_pointer = s;
1599 1.1 skrll expression (&exp);
1600 1.1 skrll if (exp.X_op == O_constant)
1601 1.1 skrll {
1602 1.1 skrll if ( ( opformat->oplen == 6
1603 1.1 skrll && (addressT) exp.X_add_number < (1ULL << 48))
1604 1.1 skrll || ( opformat->oplen == 4
1605 1.1 skrll && (addressT) exp.X_add_number < (1ULL << 32))
1606 1.1 skrll || ( opformat->oplen == 2
1607 1.1 skrll && (addressT) exp.X_add_number < (1ULL << 16)))
1608 1.1 skrll md_number_to_chars ((char *) insn, exp.X_add_number, opformat->oplen);
1609 1.1 skrll else
1610 1.1 skrll as_bad (_("Invalid .insn format\n"));
1611 1.1 skrll }
1612 1.1 skrll else if (exp.X_op == O_big)
1613 1.1 skrll {
1614 1.1 skrll if (exp.X_add_number > 0
1615 1.1 skrll && opformat->oplen == 6
1616 1.1 skrll && generic_bignum[3] == 0)
1617 1.1 skrll {
1618 1.1 skrll md_number_to_chars ((char *) insn, generic_bignum[2], 2);
1619 1.1 skrll md_number_to_chars ((char *) &insn[2], generic_bignum[1], 2);
1620 1.1 skrll md_number_to_chars ((char *) &insn[4], generic_bignum[0], 2);
1621 1.1 skrll }
1622 1.1 skrll else
1623 1.1 skrll as_bad (_("Invalid .insn format\n"));
1624 1.1 skrll }
1625 1.1 skrll else
1626 1.1 skrll as_bad (_("second operand of .insn not a constant\n"));
1627 1.1 skrll
1628 1.1 skrll if (strcmp (opformat->name, "e") != 0 && *input_line_pointer++ != ',')
1629 1.1 skrll as_bad (_("missing comma after insn constant\n"));
1630 1.1 skrll
1631 1.1 skrll if ((s = strchr (input_line_pointer, '\n')) != NULL)
1632 1.1 skrll *s = '\0';
1633 1.1 skrll input_line_pointer = md_gather_operands (input_line_pointer, insn,
1634 1.1 skrll opformat);
1635 1.1 skrll if (s != NULL)
1636 1.1 skrll *s = '\n';
1637 1.1 skrll demand_empty_rest_of_line ();
1638 1.1 skrll }
1639 1.1 skrll
1640 1.1 skrll /* The .byte pseudo-op. This is similar to the normal .byte
1641 1.1 skrll pseudo-op, but it can also take a single ASCII string. */
1642 1.1 skrll
1643 1.1 skrll static void
1644 1.1 skrll s390_byte (int ignore ATTRIBUTE_UNUSED)
1645 1.1 skrll {
1646 1.1 skrll if (*input_line_pointer != '\"')
1647 1.1 skrll {
1648 1.1 skrll cons (1);
1649 1.1 skrll return;
1650 1.1 skrll }
1651 1.1 skrll
1652 1.1 skrll /* Gather characters. A real double quote is doubled. Unusual
1653 1.1 skrll characters are not permitted. */
1654 1.1 skrll ++input_line_pointer;
1655 1.1 skrll while (1)
1656 1.1 skrll {
1657 1.1 skrll char c;
1658 1.1 skrll
1659 1.1 skrll c = *input_line_pointer++;
1660 1.1 skrll
1661 1.1 skrll if (c == '\"')
1662 1.1 skrll {
1663 1.1 skrll if (*input_line_pointer != '\"')
1664 1.1 skrll break;
1665 1.1 skrll ++input_line_pointer;
1666 1.1 skrll }
1667 1.1 skrll
1668 1.1 skrll FRAG_APPEND_1_CHAR (c);
1669 1.1 skrll }
1670 1.1 skrll
1671 1.1 skrll demand_empty_rest_of_line ();
1672 1.1 skrll }
1673 1.1 skrll
1674 1.1 skrll /* The .ltorg pseudo-op.This emits all literals defined since the last
1675 1.1 skrll .ltorg or the invocation of gas. Literals are defined with the
1676 1.1 skrll @lit suffix. */
1677 1.1 skrll
1678 1.1 skrll static void
1679 1.1 skrll s390_literals (int ignore ATTRIBUTE_UNUSED)
1680 1.1 skrll {
1681 1.1 skrll struct s390_lpe *lpe;
1682 1.1 skrll
1683 1.1 skrll if (lp_sym == NULL || lpe_count == 0)
1684 1.1 skrll return; /* Nothing to be done. */
1685 1.1 skrll
1686 1.1 skrll /* Emit symbol for start of literal pool. */
1687 1.1 skrll S_SET_SEGMENT (lp_sym, now_seg);
1688 1.1 skrll S_SET_VALUE (lp_sym, (valueT) frag_now_fix ());
1689 1.1 skrll lp_sym->sy_frag = frag_now;
1690 1.1 skrll
1691 1.1 skrll while (lpe_list)
1692 1.1 skrll {
1693 1.1 skrll lpe = lpe_list;
1694 1.1 skrll lpe_list = lpe_list->next;
1695 1.1 skrll S_SET_SEGMENT (lpe->sym, now_seg);
1696 1.1 skrll S_SET_VALUE (lpe->sym, (valueT) frag_now_fix ());
1697 1.1 skrll lpe->sym->sy_frag = frag_now;
1698 1.1 skrll
1699 1.1 skrll /* Emit literal pool entry. */
1700 1.1 skrll if (lpe->reloc != BFD_RELOC_UNUSED)
1701 1.1 skrll {
1702 1.1 skrll reloc_howto_type *reloc_howto =
1703 1.1 skrll bfd_reloc_type_lookup (stdoutput, lpe->reloc);
1704 1.1 skrll int size = bfd_get_reloc_size (reloc_howto);
1705 1.1 skrll char *where;
1706 1.1 skrll
1707 1.1 skrll if (size > lpe->nbytes)
1708 1.1 skrll as_bad (_("%s relocations do not fit in %d bytes"),
1709 1.1 skrll reloc_howto->name, lpe->nbytes);
1710 1.1 skrll where = frag_more (lpe->nbytes);
1711 1.1 skrll md_number_to_chars (where, 0, size);
1712 1.1 skrll fix_new_exp (frag_now, where - frag_now->fr_literal,
1713 1.1 skrll size, &lpe->ex, reloc_howto->pc_relative, lpe->reloc);
1714 1.1 skrll }
1715 1.1 skrll else
1716 1.1 skrll {
1717 1.1 skrll if (lpe->ex.X_op == O_big)
1718 1.1 skrll {
1719 1.1 skrll if (lpe->ex.X_add_number <= 0)
1720 1.1 skrll generic_floating_point_number = lpe->floatnum;
1721 1.1 skrll else
1722 1.1 skrll memcpy (generic_bignum, lpe->bignum,
1723 1.1 skrll lpe->ex.X_add_number * sizeof (LITTLENUM_TYPE));
1724 1.1 skrll }
1725 1.1 skrll emit_expr (&lpe->ex, lpe->nbytes);
1726 1.1 skrll }
1727 1.1 skrll
1728 1.1 skrll lpe->next = lpe_free_list;
1729 1.1 skrll lpe_free_list = lpe;
1730 1.1 skrll }
1731 1.1 skrll lpe_list_tail = NULL;
1732 1.1 skrll lp_sym = NULL;
1733 1.1 skrll lp_count++;
1734 1.1 skrll lpe_count = 0;
1735 1.1 skrll }
1736 1.1 skrll
1737 1.1 skrll char *
1738 1.1 skrll md_atof (int type, char *litp, int *sizep)
1739 1.1 skrll {
1740 1.1 skrll return ieee_md_atof (type, litp, sizep, TRUE);
1741 1.1 skrll }
1742 1.1 skrll
1743 1.1 skrll /* Align a section (I don't know why this is machine dependent). */
1744 1.1 skrll
1745 1.1 skrll valueT
1746 1.1 skrll md_section_align (asection *seg, valueT addr)
1747 1.1 skrll {
1748 1.1 skrll int align = bfd_get_section_alignment (stdoutput, seg);
1749 1.1 skrll
1750 1.1 skrll return ((addr + (1 << align) - 1) & (-1 << align));
1751 1.1 skrll }
1752 1.1 skrll
1753 1.1 skrll /* We don't have any form of relaxing. */
1754 1.1 skrll
1755 1.1 skrll int
1756 1.1 skrll md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
1757 1.1 skrll asection *seg ATTRIBUTE_UNUSED)
1758 1.1 skrll {
1759 1.1 skrll abort ();
1760 1.1 skrll return 0;
1761 1.1 skrll }
1762 1.1 skrll
1763 1.1 skrll /* Convert a machine dependent frag. We never generate these. */
1764 1.1 skrll
1765 1.1 skrll void
1766 1.1 skrll md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
1767 1.1 skrll asection *sec ATTRIBUTE_UNUSED,
1768 1.1 skrll fragS *fragp ATTRIBUTE_UNUSED)
1769 1.1 skrll {
1770 1.1 skrll abort ();
1771 1.1 skrll }
1772 1.1 skrll
1773 1.1 skrll symbolS *
1774 1.1 skrll md_undefined_symbol (char *name)
1775 1.1 skrll {
1776 1.1 skrll if (*name == '_' && *(name + 1) == 'G'
1777 1.1 skrll && strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0)
1778 1.1 skrll {
1779 1.1 skrll if (!GOT_symbol)
1780 1.1 skrll {
1781 1.1 skrll if (symbol_find (name))
1782 1.1 skrll as_bad (_("GOT already in symbol table"));
1783 1.1 skrll GOT_symbol = symbol_new (name, undefined_section,
1784 1.1 skrll (valueT) 0, &zero_address_frag);
1785 1.1 skrll }
1786 1.1 skrll return GOT_symbol;
1787 1.1 skrll }
1788 1.1 skrll return 0;
1789 1.1 skrll }
1790 1.1 skrll
1791 1.1 skrll /* Functions concerning relocs. */
1792 1.1 skrll
1793 1.1 skrll /* The location from which a PC relative jump should be calculated,
1794 1.1 skrll given a PC relative reloc. */
1795 1.1 skrll
1796 1.1 skrll long
1797 1.1 skrll md_pcrel_from_section (fixS *fixp, segT sec ATTRIBUTE_UNUSED)
1798 1.1 skrll {
1799 1.1 skrll return fixp->fx_frag->fr_address + fixp->fx_where;
1800 1.1 skrll }
1801 1.1 skrll
1802 1.1 skrll /* Here we decide which fixups can be adjusted to make them relative to
1803 1.1 skrll the beginning of the section instead of the symbol. Basically we need
1804 1.1 skrll to make sure that the dynamic relocations are done correctly, so in
1805 1.1 skrll some cases we force the original symbol to be used. */
1806 1.1 skrll int
1807 1.1 skrll tc_s390_fix_adjustable (fixS *fixP)
1808 1.1 skrll {
1809 1.1 skrll /* Don't adjust references to merge sections. */
1810 1.1 skrll if ((S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0)
1811 1.1 skrll return 0;
1812 1.1 skrll /* adjust_reloc_syms doesn't know about the GOT. */
1813 1.1 skrll if ( fixP->fx_r_type == BFD_RELOC_16_GOTOFF
1814 1.1 skrll || fixP->fx_r_type == BFD_RELOC_32_GOTOFF
1815 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_GOTOFF64
1816 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_PLTOFF16
1817 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_PLTOFF32
1818 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_PLTOFF64
1819 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_PLT16DBL
1820 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_PLT32
1821 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_PLT32DBL
1822 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_PLT64
1823 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_GOT12
1824 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_GOT20
1825 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_GOT16
1826 1.1 skrll || fixP->fx_r_type == BFD_RELOC_32_GOT_PCREL
1827 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_GOT64
1828 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_GOTENT
1829 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_GOTPLT12
1830 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_GOTPLT16
1831 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_GOTPLT20
1832 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_GOTPLT32
1833 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_GOTPLT64
1834 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_GOTPLTENT
1835 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_LOAD
1836 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_GDCALL
1837 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_LDCALL
1838 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_GD32
1839 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_GD64
1840 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_GOTIE12
1841 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_GOTIE20
1842 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_GOTIE32
1843 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_GOTIE64
1844 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_LDM32
1845 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_LDM64
1846 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_IE32
1847 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_IE64
1848 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_IEENT
1849 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_LE32
1850 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_LE64
1851 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_LDO32
1852 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_LDO64
1853 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_DTPMOD
1854 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_DTPOFF
1855 1.1 skrll || fixP->fx_r_type == BFD_RELOC_390_TLS_TPOFF
1856 1.1 skrll || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1857 1.1 skrll || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1858 1.1 skrll return 0;
1859 1.1 skrll return 1;
1860 1.1 skrll }
1861 1.1 skrll
1862 1.1 skrll /* Return true if we must always emit a reloc for a type and false if
1863 1.1 skrll there is some hope of resolving it at assembly time. */
1864 1.1 skrll int
1865 1.1 skrll tc_s390_force_relocation (struct fix *fixp)
1866 1.1 skrll {
1867 1.1 skrll /* Ensure we emit a relocation for every reference to the global
1868 1.1 skrll offset table or to the procedure link table. */
1869 1.1 skrll switch (fixp->fx_r_type)
1870 1.1 skrll {
1871 1.1 skrll case BFD_RELOC_390_GOT12:
1872 1.1 skrll case BFD_RELOC_390_GOT20:
1873 1.1 skrll case BFD_RELOC_32_GOT_PCREL:
1874 1.1 skrll case BFD_RELOC_32_GOTOFF:
1875 1.1 skrll case BFD_RELOC_390_GOTOFF64:
1876 1.1 skrll case BFD_RELOC_390_PLTOFF16:
1877 1.1 skrll case BFD_RELOC_390_PLTOFF32:
1878 1.1 skrll case BFD_RELOC_390_PLTOFF64:
1879 1.1 skrll case BFD_RELOC_390_GOTPC:
1880 1.1 skrll case BFD_RELOC_390_GOT16:
1881 1.1 skrll case BFD_RELOC_390_GOTPCDBL:
1882 1.1 skrll case BFD_RELOC_390_GOT64:
1883 1.1 skrll case BFD_RELOC_390_GOTENT:
1884 1.1 skrll case BFD_RELOC_390_PLT32:
1885 1.1 skrll case BFD_RELOC_390_PLT16DBL:
1886 1.1 skrll case BFD_RELOC_390_PLT32DBL:
1887 1.1 skrll case BFD_RELOC_390_PLT64:
1888 1.1 skrll case BFD_RELOC_390_GOTPLT12:
1889 1.1 skrll case BFD_RELOC_390_GOTPLT16:
1890 1.1 skrll case BFD_RELOC_390_GOTPLT20:
1891 1.1 skrll case BFD_RELOC_390_GOTPLT32:
1892 1.1 skrll case BFD_RELOC_390_GOTPLT64:
1893 1.1 skrll case BFD_RELOC_390_GOTPLTENT:
1894 1.1 skrll return 1;
1895 1.1 skrll default:
1896 1.1 skrll break;;
1897 1.1 skrll }
1898 1.1 skrll
1899 1.1 skrll return generic_force_reloc (fixp);
1900 1.1 skrll }
1901 1.1 skrll
1902 1.1 skrll /* Apply a fixup to the object code. This is called for all the
1903 1.1 skrll fixups we generated by the call to fix_new_exp, above. In the call
1904 1.1 skrll above we used a reloc code which was the largest legal reloc code
1905 1.1 skrll plus the operand index. Here we undo that to recover the operand
1906 1.1 skrll index. At this point all symbol values should be fully resolved,
1907 1.1 skrll and we attempt to completely resolve the reloc. If we can not do
1908 1.1 skrll that, we determine the correct reloc code and put it back in the
1909 1.1 skrll fixup. */
1910 1.1 skrll
1911 1.1 skrll void
1912 1.1 skrll md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
1913 1.1 skrll {
1914 1.1 skrll char *where;
1915 1.1 skrll valueT value = *valP;
1916 1.1 skrll
1917 1.1 skrll where = fixP->fx_frag->fr_literal + fixP->fx_where;
1918 1.1 skrll
1919 1.1 skrll if (fixP->fx_subsy != NULL)
1920 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line,
1921 1.1 skrll "cannot emit relocation %s against subsy symbol %s",
1922 1.1 skrll bfd_get_reloc_code_name (fixP->fx_r_type),
1923 1.1 skrll S_GET_NAME (fixP->fx_subsy));
1924 1.1 skrll
1925 1.1 skrll if (fixP->fx_addsy != NULL)
1926 1.1 skrll {
1927 1.1 skrll if (fixP->fx_pcrel)
1928 1.1 skrll value += fixP->fx_frag->fr_address + fixP->fx_where;
1929 1.1 skrll }
1930 1.1 skrll else
1931 1.1 skrll fixP->fx_done = 1;
1932 1.1 skrll
1933 1.1 skrll if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
1934 1.1 skrll {
1935 1.1 skrll const struct s390_operand *operand;
1936 1.1 skrll int opindex;
1937 1.1 skrll
1938 1.1 skrll opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
1939 1.1 skrll operand = &s390_operands[opindex];
1940 1.1 skrll
1941 1.1 skrll if (fixP->fx_done)
1942 1.1 skrll {
1943 1.1 skrll /* Insert the fully resolved operand value. */
1944 1.1 skrll s390_insert_operand ((unsigned char *) where, operand,
1945 1.1 skrll (offsetT) value, fixP->fx_file, fixP->fx_line);
1946 1.1 skrll return;
1947 1.1 skrll }
1948 1.1 skrll
1949 1.1 skrll /* Determine a BFD reloc value based on the operand information.
1950 1.1 skrll We are only prepared to turn a few of the operands into
1951 1.1 skrll relocs. */
1952 1.1 skrll fixP->fx_offset = value;
1953 1.1 skrll if (operand->bits == 12 && operand->shift == 20)
1954 1.1 skrll {
1955 1.1 skrll fixP->fx_size = 2;
1956 1.1 skrll fixP->fx_where += 2;
1957 1.1 skrll fixP->fx_r_type = BFD_RELOC_390_12;
1958 1.1 skrll }
1959 1.1 skrll else if (operand->bits == 12 && operand->shift == 36)
1960 1.1 skrll {
1961 1.1 skrll fixP->fx_size = 2;
1962 1.1 skrll fixP->fx_where += 4;
1963 1.1 skrll fixP->fx_r_type = BFD_RELOC_390_12;
1964 1.1 skrll }
1965 1.1 skrll else if (operand->bits == 20 && operand->shift == 20)
1966 1.1 skrll {
1967 1.1 skrll fixP->fx_size = 2;
1968 1.1 skrll fixP->fx_where += 2;
1969 1.1 skrll fixP->fx_r_type = BFD_RELOC_390_20;
1970 1.1 skrll }
1971 1.1 skrll else if (operand->bits == 8 && operand->shift == 8)
1972 1.1 skrll {
1973 1.1 skrll fixP->fx_size = 1;
1974 1.1 skrll fixP->fx_where += 1;
1975 1.1 skrll fixP->fx_r_type = BFD_RELOC_8;
1976 1.1 skrll }
1977 1.1 skrll else if (operand->bits == 16 && operand->shift == 16)
1978 1.1 skrll {
1979 1.1 skrll fixP->fx_size = 2;
1980 1.1 skrll fixP->fx_where += 2;
1981 1.1 skrll if (operand->flags & S390_OPERAND_PCREL)
1982 1.1 skrll {
1983 1.1 skrll fixP->fx_r_type = BFD_RELOC_390_PC16DBL;
1984 1.1 skrll fixP->fx_offset += 2;
1985 1.1 skrll }
1986 1.1 skrll else
1987 1.1 skrll fixP->fx_r_type = BFD_RELOC_16;
1988 1.1 skrll }
1989 1.1 skrll else if (operand->bits == 32 && operand->shift == 16
1990 1.1 skrll && (operand->flags & S390_OPERAND_PCREL))
1991 1.1 skrll {
1992 1.1 skrll fixP->fx_size = 4;
1993 1.1 skrll fixP->fx_where += 2;
1994 1.1 skrll fixP->fx_offset += 2;
1995 1.1 skrll fixP->fx_r_type = BFD_RELOC_390_PC32DBL;
1996 1.1 skrll }
1997 1.1 skrll else
1998 1.1 skrll {
1999 1.1 skrll char *sfile;
2000 1.1 skrll unsigned int sline;
2001 1.1 skrll
2002 1.1 skrll /* Use expr_symbol_where to see if this is an expression
2003 1.1 skrll symbol. */
2004 1.1 skrll if (expr_symbol_where (fixP->fx_addsy, &sfile, &sline))
2005 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line,
2006 1.1 skrll _("unresolved expression that must be resolved"));
2007 1.1 skrll else
2008 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line,
2009 1.1 skrll _("unsupported relocation type"));
2010 1.1 skrll fixP->fx_done = 1;
2011 1.1 skrll return;
2012 1.1 skrll }
2013 1.1 skrll }
2014 1.1 skrll else
2015 1.1 skrll {
2016 1.1 skrll switch (fixP->fx_r_type)
2017 1.1 skrll {
2018 1.1 skrll case BFD_RELOC_8:
2019 1.1 skrll if (fixP->fx_pcrel)
2020 1.1 skrll abort ();
2021 1.1 skrll if (fixP->fx_done)
2022 1.1 skrll md_number_to_chars (where, value, 1);
2023 1.1 skrll break;
2024 1.1 skrll case BFD_RELOC_390_12:
2025 1.1 skrll case BFD_RELOC_390_GOT12:
2026 1.1 skrll case BFD_RELOC_390_GOTPLT12:
2027 1.1 skrll if (fixP->fx_done)
2028 1.1 skrll {
2029 1.1 skrll unsigned short mop;
2030 1.1 skrll
2031 1.1 skrll mop = bfd_getb16 ((unsigned char *) where);
2032 1.1 skrll mop |= (unsigned short) (value & 0xfff);
2033 1.1 skrll bfd_putb16 ((bfd_vma) mop, (unsigned char *) where);
2034 1.1 skrll }
2035 1.1 skrll break;
2036 1.1 skrll
2037 1.1 skrll case BFD_RELOC_390_20:
2038 1.1 skrll case BFD_RELOC_390_GOT20:
2039 1.1 skrll case BFD_RELOC_390_GOTPLT20:
2040 1.1 skrll if (fixP->fx_done)
2041 1.1 skrll {
2042 1.1 skrll unsigned int mop;
2043 1.1 skrll mop = bfd_getb32 ((unsigned char *) where);
2044 1.1 skrll mop |= (unsigned int) ((value & 0xfff) << 8 |
2045 1.1 skrll (value & 0xff000) >> 12);
2046 1.1 skrll bfd_putb32 ((bfd_vma) mop, (unsigned char *) where);
2047 1.1 skrll }
2048 1.1 skrll break;
2049 1.1 skrll
2050 1.1 skrll case BFD_RELOC_16:
2051 1.1 skrll case BFD_RELOC_GPREL16:
2052 1.1 skrll case BFD_RELOC_16_GOT_PCREL:
2053 1.1 skrll case BFD_RELOC_16_GOTOFF:
2054 1.1 skrll if (fixP->fx_pcrel)
2055 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line,
2056 1.1 skrll "cannot emit PC relative %s relocation%s%s",
2057 1.1 skrll bfd_get_reloc_code_name (fixP->fx_r_type),
2058 1.1 skrll fixP->fx_addsy != NULL ? " against " : "",
2059 1.1 skrll (fixP->fx_addsy != NULL
2060 1.1 skrll ? S_GET_NAME (fixP->fx_addsy)
2061 1.1 skrll : ""));
2062 1.1 skrll if (fixP->fx_done)
2063 1.1 skrll md_number_to_chars (where, value, 2);
2064 1.1 skrll break;
2065 1.1 skrll case BFD_RELOC_390_GOT16:
2066 1.1 skrll case BFD_RELOC_390_PLTOFF16:
2067 1.1 skrll case BFD_RELOC_390_GOTPLT16:
2068 1.1 skrll if (fixP->fx_done)
2069 1.1 skrll md_number_to_chars (where, value, 2);
2070 1.1 skrll break;
2071 1.1 skrll case BFD_RELOC_390_PC16DBL:
2072 1.1 skrll case BFD_RELOC_390_PLT16DBL:
2073 1.1 skrll value += 2;
2074 1.1 skrll if (fixP->fx_done)
2075 1.1 skrll md_number_to_chars (where, (offsetT) value >> 1, 2);
2076 1.1 skrll break;
2077 1.1 skrll
2078 1.1 skrll case BFD_RELOC_32:
2079 1.1 skrll if (fixP->fx_pcrel)
2080 1.1 skrll fixP->fx_r_type = BFD_RELOC_32_PCREL;
2081 1.1 skrll else
2082 1.1 skrll fixP->fx_r_type = BFD_RELOC_32;
2083 1.1 skrll if (fixP->fx_done)
2084 1.1 skrll md_number_to_chars (where, value, 4);
2085 1.1 skrll break;
2086 1.1 skrll case BFD_RELOC_32_PCREL:
2087 1.1 skrll case BFD_RELOC_32_BASEREL:
2088 1.1 skrll fixP->fx_r_type = BFD_RELOC_32_PCREL;
2089 1.1 skrll if (fixP->fx_done)
2090 1.1 skrll md_number_to_chars (where, value, 4);
2091 1.1 skrll break;
2092 1.1 skrll case BFD_RELOC_32_GOT_PCREL:
2093 1.1 skrll case BFD_RELOC_390_PLTOFF32:
2094 1.1 skrll case BFD_RELOC_390_PLT32:
2095 1.1 skrll case BFD_RELOC_390_GOTPLT32:
2096 1.1 skrll if (fixP->fx_done)
2097 1.1 skrll md_number_to_chars (where, value, 4);
2098 1.1 skrll break;
2099 1.1 skrll case BFD_RELOC_390_PC32DBL:
2100 1.1 skrll case BFD_RELOC_390_PLT32DBL:
2101 1.1 skrll case BFD_RELOC_390_GOTPCDBL:
2102 1.1 skrll case BFD_RELOC_390_GOTENT:
2103 1.1 skrll case BFD_RELOC_390_GOTPLTENT:
2104 1.1 skrll value += 2;
2105 1.1 skrll if (fixP->fx_done)
2106 1.1 skrll md_number_to_chars (where, (offsetT) value >> 1, 4);
2107 1.1 skrll break;
2108 1.1 skrll
2109 1.1 skrll case BFD_RELOC_32_GOTOFF:
2110 1.1 skrll if (fixP->fx_done)
2111 1.1 skrll md_number_to_chars (where, value, sizeof (int));
2112 1.1 skrll break;
2113 1.1 skrll
2114 1.1 skrll case BFD_RELOC_390_GOTOFF64:
2115 1.1 skrll if (fixP->fx_done)
2116 1.1 skrll md_number_to_chars (where, value, 8);
2117 1.1 skrll break;
2118 1.1 skrll
2119 1.1 skrll case BFD_RELOC_390_GOT64:
2120 1.1 skrll case BFD_RELOC_390_PLTOFF64:
2121 1.1 skrll case BFD_RELOC_390_PLT64:
2122 1.1 skrll case BFD_RELOC_390_GOTPLT64:
2123 1.1 skrll if (fixP->fx_done)
2124 1.1 skrll md_number_to_chars (where, value, 8);
2125 1.1 skrll break;
2126 1.1 skrll
2127 1.1 skrll case BFD_RELOC_64:
2128 1.1 skrll if (fixP->fx_pcrel)
2129 1.1 skrll fixP->fx_r_type = BFD_RELOC_64_PCREL;
2130 1.1 skrll else
2131 1.1 skrll fixP->fx_r_type = BFD_RELOC_64;
2132 1.1 skrll if (fixP->fx_done)
2133 1.1 skrll md_number_to_chars (where, value, 8);
2134 1.1 skrll break;
2135 1.1 skrll
2136 1.1 skrll case BFD_RELOC_64_PCREL:
2137 1.1 skrll fixP->fx_r_type = BFD_RELOC_64_PCREL;
2138 1.1 skrll if (fixP->fx_done)
2139 1.1 skrll md_number_to_chars (where, value, 8);
2140 1.1 skrll break;
2141 1.1 skrll
2142 1.1 skrll case BFD_RELOC_VTABLE_INHERIT:
2143 1.1 skrll case BFD_RELOC_VTABLE_ENTRY:
2144 1.1 skrll fixP->fx_done = 0;
2145 1.1 skrll return;
2146 1.1 skrll
2147 1.1 skrll case BFD_RELOC_390_TLS_LOAD:
2148 1.1 skrll case BFD_RELOC_390_TLS_GDCALL:
2149 1.1 skrll case BFD_RELOC_390_TLS_LDCALL:
2150 1.1 skrll case BFD_RELOC_390_TLS_GD32:
2151 1.1 skrll case BFD_RELOC_390_TLS_GD64:
2152 1.1 skrll case BFD_RELOC_390_TLS_GOTIE12:
2153 1.1 skrll case BFD_RELOC_390_TLS_GOTIE20:
2154 1.1 skrll case BFD_RELOC_390_TLS_GOTIE32:
2155 1.1 skrll case BFD_RELOC_390_TLS_GOTIE64:
2156 1.1 skrll case BFD_RELOC_390_TLS_LDM32:
2157 1.1 skrll case BFD_RELOC_390_TLS_LDM64:
2158 1.1 skrll case BFD_RELOC_390_TLS_IE32:
2159 1.1 skrll case BFD_RELOC_390_TLS_IE64:
2160 1.1 skrll case BFD_RELOC_390_TLS_LE32:
2161 1.1 skrll case BFD_RELOC_390_TLS_LE64:
2162 1.1 skrll case BFD_RELOC_390_TLS_LDO32:
2163 1.1 skrll case BFD_RELOC_390_TLS_LDO64:
2164 1.1 skrll case BFD_RELOC_390_TLS_DTPMOD:
2165 1.1 skrll case BFD_RELOC_390_TLS_DTPOFF:
2166 1.1 skrll case BFD_RELOC_390_TLS_TPOFF:
2167 1.1 skrll S_SET_THREAD_LOCAL (fixP->fx_addsy);
2168 1.1 skrll /* Fully resolved at link time. */
2169 1.1 skrll break;
2170 1.1 skrll case BFD_RELOC_390_TLS_IEENT:
2171 1.1 skrll /* Fully resolved at link time. */
2172 1.1 skrll S_SET_THREAD_LOCAL (fixP->fx_addsy);
2173 1.1 skrll value += 2;
2174 1.1 skrll break;
2175 1.1 skrll
2176 1.1 skrll default:
2177 1.1 skrll {
2178 1.1 skrll const char *reloc_name = bfd_get_reloc_code_name (fixP->fx_r_type);
2179 1.1 skrll
2180 1.1 skrll if (reloc_name != NULL)
2181 1.1 skrll fprintf (stderr, "Gas failure, reloc type %s\n", reloc_name);
2182 1.1 skrll else
2183 1.1 skrll fprintf (stderr, "Gas failure, reloc type #%i\n", fixP->fx_r_type);
2184 1.1 skrll fflush (stderr);
2185 1.1 skrll abort ();
2186 1.1 skrll }
2187 1.1 skrll }
2188 1.1 skrll
2189 1.1 skrll fixP->fx_offset = value;
2190 1.1 skrll }
2191 1.1 skrll }
2192 1.1 skrll
2193 1.1 skrll /* Generate a reloc for a fixup. */
2194 1.1 skrll
2195 1.1 skrll arelent *
2196 1.1 skrll tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
2197 1.1 skrll {
2198 1.1 skrll bfd_reloc_code_real_type code;
2199 1.1 skrll arelent *reloc;
2200 1.1 skrll
2201 1.1 skrll code = fixp->fx_r_type;
2202 1.1 skrll if (GOT_symbol && fixp->fx_addsy == GOT_symbol)
2203 1.1 skrll {
2204 1.1 skrll if ( (s390_arch_size == 32 && code == BFD_RELOC_32_PCREL)
2205 1.1 skrll || (s390_arch_size == 64 && code == BFD_RELOC_64_PCREL))
2206 1.1 skrll code = BFD_RELOC_390_GOTPC;
2207 1.1 skrll if (code == BFD_RELOC_390_PC32DBL)
2208 1.1 skrll code = BFD_RELOC_390_GOTPCDBL;
2209 1.1 skrll }
2210 1.1 skrll
2211 1.1 skrll reloc = (arelent *) xmalloc (sizeof (arelent));
2212 1.1 skrll reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2213 1.1 skrll *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2214 1.1 skrll reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2215 1.1 skrll reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
2216 1.1 skrll if (reloc->howto == NULL)
2217 1.1 skrll {
2218 1.1 skrll as_bad_where (fixp->fx_file, fixp->fx_line,
2219 1.1 skrll _("cannot represent relocation type %s"),
2220 1.1 skrll bfd_get_reloc_code_name (code));
2221 1.1 skrll /* Set howto to a garbage value so that we can keep going. */
2222 1.1 skrll reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
2223 1.1 skrll assert (reloc->howto != NULL);
2224 1.1 skrll }
2225 1.1 skrll reloc->addend = fixp->fx_offset;
2226 1.1 skrll
2227 1.1 skrll return reloc;
2228 1.1 skrll }
2229 1.1 skrll
2230 1.1 skrll void
2231 1.1 skrll s390_cfi_frame_initial_instructions (void)
2232 1.1 skrll {
2233 1.1 skrll cfi_add_CFA_def_cfa (15, s390_arch_size == 64 ? 160 : 96);
2234 1.1 skrll }
2235 1.1 skrll
2236 1.1 skrll int
2237 1.1 skrll tc_s390_regname_to_dw2regnum (char *regname)
2238 1.1 skrll {
2239 1.1 skrll int regnum = -1;
2240 1.1 skrll
2241 1.1 skrll if (regname[0] != 'c' && regname[0] != 'a')
2242 1.1 skrll {
2243 1.1 skrll regnum = reg_name_search (pre_defined_registers, REG_NAME_CNT, regname);
2244 1.1 skrll if (regname[0] == 'f' && regnum != -1)
2245 1.1 skrll regnum += 16;
2246 1.1 skrll }
2247 1.1 skrll else if (strcmp (regname, "ap") == 0)
2248 1.1 skrll regnum = 32;
2249 1.1 skrll else if (strcmp (regname, "cc") == 0)
2250 1.1 skrll regnum = 33;
2251 1.1 skrll return regnum;
2252 1.1 skrll }
2253