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