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