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