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