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