OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [binutils-2.20.1/] [gas/] [config/] [tc-i370.c] - Blame information for rev 413

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.