[BACK]Return to tc-i370.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / external / gpl3 / binutils.old / dist / gas / config

Annotation of src/external/gpl3/binutils.old/dist/gas/config/tc-i370.c, Revision 1.3

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

CVSweb <webmaster@jp.NetBSD.org>