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