* MAINTAINERS (BFIN): Remove myself as Blackfin maintainer.
[deliverable/binutils-gdb.git] / gas / config / tc-s390.c
CommitLineData
a85d7ed0 1/* tc-s390.c -- Assemble for the S390
2571583a 2 Copyright (C) 2000-2017 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 1654 fixP->fx_no_overflow = 1;
feb4bea7
AK
1655
1656 if (operand->flags & S390_OPERAND_PCREL)
1657 fixP->fx_pcrel_adjust = operand->shift / 8;
07855bec
NC
1658 }
1659 else
1660 fix_new_exp (frag_now, f - frag_now->fr_literal, 4, &fixups[i].exp,
1661 (operand->flags & S390_OPERAND_PCREL) != 0,
1662 ((bfd_reloc_code_real_type)
1663 (fixups[i].opindex + (int) BFD_RELOC_UNUSED)));
1664 }
a85d7ed0
NC
1665 return str;
1666}
1667
1668/* This routine is called for each instruction to be assembled. */
1669
1670void
5a49b8ac 1671md_assemble (char *str)
a85d7ed0
NC
1672{
1673 const struct s390_opcode *opcode;
1674 unsigned char insn[6];
1675 char *s;
1676
1677 /* Get the opcode. */
3882b010 1678 for (s = str; *s != '\0' && ! ISSPACE (*s); s++)
a85d7ed0
NC
1679 ;
1680 if (*s != '\0')
1681 *s++ = '\0';
1682
1683 /* Look up the opcode in the hash table. */
1684 opcode = (struct s390_opcode *) hash_find (s390_opcode_hash, str);
07855bec
NC
1685 if (opcode == (const struct s390_opcode *) NULL)
1686 {
1687 as_bad (_("Unrecognized opcode: `%s'"), str);
1688 return;
1689 }
37a58793
MS
1690 else if (!(opcode->modes & current_mode_mask))
1691 {
20203fb9 1692 as_bad (_("Opcode %s not available in this mode"), str);
37a58793
MS
1693 return;
1694 }
07726851 1695 memcpy (insn, opcode->opcode, sizeof (insn));
07855bec 1696 md_gather_operands (s, insn, opcode);
a85d7ed0
NC
1697}
1698
1699#ifndef WORKING_DOT_WORD
1700/* Handle long and short jumps. We don't support these */
1701void
1702md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
1703 char *ptr;
1704 addressT from_addr, to_addr;
1705 fragS *frag;
1706 symbolS *to_symbol;
1707{
1708 abort ();
1709}
1710
1711void
1712md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
1713 char *ptr;
1714 addressT from_addr, to_addr;
1715 fragS *frag;
1716 symbolS *to_symbol;
1717{
1718 abort ();
1719}
1720#endif
1721
1722void
5a49b8ac 1723s390_bss (int ignore ATTRIBUTE_UNUSED)
a85d7ed0
NC
1724{
1725 /* We don't support putting frags in the BSS segment, we fake it
1726 by marking in_bss, then looking at s_skip for clues. */
1727
1728 subseg_set (bss_section, 0);
1729 demand_empty_rest_of_line ();
1730}
1731
1732/* Pseudo-op handling. */
1733
1734void
5a49b8ac 1735s390_insn (int ignore ATTRIBUTE_UNUSED)
a85d7ed0
NC
1736{
1737 expressionS exp;
1738 const struct s390_opcode *opformat;
1739 unsigned char insn[6];
1740 char *s;
1741
1742 /* Get the opcode format. */
1743 s = input_line_pointer;
3882b010 1744 while (*s != '\0' && *s != ',' && ! ISSPACE (*s))
a85d7ed0
NC
1745 s++;
1746 if (*s != ',')
1747 as_bad (_("Invalid .insn format\n"));
1748 *s++ = '\0';
1749
1750 /* Look up the opcode in the hash table. */
1751 opformat = (struct s390_opcode *)
1752 hash_find (s390_opformat_hash, input_line_pointer);
07855bec
NC
1753 if (opformat == (const struct s390_opcode *) NULL)
1754 {
1755 as_bad (_("Unrecognized opcode format: `%s'"), input_line_pointer);
1756 return;
1757 }
a85d7ed0
NC
1758 input_line_pointer = s;
1759 expression (&exp);
07855bec
NC
1760 if (exp.X_op == O_constant)
1761 {
1d6d62a4 1762 if ( ( opformat->oplen == 6
1d6d62a4
MS
1763 && (addressT) exp.X_add_number < (1ULL << 48))
1764 || ( opformat->oplen == 4
1d6d62a4
MS
1765 && (addressT) exp.X_add_number < (1ULL << 32))
1766 || ( opformat->oplen == 2
1d6d62a4 1767 && (addressT) exp.X_add_number < (1ULL << 16)))
2132e3a3 1768 md_number_to_chars ((char *) insn, exp.X_add_number, opformat->oplen);
07855bec 1769 else
07726851 1770 as_bad (_("Invalid .insn format\n"));
07855bec
NC
1771 }
1772 else if (exp.X_op == O_big)
1773 {
16a419ba
NC
1774 if (exp.X_add_number > 0
1775 && opformat->oplen == 6
1776 && generic_bignum[3] == 0)
07855bec 1777 {
2132e3a3
AM
1778 md_number_to_chars ((char *) insn, generic_bignum[2], 2);
1779 md_number_to_chars ((char *) &insn[2], generic_bignum[1], 2);
1780 md_number_to_chars ((char *) &insn[4], generic_bignum[0], 2);
07855bec
NC
1781 }
1782 else
07726851 1783 as_bad (_("Invalid .insn format\n"));
07855bec
NC
1784 }
1785 else
a85d7ed0 1786 as_bad (_("second operand of .insn not a constant\n"));
a85d7ed0 1787
b6849f55
NC
1788 if (strcmp (opformat->name, "e") != 0 && *input_line_pointer++ != ',')
1789 as_bad (_("missing comma after insn constant\n"));
98d3f06f 1790
07726851 1791 if ((s = strchr (input_line_pointer, '\n')) != NULL)
a85d7ed0 1792 *s = '\0';
b6849f55
NC
1793 input_line_pointer = md_gather_operands (input_line_pointer, insn,
1794 opformat);
a85d7ed0
NC
1795 if (s != NULL)
1796 *s = '\n';
1797 demand_empty_rest_of_line ();
1798}
1799
1800/* The .byte pseudo-op. This is similar to the normal .byte
1801 pseudo-op, but it can also take a single ASCII string. */
1802
1803static void
5a49b8ac 1804s390_byte (int ignore ATTRIBUTE_UNUSED)
a85d7ed0
NC
1805{
1806 if (*input_line_pointer != '\"')
1807 {
1808 cons (1);
1809 return;
1810 }
1811
1812 /* Gather characters. A real double quote is doubled. Unusual
1813 characters are not permitted. */
1814 ++input_line_pointer;
1815 while (1)
1816 {
1817 char c;
1818
1819 c = *input_line_pointer++;
1820
1821 if (c == '\"')
1822 {
1823 if (*input_line_pointer != '\"')
1824 break;
1825 ++input_line_pointer;
1826 }
1827
1828 FRAG_APPEND_1_CHAR (c);
1829 }
1830
1831 demand_empty_rest_of_line ();
1832}
1833
1834/* The .ltorg pseudo-op.This emits all literals defined since the last
198ce79b 1835 .ltorg or the invocation of gas. Literals are defined with the
a85d7ed0
NC
1836 @lit suffix. */
1837
1838static void
5a49b8ac 1839s390_literals (int ignore ATTRIBUTE_UNUSED)
a85d7ed0
NC
1840{
1841 struct s390_lpe *lpe;
1842
1843 if (lp_sym == NULL || lpe_count == 0)
98d3f06f 1844 return; /* Nothing to be done. */
a85d7ed0
NC
1845
1846 /* Emit symbol for start of literal pool. */
1847 S_SET_SEGMENT (lp_sym, now_seg);
1848 S_SET_VALUE (lp_sym, (valueT) frag_now_fix ());
1849 lp_sym->sy_frag = frag_now;
1850
07855bec
NC
1851 while (lpe_list)
1852 {
1853 lpe = lpe_list;
1854 lpe_list = lpe_list->next;
1855 S_SET_SEGMENT (lpe->sym, now_seg);
1856 S_SET_VALUE (lpe->sym, (valueT) frag_now_fix ());
1857 lpe->sym->sy_frag = frag_now;
1858
1859 /* Emit literal pool entry. */
1860 if (lpe->reloc != BFD_RELOC_UNUSED)
1861 {
198ce79b 1862 reloc_howto_type *reloc_howto =
07855bec
NC
1863 bfd_reloc_type_lookup (stdoutput, lpe->reloc);
1864 int size = bfd_get_reloc_size (reloc_howto);
1865 char *where;
1866
1867 if (size > lpe->nbytes)
1868 as_bad (_("%s relocations do not fit in %d bytes"),
1869 reloc_howto->name, lpe->nbytes);
07726851 1870 where = frag_more (lpe->nbytes);
07855bec
NC
1871 md_number_to_chars (where, 0, size);
1872 fix_new_exp (frag_now, where - frag_now->fr_literal,
1873 size, &lpe->ex, reloc_howto->pc_relative, lpe->reloc);
1874 }
1875 else
1876 {
1877 if (lpe->ex.X_op == O_big)
1878 {
1879 if (lpe->ex.X_add_number <= 0)
1880 generic_floating_point_number = lpe->floatnum;
1881 else
1882 memcpy (generic_bignum, lpe->bignum,
98d3f06f 1883 lpe->ex.X_add_number * sizeof (LITTLENUM_TYPE));
07855bec
NC
1884 }
1885 emit_expr (&lpe->ex, lpe->nbytes);
1886 }
a85d7ed0 1887
07855bec
NC
1888 lpe->next = lpe_free_list;
1889 lpe_free_list = lpe;
1890 }
a85d7ed0
NC
1891 lpe_list_tail = NULL;
1892 lp_sym = NULL;
1893 lp_count++;
1894 lpe_count = 0;
1895}
1896
7ecc513a
DV
1897#define MAX_HISTORY 100
1898
902cc293
AK
1899/* The .machine pseudo op allows to switch to a different CPU level in
1900 the asm listing. The current CPU setting can be stored on a stack
1dd53816 1901 with .machine push and restored with .machine pop. */
902cc293
AK
1902
1903static void
1904s390_machine (int ignore ATTRIBUTE_UNUSED)
1905{
1906 char *cpu_string;
325801bd 1907 static struct cpu_history
7ecc513a
DV
1908 {
1909 unsigned int cpu;
1910 unsigned int flags;
1911 } *cpu_history;
902cc293
AK
1912 static int curr_hist;
1913
1914 SKIP_WHITESPACE ();
1915
1916 if (*input_line_pointer == '"')
1917 {
1918 int len;
1919 cpu_string = demand_copy_C_string (&len);
1920 }
1921 else
1922 {
1923 char c;
7ecc513a
DV
1924
1925 cpu_string = input_line_pointer;
1926 do
1927 {
1928 char * str;
1929
1930 c = get_symbol_name (&str);
1931 c = restore_line_pointer (c);
1932 if (c == '+')
1933 ++ input_line_pointer;
1934 }
1935 while (c == '+');
1936
1937 c = *input_line_pointer;
1938 *input_line_pointer = 0;
902cc293 1939 cpu_string = xstrdup (cpu_string);
d02603dc 1940 (void) restore_line_pointer (c);
902cc293
AK
1941 }
1942
1943 if (cpu_string != NULL)
1944 {
7ecc513a
DV
1945 unsigned int new_cpu = current_cpu;
1946 unsigned int new_flags = current_flags;
902cc293
AK
1947
1948 if (strcmp (cpu_string, "push") == 0)
1949 {
1950 if (cpu_history == NULL)
325801bd 1951 cpu_history = XNEWVEC (struct cpu_history, MAX_HISTORY);
902cc293
AK
1952
1953 if (curr_hist >= MAX_HISTORY)
1954 as_bad (_(".machine stack overflow"));
1955 else
7ecc513a
DV
1956 {
1957 cpu_history[curr_hist].cpu = current_cpu;
1958 cpu_history[curr_hist].flags = current_flags;
1959 curr_hist++;
1960 }
902cc293
AK
1961 }
1962 else if (strcmp (cpu_string, "pop") == 0)
1963 {
1964 if (curr_hist <= 0)
1965 as_bad (_(".machine stack underflow"));
1966 else
7ecc513a
DV
1967 {
1968 curr_hist--;
1969 new_cpu = cpu_history[curr_hist].cpu;
1970 new_flags = cpu_history[curr_hist].flags;
1971 }
902cc293 1972 }
902cc293 1973 else
7ecc513a
DV
1974 new_cpu = s390_parse_cpu (cpu_string, &new_flags, TRUE);
1975
1976 if (new_cpu == S390_OPCODE_MAXCPU)
902cc293
AK
1977 as_bad (_("invalid machine `%s'"), cpu_string);
1978
7ecc513a
DV
1979 if (new_cpu != current_cpu || new_flags != current_flags)
1980 {
1981 current_cpu = new_cpu;
1982 current_flags = new_flags;
1983 s390_setup_opcodes ();
1984 }
902cc293
AK
1985 }
1986
1987 demand_empty_rest_of_line ();
1988}
1989
1dd53816
AK
1990/* The .machinemode pseudo op allows to switch to a different
1991 architecture mode in the asm listing. The current architecture
1992 mode setting can be stored on a stack with .machinemode push and
1993 restored with .machinemode pop. */
1994
1995static void
1996s390_machinemode (int ignore ATTRIBUTE_UNUSED)
1997{
1998 char *mode_string;
1dd53816
AK
1999 static unsigned int *mode_history;
2000 static int curr_hist;
2001
2002 SKIP_WHITESPACE ();
2003
d02603dc
NC
2004 {
2005 char c;
2006
2007 c = get_symbol_name (&mode_string);
2008 mode_string = xstrdup (mode_string);
2009 (void) restore_line_pointer (c);
2010 }
1dd53816
AK
2011
2012 if (mode_string != NULL)
2013 {
2014 unsigned int old_mode_mask = current_mode_mask;
2015 char *p;
2016
2017 for (p = mode_string; *p != 0; p++)
2018 *p = TOLOWER (*p);
2019
2020 if (strcmp (mode_string, "push") == 0)
2021 {
2022 if (mode_history == NULL)
325801bd 2023 mode_history = XNEWVEC (unsigned int, MAX_HISTORY);
1dd53816
AK
2024
2025 if (curr_hist >= MAX_HISTORY)
2026 as_bad (_(".machinemode stack overflow"));
2027 else
2028 mode_history[curr_hist++] = current_mode_mask;
2029 }
2030 else if (strcmp (mode_string, "pop") == 0)
2031 {
2032 if (curr_hist <= 0)
2033 as_bad (_(".machinemode stack underflow"));
2034 else
2035 current_mode_mask = mode_history[--curr_hist];
2036 }
2037 else
2038 {
2039 if (strcmp (mode_string, "esa") == 0)
2040 current_mode_mask = 1 << S390_OPCODE_ESA;
2041 else if (strcmp (mode_string, "zarch") == 0)
2042 {
2043 if (s390_arch_size == 32)
2044 set_highgprs_p = TRUE;
2045 current_mode_mask = 1 << S390_OPCODE_ZARCH;
2046 }
2047 else if (strcmp (mode_string, "zarch_nohighgprs") == 0)
2048 current_mode_mask = 1 << S390_OPCODE_ZARCH;
2049 else
7ecc513a 2050 as_bad (_("invalid machine mode `%s'"), mode_string);
1dd53816
AK
2051 }
2052
2053 if (current_mode_mask != old_mode_mask)
2054 s390_setup_opcodes ();
2055 }
2056
2057 demand_empty_rest_of_line ();
2058}
2059
7ecc513a
DV
2060#undef MAX_HISTORY
2061
6d4af3c2 2062const char *
499ac353 2063md_atof (int type, char *litp, int *sizep)
a85d7ed0 2064{
499ac353 2065 return ieee_md_atof (type, litp, sizep, TRUE);
a85d7ed0
NC
2066}
2067
2068/* Align a section (I don't know why this is machine dependent). */
2069
2070valueT
5a49b8ac 2071md_section_align (asection *seg, valueT addr)
a85d7ed0
NC
2072{
2073 int align = bfd_get_section_alignment (stdoutput, seg);
2074
8d3842cd 2075 return ((addr + (1 << align) - 1) & -(1 << align));
a85d7ed0
NC
2076}
2077
2078/* We don't have any form of relaxing. */
2079
2080int
5a49b8ac
AM
2081md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
2082 asection *seg ATTRIBUTE_UNUSED)
a85d7ed0
NC
2083{
2084 abort ();
2085 return 0;
2086}
2087
2088/* Convert a machine dependent frag. We never generate these. */
2089
2090void
5a49b8ac
AM
2091md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
2092 asection *sec ATTRIBUTE_UNUSED,
2093 fragS *fragp ATTRIBUTE_UNUSED)
a85d7ed0
NC
2094{
2095 abort ();
2096}
2097
2098symbolS *
5a49b8ac 2099md_undefined_symbol (char *name)
a85d7ed0 2100{
98d3f06f 2101 if (*name == '_' && *(name + 1) == 'G'
07726851 2102 && strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0)
98d3f06f
KH
2103 {
2104 if (!GOT_symbol)
2105 {
2106 if (symbol_find (name))
2107 as_bad (_("GOT already in symbol table"));
2108 GOT_symbol = symbol_new (name, undefined_section,
2109 (valueT) 0, &zero_address_frag);
2110 }
2111 return GOT_symbol;
2112 }
a85d7ed0
NC
2113 return 0;
2114}
2115
2116/* Functions concerning relocs. */
2117
2118/* The location from which a PC relative jump should be calculated,
2119 given a PC relative reloc. */
2120
2121long
5a49b8ac 2122md_pcrel_from_section (fixS *fixp, segT sec ATTRIBUTE_UNUSED)
a85d7ed0
NC
2123{
2124 return fixp->fx_frag->fr_address + fixp->fx_where;
2125}
2126
2127/* Here we decide which fixups can be adjusted to make them relative to
2128 the beginning of the section instead of the symbol. Basically we need
2129 to make sure that the dynamic relocations are done correctly, so in
2130 some cases we force the original symbol to be used. */
2131int
5a49b8ac 2132tc_s390_fix_adjustable (fixS *fixP)
a85d7ed0 2133{
0a00dd48
MS
2134 /* Don't adjust references to merge sections. */
2135 if ((S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0)
2136 return 0;
a85d7ed0 2137 /* adjust_reloc_syms doesn't know about the GOT. */
2a19f73f
MS
2138 if ( fixP->fx_r_type == BFD_RELOC_16_GOTOFF
2139 || fixP->fx_r_type == BFD_RELOC_32_GOTOFF
2140 || fixP->fx_r_type == BFD_RELOC_390_GOTOFF64
2141 || fixP->fx_r_type == BFD_RELOC_390_PLTOFF16
2142 || fixP->fx_r_type == BFD_RELOC_390_PLTOFF32
2143 || fixP->fx_r_type == BFD_RELOC_390_PLTOFF64
fb798c50 2144 || fixP->fx_r_type == BFD_RELOC_390_PLT12DBL
a85d7ed0 2145 || fixP->fx_r_type == BFD_RELOC_390_PLT16DBL
fb798c50 2146 || fixP->fx_r_type == BFD_RELOC_390_PLT24DBL
a85d7ed0
NC
2147 || fixP->fx_r_type == BFD_RELOC_390_PLT32
2148 || fixP->fx_r_type == BFD_RELOC_390_PLT32DBL
2149 || fixP->fx_r_type == BFD_RELOC_390_PLT64
2150 || fixP->fx_r_type == BFD_RELOC_390_GOT12
933fbc29 2151 || fixP->fx_r_type == BFD_RELOC_390_GOT20
a85d7ed0
NC
2152 || fixP->fx_r_type == BFD_RELOC_390_GOT16
2153 || fixP->fx_r_type == BFD_RELOC_32_GOT_PCREL
2154 || fixP->fx_r_type == BFD_RELOC_390_GOT64
07855bec 2155 || fixP->fx_r_type == BFD_RELOC_390_GOTENT
2a19f73f
MS
2156 || fixP->fx_r_type == BFD_RELOC_390_GOTPLT12
2157 || fixP->fx_r_type == BFD_RELOC_390_GOTPLT16
933fbc29 2158 || fixP->fx_r_type == BFD_RELOC_390_GOTPLT20
2a19f73f
MS
2159 || fixP->fx_r_type == BFD_RELOC_390_GOTPLT32
2160 || fixP->fx_r_type == BFD_RELOC_390_GOTPLT64
2161 || fixP->fx_r_type == BFD_RELOC_390_GOTPLTENT
1971b29d
MS
2162 || fixP->fx_r_type == BFD_RELOC_390_TLS_LOAD
2163 || fixP->fx_r_type == BFD_RELOC_390_TLS_GDCALL
2164 || fixP->fx_r_type == BFD_RELOC_390_TLS_LDCALL
2165 || fixP->fx_r_type == BFD_RELOC_390_TLS_GD32
2166 || fixP->fx_r_type == BFD_RELOC_390_TLS_GD64
2167 || fixP->fx_r_type == BFD_RELOC_390_TLS_GOTIE12
933fbc29 2168 || fixP->fx_r_type == BFD_RELOC_390_TLS_GOTIE20
1971b29d
MS
2169 || fixP->fx_r_type == BFD_RELOC_390_TLS_GOTIE32
2170 || fixP->fx_r_type == BFD_RELOC_390_TLS_GOTIE64
2171 || fixP->fx_r_type == BFD_RELOC_390_TLS_LDM32
2172 || fixP->fx_r_type == BFD_RELOC_390_TLS_LDM64
2173 || fixP->fx_r_type == BFD_RELOC_390_TLS_IE32
2174 || fixP->fx_r_type == BFD_RELOC_390_TLS_IE64
2175 || fixP->fx_r_type == BFD_RELOC_390_TLS_IEENT
2176 || fixP->fx_r_type == BFD_RELOC_390_TLS_LE32
2177 || fixP->fx_r_type == BFD_RELOC_390_TLS_LE64
2178 || fixP->fx_r_type == BFD_RELOC_390_TLS_LDO32
2179 || fixP->fx_r_type == BFD_RELOC_390_TLS_LDO64
2180 || fixP->fx_r_type == BFD_RELOC_390_TLS_DTPMOD
2181 || fixP->fx_r_type == BFD_RELOC_390_TLS_DTPOFF
2182 || fixP->fx_r_type == BFD_RELOC_390_TLS_TPOFF
a85d7ed0
NC
2183 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2184 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2185 return 0;
2186 return 1;
2187}
2188
b8edc45c 2189/* Return true if we must always emit a reloc for a type and false if
c03099e6 2190 there is some hope of resolving it at assembly time. */
b8edc45c 2191int
5a49b8ac 2192tc_s390_force_relocation (struct fix *fixp)
b8edc45c
MS
2193{
2194 /* Ensure we emit a relocation for every reference to the global
2195 offset table or to the procedure link table. */
2196 switch (fixp->fx_r_type)
2197 {
2198 case BFD_RELOC_390_GOT12:
933fbc29 2199 case BFD_RELOC_390_GOT20:
b8edc45c
MS
2200 case BFD_RELOC_32_GOT_PCREL:
2201 case BFD_RELOC_32_GOTOFF:
2a19f73f
MS
2202 case BFD_RELOC_390_GOTOFF64:
2203 case BFD_RELOC_390_PLTOFF16:
2204 case BFD_RELOC_390_PLTOFF32:
2205 case BFD_RELOC_390_PLTOFF64:
b8edc45c
MS
2206 case BFD_RELOC_390_GOTPC:
2207 case BFD_RELOC_390_GOT16:
2208 case BFD_RELOC_390_GOTPCDBL:
2209 case BFD_RELOC_390_GOT64:
2210 case BFD_RELOC_390_GOTENT:
2211 case BFD_RELOC_390_PLT32:
fb798c50 2212 case BFD_RELOC_390_PLT12DBL:
b8edc45c 2213 case BFD_RELOC_390_PLT16DBL:
fb798c50 2214 case BFD_RELOC_390_PLT24DBL:
b8edc45c
MS
2215 case BFD_RELOC_390_PLT32DBL:
2216 case BFD_RELOC_390_PLT64:
2a19f73f
MS
2217 case BFD_RELOC_390_GOTPLT12:
2218 case BFD_RELOC_390_GOTPLT16:
933fbc29 2219 case BFD_RELOC_390_GOTPLT20:
2a19f73f
MS
2220 case BFD_RELOC_390_GOTPLT32:
2221 case BFD_RELOC_390_GOTPLT64:
2222 case BFD_RELOC_390_GOTPLTENT:
b8edc45c
MS
2223 return 1;
2224 default:
5bb3703f 2225 break;
b8edc45c 2226 }
a161fe53 2227
ae6063d4 2228 return generic_force_reloc (fixp);
b8edc45c
MS
2229}
2230
a85d7ed0
NC
2231/* Apply a fixup to the object code. This is called for all the
2232 fixups we generated by the call to fix_new_exp, above. In the call
2233 above we used a reloc code which was the largest legal reloc code
2234 plus the operand index. Here we undo that to recover the operand
2235 index. At this point all symbol values should be fully resolved,
2236 and we attempt to completely resolve the reloc. If we can not do
2237 that, we determine the correct reloc code and put it back in the
2238 fixup. */
2239
94f592af 2240void
5a49b8ac 2241md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
a85d7ed0
NC
2242{
2243 char *where;
98d3f06f 2244 valueT value = *valP;
a85d7ed0 2245
94f592af 2246 where = fixP->fx_frag->fr_literal + fixP->fx_where;
a85d7ed0 2247
98d3f06f 2248 if (fixP->fx_subsy != NULL)
f1fc51da 2249 as_bad_where (fixP->fx_file, fixP->fx_line,
20203fb9 2250 _("cannot emit relocation %s against subsy symbol %s"),
f1fc51da
MS
2251 bfd_get_reloc_code_name (fixP->fx_r_type),
2252 S_GET_NAME (fixP->fx_subsy));
98d3f06f
KH
2253
2254 if (fixP->fx_addsy != NULL)
07855bec 2255 {
94f592af
NC
2256 if (fixP->fx_pcrel)
2257 value += fixP->fx_frag->fr_address + fixP->fx_where;
07855bec
NC
2258 }
2259 else
94f592af 2260 fixP->fx_done = 1;
a85d7ed0 2261
94f592af 2262 if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
07855bec
NC
2263 {
2264 const struct s390_operand *operand;
2265 int opindex;
198ce79b 2266
94f592af 2267 opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
07855bec 2268 operand = &s390_operands[opindex];
198ce79b 2269
94f592af 2270 if (fixP->fx_done)
07855bec
NC
2271 {
2272 /* Insert the fully resolved operand value. */
2132e3a3
AM
2273 s390_insert_operand ((unsigned char *) where, operand,
2274 (offsetT) value, fixP->fx_file, fixP->fx_line);
94f592af 2275 return;
07855bec 2276 }
198ce79b 2277
07855bec
NC
2278 /* Determine a BFD reloc value based on the operand information.
2279 We are only prepared to turn a few of the operands into
2280 relocs. */
94f592af 2281 fixP->fx_offset = value;
07855bec
NC
2282 if (operand->bits == 12 && operand->shift == 20)
2283 {
94f592af
NC
2284 fixP->fx_size = 2;
2285 fixP->fx_where += 2;
2286 fixP->fx_r_type = BFD_RELOC_390_12;
07855bec
NC
2287 }
2288 else if (operand->bits == 12 && operand->shift == 36)
2289 {
94f592af
NC
2290 fixP->fx_size = 2;
2291 fixP->fx_where += 4;
2292 fixP->fx_r_type = BFD_RELOC_390_12;
07855bec 2293 }
933fbc29
MS
2294 else if (operand->bits == 20 && operand->shift == 20)
2295 {
2296 fixP->fx_size = 2;
2297 fixP->fx_where += 2;
2298 fixP->fx_r_type = BFD_RELOC_390_20;
2299 }
07855bec
NC
2300 else if (operand->bits == 8 && operand->shift == 8)
2301 {
94f592af
NC
2302 fixP->fx_size = 1;
2303 fixP->fx_where += 1;
2304 fixP->fx_r_type = BFD_RELOC_8;
07855bec 2305 }
fb798c50
AK
2306 else if (operand->bits == 12 && operand->shift == 12
2307 && (operand->flags & S390_OPERAND_PCREL))
2308 {
2309 fixP->fx_size = 2;
2310 fixP->fx_where += 1;
2311 fixP->fx_offset += 1;
feb4bea7 2312 fixP->fx_pcrel_adjust = 1;
fb798c50
AK
2313 fixP->fx_r_type = BFD_RELOC_390_PC12DBL;
2314 }
07855bec
NC
2315 else if (operand->bits == 16 && operand->shift == 16)
2316 {
94f592af
NC
2317 fixP->fx_size = 2;
2318 fixP->fx_where += 2;
07855bec
NC
2319 if (operand->flags & S390_OPERAND_PCREL)
2320 {
94f592af
NC
2321 fixP->fx_r_type = BFD_RELOC_390_PC16DBL;
2322 fixP->fx_offset += 2;
feb4bea7 2323 fixP->fx_pcrel_adjust = 2;
07855bec
NC
2324 }
2325 else
94f592af 2326 fixP->fx_r_type = BFD_RELOC_16;
07855bec 2327 }
feb4bea7
AK
2328 else if (operand->bits == 16 && operand->shift == 32
2329 && (operand->flags & S390_OPERAND_PCREL))
2330 {
2331 fixP->fx_size = 2;
2332 fixP->fx_where += 4;
2333 fixP->fx_offset += 4;
2334 fixP->fx_pcrel_adjust = 4;
2335 fixP->fx_r_type = BFD_RELOC_390_PC16DBL;
2336 }
fb798c50
AK
2337 else if (operand->bits == 24 && operand->shift == 24
2338 && (operand->flags & S390_OPERAND_PCREL))
2339 {
2340 fixP->fx_size = 3;
2341 fixP->fx_where += 3;
2342 fixP->fx_offset += 3;
feb4bea7 2343 fixP->fx_pcrel_adjust = 3;
fb798c50
AK
2344 fixP->fx_r_type = BFD_RELOC_390_PC24DBL;
2345 }
16a419ba
NC
2346 else if (operand->bits == 32 && operand->shift == 16
2347 && (operand->flags & S390_OPERAND_PCREL))
07855bec 2348 {
94f592af
NC
2349 fixP->fx_size = 4;
2350 fixP->fx_where += 2;
2351 fixP->fx_offset += 2;
feb4bea7 2352 fixP->fx_pcrel_adjust = 2;
94f592af 2353 fixP->fx_r_type = BFD_RELOC_390_PC32DBL;
07855bec 2354 }
a85d7ed0 2355 else
07855bec 2356 {
3b4dbbbf 2357 const char *sfile;
07855bec 2358 unsigned int sline;
198ce79b 2359
07855bec
NC
2360 /* Use expr_symbol_where to see if this is an expression
2361 symbol. */
94f592af
NC
2362 if (expr_symbol_where (fixP->fx_addsy, &sfile, &sline))
2363 as_bad_where (fixP->fx_file, fixP->fx_line,
07855bec
NC
2364 _("unresolved expression that must be resolved"));
2365 else
94f592af 2366 as_bad_where (fixP->fx_file, fixP->fx_line,
07855bec 2367 _("unsupported relocation type"));
94f592af
NC
2368 fixP->fx_done = 1;
2369 return;
07855bec 2370 }
a85d7ed0 2371 }
07855bec
NC
2372 else
2373 {
94f592af 2374 switch (fixP->fx_r_type)
07855bec
NC
2375 {
2376 case BFD_RELOC_8:
94f592af 2377 if (fixP->fx_pcrel)
07855bec 2378 abort ();
94f592af 2379 if (fixP->fx_done)
07855bec
NC
2380 md_number_to_chars (where, value, 1);
2381 break;
2382 case BFD_RELOC_390_12:
2383 case BFD_RELOC_390_GOT12:
2a19f73f 2384 case BFD_RELOC_390_GOTPLT12:
fb798c50
AK
2385 case BFD_RELOC_390_PC12DBL:
2386 case BFD_RELOC_390_PLT12DBL:
2387 if (fixP->fx_pcrel)
feb4bea7 2388 value += fixP->fx_pcrel_adjust;
fb798c50 2389
94f592af 2390 if (fixP->fx_done)
07855bec
NC
2391 {
2392 unsigned short mop;
2393
fb798c50
AK
2394 if (fixP->fx_pcrel)
2395 value >>= 1;
2396
07855bec
NC
2397 mop = bfd_getb16 ((unsigned char *) where);
2398 mop |= (unsigned short) (value & 0xfff);
2399 bfd_putb16 ((bfd_vma) mop, (unsigned char *) where);
198ce79b 2400 }
07855bec 2401 break;
198ce79b 2402
933fbc29
MS
2403 case BFD_RELOC_390_20:
2404 case BFD_RELOC_390_GOT20:
2405 case BFD_RELOC_390_GOTPLT20:
2406 if (fixP->fx_done)
2407 {
2408 unsigned int mop;
2409 mop = bfd_getb32 ((unsigned char *) where);
2410 mop |= (unsigned int) ((value & 0xfff) << 8 |
2411 (value & 0xff000) >> 12);
2412 bfd_putb32 ((bfd_vma) mop, (unsigned char *) where);
3739860c 2413 }
933fbc29
MS
2414 break;
2415
07855bec
NC
2416 case BFD_RELOC_16:
2417 case BFD_RELOC_GPREL16:
2418 case BFD_RELOC_16_GOT_PCREL:
2419 case BFD_RELOC_16_GOTOFF:
94f592af
NC
2420 if (fixP->fx_pcrel)
2421 as_bad_where (fixP->fx_file, fixP->fx_line,
20203fb9 2422 _("cannot emit PC relative %s relocation%s%s"),
94f592af
NC
2423 bfd_get_reloc_code_name (fixP->fx_r_type),
2424 fixP->fx_addsy != NULL ? " against " : "",
2425 (fixP->fx_addsy != NULL
2426 ? S_GET_NAME (fixP->fx_addsy)
07855bec 2427 : ""));
94f592af 2428 if (fixP->fx_done)
07855bec
NC
2429 md_number_to_chars (where, value, 2);
2430 break;
2431 case BFD_RELOC_390_GOT16:
2a19f73f
MS
2432 case BFD_RELOC_390_PLTOFF16:
2433 case BFD_RELOC_390_GOTPLT16:
94f592af 2434 if (fixP->fx_done)
07855bec
NC
2435 md_number_to_chars (where, value, 2);
2436 break;
2437 case BFD_RELOC_390_PC16DBL:
2438 case BFD_RELOC_390_PLT16DBL:
feb4bea7 2439 value += fixP->fx_pcrel_adjust;
94f592af 2440 if (fixP->fx_done)
07855bec
NC
2441 md_number_to_chars (where, (offsetT) value >> 1, 2);
2442 break;
2443
fb798c50
AK
2444 case BFD_RELOC_390_PC24DBL:
2445 case BFD_RELOC_390_PLT24DBL:
feb4bea7 2446 value += fixP->fx_pcrel_adjust;
fb798c50
AK
2447 if (fixP->fx_done)
2448 {
2449 unsigned int mop;
2450 value >>= 1;
2451
2452 mop = bfd_getb32 ((unsigned char *) where - 1);
2453 mop |= (unsigned int) (value & 0xffffff);
2454 bfd_putb32 ((bfd_vma) mop, (unsigned char *) where - 1);
2455 }
2456 break;
2457
07855bec 2458 case BFD_RELOC_32:
94f592af
NC
2459 if (fixP->fx_pcrel)
2460 fixP->fx_r_type = BFD_RELOC_32_PCREL;
07855bec 2461 else
94f592af
NC
2462 fixP->fx_r_type = BFD_RELOC_32;
2463 if (fixP->fx_done)
07855bec
NC
2464 md_number_to_chars (where, value, 4);
2465 break;
2466 case BFD_RELOC_32_PCREL:
2467 case BFD_RELOC_32_BASEREL:
94f592af
NC
2468 fixP->fx_r_type = BFD_RELOC_32_PCREL;
2469 if (fixP->fx_done)
07855bec
NC
2470 md_number_to_chars (where, value, 4);
2471 break;
2472 case BFD_RELOC_32_GOT_PCREL:
2a19f73f 2473 case BFD_RELOC_390_PLTOFF32:
07855bec 2474 case BFD_RELOC_390_PLT32:
2a19f73f 2475 case BFD_RELOC_390_GOTPLT32:
94f592af 2476 if (fixP->fx_done)
07855bec
NC
2477 md_number_to_chars (where, value, 4);
2478 break;
2479 case BFD_RELOC_390_PC32DBL:
2480 case BFD_RELOC_390_PLT32DBL:
2481 case BFD_RELOC_390_GOTPCDBL:
2482 case BFD_RELOC_390_GOTENT:
2a19f73f 2483 case BFD_RELOC_390_GOTPLTENT:
feb4bea7 2484 value += fixP->fx_pcrel_adjust;
94f592af 2485 if (fixP->fx_done)
07855bec
NC
2486 md_number_to_chars (where, (offsetT) value >> 1, 4);
2487 break;
2488
2489 case BFD_RELOC_32_GOTOFF:
94f592af 2490 if (fixP->fx_done)
07726851 2491 md_number_to_chars (where, value, sizeof (int));
07855bec
NC
2492 break;
2493
2a19f73f
MS
2494 case BFD_RELOC_390_GOTOFF64:
2495 if (fixP->fx_done)
2496 md_number_to_chars (where, value, 8);
2497 break;
2498
07855bec 2499 case BFD_RELOC_390_GOT64:
2a19f73f 2500 case BFD_RELOC_390_PLTOFF64:
07855bec 2501 case BFD_RELOC_390_PLT64:
2a19f73f 2502 case BFD_RELOC_390_GOTPLT64:
94f592af 2503 if (fixP->fx_done)
07855bec
NC
2504 md_number_to_chars (where, value, 8);
2505 break;
2506
2507 case BFD_RELOC_64:
94f592af
NC
2508 if (fixP->fx_pcrel)
2509 fixP->fx_r_type = BFD_RELOC_64_PCREL;
07855bec 2510 else
94f592af
NC
2511 fixP->fx_r_type = BFD_RELOC_64;
2512 if (fixP->fx_done)
07855bec
NC
2513 md_number_to_chars (where, value, 8);
2514 break;
2515
2516 case BFD_RELOC_64_PCREL:
94f592af
NC
2517 fixP->fx_r_type = BFD_RELOC_64_PCREL;
2518 if (fixP->fx_done)
07855bec
NC
2519 md_number_to_chars (where, value, 8);
2520 break;
2521
2522 case BFD_RELOC_VTABLE_INHERIT:
2523 case BFD_RELOC_VTABLE_ENTRY:
94f592af
NC
2524 fixP->fx_done = 0;
2525 return;
07855bec 2526
1971b29d
MS
2527 case BFD_RELOC_390_TLS_LOAD:
2528 case BFD_RELOC_390_TLS_GDCALL:
2529 case BFD_RELOC_390_TLS_LDCALL:
2530 case BFD_RELOC_390_TLS_GD32:
2531 case BFD_RELOC_390_TLS_GD64:
2532 case BFD_RELOC_390_TLS_GOTIE12:
933fbc29 2533 case BFD_RELOC_390_TLS_GOTIE20:
1971b29d
MS
2534 case BFD_RELOC_390_TLS_GOTIE32:
2535 case BFD_RELOC_390_TLS_GOTIE64:
2536 case BFD_RELOC_390_TLS_LDM32:
2537 case BFD_RELOC_390_TLS_LDM64:
2538 case BFD_RELOC_390_TLS_IE32:
2539 case BFD_RELOC_390_TLS_IE64:
2540 case BFD_RELOC_390_TLS_LE32:
2541 case BFD_RELOC_390_TLS_LE64:
2542 case BFD_RELOC_390_TLS_LDO32:
2543 case BFD_RELOC_390_TLS_LDO64:
2544 case BFD_RELOC_390_TLS_DTPMOD:
2545 case BFD_RELOC_390_TLS_DTPOFF:
2546 case BFD_RELOC_390_TLS_TPOFF:
7c1d0959 2547 S_SET_THREAD_LOCAL (fixP->fx_addsy);
1971b29d
MS
2548 /* Fully resolved at link time. */
2549 break;
2550 case BFD_RELOC_390_TLS_IEENT:
2551 /* Fully resolved at link time. */
7c1d0959 2552 S_SET_THREAD_LOCAL (fixP->fx_addsy);
1971b29d
MS
2553 value += 2;
2554 break;
2555
07855bec
NC
2556 default:
2557 {
94f592af 2558 const char *reloc_name = bfd_get_reloc_code_name (fixP->fx_r_type);
198ce79b 2559
07855bec 2560 if (reloc_name != NULL)
20203fb9 2561 as_fatal (_("Gas failure, reloc type %s\n"), reloc_name);
07855bec 2562 else
20203fb9 2563 as_fatal (_("Gas failure, reloc type #%i\n"), fixP->fx_r_type);
07855bec
NC
2564 }
2565 }
a85d7ed0 2566
94f592af 2567 fixP->fx_offset = value;
07855bec 2568 }
a85d7ed0
NC
2569}
2570
2571/* Generate a reloc for a fixup. */
2572
2573arelent *
5a49b8ac 2574tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
a85d7ed0
NC
2575{
2576 bfd_reloc_code_real_type code;
2577 arelent *reloc;
2578
2579 code = fixp->fx_r_type;
07855bec
NC
2580 if (GOT_symbol && fixp->fx_addsy == GOT_symbol)
2581 {
16a419ba
NC
2582 if ( (s390_arch_size == 32 && code == BFD_RELOC_32_PCREL)
2583 || (s390_arch_size == 64 && code == BFD_RELOC_64_PCREL))
07855bec
NC
2584 code = BFD_RELOC_390_GOTPC;
2585 if (code == BFD_RELOC_390_PC32DBL)
2586 code = BFD_RELOC_390_GOTPCDBL;
2587 }
a85d7ed0 2588
325801bd
TS
2589 reloc = XNEW (arelent);
2590 reloc->sym_ptr_ptr = XNEW (asymbol *);
a85d7ed0
NC
2591 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2592 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2593 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
2594 if (reloc->howto == NULL)
2595 {
2596 as_bad_where (fixp->fx_file, fixp->fx_line,
98d3f06f
KH
2597 _("cannot represent relocation type %s"),
2598 bfd_get_reloc_code_name (code));
a85d7ed0
NC
2599 /* Set howto to a garbage value so that we can keep going. */
2600 reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
9c2799c2 2601 gas_assert (reloc->howto != NULL);
a85d7ed0
NC
2602 }
2603 reloc->addend = fixp->fx_offset;
2604
2605 return reloc;
2606}
75e21f08
JJ
2607
2608void
5a49b8ac 2609s390_cfi_frame_initial_instructions (void)
75e21f08
JJ
2610{
2611 cfi_add_CFA_def_cfa (15, s390_arch_size == 64 ? 160 : 96);
2612}
2613
2614int
1df69f4f 2615tc_s390_regname_to_dw2regnum (char *regname)
75e21f08
JJ
2616{
2617 int regnum = -1;
2618
2619 if (regname[0] != 'c' && regname[0] != 'a')
2620 {
1e2e8c52 2621 regnum = reg_name_search (regname);
75e21f08
JJ
2622 if (regname[0] == 'f' && regnum != -1)
2623 regnum += 16;
2624 }
2625 else if (strcmp (regname, "ap") == 0)
2626 regnum = 32;
2627 else if (strcmp (regname, "cc") == 0)
2628 regnum = 33;
2629 return regnum;
2630}
55786da2
AK
2631
2632void
2633s390_elf_final_processing (void)
2634{
1dd53816 2635 if (set_highgprs_p)
55786da2
AK
2636 elf_elfheader (stdoutput)->e_flags |= EF_S390_HIGH_GPRS;
2637}
This page took 0.90362 seconds and 4 git commands to generate.