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