OSDN Git Service

Locale changes from Bruno Haible <haible@clisp.cons.org>.
[pf3gnuchains/pf3gnuchains3x.git] / gas / config / tc-i370.c
1 /* tc-i370.c -- Assembler for the IBM 360/370/390 instruction set.
2    Loosely based on the ppc files by Linas Vepstas <linas@linas.org> 1998, 99
3    Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
4    Free Software Foundation, Inc.
5    Written by Ian Lance Taylor, Cygnus Support.
6
7    This file is part of GAS, the GNU Assembler.
8
9    GAS is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 2, or (at your option)
12    any later version.
13
14    GAS is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with GAS; see the file COPYING.  If not, write to the Free
21    Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22    02111-1307, USA.  */
23
24 /* This assembler implements a very hacked version of an elf-like thing
25  * that gcc emits (when gcc is suitably hacked).  To make it behave more
26  * HLASM-like, try turning on the -M or --mri flag (as there are various
27  * similarities between HLASM and the MRI assemblers, such as section
28  * names, lack of leading . in pseudo-ops, DC and DS, etc ...
29  */
30
31 #include <stdio.h>
32 #include "as.h"
33 #include "c=ctype.h"
34 #include "subsegs.h"
35 #include "struc-symbol.h"
36
37 #include "opcode/i370.h"
38
39 #ifdef OBJ_ELF
40 #include "elf/i370.h"
41 #endif
42
43 /* This is the assembler for the System/390 Architecture  */
44
45 /* Tell the main code what the endianness is.  */
46 extern int target_big_endian;
47
48 \f
49 /* Generic assembler global variables which must be defined by all
50    targets.  */
51
52 #ifdef OBJ_ELF
53 /* This string holds the chars that always start a comment.  If the
54    pre-processor is disabled, these aren't very useful.  The macro
55    tc_comment_chars points to this.  We use this, rather than the
56    usual comment_chars, so that we can switch for Solaris conventions.  */
57 static const char i370_eabi_comment_chars[] = "#";
58
59 const char *i370_comment_chars = i370_eabi_comment_chars;
60 #else
61 const char comment_chars[] = "#";
62 #endif
63
64 /* Characters which start a comment at the beginning of a line.  */
65 const char line_comment_chars[] = "#*";
66
67 /* Characters which may be used to separate multiple commands on a
68    single line.  */
69 const char line_separator_chars[] = ";";
70
71 /* Characters which are used to indicate an exponent in a floating
72    point number.  */
73 const char EXP_CHARS[] = "eE";
74
75 /* Characters which mean that a number is a floating point constant,
76    as in 0d1.0.  */
77 const char FLT_CHARS[] = "dD";
78
79 void
80 md_show_usage (stream)
81      FILE *stream;
82 {
83   fprintf (stream, "\
84 S/370 options: (these have not yet been tested and may not work) \n\
85 -u                      ignored\n\
86 -mregnames              Allow symbolic names for registers\n\
87 -mno-regnames           Do not allow symbolic names for registers\n");
88 #ifdef OBJ_ELF
89   fprintf (stream, "\
90 -mrelocatable           support for GCC's -mrelocatble option\n\
91 -mrelocatable-lib       support for GCC's -mrelocatble-lib option\n\
92 -V                      print assembler version number\n");
93 #endif
94 }
95
96 \f
97 static void i370_byte PARAMS ((int));
98 static void i370_tc PARAMS ((int));
99 static void i370_ebcdic PARAMS ((int));
100
101 static void i370_dc PARAMS ((int));
102 static void i370_ds PARAMS ((int));
103 static void i370_rmode PARAMS ((int));
104 static void i370_csect PARAMS ((int));
105 static void i370_dsect PARAMS ((int));
106 static void i370_ltorg PARAMS ((int));
107 static void i370_using PARAMS ((int));
108 static void i370_drop PARAMS ((int));
109 static void i370_make_relative PARAMS ((expressionS *exp, expressionS *baseaddr));
110
111 #ifdef OBJ_ELF
112 static bfd_reloc_code_real_type i370_elf_suffix PARAMS ((char **, expressionS *));
113 static void i370_elf_cons PARAMS ((int));
114 static void i370_elf_rdata PARAMS ((int));
115 static void i370_elf_lcomm PARAMS ((int));
116 static void i370_elf_validate_fix PARAMS ((fixS *, segT));
117 #endif
118
119 \f
120 /* The target specific pseudo-ops which we support.  */
121
122 const pseudo_typeS md_pseudo_table[] =
123 {
124   /* Pseudo-ops which must be overridden.  */
125   { "byte",     i370_byte,      0 },
126
127   { "dc",       i370_dc,        0 },
128   { "ds",       i370_ds,        0 },
129   { "rmode",    i370_rmode,     0 },
130   { "csect",    i370_csect,     0 },
131   { "dsect",    i370_dsect,     0 },
132
133   /* enable ebcdic strings e.g. for 3270 support */
134   { "ebcdic",   i370_ebcdic,    0 },
135
136 #ifdef OBJ_ELF
137   { "long",     i370_elf_cons,  4 },
138   { "word",     i370_elf_cons,  4 },
139   { "short",    i370_elf_cons,  2 },
140   { "rdata",    i370_elf_rdata, 0 },
141   { "rodata",   i370_elf_rdata, 0 },
142   { "lcomm",    i370_elf_lcomm, 0 },
143 #endif
144
145   /* This pseudo-op is used even when not generating XCOFF output.  */
146   { "tc",       i370_tc,        0 },
147
148   /* dump the literal pool */
149   { "ltorg",    i370_ltorg,     0 },
150
151   /* support the hlasm-style USING directive */
152   { "using",    i370_using,     0 },
153   { "drop",     i370_drop,      0 },
154
155   { NULL,       NULL,           0 }
156 };
157
158 /* ***************************************************************** */
159
160 /* Whether to use user friendly register names.  */
161 #define TARGET_REG_NAMES_P true
162
163 static boolean reg_names_p = TARGET_REG_NAMES_P;
164
165 static boolean register_name PARAMS ((expressionS *));
166 static void i370_set_cpu PARAMS ((void));
167 static i370_insn_t i370_insert_operand
168   PARAMS ((i370_insn_t insn, const struct i370_operand *operand, offsetT val));
169 static void i370_macro PARAMS ((char *str, const struct i370_macro *macro));
170 \f
171 /* Predefined register names if -mregnames */
172 /* In general, there are lots of them, in an attempt to be compatible */
173 /* with a number of assemblers.                      */
174
175 /* Structure to hold information about predefined registers.  */
176 struct pd_reg
177   {
178     char *name;
179     int value;
180   };
181
182 /* List of registers that are pre-defined:
183
184    Each general register has predefined names of the form:
185    1. r<reg_num> which has the value <reg_num>.
186    2. r.<reg_num> which has the value <reg_num>.
187
188    Each floating point register has predefined names of the form:
189    1. f<reg_num> which has the value <reg_num>.
190    2. f.<reg_num> which has the value <reg_num>.
191
192    There are only four floating point registers, and these are
193    commonly labelled 0,2,4 and 6.  Thus, there is no f1, f3, etc.
194
195    There are individual registers as well:
196    rbase or r.base has the value  3  (base register)
197    rpgt or r.pgt   has the value  4  (page origin table pointer)
198    rarg or r.arg   has the value 11  (argument pointer)
199    rtca or r.tca   has the value 12  (table of contents pointer)
200    rtoc or r.toc   has the value 12  (table of contents pointer)
201    sp or r.sp      has the value 13  (stack pointer)
202    dsa or r.dsa    has the value 13  (stack pointer)
203    lr              has the value 14  (link reg)
204
205    The table is sorted. Suitable for searching by a binary search.  */
206
207 static const struct pd_reg pre_defined_registers[] =
208 {
209   { "arg", 11 },  /* Argument Pointer */
210   { "base", 3 },  /* Base Reg */
211
212   { "f.0", 0 },     /* Floating point registers */
213   { "f.2", 2 },
214   { "f.4", 4 },
215   { "f.6", 6 },
216
217   { "f0", 0 },
218   { "f2", 2 },
219   { "f4", 4 },
220   { "f6", 6 },
221
222   { "dsa",13 },    /* stack pointer */
223   { "lr", 14 },    /* Link Register */
224   { "pgt", 4 },    /* Page Origin Table Pointer */
225
226   { "r.0", 0 },    /* General Purpose Registers */
227   { "r.1", 1 },
228   { "r.10", 10 },
229   { "r.11", 11 },
230   { "r.12", 12 },
231   { "r.13", 13 },
232   { "r.14", 14 },
233   { "r.15", 15 },
234   { "r.2", 2 },
235   { "r.3", 3 },
236   { "r.4", 4 },
237   { "r.5", 5 },
238   { "r.6", 6 },
239   { "r.7", 7 },
240   { "r.8", 8 },
241   { "r.9", 9 },
242
243   { "r.arg", 11 },  /* Argument Pointer */
244   { "r.base", 3 },  /* Base Reg */
245   { "r.dsa", 13 },  /* Stack Pointer */
246   { "r.pgt", 4 },   /* Page Origin Table Pointer */
247   { "r.sp", 13 },   /* Stack Pointer */
248
249   { "r.tca", 12 },  /* Pointer to the table of contents */
250   { "r.toc", 12 },  /* Pointer to the table of contents */
251
252   { "r0", 0 },     /* More general purpose registers */
253   { "r1", 1 },
254   { "r10", 10 },
255   { "r11", 11 },
256   { "r12", 12 },
257   { "r13", 13 },
258   { "r14", 14 },
259   { "r15", 15 },
260   { "r2", 2 },
261   { "r3", 3 },
262   { "r4", 4 },
263   { "r5", 5 },
264   { "r6", 6 },
265   { "r7", 7 },
266   { "r8", 8 },
267   { "r9", 9 },
268
269   { "rbase", 3 },  /* Base Reg */
270
271   { "rtca", 12 },  /* Pointer to the table of contents */
272   { "rtoc", 12 },  /* Pointer to the table of contents */
273
274   { "sp", 13 },   /* Stack Pointer */
275
276 };
277
278 #define REG_NAME_CNT        (sizeof (pre_defined_registers) / sizeof (struct pd_reg))
279
280 /* Given NAME, find the register number associated with that name, return
281    the integer value associated with the given name or -1 on failure.  */
282
283 static int reg_name_search
284   PARAMS ((const struct pd_reg *, int, const char * name));
285
286 static int
287 reg_name_search (regs, regcount, name)
288      const struct pd_reg *regs;
289      int regcount;
290      const char *name;
291 {
292   int middle, low, high;
293   int cmp;
294
295   low = 0;
296   high = regcount - 1;
297
298   do
299     {
300       middle = (low + high) / 2;
301       cmp = strcasecmp (name, regs[middle].name);
302       if (cmp < 0)
303         high = middle - 1;
304       else if (cmp > 0)
305         low = middle + 1;
306       else
307         return regs[middle].value;
308     }
309   while (low <= high);
310
311   return -1;
312 }
313
314 /*
315  * Summary of register_name().
316  *
317  * in:        Input_line_pointer points to 1st char of operand.
318  *
319  * out:        A expressionS.
320  *      The operand may have been a register: in this case, X_op == O_register,
321  *      X_add_number is set to the register number, and truth is returned.
322  *        Input_line_pointer->(next non-blank) char after operand, or is in its
323  *      original state.
324  */
325
326 static boolean
327 register_name (expressionP)
328      expressionS *expressionP;
329 {
330   int reg_number;
331   char *name;
332   char *start;
333   char c;
334
335   /* Find the spelling of the operand.  */
336   start = name = input_line_pointer;
337   if (name[0] == '%' && ISALPHA (name[1]))
338     name = ++input_line_pointer;
339
340   else if (!reg_names_p)
341     return false;
342
343   while (' ' == *name)
344     name = ++input_line_pointer;
345
346   /* If it's a number, treat it as a number.  If it's alpha, look to
347      see if it's in the register table.  */
348   if (!ISALPHA (name[0]))
349     {
350       reg_number = get_single_number ();
351     }
352   else
353     {
354       c = get_symbol_end ();
355       reg_number = reg_name_search (pre_defined_registers, REG_NAME_CNT, name);
356
357       /* Put back the delimiting char.  */
358       *input_line_pointer = c;
359     }
360
361   /* If numeric, make sure its not out of bounds.  */
362   if ((0 <= reg_number) && (16 >= reg_number))
363     {
364       expressionP->X_op = O_register;
365       expressionP->X_add_number = reg_number;
366
367       /* Make the rest nice.  */
368       expressionP->X_add_symbol = NULL;
369       expressionP->X_op_symbol = NULL;
370       return true;
371     }
372
373   /* Reset the line as if we had not done anything.  */
374   input_line_pointer = start;
375   return false;
376 }
377 \f
378 /* Local variables.  */
379
380 /* The type of processor we are assembling for.  This is one or more
381    of the I370_OPCODE flags defined in opcode/i370.h.  */
382 static int i370_cpu = 0;
383
384 /* The base register to use for opcode with optional operands.
385  * We define two of these: "text" and "other".  Normally, "text"
386  * would get used in the .text section for branches, while "other"
387  * gets used in the .data section for address constants.
388  *
389  * The idea of a second base register in a different section
390  * is foreign to the usual HLASM-style semantics; however, it
391  * allows us to provide support for dynamically loaded libraries,
392  * by allowing us to place address constants in a section other
393  * than the text section. The "other" section need not be the
394  * .data section, it can be any section that isn't the .text section.
395  *
396  * Note that HLASM defines a multiple, concurrent .using semantic
397  * that we do not: in calculating offsets, it uses either the most
398  * recent .using directive, or the one with the smallest displacement.
399  * This allows HLASM to support a quasi-block-scope-like behaviour.
400  * Handy for people writing assembly by hand ... but not supported
401  * by us.
402  */
403 static int i370_using_text_regno = -1;
404 static int i370_using_other_regno = -1;
405
406 /* The base address for address literals */
407 static expressionS i370_using_text_baseaddr;
408 static expressionS i370_using_other_baseaddr;
409
410 /* the "other" section, used only for syntax error detection */
411 static segT i370_other_section = undefined_section;
412
413 /* Opcode hash table.  */
414 static struct hash_control *i370_hash;
415
416 /* Macro hash table.  */
417 static struct hash_control *i370_macro_hash;
418
419 #ifdef OBJ_ELF
420 /* What type of shared library support to use */
421 static enum { SHLIB_NONE, SHLIB_PIC, SHILB_MRELOCATABLE } shlib = SHLIB_NONE;
422 #endif
423
424 /* Flags to set in the elf header */
425 static flagword i370_flags = 0;
426
427 #ifndef WORKING_DOT_WORD
428 const int md_short_jump_size = 4;
429 const int md_long_jump_size = 4;
430 #endif
431 \f
432 #ifdef OBJ_ELF
433 CONST char *md_shortopts = "l:um:K:VQ:";
434 #else
435 CONST char *md_shortopts = "um:";
436 #endif
437 struct option md_longopts[] =
438 {
439   {NULL, no_argument, NULL, 0}
440 };
441 size_t md_longopts_size = sizeof (md_longopts);
442
443 int
444 md_parse_option (c, arg)
445      int c;
446      char *arg;
447 {
448   switch (c)
449     {
450     case 'u':
451       /* -u means that any undefined symbols should be treated as
452          external, which is the default for gas anyhow.  */
453       break;
454
455 #ifdef OBJ_ELF
456     case 'K':
457       /* Recognize -K PIC */
458       if (strcmp (arg, "PIC") == 0 || strcmp (arg, "pic") == 0)
459         {
460           shlib = SHLIB_PIC;
461           i370_flags |= EF_I370_RELOCATABLE_LIB;
462         }
463       else
464         return 0;
465
466       break;
467 #endif
468
469     case 'm':
470
471       /* -m360 mean to assemble for the ancient 360 architecture */
472       if (strcmp (arg, "360") == 0 || strcmp (arg, "i360") == 0)
473         i370_cpu = I370_OPCODE_360;
474       /* -mxa means to assemble for the IBM 370 XA  */
475       else if (strcmp (arg, "xa") == 0)
476         i370_cpu = I370_OPCODE_370_XA;
477       /* -many means to assemble for any architecture (370/XA).  */
478       else if (strcmp (arg, "any") == 0)
479         i370_cpu = I370_OPCODE_370;
480
481       else if (strcmp (arg, "regnames") == 0)
482         reg_names_p = true;
483
484       else if (strcmp (arg, "no-regnames") == 0)
485         reg_names_p = false;
486
487 #ifdef OBJ_ELF
488       /* -mrelocatable/-mrelocatable-lib -- warn about initializations that require relocation */
489       else if (strcmp (arg, "relocatable") == 0)
490         {
491           shlib = SHILB_MRELOCATABLE;
492           i370_flags |= EF_I370_RELOCATABLE;
493         }
494
495       else if (strcmp (arg, "relocatable-lib") == 0)
496         {
497           shlib = SHILB_MRELOCATABLE;
498           i370_flags |= EF_I370_RELOCATABLE_LIB;
499         }
500
501 #endif
502       else
503         {
504           as_bad ("invalid switch -m%s", arg);
505           return 0;
506         }
507       break;
508
509 #ifdef OBJ_ELF
510       /* -V: SVR4 argument to print version ID.  */
511     case 'V':
512       print_version_id ();
513       break;
514
515       /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
516          should be emitted or not.  FIXME: Not implemented.  */
517     case 'Q':
518       break;
519
520 #endif
521
522     default:
523       return 0;
524     }
525
526   return 1;
527 }
528
529 \f
530 /* Set i370_cpu if it is not already set.
531    Currently defaults to the reasonable superset;
532    but can be made more fine grained if desred.  */
533
534 static void
535 i370_set_cpu ()
536 {
537   const char *default_os  = TARGET_OS;
538   const char *default_cpu = TARGET_CPU;
539
540   /* override with the superset for the moment.  */
541   i370_cpu = I370_OPCODE_ESA390_SUPERSET;
542   if (i370_cpu == 0)
543     {
544       if (strcmp (default_cpu, "i360") == 0)
545         i370_cpu = I370_OPCODE_360;
546       else if (strcmp (default_cpu, "i370") == 0)
547         i370_cpu = I370_OPCODE_370;
548       else if (strcmp (default_cpu, "XA") == 0)
549         i370_cpu = I370_OPCODE_370_XA;
550       else
551         as_fatal ("Unknown default cpu = %s, os = %s", default_cpu, default_os);
552     }
553 }
554
555 /* Figure out the BFD architecture to use.  */
556 /* hack alert -- specify the different 370 architectures  */
557
558 enum bfd_architecture
559 i370_arch ()
560 {
561    return bfd_arch_i370;
562 }
563
564 /* This function is called when the assembler starts up.  It is called
565    after the options have been parsed and the output file has been
566    opened.  */
567
568 void
569 md_begin ()
570 {
571   register const struct i370_opcode *op;
572   const struct i370_opcode *op_end;
573   const struct i370_macro *macro;
574   const struct i370_macro *macro_end;
575   boolean dup_insn = false;
576
577   i370_set_cpu ();
578
579 #ifdef OBJ_ELF
580   /* Set the ELF flags if desired.  */
581   if (i370_flags)
582     bfd_set_private_flags (stdoutput, i370_flags);
583 #endif
584
585   /* Insert the opcodes into a hash table.  */
586   i370_hash = hash_new ();
587
588    op_end = i370_opcodes + i370_num_opcodes;
589    for (op = i370_opcodes; op < op_end; op++)
590      {
591        know ((op->opcode & op->mask) == op->opcode);
592
593        if ((op->flags & i370_cpu) != 0)
594          {
595            const char *retval;
596
597            retval = hash_insert (i370_hash, op->name, (PTR) op);
598            if (retval != (const char *) NULL)
599              {
600                as_bad ("Internal assembler error for instruction %s", op->name);
601                dup_insn = true;
602              }
603          }
604      }
605
606   /* Insert the macros into a hash table.  */
607   i370_macro_hash = hash_new ();
608
609   macro_end = i370_macros + i370_num_macros;
610   for (macro = i370_macros; macro < macro_end; macro++)
611     {
612       if ((macro->flags & i370_cpu) != 0)
613         {
614           const char *retval;
615
616           retval = hash_insert (i370_macro_hash, macro->name, (PTR) macro);
617           if (retval != (const char *) NULL)
618             {
619               as_bad ("Internal assembler error for macro %s", macro->name);
620               dup_insn = true;
621             }
622         }
623     }
624
625   if (dup_insn)
626     abort ();
627 }
628
629 /* Insert an operand value into an instruction.  */
630
631 static i370_insn_t
632 i370_insert_operand (insn, operand, val)
633      i370_insn_t insn;
634      const struct i370_operand *operand;
635      offsetT val;
636 {
637   if (operand->insert)
638     {
639       const char *errmsg;
640
641       /* used for 48-bit insn's */
642       errmsg = NULL;
643       insn = (*operand->insert) (insn, (long) val, &errmsg);
644       if (errmsg)
645         as_bad ("%s", errmsg);
646     }
647   else
648     {
649       /* this is used only for 16, 32 bit insn's */
650       insn.i[0] |= (((long) val & ((1 << operand->bits) - 1))
651                     << operand->shift);
652     }
653
654   return insn;
655 }
656
657 \f
658 #ifdef OBJ_ELF
659 /* Parse @got, etc. and return the desired relocation.
660    Currently, i370 does not support (don't really need to support) any
661    of these fancier markups ... for example, no one is going to
662    write 'L 6,=V(bogus)@got' it just doesn't make sense (at least to me).
663    So basically, we could get away with this routine returning
664    BFD_RELOC_UNUSED in all circumstances.  However, I'll leave
665    in for now in case someone ambitious finds a good use for this stuff ...
666    this routine was pretty much just copied from the powerpc code ...  */
667 static bfd_reloc_code_real_type
668 i370_elf_suffix (str_p, exp_p)
669      char **str_p;
670      expressionS *exp_p;
671 {
672   struct map_bfd
673   {
674     char *string;
675     int length;
676     bfd_reloc_code_real_type reloc;
677   };
678
679   char ident[20];
680   char *str = *str_p;
681   char *str2;
682   int ch;
683   int len;
684   struct map_bfd *ptr;
685
686 #define MAP(str,reloc) { str, sizeof (str)-1, reloc }
687
688   static struct map_bfd mapping[] =
689   {
690 #if 0
691     MAP ("l",           BFD_RELOC_LO16),
692     MAP ("h",           BFD_RELOC_HI16),
693     MAP ("ha",          BFD_RELOC_HI16_S),
694 #endif
695     /* warnings with -mrelocatable.  */
696     MAP ("fixup",       BFD_RELOC_CTOR),
697     { (char *)0, 0,     BFD_RELOC_UNUSED }
698   };
699
700   if (*str++ != '@')
701     return BFD_RELOC_UNUSED;
702
703   for (ch = *str, str2 = ident;
704        (str2 < ident + sizeof (ident) - 1
705         && (ISALNUM (ch) || ch == '@'));
706        ch = *++str)
707     {
708       *str2++ = TOLOWER (ch);
709     }
710
711   *str2 = '\0';
712   len = str2 - ident;
713
714   ch = ident[0];
715   for (ptr = &mapping[0]; ptr->length > 0; ptr++)
716     if (ch == ptr->string[0]
717         && len == ptr->length
718         && memcmp (ident, ptr->string, ptr->length) == 0)
719       {
720         if (exp_p->X_add_number != 0
721             && (ptr->reloc == BFD_RELOC_16_GOTOFF
722                 || ptr->reloc == BFD_RELOC_LO16_GOTOFF
723                 || ptr->reloc == BFD_RELOC_HI16_GOTOFF
724                 || ptr->reloc == BFD_RELOC_HI16_S_GOTOFF))
725           as_warn ("identifier+constant@got means identifier@got+constant");
726
727         /* Now check for identifier@suffix+constant */
728         if (*str == '-' || *str == '+')
729           {
730             char *orig_line = input_line_pointer;
731             expressionS new_exp;
732
733             input_line_pointer = str;
734             expression (&new_exp);
735             if (new_exp.X_op == O_constant)
736               {
737                 exp_p->X_add_number += new_exp.X_add_number;
738                 str = input_line_pointer;
739               }
740
741             if (&input_line_pointer != str_p)
742               input_line_pointer = orig_line;
743           }
744
745         *str_p = str;
746         return ptr->reloc;
747       }
748
749   return BFD_RELOC_UNUSED;
750 }
751
752 /* Like normal .long/.short/.word, except support @got, etc.  */
753 /* clobbers input_line_pointer, checks end-of-line.  */
754 static void
755 i370_elf_cons (nbytes)
756      register int nbytes;        /* 1=.byte, 2=.word, 4=.long */
757 {
758   expressionS exp;
759   bfd_reloc_code_real_type reloc;
760
761   if (is_it_end_of_statement ())
762     {
763       demand_empty_rest_of_line ();
764       return;
765     }
766
767   do
768     {
769       expression (&exp);
770       if (exp.X_op == O_symbol
771           && *input_line_pointer == '@'
772           && (reloc = i370_elf_suffix (&input_line_pointer, &exp)) != BFD_RELOC_UNUSED)
773         {
774           reloc_howto_type *reloc_howto = bfd_reloc_type_lookup (stdoutput, reloc);
775           int size = bfd_get_reloc_size (reloc_howto);
776
777           if (size > nbytes)
778             as_bad ("%s relocations do not fit in %d bytes\n", reloc_howto->name, nbytes);
779
780           else
781             {
782               register char *p = frag_more ((int) nbytes);
783               int offset = nbytes - size;
784
785               fix_new_exp (frag_now, p - frag_now->fr_literal + offset, size, &exp, 0, reloc);
786             }
787         }
788       else
789         emit_expr (&exp, (unsigned int) nbytes);
790     }
791   while (*input_line_pointer++ == ',');
792
793   input_line_pointer--;         /* Put terminator back into stream.  */
794   demand_empty_rest_of_line ();
795 }
796
797 \f
798 /* ASCII to EBCDIC conversion table.  */
799 static unsigned char ascebc[256] =
800 {
801  /*00  NL    SH    SX    EX    ET    NQ    AK    BL */
802      0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F,
803  /*08  BS    HT    LF    VT    FF    CR    SO    SI */
804      0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
805  /*10  DL    D1    D2    D3    D4    NK    SN    EB */
806      0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26,
807  /*18  CN    EM    SB    EC    FS    GS    RS    US */
808      0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
809  /*20  SP     !     "     #     $     %     &     ' */
810      0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D,
811  /*28   (     )     *     +     ,     -    .      / */
812      0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
813  /*30   0     1     2     3     4     5     6     7 */
814      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
815  /*38   8     9     :     ;     <     =     >     ? */
816      0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
817  /*40   @     A     B     C     D     E     F     G */
818      0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
819  /*48   H     I     J     K     L     M     N     O */
820      0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
821  /*50   P     Q     R     S     T     U     V     W */
822      0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6,
823  /*58   X     Y     Z     [     \     ]     ^     _ */
824      0xE7, 0xE8, 0xE9, 0xAD, 0xE0, 0xBD, 0x5F, 0x6D,
825  /*60   `     a     b     c     d     e     f     g */
826      0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
827  /*68   h     i     j     k     l     m     n     o */
828      0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
829  /*70   p     q     r     s     t     u     v     w */
830      0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
831  /*78   x     y     z     {     |     }     ~    DL */
832      0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07,
833      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
834      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
835      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
836      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
837      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
838      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
839      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
840      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
841      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
842      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
843      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
844      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
845      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
846      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
847      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
848      0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFF
849 };
850
851 /* EBCDIC to ASCII conversion table.  */
852 unsigned char ebcasc[256] =
853 {
854  /*00  NU    SH    SX    EX    PF    HT    LC    DL */
855      0x00, 0x01, 0x02, 0x03, 0x00, 0x09, 0x00, 0x7F,
856  /*08              SM    VT    FF    CR    SO    SI */
857      0x00, 0x00, 0x00, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
858  /*10  DE    D1    D2    TM    RS    NL    BS    IL */
859      0x10, 0x11, 0x12, 0x13, 0x14, 0x0A, 0x08, 0x00,
860  /*18  CN    EM    CC    C1    FS    GS    RS    US */
861      0x18, 0x19, 0x00, 0x00, 0x1C, 0x1D, 0x1E, 0x1F,
862  /*20  DS    SS    FS          BP    LF    EB    EC */
863      0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x17, 0x1B,
864  /*28              SM    C2    EQ    AK    BL       */
865      0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x07, 0x00,
866  /*30              SY          PN    RS    UC    ET */
867      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
868  /*38                    C3    D4    NK          SU */
869      0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x00, 0x1A,
870  /*40  SP                                           */
871      0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
872  /*48                     .     <     (     +     | */
873      0x00, 0x00, 0x00, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
874  /*50   &                                           */
875      0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
876  /*58               !     $     *     )     ;     ^ */
877      0x00, 0x00, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x5E,
878  /*60   -     /                                     */
879      0x2D, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
880  /*68                     ,     %     _     >     ? */
881      0x00, 0x00, 0x00, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
882  /*70                                               */
883      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
884  /*78         `     :     #     @     '     =     " */
885      0x00, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
886  /*80         a     b     c     d     e     f     g */
887      0x00, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
888  /*88   h     i           {                         */
889      0x68, 0x69, 0x00, 0x7B, 0x00, 0x00, 0x00, 0x00,
890  /*90         j     k     l     m     n     o     p */
891      0x00, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70,
892  /*98   q     r           }                         */
893      0x71, 0x72, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x00,
894  /*A0         ~     s     t     u     v     w     x */
895      0x00, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
896  /*A8   y     z                       [             */
897      0x79, 0x7A, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00,
898  /*B0                                               */
899      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
900  /*B8                                 ]             */
901      0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00,
902  /*C0   {     A     B     C     D     E     F     G */
903      0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
904  /*C8   H     I                                     */
905      0x48, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
906  /*D0   }     J     K     L     M     N     O     P */
907      0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,
908  /*D8   Q     R                                     */
909      0x51, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
910  /*E0   \           S     T     U     V     W     X */
911      0x5C, 0x00, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
912  /*E8   Y     Z                                     */
913      0x59, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
914  /*F0   0     1     2     3     4     5     6     7 */
915      0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
916  /*F8   8     9                                     */
917      0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF
918 };
919
920 /* ebcdic translation tables needed for 3270 support */
921 static void
922 i370_ebcdic (unused)
923      int unused;
924 {
925   char *p, *end;
926   char delim = 0;
927   size_t nbytes;
928
929   nbytes = strlen (input_line_pointer);
930   end = input_line_pointer + nbytes;
931   while ('\r' == *end) end --;
932   while ('\n' == *end) end --;
933
934   delim = *input_line_pointer;
935   if (('\'' == delim) || ('\"' == delim)) {
936     input_line_pointer ++;
937     end = rindex (input_line_pointer, delim);
938   }
939
940   if (end > input_line_pointer)
941     {
942       nbytes = end - input_line_pointer +1;
943       p = frag_more (nbytes);
944       while (end > input_line_pointer)
945         {
946           *p = ascebc [(unsigned char) (*input_line_pointer)];
947           ++p; ++input_line_pointer;
948         }
949       *p = '\0';
950     }
951   if (delim == *input_line_pointer) ++input_line_pointer;
952 }
953
954 \f
955 /* stub out a couple of routines */
956 static void
957 i370_rmode (unused)
958      int unused;
959 {
960   as_tsktsk ("rmode ignored");
961 }
962
963 static void
964 i370_dsect (sect)
965      int sect;
966 {
967   char *save_line = input_line_pointer;
968   static char section[] = ".data\n";
969
970   /* Just pretend this is .section .data */
971   input_line_pointer = section;
972   obj_elf_section (sect);
973
974   input_line_pointer = save_line;
975 }
976
977 static void
978 i370_csect (unused)
979      int unused;
980 {
981   as_tsktsk ("csect not supported");
982 }
983
984 \f
985 /* DC Define Const  is only partially supported.
986  * For samplecode on what to do, look at i370_elf_cons() above.
987  * This code handles pseudoops of the style
988  * DC   D'3.141592653'   # in sysv4, .double 3.14159265
989  * DC   F'1'             # in sysv4, .long   1
990  */
991 static void
992 i370_dc(unused)
993      int unused;
994 {
995   char * p, tmp[50];
996   int nbytes=0;
997   expressionS exp;
998   char type=0;
999
1000   if (is_it_end_of_statement ())
1001     {
1002       demand_empty_rest_of_line ();
1003       return;
1004     }
1005
1006   /* figure out the size */
1007   type = *input_line_pointer++;
1008   switch (type)
1009     {
1010     case 'H':  /* 16-bit */
1011       nbytes = 2;
1012       break;
1013     case 'E':  /* 32-bit */
1014     case 'F':  /* 32-bit */
1015       nbytes = 4;
1016       break;
1017     case 'D':  /* 64-bit */
1018       nbytes = 8;
1019       break;
1020     default:
1021       as_bad ("unsupported DC type");
1022       return;
1023     }
1024
1025   /* get rid of pesky quotes */
1026   if ('\'' == *input_line_pointer)
1027     {
1028       char * close;
1029       ++input_line_pointer;
1030       close = strchr (input_line_pointer, '\'');
1031       if (close)
1032         *close= ' ';
1033       else
1034         as_bad ("missing end-quote");
1035     }
1036   if ('\"' == *input_line_pointer)
1037     {
1038       char * close;
1039       ++input_line_pointer;
1040       close = strchr (input_line_pointer, '\"');
1041       if (close)
1042         *close= ' ';
1043       else
1044         as_bad ("missing end-quote");
1045     }
1046
1047   switch (type)
1048     {
1049     case 'H':  /* 16-bit */
1050     case 'F':  /* 32-bit */
1051       expression (&exp);
1052       emit_expr (&exp, nbytes);
1053       break;
1054     case 'E':  /* 32-bit */
1055     case 'D':  /* 64-bit */
1056       md_atof (type, tmp, &nbytes);
1057       p = frag_more (nbytes);
1058       memcpy (p, tmp, nbytes);
1059       break;
1060     default:
1061       as_bad ("unsupported DC type");
1062       return;
1063     }
1064
1065   demand_empty_rest_of_line ();
1066 }
1067
1068 \f
1069 /* provide minimal support for DS Define Storage */
1070 static void
1071 i370_ds (unused)
1072      int unused;
1073 {
1074   /* DS 0H or DS 0F or DS 0D */
1075   if ('0' == *input_line_pointer)
1076     {
1077       int alignment = 0;  /* left shift 1<<align */
1078       input_line_pointer ++;
1079       switch (*input_line_pointer++)
1080         {
1081         case 'H':  /* 16-bit */
1082           alignment = 1;
1083           break;
1084         case 'F':  /* 32-bit */
1085           alignment = 2;
1086           break;
1087         case 'D':  /* 64-bit */
1088           alignment = 3;
1089           break;
1090         default:
1091           as_bad ("unsupported alignment");
1092           return;
1093         }
1094       frag_align (alignment, 0, 0);
1095       record_alignment (now_seg, alignment);
1096     }
1097   else
1098     {
1099       as_bad ("this DS form not yet supported");
1100     }
1101 }
1102
1103 /* Solaris pseudo op to change to the .rodata section.  */
1104 static void
1105 i370_elf_rdata (sect)
1106      int sect;
1107 {
1108   char *save_line = input_line_pointer;
1109   static char section[] = ".rodata\n";
1110
1111   /* Just pretend this is .section .rodata */
1112   input_line_pointer = section;
1113   obj_elf_section (sect);
1114
1115   input_line_pointer = save_line;
1116 }
1117
1118 /* Pseudo op to make file scope bss items */
1119 static void
1120 i370_elf_lcomm (unused)
1121      int unused;
1122 {
1123   register char *name;
1124   register char c;
1125   register char *p;
1126   offsetT size;
1127   register symbolS *symbolP;
1128   offsetT align;
1129   segT old_sec;
1130   int old_subsec;
1131   char *pfrag;
1132   int align2;
1133
1134   name = input_line_pointer;
1135   c = get_symbol_end ();
1136
1137   /* just after name is now '\0' */
1138   p = input_line_pointer;
1139   *p = c;
1140   SKIP_WHITESPACE ();
1141   if (*input_line_pointer != ',')
1142     {
1143       as_bad ("Expected comma after symbol-name: rest of line ignored.");
1144       ignore_rest_of_line ();
1145       return;
1146     }
1147
1148   input_line_pointer++;         /* skip ',' */
1149   if ((size = get_absolute_expression ()) < 0)
1150     {
1151       as_warn (".COMMon length (%ld.) <0! Ignored.", (long) size);
1152       ignore_rest_of_line ();
1153       return;
1154     }
1155
1156   /* The third argument to .lcomm is the alignment.  */
1157   if (*input_line_pointer != ',')
1158     align = 8;
1159   else
1160     {
1161       ++input_line_pointer;
1162       align = get_absolute_expression ();
1163       if (align <= 0)
1164         {
1165           as_warn ("ignoring bad alignment");
1166           align = 8;
1167         }
1168     }
1169
1170   *p = 0;
1171   symbolP = symbol_find_or_make (name);
1172   *p = c;
1173
1174   if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
1175     {
1176       as_bad ("Ignoring attempt to re-define symbol `%s'.",
1177               S_GET_NAME (symbolP));
1178       ignore_rest_of_line ();
1179       return;
1180     }
1181
1182   if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size)
1183     {
1184       as_bad ("Length of .lcomm \"%s\" is already %ld. Not changed to %ld.",
1185               S_GET_NAME (symbolP),
1186               (long) S_GET_VALUE (symbolP),
1187               (long) size);
1188
1189       ignore_rest_of_line ();
1190       return;
1191     }
1192
1193   /* allocate_bss: */
1194   old_sec = now_seg;
1195   old_subsec = now_subseg;
1196   if (align)
1197     {
1198       /* convert to a power of 2 alignment */
1199       for (align2 = 0; (align & 1) == 0; align >>= 1, ++align2)
1200         ;
1201       if (align != 1)
1202         {
1203           as_bad ("Common alignment not a power of 2");
1204           ignore_rest_of_line ();
1205           return;
1206         }
1207     }
1208   else
1209     align2 = 0;
1210
1211   record_alignment (bss_section, align2);
1212   subseg_set (bss_section, 0);
1213   if (align2)
1214     frag_align (align2, 0, 0);
1215   if (S_GET_SEGMENT (symbolP) == bss_section)
1216     symbol_get_frag (symbolP)->fr_symbol = 0;
1217   symbol_set_frag (symbolP, frag_now);
1218   pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, size,
1219                     (char *) 0);
1220   *pfrag = 0;
1221   S_SET_SIZE (symbolP, size);
1222   S_SET_SEGMENT (symbolP, bss_section);
1223   subseg_set (old_sec, old_subsec);
1224   demand_empty_rest_of_line ();
1225 }
1226
1227 /* Validate any relocations emitted for -mrelocatable, possibly adding
1228    fixups for word relocations in writable segments, so we can adjust
1229    them at runtime.  */
1230 static void
1231 i370_elf_validate_fix (fixp, seg)
1232      fixS *fixp;
1233      segT seg;
1234 {
1235   if (fixp->fx_done || fixp->fx_pcrel)
1236     return;
1237
1238   switch (shlib)
1239     {
1240     case SHLIB_NONE:
1241     case SHLIB_PIC:
1242       return;
1243
1244     case SHILB_MRELOCATABLE:
1245       if (fixp->fx_r_type <= BFD_RELOC_UNUSED
1246           && fixp->fx_r_type != BFD_RELOC_16_GOTOFF
1247           && fixp->fx_r_type != BFD_RELOC_HI16_GOTOFF
1248           && fixp->fx_r_type != BFD_RELOC_LO16_GOTOFF
1249           && fixp->fx_r_type != BFD_RELOC_HI16_S_GOTOFF
1250           && fixp->fx_r_type != BFD_RELOC_32_BASEREL
1251           && fixp->fx_r_type != BFD_RELOC_LO16_BASEREL
1252           && fixp->fx_r_type != BFD_RELOC_HI16_BASEREL
1253           && fixp->fx_r_type != BFD_RELOC_HI16_S_BASEREL
1254           && strcmp (segment_name (seg), ".got2") != 0
1255           && strcmp (segment_name (seg), ".dtors") != 0
1256           && strcmp (segment_name (seg), ".ctors") != 0
1257           && strcmp (segment_name (seg), ".fixup") != 0
1258           && strcmp (segment_name (seg), ".stab") != 0
1259           && strcmp (segment_name (seg), ".gcc_except_table") != 0
1260           && strcmp (segment_name (seg), ".ex_shared") != 0)
1261         {
1262           if ((seg->flags & (SEC_READONLY | SEC_CODE)) != 0
1263               || fixp->fx_r_type != BFD_RELOC_CTOR)
1264             {
1265               as_bad_where (fixp->fx_file, fixp->fx_line,
1266                             "Relocation cannot be done when using -mrelocatable");
1267             }
1268         }
1269       return;
1270     }
1271 }
1272 #endif /* OBJ_ELF */
1273
1274 \f
1275 #define LITERAL_POOL_SUPPORT
1276 #ifdef LITERAL_POOL_SUPPORT
1277 /* Provide support for literal pools within the text section.  */
1278 /* Loosely based on similar code from tc-arm.c  */
1279 /*
1280  * We will use four symbols to locate four parts of the literal pool.
1281  *    These four sections contain 64,32,16 and 8-bit constants; we use
1282  *    four sections so that all memory access can be appropriately aligned.
1283  *    That is, we want to avoid mixing these together so that we don't
1284  *    waste space padding out to alignments.  The four pointers
1285  *    longlong_poolP, word_poolP, etc. point to a symbol labeling the
1286  *    start of each pool part.
1287  *
1288  * lit_pool_num increments from zero to infinity and uniquely id's
1289  *    -- its used to generate the *_poolP symbol name.
1290  */
1291
1292 #define MAX_LITERAL_POOL_SIZE 1024
1293
1294 typedef struct literalS
1295 {
1296   struct expressionS  exp;
1297   char * sym_name;
1298   char size;  /* 1,2,4 or 8 */
1299   short offset;
1300 } literalT;
1301
1302 literalT literals[MAX_LITERAL_POOL_SIZE];
1303 int next_literal_pool_place = 0; /* Next free entry in the pool */
1304
1305 static symbolS *longlong_poolP = NULL;   /* 64-bit pool entries */
1306 static symbolS *word_poolP = NULL;       /* 32-bit pool entries */
1307 static symbolS *short_poolP = NULL;      /* 16-bit pool entries */
1308 static symbolS *byte_poolP = NULL;       /* 8-bit  pool entries */
1309
1310 static int lit_pool_num = 1;
1311
1312 /* create a new, empty symbol */
1313 static symbolS *
1314 symbol_make_empty (void)
1315 {
1316   return symbol_create (FAKE_LABEL_NAME, undefined_section,
1317                         (valueT) 0, &zero_address_frag);
1318 }
1319
1320 /* add an expression to the literal pool */
1321 static  void
1322 add_to_lit_pool (expressionS *exx, char *name, int sz)
1323 {
1324   int lit_count = 0;
1325   int offset_in_pool = 0;
1326
1327   /* start a new pool, if necessary */
1328   if (8 == sz && NULL == longlong_poolP)
1329     longlong_poolP = symbol_make_empty ();
1330   else if (4 == sz && NULL == word_poolP)
1331     word_poolP = symbol_make_empty ();
1332   else if (2 == sz && NULL == short_poolP)
1333     short_poolP = symbol_make_empty ();
1334   else if (1 == sz && NULL == byte_poolP)
1335     byte_poolP = symbol_make_empty ();
1336
1337   /* Check if this literal value is already in the pool: */
1338   /* hack alert -- we should probably be checking expressions
1339    * of type O_symbol as well ...  */
1340   /* hack alert XXX this is probably(certainly?) broken for O_big,
1341    * which includes 64-bit long-longs ...
1342    */
1343   while (lit_count < next_literal_pool_place)
1344     {
1345       if (exx->X_op == O_constant
1346           && literals[lit_count].exp.X_op == exx->X_op
1347           && literals[lit_count].exp.X_add_number == exx->X_add_number
1348           && literals[lit_count].exp.X_unsigned == exx->X_unsigned
1349           && literals[lit_count].size == sz)
1350         break;
1351       else if (literals[lit_count].sym_name
1352                && name
1353                && !strcmp (name, literals[lit_count].sym_name))
1354         break;
1355       if (sz == literals[lit_count].size)
1356         offset_in_pool += sz;
1357       lit_count ++;
1358     }
1359
1360   if (lit_count == next_literal_pool_place) /* new entry */
1361     {
1362       if (next_literal_pool_place > MAX_LITERAL_POOL_SIZE)
1363         {
1364           as_bad ("Literal Pool Overflow");
1365         }
1366
1367       literals[next_literal_pool_place].exp = *exx;
1368       literals[next_literal_pool_place].size = sz;
1369       literals[next_literal_pool_place].offset = offset_in_pool;
1370       if (name)
1371         {
1372           literals[next_literal_pool_place].sym_name = strdup (name);
1373         }
1374       else
1375         {
1376           literals[next_literal_pool_place].sym_name = NULL;
1377         }
1378       next_literal_pool_place++;
1379     }
1380
1381   /* ???_poolP points to the begining of the literal pool.
1382    * X_add_number is the offset from the begining of the
1383    * literal pool to this expr minus the location of the most
1384    * recent .using directive.  Thus, the grand total value of the
1385    * expression is the distance from .using to the literal.
1386    */
1387   if (8 == sz)
1388     exx->X_add_symbol = longlong_poolP;
1389   else if (4 == sz)
1390     exx->X_add_symbol = word_poolP;
1391   else if (2 == sz)
1392     exx->X_add_symbol = short_poolP;
1393   else if (1 == sz)
1394     exx->X_add_symbol = byte_poolP;
1395   exx->X_add_number = offset_in_pool;
1396   exx->X_op_symbol = NULL;
1397
1398   /* If the user has set up a base reg in another section,
1399    * use that; otherwise use the text section.  */
1400   if (0 < i370_using_other_regno)
1401     {
1402       i370_make_relative (exx, &i370_using_other_baseaddr);
1403     }
1404   else
1405     {
1406       i370_make_relative (exx, &i370_using_text_baseaddr);
1407     }
1408 }
1409
1410 /* The symbol setup for the literal pool is done in two steps.  First,
1411  * a symbol that represents the start of the literal pool is created,
1412  * above, in the add_to_pool() routine. This sym ???_poolP.
1413  * However, we don't know what fragment its in until a bit later.
1414  * So we defer the frag_now thing, and the symbol name, until .ltorg time
1415  */
1416
1417 /* Can't use symbol_new here, so have to create a symbol and then at
1418    a later date assign it a value. Thats what these functions do */
1419 static void
1420 symbol_locate (symbolP, name, segment, valu, frag)
1421      symbolS *symbolP;
1422      CONST char *name;          /* It is copied, the caller can modify */
1423      segT segment;              /* Segment identifier (SEG_<something>) */
1424      valueT valu;               /* Symbol value */
1425      fragS *frag;               /* Associated fragment */
1426 {
1427   size_t name_length;
1428   char *preserved_copy_of_name;
1429
1430   name_length = strlen (name) + 1;      /* +1 for \0 */
1431   obstack_grow (&notes, name, name_length);
1432   preserved_copy_of_name = obstack_finish (&notes);
1433
1434   S_SET_NAME (symbolP, preserved_copy_of_name);
1435
1436   S_SET_SEGMENT (symbolP, segment);
1437   S_SET_VALUE (symbolP, valu);
1438   symbol_clear_list_pointers (symbolP);
1439
1440   symbol_set_frag (symbolP, frag);
1441
1442   /*
1443    * Link to end of symbol chain.
1444    */
1445   {
1446     extern int symbol_table_frozen;
1447     if (symbol_table_frozen)
1448       abort ();
1449   }
1450
1451   symbol_append (symbolP, symbol_lastP, &symbol_rootP, &symbol_lastP);
1452
1453   obj_symbol_new_hook (symbolP);
1454
1455 #ifdef tc_symbol_new_hook
1456   tc_symbol_new_hook (symbolP);
1457 #endif
1458
1459 #define DEBUG_SYMS
1460 #ifdef DEBUG_SYMS
1461   verify_symbol_chain(symbol_rootP, symbol_lastP);
1462 #endif /* DEBUG_SYMS */
1463 }
1464
1465 /* i370_addr_offset() will convert operand expressions
1466  * that appear to be absolute into thier base-register
1467  * relative form.  These expressions come in two types:
1468  *
1469  * (1) of the form "* + const" * where "*" means
1470  * relative offset since the last using
1471  * i.e. "*" means ".-using_baseaddr"
1472  *
1473  * (2) labels, which are never absolute, but are always
1474  * relative to the last "using".  Anything with an alpha
1475  * character is considered to be a label (since symbols
1476  * can never be operands), and since we've already handled
1477  * register operands. For example, "BL .L33" branch low
1478  * to .L33 RX form insn frequently terminates for-loops,
1479  */
1480 static boolean
1481 i370_addr_offset (expressionS *exx)
1482 {
1483   char *dot, *lab;
1484   int islabel = 0;
1485   int all_digits = 0;
1486
1487   /* search for a label; anything with an alpha char will do */
1488   /* local labels consist of N digits followed by either b or f */
1489   lab = input_line_pointer;
1490   while (*lab && (',' != *lab) && ('(' != *lab))
1491     {
1492       if (ISDIGIT (*lab))
1493         {
1494           all_digits = 1;
1495         }
1496       else if (ISALPHA (*lab))
1497         {
1498           if (!all_digits)
1499             {
1500               islabel = 1;
1501               break;
1502             }
1503           else if (('f' == *lab) || ('b' == *lab))
1504             {
1505               islabel = 1;
1506               break;
1507             }
1508           if (all_digits)
1509             break;
1510         }
1511       else if ('.' != *lab)
1512         break;
1513       ++lab;
1514     }
1515
1516   /* See if operand has a * in it */
1517   dot = strchr (input_line_pointer, '*');
1518
1519   if (!dot && !islabel)
1520     return false;
1521
1522   /* replace * with . and let expr munch on it.  */
1523   if (dot)
1524     *dot = '.';
1525   expression (exx);
1526
1527   /* OK, now we have to subtract the "using" location  */
1528   /* normally branches appear in the text section only...  */
1529   if (0 == strncmp (now_seg->name, ".text", 5) || 0 > i370_using_other_regno)
1530     {
1531       i370_make_relative (exx, &i370_using_text_baseaddr);
1532     }
1533   else
1534     {
1535       i370_make_relative (exx, &i370_using_other_baseaddr);
1536     }
1537
1538   /* put the * back */
1539   if (dot)
1540     *dot = '*';
1541
1542   return true;
1543 }
1544
1545 /* handle address constants of various sorts */
1546 /* The currently supported types are
1547  *    =A(some_symb)
1548  *    =V(some_extern)
1549  *    =X'deadbeef'    hexadecimal
1550  *    =F'1234'        32-bit const int
1551  *    =H'1234'        16-bit const int
1552  */
1553 static boolean
1554 i370_addr_cons (expressionS *exp)
1555 {
1556   char *name;
1557   char *sym_name, delim;
1558   int name_len;
1559   int hex_len=0;
1560   int cons_len=0;
1561
1562   name = input_line_pointer;
1563   sym_name = input_line_pointer;
1564   /* Find the spelling of the operand */
1565   if (name[0] == '=' && ISALPHA (name[1]))
1566     {
1567       name = ++input_line_pointer;
1568     }
1569   else
1570     {
1571       return false;
1572     }
1573   switch (name[0])
1574     {
1575     case 'A':
1576     case 'V':
1577       /* A == address-of */
1578       /* V == extern */
1579       ++input_line_pointer;
1580       expression (exp);
1581
1582       /* we use a simple string name to collapse together
1583        * multiple refrences to the same address literal
1584        */
1585       name_len = strcspn (sym_name, ", ");
1586       delim = *(sym_name + name_len);
1587       *(sym_name + name_len) = 0x0;
1588       add_to_lit_pool (exp, sym_name, 4);
1589       *(sym_name + name_len) = delim;
1590
1591       break;
1592     case 'H':
1593     case 'F':
1594     case 'X':
1595     case 'E':  /* single-precision float point */
1596     case 'D':  /* double-precision float point */
1597
1598       /* H == 16-bit fixed-point const; expression must be const */
1599       /* F == fixed-point const; expression must be const */
1600       /* X == fixed-point const; expression must be const */
1601       if ('H' == name[0]) cons_len = 2;
1602       else if ('F' == name[0]) cons_len = 4;
1603       else if ('X' == name[0]) cons_len = -1;
1604       else if ('E' == name[0]) cons_len = 4;
1605       else if ('D' == name[0]) cons_len = 8;
1606
1607       /* extract length, if it is present; hack alert -- assume single-digit
1608        * length */
1609       if ('L' == name[1])
1610         {
1611           cons_len = name[2] - '0';  /* should work for ascii and ebcdic */
1612           input_line_pointer += 2;
1613         }
1614
1615       ++input_line_pointer;
1616
1617       /* get rid of pesky quotes */
1618       if ('\'' == *input_line_pointer)
1619         {
1620           char * close;
1621           ++input_line_pointer;
1622           close = strchr (input_line_pointer, '\'');
1623           if (close)
1624             *close= ' ';
1625           else
1626             as_bad ("missing end-quote");
1627         }
1628       if ('\"' == *input_line_pointer)
1629         {
1630           char * close;
1631           ++input_line_pointer;
1632           close = strchr (input_line_pointer, '\"');
1633           if (close)
1634             *close= ' ';
1635           else
1636             as_bad ("missing end-quote");
1637         }
1638       if (('X' == name[0]) || ('E' == name[0]) || ('D' == name[0]))
1639         {
1640           char tmp[50];
1641           char *save;
1642
1643           /* The length of hex constants is specified directly with L,
1644            * or implied through the number of hex digits. For example:
1645            * =X'AB'       one byte
1646            * =X'abcd'     two bytes
1647            * =X'000000AB' four bytes
1648            * =XL4'AB'     four bytes, left-padded withn zero
1649            */
1650           if (('X' == name[0]) && (0 > cons_len))
1651             {
1652               save = input_line_pointer;
1653               while (*save)
1654                 {
1655                   if (ISXDIGIT (*save))
1656                     hex_len++;
1657                   save++;
1658                 }
1659               cons_len = (hex_len+1) /2;
1660             }
1661           /* I beleive this works even for =XL8'dada0000beeebaaa'
1662            * which should parse out to X_op == O_big
1663            * Note that floats and doubles get represented as
1664            * 0d3.14159265358979  or 0f 2.7
1665            */
1666           tmp[0] = '0';
1667           tmp[1] = name[0];
1668           tmp[2] = 0;
1669           strcat (tmp, input_line_pointer);
1670           save = input_line_pointer;
1671           input_line_pointer = tmp;
1672           expression (exp);
1673           input_line_pointer = save + (input_line_pointer-tmp-2);
1674
1675           /* fix up lengths for floats and doubles */
1676           if (O_big == exp->X_op)
1677             {
1678               exp->X_add_number = cons_len / CHARS_PER_LITTLENUM;
1679             }
1680         }
1681       else
1682         {
1683           expression (exp);
1684         }
1685       /* O_big occurs when more than 4 bytes worth gets parsed */
1686       if ((exp->X_op != O_constant) && (exp->X_op != O_big))
1687         {
1688           as_bad ("expression not a constant");
1689           return false;
1690         }
1691       add_to_lit_pool (exp, 0x0, cons_len);
1692       break;
1693
1694     default:
1695       as_bad ("Unknown/unsupported address literal type");
1696       return false;
1697     }
1698
1699   return true;
1700 }
1701
1702 \f
1703 /* Dump the contents of the literal pool that we've accumulated so far.
1704  * This aligns the pool to the size of the largest literal in the pool.
1705  */
1706
1707 static void
1708 i370_ltorg (ignore)
1709      int ignore;
1710 {
1711   int litsize;
1712   int lit_count = 0;
1713   int biggest_literal_size = 0;
1714   int biggest_align = 0;
1715   char pool_name[20];
1716
1717   if (strncmp (now_seg->name, ".text", 5))
1718     {
1719       if (i370_other_section == undefined_section)
1720         {
1721           as_bad (".ltorg without prior .using in section %s",
1722                   now_seg->name);
1723         }
1724       if (i370_other_section != now_seg)
1725         {
1726           as_bad (".ltorg in section %s paired to .using in section %s",
1727                   now_seg->name, i370_other_section->name);
1728         }
1729     }
1730   if (! longlong_poolP
1731       && ! word_poolP
1732       && ! short_poolP
1733       && ! byte_poolP)
1734     {
1735       /* Nothing to do */
1736       /* as_tsktsk ("Nothing to put in the pool\n"); */
1737       return;
1738     }
1739
1740   /* find largest literal .. 2 4 or 8 */
1741   lit_count = 0;
1742   while (lit_count < next_literal_pool_place)
1743     {
1744       if (biggest_literal_size < literals[lit_count].size)
1745         biggest_literal_size = literals[lit_count].size;
1746       lit_count ++;
1747     }
1748   if (1 == biggest_literal_size) biggest_align = 0;
1749   else if (2 == biggest_literal_size) biggest_align = 1;
1750   else if (4 == biggest_literal_size) biggest_align = 2;
1751   else if (8 == biggest_literal_size) biggest_align = 3;
1752   else as_bad ("bad alignment of %d bytes in literal pool", biggest_literal_size);
1753   if (0 == biggest_align) biggest_align = 1;
1754
1755   /* Align pool for short, word, double word accesses */
1756   frag_align (biggest_align, 0, 0);
1757   record_alignment (now_seg, biggest_align);
1758
1759   /* Note that the gas listing will print only the first five
1760    * entries in the pool .... wonder how to make it print more ...
1761    */
1762   /* output largest literals first, then the smaller ones.  */
1763   for (litsize=8; litsize; litsize /=2)
1764     {
1765       symbolS *current_poolP = NULL;
1766       switch (litsize)
1767         {
1768         case 8:
1769           current_poolP = longlong_poolP; break;
1770         case 4:
1771           current_poolP = word_poolP; break;
1772         case 2:
1773           current_poolP = short_poolP; break;
1774         case 1:
1775           current_poolP = byte_poolP; break;
1776         default:
1777           as_bad ("bad literal size\n");
1778         }
1779       if (NULL == current_poolP)
1780         continue;
1781       sprintf (pool_name, ".LITP%01d%06d", litsize, lit_pool_num);
1782       symbol_locate (current_poolP, pool_name, now_seg,
1783                      (valueT) frag_now_fix (), frag_now);
1784       symbol_table_insert (current_poolP);
1785
1786       lit_count = 0;
1787       while (lit_count < next_literal_pool_place)
1788         {
1789           if (litsize == literals[lit_count].size)
1790             {
1791 #define EMIT_ADDR_CONS_SYMBOLS
1792 #ifdef EMIT_ADDR_CONS_SYMBOLS
1793               /* create a bogus symbol, add it to the pool ...
1794                * For the most part, I think this is a useless excercise,
1795                * except that having these symbol names in the objects
1796                * is vaguely useful for debugging ...
1797                */
1798               if (literals[lit_count].sym_name)
1799                 {
1800                   symbolS * symP = symbol_make_empty ();
1801                   symbol_locate (symP, literals[lit_count].sym_name, now_seg,
1802                                  (valueT) frag_now_fix (), frag_now);
1803                   symbol_table_insert (symP);
1804                 }
1805 #endif /* EMIT_ADDR_CONS_SYMBOLS */
1806
1807               emit_expr (&(literals[lit_count].exp), literals[lit_count].size);
1808             }
1809           lit_count ++;
1810         }
1811     }
1812
1813   next_literal_pool_place = 0;
1814   longlong_poolP = NULL;
1815   word_poolP = NULL;
1816   short_poolP = NULL;
1817   byte_poolP = NULL;
1818   lit_pool_num++;
1819 }
1820
1821 #endif /* LITERAL_POOL_SUPPORT */
1822
1823 \f
1824 /* add support for the HLASM-like USING directive to indicate
1825  * the base register to use ...  we don't support the full
1826  * hlasm semantics for this ... we merely pluck a base address
1827  * and a register number out.  We print a warning if using is
1828  * called multiple times.  I suppose we should check to see
1829  * if the regno is valid ...
1830  */
1831 static void
1832 i370_using (ignore)
1833      int ignore;
1834 {
1835   expressionS ex, baseaddr;
1836   int iregno;
1837   char *star;
1838
1839   /* if "*" appears in a using, it means "."  */
1840   /* replace it with "." so that expr doesn't get confused.  */
1841   star = strchr (input_line_pointer, '*');
1842   if (star)
1843     *star = '.';
1844
1845   /* the first arg to using will usually be ".", but it can
1846    * be a more complex exprsssion too ...  */
1847   expression (&baseaddr);
1848   if (star)
1849     *star = '*';
1850   if (O_constant != baseaddr.X_op
1851       && O_symbol != baseaddr.X_op
1852       && O_uminus != baseaddr.X_op)
1853   {
1854     as_bad (".using: base address expression illegal or too complex");
1855   }
1856
1857   if (*input_line_pointer != '\0') ++input_line_pointer;
1858
1859   /* the second arg to using had better be a register */
1860   register_name (&ex);
1861   demand_empty_rest_of_line ();
1862   iregno = ex.X_add_number;
1863
1864   if (0 == strncmp (now_seg->name, ".text", 5))
1865     {
1866       i370_using_text_baseaddr = baseaddr;
1867       i370_using_text_regno = iregno;
1868     }
1869   else
1870     {
1871       i370_using_other_baseaddr = baseaddr;
1872       i370_using_other_regno = iregno;
1873       i370_other_section = now_seg;
1874     }
1875 }
1876
1877 static void
1878 i370_drop (ignore)
1879      int ignore;
1880 {
1881   expressionS ex;
1882   int iregno;
1883
1884   register_name (&ex);
1885   demand_empty_rest_of_line ();
1886   iregno = ex.X_add_number;
1887
1888   if (0 == strncmp (now_seg->name, ".text", 5))
1889     {
1890       if (iregno != i370_using_text_regno)
1891         {
1892           as_bad ("droping register %d in section %s does not match using register %d",
1893                   iregno, now_seg->name, i370_using_text_regno);
1894         }
1895       i370_using_text_regno = -1;
1896       i370_using_text_baseaddr.X_op = O_absent;
1897     }
1898   else
1899     {
1900       if (iregno != i370_using_other_regno)
1901         {
1902           as_bad ("droping register %d in section %s does not match using register %d",
1903                   iregno, now_seg->name, i370_using_other_regno);
1904         }
1905       if (i370_other_section != now_seg)
1906         {
1907           as_bad ("droping register %d in section %s previously used in section %s",
1908                   iregno, now_seg->name, i370_other_section->name);
1909         }
1910       i370_using_other_regno = -1;
1911       i370_using_other_baseaddr.X_op = O_absent;
1912       i370_other_section = undefined_section;
1913     }
1914 }
1915
1916 /* Make the first argument an address-relative expression
1917  * by subtracting the second argument.
1918  */
1919 static void
1920 i370_make_relative (expressionS *exx, expressionS *baseaddr)
1921 {
1922
1923   if (O_constant == baseaddr->X_op)
1924     {
1925        exx->X_op = O_symbol;
1926        exx->X_add_number -= baseaddr->X_add_number;
1927     }
1928   else if (O_symbol == baseaddr->X_op)
1929     {
1930        exx->X_op = O_subtract;
1931        exx->X_op_symbol = baseaddr->X_add_symbol;
1932        exx->X_add_number -= baseaddr->X_add_number;
1933     }
1934   else if (O_uminus == baseaddr->X_op)
1935     {
1936        exx->X_op = O_add;
1937        exx->X_op_symbol = baseaddr->X_add_symbol;
1938        exx->X_add_number += baseaddr->X_add_number;
1939      }
1940   else
1941      {
1942        as_bad ("Missing or bad .using directive");
1943      }
1944 }
1945 \f
1946 /* We need to keep a list of fixups.  We can't simply generate them as
1947    we go, because that would require us to first create the frag, and
1948    that would screw up references to ``.''.  */
1949
1950 struct i370_fixup
1951 {
1952   expressionS exp;
1953   int opindex;
1954   bfd_reloc_code_real_type reloc;
1955 };
1956
1957 #define MAX_INSN_FIXUPS (5)
1958
1959 /* This routine is called for each instruction to be assembled.  */
1960
1961 void
1962 md_assemble (str)
1963      char *str;
1964 {
1965   char *s, *opcode_str;
1966   const struct i370_opcode *opcode;
1967   i370_insn_t insn;
1968   const unsigned char *opindex_ptr;
1969   int have_optional_index, have_optional_basereg, have_optional_reg;
1970   int skip_optional_index, skip_optional_basereg, skip_optional_reg;
1971   int use_text=0, use_other=0;
1972   int off_by_one;
1973   struct i370_fixup fixups[MAX_INSN_FIXUPS];
1974   int fc;
1975   char *f;
1976   int i;
1977 #ifdef OBJ_ELF
1978   bfd_reloc_code_real_type reloc;
1979 #endif
1980
1981   /* Get the opcode.  */
1982   for (s = str; *s != '\0' && ! ISSPACE (*s); s++)
1983     ;
1984   if (*s != '\0')
1985     *s++ = '\0';
1986   opcode_str = str;
1987
1988   /* Look up the opcode in the hash table.  */
1989   opcode = (const struct i370_opcode *) hash_find (i370_hash, str);
1990   if (opcode == (const struct i370_opcode *) NULL)
1991     {
1992       const struct i370_macro *macro;
1993
1994       assert (i370_macro_hash);
1995       macro = (const struct i370_macro *) hash_find (i370_macro_hash, str);
1996       if (macro == (const struct i370_macro *) NULL)
1997         as_bad ("Unrecognized opcode: `%s'", str);
1998       else
1999         i370_macro (s, macro);
2000
2001       return;
2002     }
2003
2004   insn = opcode->opcode;
2005
2006   str = s;
2007   while (ISSPACE (*str))
2008     ++str;
2009
2010   /* I370 operands are either expressions or address constants.
2011      Many operand types are optional.  The optional operands
2012      are always surrounded by parens, and are used to denote the base
2013      register ... e.g. "A R1, D2" or "A R1, D2(,B2) as opposed to
2014      the fully-formed "A R1, D2(X2,B2)".  Note also the = sign,
2015      such as A R1,=A(i) where the address-of operator =A implies
2016      use of both a base register, and a missing index register.
2017
2018      So, before we start seriously parsing the operands, we check
2019      to see if we have an optional operand, and, if we do, we count
2020      the number of commas to see which operand should be omitted.  */
2021
2022   have_optional_index = have_optional_basereg = have_optional_reg = 0;
2023   for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
2024     {
2025       const struct i370_operand *operand;
2026       operand = &i370_operands[*opindex_ptr];
2027       if ((operand->flags & I370_OPERAND_INDEX) != 0)
2028         have_optional_index = 1;
2029       if ((operand->flags & I370_OPERAND_BASE) != 0)
2030         have_optional_basereg = 1;
2031       if ((operand->flags & I370_OPERAND_OPTIONAL) != 0)
2032         have_optional_reg = 1;
2033     }
2034
2035   skip_optional_index = skip_optional_basereg = skip_optional_reg = 0;
2036   if (have_optional_index || have_optional_basereg)
2037     {
2038       unsigned int opcount, nwanted;
2039
2040       /* There is an optional operand.  Count the number of
2041          commas and open-parens in the input line.  */
2042       if (*str == '\0')
2043         opcount = 0;
2044       else
2045         {
2046           opcount = 1;
2047           s = str;
2048           while ((s = strpbrk (s, ",(=")) != (char *) NULL)
2049             {
2050               ++opcount;
2051               ++s;
2052               if (',' == *s) ++s;  /* avoid counting things like (, */
2053               if ('=' == *s) { ++s; --opcount; }
2054             }
2055         }
2056
2057       /* If there are fewer operands in the line then are called
2058          for by the instruction, we want to skip the optional
2059          operand.  */
2060       nwanted = strlen (opcode->operands);
2061       if (have_optional_index)
2062         {
2063           if (opcount < nwanted)
2064             skip_optional_index = 1;
2065           if (have_optional_basereg && ((opcount+1) < nwanted))
2066             skip_optional_basereg = 1;
2067           if (have_optional_reg && ((opcount+1) < nwanted))
2068             skip_optional_reg = 1;
2069         }
2070       else
2071         {
2072           if (have_optional_basereg && (opcount < nwanted))
2073             skip_optional_basereg = 1;
2074           if (have_optional_reg && (opcount < nwanted))
2075             skip_optional_reg = 1;
2076         }
2077     }
2078
2079   /* Perform some off-by-one hacks on the length field of certain instructions.
2080    * Its such a shame to have to do this, but the problem is that HLASM got
2081    * defined so that the lengths differ by one from the actual machine instructions.
2082    * this code should probably be moved to a special inster-operand routine.
2083    * Sigh. Affected instructions are Compare Logical, Move and Exclusive OR
2084    * hack alert -- aren't *all* SS instructions affected ??
2085    */
2086   off_by_one = 0;
2087   if (0 == strcasecmp ("CLC", opcode->name)
2088       || 0 == strcasecmp ("ED", opcode->name)
2089       || 0 == strcasecmp ("EDMK", opcode->name)
2090       || 0 == strcasecmp ("MVC", opcode->name)
2091       || 0 == strcasecmp ("MVCIN", opcode->name)
2092       || 0 == strcasecmp ("MVN", opcode->name)
2093       || 0 == strcasecmp ("MVZ", opcode->name)
2094       || 0 == strcasecmp ("NC", opcode->name)
2095       || 0 == strcasecmp ("OC", opcode->name)
2096       || 0 == strcasecmp ("XC", opcode->name))
2097     off_by_one = 1;
2098
2099   /* Gather the operands.  */
2100   fc = 0;
2101   for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
2102     {
2103       const struct i370_operand *operand;
2104       const char *errmsg;
2105       char *hold;
2106       expressionS ex;
2107
2108       operand = &i370_operands[*opindex_ptr];
2109       errmsg = NULL;
2110
2111       /* If this is an index operand, and we are skipping it,
2112          just insert a zero.  */
2113       if (skip_optional_index &&
2114           ((operand->flags & I370_OPERAND_INDEX) != 0))
2115         {
2116           insn = i370_insert_operand (insn, operand, 0);
2117           continue;
2118         }
2119
2120       /* If this is the base operand, and we are skipping it,
2121          just insert the current using basreg.  */
2122       if (skip_optional_basereg &&
2123           ((operand->flags & I370_OPERAND_BASE) != 0))
2124         {
2125           int basereg = -1;
2126           if (use_text)
2127             {
2128               if (0 == strncmp (now_seg->name, ".text", 5)
2129                   || 0 > i370_using_other_regno)
2130                 {
2131                   basereg = i370_using_text_regno;
2132                 }
2133               else
2134                 {
2135                   basereg = i370_using_other_regno;
2136                 }
2137             }
2138           else if (use_other)
2139             {
2140               if (0 > i370_using_other_regno)
2141                 {
2142                   basereg = i370_using_text_regno;
2143                 }
2144               else
2145                 {
2146                   basereg = i370_using_other_regno;
2147                 }
2148             }
2149           if (0 > basereg)
2150             {
2151               as_bad ("not using any base register");
2152             }
2153           insn = i370_insert_operand (insn, operand, basereg);
2154           continue;
2155         }
2156
2157       /* If this is an optional operand, and we are skipping it,
2158          Use zero (since a non-zero value would denote a register)  */
2159       if (skip_optional_reg
2160           && ((operand->flags & I370_OPERAND_OPTIONAL) != 0))
2161         {
2162           insn = i370_insert_operand (insn, operand, 0);
2163           continue;
2164         }
2165
2166       /* Gather the operand.  */
2167       hold = input_line_pointer;
2168       input_line_pointer = str;
2169
2170       /* register names are only allowed where there are registers ...  */
2171       if ((operand->flags & I370_OPERAND_GPR) != 0)
2172         {
2173           /* quickie hack to get past things like (,r13) */
2174           if (skip_optional_index && (',' == *input_line_pointer))
2175             {
2176               *input_line_pointer = ' ';
2177               input_line_pointer ++;
2178             }
2179           if (! register_name (&ex))
2180             {
2181               as_bad ("expecting a register for operand %d",
2182                       opindex_ptr - opcode->operands + 1);
2183             }
2184         }
2185
2186       /* check for a address constant expression */
2187       /* We will put PSW-relative addresses in the text section,
2188        * and adress literals in the .data (or other) section.  */
2189       else if (i370_addr_cons (&ex))
2190         use_other=1;
2191       else if (i370_addr_offset (&ex))
2192         use_text=1;
2193       else expression (&ex);
2194
2195       str = input_line_pointer;
2196       input_line_pointer = hold;
2197
2198       /* perform some off-by-one hacks on the length field of certain instructions.
2199        * Its such a shame to have to do this, but the problem is that HLASM got
2200        * defined so that the programmer specifies a length that is one greater
2201        * than what the machine instruction wants.
2202        * Sigh.
2203        */
2204       if (off_by_one && (0 == strcasecmp ("SS L", operand->name)))
2205         {
2206           ex.X_add_number --;
2207         }
2208
2209       if (ex.X_op == O_illegal)
2210         as_bad ("illegal operand");
2211       else if (ex.X_op == O_absent)
2212         as_bad ("missing operand");
2213       else if (ex.X_op == O_register)
2214         {
2215           insn = i370_insert_operand (insn, operand, ex.X_add_number);
2216         }
2217       else if (ex.X_op == O_constant)
2218         {
2219 #ifdef OBJ_ELF
2220           /* Allow @HA, @L, @H on constants.
2221            * Well actually, no we don't; there really don't make sense
2222            * (at least not to me) for the i370.  However, this code is
2223            * left here for any dubious future expansion reasons ...  */
2224           char *orig_str = str;
2225
2226           if ((reloc = i370_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED)
2227             switch (reloc)
2228               {
2229               default:
2230                 str = orig_str;
2231                 break;
2232
2233               case BFD_RELOC_LO16:
2234                 /* X_unsigned is the default, so if the user has done
2235                    something which cleared it, we always produce a
2236                    signed value.  */
2237                 ex.X_add_number = (((ex.X_add_number & 0xffff)
2238                                     ^ 0x8000)
2239                                    - 0x8000);
2240                 break;
2241
2242               case BFD_RELOC_HI16:
2243                 ex.X_add_number = (ex.X_add_number >> 16) & 0xffff;
2244                 break;
2245
2246               case BFD_RELOC_HI16_S:
2247                 ex.X_add_number = (((ex.X_add_number >> 16) & 0xffff)
2248                                    + ((ex.X_add_number >> 15) & 1));
2249                 break;
2250               }
2251 #endif
2252           insn = i370_insert_operand (insn, operand, ex.X_add_number);
2253         }
2254 #ifdef OBJ_ELF
2255       else if ((reloc = i370_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED)
2256         {
2257           as_tsktsk ("md_assemble(): suffixed relocations not supported\n");
2258
2259           /* We need to generate a fixup for this expression.  */
2260           if (fc >= MAX_INSN_FIXUPS)
2261             as_fatal ("too many fixups");
2262           fixups[fc].exp = ex;
2263           fixups[fc].opindex = 0;
2264           fixups[fc].reloc = reloc;
2265           ++fc;
2266         }
2267 #endif /* OBJ_ELF */
2268
2269       else
2270         {
2271           /* We need to generate a fixup for this expression.  */
2272           /* Typically, the expression will just be a symbol ...
2273            * printf ("insn %s needs fixup for %s \n",
2274            *        opcode->name, ex.X_add_symbol->bsym->name);
2275            */
2276
2277           if (fc >= MAX_INSN_FIXUPS)
2278             as_fatal ("too many fixups");
2279           fixups[fc].exp = ex;
2280           fixups[fc].opindex = *opindex_ptr;
2281           fixups[fc].reloc = BFD_RELOC_UNUSED;
2282           ++fc;
2283         }
2284
2285       /* skip over delimiter (close paren, or comma) */
2286       if ((')' == *str) && (',' == *(str+1)))
2287         ++str;
2288       if (*str != '\0')
2289         ++str;
2290     }
2291
2292   while (ISSPACE (*str))
2293     ++str;
2294
2295   if (*str != '\0')
2296     as_bad ("junk at end of line: `%s'", str);
2297
2298   /* Write out the instruction.  */
2299   f = frag_more (opcode->len);
2300   if (4 >= opcode->len)
2301     {
2302       md_number_to_chars (f, insn.i[0], opcode->len);
2303     }
2304   else
2305     {
2306       md_number_to_chars (f, insn.i[0], 4);
2307       if (6 == opcode->len)
2308         {
2309           md_number_to_chars ((f+4), ((insn.i[1])>>16), 2);
2310         }
2311       else
2312         {
2313           /* not used --- don't have any 8 byte instructions */
2314           as_bad ("Internal Error: bad instruction length");
2315           md_number_to_chars ((f+4), insn.i[1], opcode->len -4);
2316         }
2317     }
2318
2319   /* Create any fixups.  At this point we do not use a
2320      bfd_reloc_code_real_type, but instead just use the
2321      BFD_RELOC_UNUSED plus the operand index.  This lets us easily
2322      handle fixups for any operand type, although that is admittedly
2323      not a very exciting feature.  We pick a BFD reloc type in
2324      md_apply_fix.  */
2325   for (i = 0; i < fc; i++)
2326     {
2327       const struct i370_operand *operand;
2328
2329       operand = &i370_operands[fixups[i].opindex];
2330       if (fixups[i].reloc != BFD_RELOC_UNUSED)
2331         {
2332           reloc_howto_type *reloc_howto = bfd_reloc_type_lookup (stdoutput, fixups[i].reloc);
2333           int size;
2334           fixS *fixP;
2335
2336           if (!reloc_howto)
2337             abort ();
2338
2339           size = bfd_get_reloc_size (reloc_howto);
2340
2341           if (size < 1 || size > 4)
2342             abort ();
2343
2344           printf (" gwana doo fixup %d \n", i);
2345           fixP = fix_new_exp (frag_now, f - frag_now->fr_literal, size,
2346                               &fixups[i].exp, reloc_howto->pc_relative,
2347                               fixups[i].reloc);
2348
2349           /* Turn off complaints that the addend is too large for things like
2350              foo+100000@ha.  */
2351           switch (fixups[i].reloc)
2352             {
2353             case BFD_RELOC_16_GOTOFF:
2354             case BFD_RELOC_LO16:
2355             case BFD_RELOC_HI16:
2356             case BFD_RELOC_HI16_S:
2357               fixP->fx_no_overflow = 1;
2358               break;
2359             default:
2360               break;
2361             }
2362         }
2363       else
2364         {
2365           fix_new_exp (frag_now, f - frag_now->fr_literal, opcode->len,
2366                        &fixups[i].exp,
2367                        (operand->flags & I370_OPERAND_RELATIVE) != 0,
2368                        ((bfd_reloc_code_real_type)
2369                         (fixups[i].opindex + (int) BFD_RELOC_UNUSED)));
2370         }
2371     }
2372 }
2373
2374 /* Handle a macro.  Gather all the operands, transform them as
2375    described by the macro, and call md_assemble recursively.  All the
2376    operands are separated by commas; we don't accept parentheses
2377    around operands here.  */
2378
2379 static void
2380 i370_macro (str, macro)
2381      char *str;
2382      const struct i370_macro *macro;
2383 {
2384   char *operands[10];
2385   unsigned int count;
2386   char *s;
2387   unsigned int len;
2388   const char *format;
2389   int arg;
2390   char *send;
2391   char *complete;
2392
2393   /* Gather the users operands into the operands array.  */
2394   count = 0;
2395   s = str;
2396   while (1)
2397     {
2398       if (count >= sizeof operands / sizeof operands[0])
2399         break;
2400       operands[count++] = s;
2401       s = strchr (s, ',');
2402       if (s == (char *) NULL)
2403         break;
2404       *s++ = '\0';
2405     }
2406
2407   if (count != macro->operands)
2408     {
2409       as_bad ("wrong number of operands");
2410       return;
2411     }
2412
2413   /* Work out how large the string must be (the size is unbounded
2414      because it includes user input).  */
2415   len = 0;
2416   format = macro->format;
2417   while (*format != '\0')
2418     {
2419       if (*format != '%')
2420         {
2421           ++len;
2422           ++format;
2423         }
2424       else
2425         {
2426           arg = strtol (format + 1, &send, 10);
2427           know (send != format && arg >= 0 && arg < count);
2428           len += strlen (operands[arg]);
2429           format = send;
2430         }
2431     }
2432
2433   /* Put the string together.  */
2434   complete = s = (char *) alloca (len + 1);
2435   format = macro->format;
2436   while (*format != '\0')
2437     {
2438       if (*format != '%')
2439         *s++ = *format++;
2440       else
2441         {
2442           arg = strtol (format + 1, &send, 10);
2443           strcpy (s, operands[arg]);
2444           s += strlen (s);
2445           format = send;
2446         }
2447     }
2448   *s = '\0';
2449
2450   /* Assemble the constructed instruction.  */
2451   md_assemble (complete);
2452 }
2453 \f
2454 #ifdef OBJ_ELF
2455 /* For ELF, add support for SHF_EXCLUDE and SHT_ORDERED */
2456
2457 int
2458 i370_section_letter (letter, ptr_msg)
2459      int letter;
2460      char **ptr_msg;
2461 {
2462   if (letter == 'e')
2463     return SHF_EXCLUDE;
2464
2465   *ptr_msg = "Bad .section directive: want a,e,w,x,M,S in string";
2466   return 0;
2467 }
2468
2469 int
2470 i370_section_word (str, len)
2471     char *str;
2472     size_t len;
2473 {
2474   if (len == 7 && strncmp (str, "exclude", 7) == 0)
2475     return SHF_EXCLUDE;
2476
2477   return -1;
2478 }
2479
2480 int
2481 i370_section_type (str, len)
2482     char *str;
2483     size_t len;
2484 {
2485   if (len == 7 && strncmp (str, "ordered", 7) == 0)
2486      return SHT_ORDERED;
2487
2488   return -1;
2489 }
2490
2491 int
2492 i370_section_flags (flags, attr, type)
2493      int flags;
2494      int attr;
2495      int type;
2496 {
2497   if (type == SHT_ORDERED)
2498     flags |= SEC_ALLOC | SEC_LOAD | SEC_SORT_ENTRIES;
2499
2500   if (attr & SHF_EXCLUDE)
2501     flags |= SEC_EXCLUDE;
2502
2503   return flags;
2504 }
2505 #endif /* OBJ_ELF */
2506
2507 \f
2508 /* Pseudo-op handling.  */
2509
2510 /* The .byte pseudo-op.  This is similar to the normal .byte
2511    pseudo-op, but it can also take a single ASCII string.  */
2512
2513 static void
2514 i370_byte (ignore)
2515      int ignore;
2516 {
2517   if (*input_line_pointer != '\"')
2518     {
2519       cons (1);
2520       return;
2521     }
2522
2523   /* Gather characters.  A real double quote is doubled.  Unusual
2524      characters are not permitted.  */
2525   ++input_line_pointer;
2526   while (1)
2527     {
2528       char c;
2529
2530       c = *input_line_pointer++;
2531
2532       if (c == '\"')
2533         {
2534         if (*input_line_pointer != '\"')
2535             break;
2536           ++input_line_pointer;
2537         }
2538
2539       FRAG_APPEND_1_CHAR (c);
2540     }
2541
2542   demand_empty_rest_of_line ();
2543 }
2544 \f
2545 /* The .tc pseudo-op.  This is used when generating XCOFF and ELF.
2546    This takes two or more arguments.
2547
2548    When generating XCOFF output, the first argument is the name to
2549    give to this location in the toc; this will be a symbol with class
2550    TC.  The rest of the arguments are 4 byte values to actually put at
2551    this location in the TOC; often there is just one more argument, a
2552    relocateable symbol reference.
2553
2554    When not generating XCOFF output, the arguments are the same, but
2555    the first argument is simply ignored.  */
2556
2557 static void
2558 i370_tc (ignore)
2559      int ignore;
2560 {
2561
2562   /* Skip the TOC symbol name.  */
2563   while (is_part_of_name (*input_line_pointer)
2564          || *input_line_pointer == '['
2565          || *input_line_pointer == ']'
2566          || *input_line_pointer == '{'
2567          || *input_line_pointer == '}')
2568     ++input_line_pointer;
2569
2570   /* Align to a four byte boundary.  */
2571   frag_align (2, 0, 0);
2572   record_alignment (now_seg, 2);
2573
2574   if (*input_line_pointer != ',')
2575     demand_empty_rest_of_line ();
2576   else
2577     {
2578       ++input_line_pointer;
2579       cons (4);
2580     }
2581 }
2582 \f
2583 /* Turn a string in input_line_pointer into a floating point constant
2584    of type TYPE, and store the appropriate bytes in *LITP.  The number
2585    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
2586    returned, or NULL on OK.  */
2587
2588 char *
2589 md_atof (type, litp, sizep)
2590      int type;
2591      char *litp;
2592      int *sizep;
2593 {
2594   int prec;
2595   LITTLENUM_TYPE words[4];
2596   char *t;
2597   int i;
2598
2599   switch (type)
2600     {
2601     case 'f':
2602     case 'E':
2603       type = 'f';
2604       prec = 2;
2605       break;
2606
2607     case 'd':
2608     case 'D':
2609       type = 'd';
2610       prec = 4;
2611       break;
2612
2613     default:
2614       *sizep = 0;
2615       return "bad call to md_atof";
2616     }
2617
2618   /* 360/370/390 have two float formats: an old, funky 360 single-precision
2619    * format, and the ieee format.  Support only the ieee format.  */
2620   t = atof_ieee (input_line_pointer, type, words);
2621   if (t)
2622     input_line_pointer = t;
2623
2624   *sizep = prec * 2;
2625
2626   for (i = 0; i < prec; i++)
2627     {
2628       md_number_to_chars (litp, (valueT) words[i], 2);
2629       litp += 2;
2630     }
2631
2632   return NULL;
2633 }
2634
2635 /* Write a value out to the object file, using the appropriate
2636    endianness.  */
2637
2638 void
2639 md_number_to_chars (buf, val, n)
2640      char *buf;
2641      valueT val;
2642      int n;
2643 {
2644     number_to_chars_bigendian (buf, val, n);
2645 }
2646
2647 /* Align a section (I don't know why this is machine dependent).  */
2648
2649 valueT
2650 md_section_align (seg, addr)
2651      asection *seg;
2652      valueT addr;
2653 {
2654   int align = bfd_get_section_alignment (stdoutput, seg);
2655
2656   return (addr + (1 << align) - 1) & (-1 << align);
2657 }
2658
2659 /* We don't have any form of relaxing.  */
2660
2661 int
2662 md_estimate_size_before_relax (fragp, seg)
2663      fragS *fragp;
2664      asection *seg;
2665 {
2666   abort ();
2667   return 0;
2668 }
2669
2670 /* Convert a machine dependent frag.  We never generate these.  */
2671
2672 void
2673 md_convert_frag (abfd, sec, fragp)
2674      bfd *abfd;
2675      asection *sec;
2676      fragS *fragp;
2677 {
2678   abort ();
2679 }
2680
2681 /* We have no need to default values of symbols.  */
2682
2683 symbolS *
2684 md_undefined_symbol (name)
2685      char *name;
2686 {
2687   return 0;
2688 }
2689 \f
2690 /* Functions concerning relocs.  */
2691
2692 /* The location from which a PC relative jump should be calculated,
2693    given a PC relative reloc.  */
2694
2695 long
2696 md_pcrel_from_section (fixp, sec)
2697      fixS *fixp;
2698      segT sec;
2699 {
2700   return fixp->fx_frag->fr_address + fixp->fx_where;
2701 }
2702
2703 /* Apply a fixup to the object code.  This is called for all the
2704    fixups we generated by the call to fix_new_exp, above.  In the call
2705    above we used a reloc code which was the largest legal reloc code
2706    plus the operand index.  Here we undo that to recover the operand
2707    index.  At this point all symbol values should be fully resolved,
2708    and we attempt to completely resolve the reloc.  If we can not do
2709    that, we determine the correct reloc code and put it back in the
2710    fixup.
2711
2712    See gas/cgen.c for more sample code and explanations of what's
2713    going on here ...
2714 */
2715
2716 int
2717 md_apply_fix3 (fixp, valuep, seg)
2718      fixS *fixp;
2719      valueT *valuep;
2720      segT seg;
2721 {
2722   valueT value;
2723
2724   value = *valuep;
2725   if (fixp->fx_addsy != NULL)
2726     {
2727       /* Notes:
2728          Branches to labels will come in here with fixp->fx_pcrel set to 1
2729          and fixp->fx_subsy not null, and holding the value of the base
2730          (i.e. the value of the .using). These we want to ignore.
2731
2732          'Strong' and 'weak' symbols will come in here with
2733          fixp->fx_pcrel==0, fixp->fx_addsy defined, and
2734          *valuep holding the value of the symbol.
2735
2736          'Strong' symbols will have S_GET_VALUE(fx_addsy) equal to zero,
2737          whereas 'weak' symbols will have S_GET_VALUE(fx_addsy) set to the
2738          symbol value (usually).
2739
2740          We want to subtract S_GET_VALUE(fx_addsy) if it set, and
2741          for all practical purposes, do a fixup with value zero.  This
2742          is because the linker/loader, at a later time, will do this
2743          fixup with the correct value. If we fixup now with a value,
2744          it will get double-fixed, leading to garbage.
2745
2746          Note that subsy will also be set for strong/weak symbols
2747          when the user program was compiled with -g.  In that case,
2748          subsy will hold the base address (i.e. the .using address).
2749       */
2750
2751       if (fixp->fx_addsy->sy_used_in_reloc
2752           && S_GET_SEGMENT (fixp->fx_addsy) != absolute_section
2753           && S_GET_SEGMENT (fixp->fx_addsy) != undefined_section
2754           && ! bfd_is_com_section (S_GET_SEGMENT (fixp->fx_addsy)))
2755         value -= S_GET_VALUE (fixp->fx_addsy);
2756
2757 #ifdef DEBUG
2758       printf ("\nmd_apply_fix3: symbol %s at 0x%x (%s:%d) val=0x%x addend=0x%x\n",
2759               S_GET_NAME (fixp->fx_addsy),
2760               fixp->fx_frag->fr_address + fixp->fx_where,
2761               fixp->fx_file, fixp->fx_line,
2762               S_GET_VALUE (fixp->fx_addsy), value);
2763 #endif
2764     }
2765   else
2766     {
2767       fixp->fx_done = 1;
2768       return 1;
2769     }
2770
2771   /* Apply fixups to operands.  Note that there should be no relocations
2772      for any operands, since no instruction ever takes an operand
2773      that requires reloc.  */
2774   if ((int) fixp->fx_r_type >= (int) BFD_RELOC_UNUSED)
2775     {
2776       int opindex;
2777       const struct i370_operand *operand;
2778       char *where;
2779       i370_insn_t insn;
2780
2781       opindex = (int) fixp->fx_r_type - (int) BFD_RELOC_UNUSED;
2782
2783       operand = &i370_operands[opindex];
2784
2785 #ifdef DEBUG
2786       printf ("\nmd_apply_fix3: fixup operand %s at 0x%x in %s:%d addend=0x%x\n",
2787               operand->name,
2788               fixp->fx_frag->fr_address + fixp->fx_where,
2789               fixp->fx_file, fixp->fx_line,
2790               value);
2791 #endif
2792       /* Fetch the instruction, insert the fully resolved operand
2793          value, and stuff the instruction back again.
2794          fisxp->fx_size is the length of the instruction.  */
2795       where = fixp->fx_frag->fr_literal + fixp->fx_where;
2796       insn.i[0] = bfd_getb32 ((unsigned char *) where);
2797       if (6 <= fixp->fx_size)
2798         {    /* deal with 48-bit insn's */
2799           insn.i[1] = bfd_getb32 (((unsigned char *) where)+4);
2800         }
2801       insn = i370_insert_operand (insn, operand, (offsetT) value);
2802       bfd_putb32 ((bfd_vma) insn.i[0], (unsigned char *) where);
2803       if (6 <= fixp->fx_size)
2804         {   /* deal with 48-bit insn's */
2805           bfd_putb32 ((bfd_vma) insn.i[1], (((unsigned char *) where)+4));
2806         }
2807
2808       /* we are done, right? right !! */
2809       fixp->fx_done = 1;
2810       if (fixp->fx_done)
2811         {
2812           /* Nothing else to do here.  */
2813           return 1;
2814         }
2815
2816       /* Determine a BFD reloc value based on the operand information.
2817          We are only prepared to turn a few of the operands into
2818          relocs.  In fact, we support *zero* operand relocations ...
2819          Why?  Because we are not expecting the compiler to generate
2820          any operands that need relocation.  Due to the 12-bit naturew of
2821          i370 addressing, this would be unusual.  */
2822 #if 0
2823       if ((operand->flags & I370_OPERAND_RELATIVE) != 0
2824           && operand->bits == 12
2825           && operand->shift == 0)
2826         fixp->fx_r_type = BFD_RELOC_I370_D12;
2827       else
2828 #endif
2829         {
2830           char *sfile;
2831           unsigned int sline;
2832
2833           /* Use expr_symbol_where to see if this is an expression
2834              symbol.  */
2835           if (expr_symbol_where (fixp->fx_addsy, &sfile, &sline))
2836             as_bad_where (fixp->fx_file, fixp->fx_line,
2837                           "unresolved expression that must be resolved");
2838           else
2839             as_bad_where (fixp->fx_file, fixp->fx_line,
2840                           "unsupported relocation type");
2841           fixp->fx_done = 1;
2842           return 1;
2843         }
2844     }
2845   else
2846     {
2847       /* We branch to here if the fixup is not to a symbol that
2848        * appears in an instruction operand, but is rather some
2849        * declared storage.
2850        */
2851 #ifdef OBJ_ELF
2852       i370_elf_validate_fix (fixp, seg);
2853 #endif
2854 #ifdef DEBUG
2855       printf ("md_apply_fix3: reloc case %d in segment  %s %s:%d\n",
2856               fixp->fx_r_type, segment_name (seg), fixp->fx_file, fixp->fx_line);
2857       printf ("\tcurrent fixup value is 0x%x \n", value);
2858 #endif
2859       switch (fixp->fx_r_type)
2860         {
2861         case BFD_RELOC_32:
2862         case BFD_RELOC_CTOR:
2863           if (fixp->fx_pcrel)
2864             fixp->fx_r_type = BFD_RELOC_32_PCREL;
2865           /* fall through */
2866
2867         case BFD_RELOC_RVA:
2868         case BFD_RELOC_32_PCREL:
2869         case BFD_RELOC_32_BASEREL:
2870 #ifdef DEBUG
2871           printf ("\t32 bit relocation at 0x%x\n",
2872                   fixp->fx_frag->fr_address + fixp->fx_where);
2873 #endif
2874           md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
2875                               value, 4);
2876           break;
2877
2878         case BFD_RELOC_LO16:
2879         case BFD_RELOC_16:
2880           if (fixp->fx_pcrel)
2881             as_bad_where (fixp->fx_file, fixp->fx_line,
2882                           "cannot emit PC relative %s relocation%s%s",
2883                           bfd_get_reloc_code_name (fixp->fx_r_type),
2884                           fixp->fx_addsy != NULL ? " against " : "",
2885                           (fixp->fx_addsy != NULL
2886                            ? S_GET_NAME (fixp->fx_addsy)
2887                            : ""));
2888
2889           md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
2890                               value, 2);
2891           break;
2892
2893           /* This case happens when you write, for example,
2894              lis %r3,(L1-L2)@ha
2895              where L1 and L2 are defined later.  */
2896         case BFD_RELOC_HI16:
2897           if (fixp->fx_pcrel)
2898             abort ();
2899           md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
2900                               value >> 16, 2);
2901           break;
2902         case BFD_RELOC_HI16_S:
2903           if (fixp->fx_pcrel)
2904             abort ();
2905           md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
2906                               (value + 0x8000) >> 16, 2);
2907           break;
2908
2909         case BFD_RELOC_8:
2910           if (fixp->fx_pcrel)
2911             abort ();
2912
2913           md_number_to_chars (fixp->fx_frag->fr_literal + fixp->fx_where,
2914                               value, 1);
2915           break;
2916
2917         default:
2918           fprintf (stderr,
2919                   "Gas failure, reloc value %d\n", fixp->fx_r_type);
2920           fflush (stderr);
2921           abort ();
2922         }
2923     }
2924
2925   fixp->fx_addnumber = value;
2926
2927   return 1;
2928 }
2929
2930 /* Generate a reloc for a fixup.  */
2931
2932 arelent *
2933 tc_gen_reloc (seg, fixp)
2934      asection *seg;
2935      fixS *fixp;
2936 {
2937   arelent *reloc;
2938
2939   reloc = (arelent *) xmalloc (sizeof (arelent));
2940
2941   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2942   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2943   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2944   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
2945   if (reloc->howto == (reloc_howto_type *) NULL)
2946     {
2947       as_bad_where (fixp->fx_file, fixp->fx_line,
2948                     "reloc %d not supported by object file format", (int)fixp->fx_r_type);
2949       return NULL;
2950     }
2951   reloc->addend = fixp->fx_addnumber;
2952
2953 #ifdef DEBUG
2954   printf ("\ngen_reloc(): sym %s (%s:%d) at addr 0x%x addend=0x%x\n",
2955           fixp->fx_addsy->bsym->name,
2956           fixp->fx_file, fixp->fx_line,
2957           reloc->address, reloc->addend);
2958 #endif
2959
2960   return reloc;
2961 }