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