diff options
Diffstat (limited to 'gas/config/tc-s390.c')
-rw-r--r-- | gas/config/tc-s390.c | 103 |
1 files changed, 57 insertions, 46 deletions
diff --git a/gas/config/tc-s390.c b/gas/config/tc-s390.c index a84750b..dc3b16f 100644 --- a/gas/config/tc-s390.c +++ b/gas/config/tc-s390.c @@ -28,25 +28,28 @@ #include "opcode/s390.h" #include "elf/s390.h" -/* The default architecture */ +/* The default architecture. */ #ifndef DEFAULT_ARCH #define DEFAULT_ARCH "s390" #endif static char *default_arch = DEFAULT_ARCH; /* Either 32 or 64, selects file format. */ static int s390_arch_size; -/* Current architecture. Start with the smallest instruction set */ +/* Current architecture. Start with the smallest instruction set. */ static enum s390_opcode_arch_val current_architecture = S390_OPCODE_ESA; static int current_arch_mask = 1 << S390_OPCODE_ESA; static int current_arch_requested = 0; -/* Whether to use user friendly register names. Default is true. */ +/* Whether to use user friendly register names. Default is true. */ #ifndef TARGET_REG_NAMES_P #define TARGET_REG_NAMES_P true #endif static boolean reg_names_p = TARGET_REG_NAMES_P; +/* Set to TRUE if we want to warn about zero base/index registers. */ +static boolean warn_areg_zero = FALSE; + /* Generic assembler global variables which must be defined by all targets. */ @@ -367,6 +370,9 @@ md_parse_option (c, arg) else if (arg != NULL && strcmp (arg, "no-regnames") == 0) reg_names_p = false; + else if (arg != NULL && strcmp (arg, "warn-areg-zero") == 0) + warn_areg_zero = TRUE; + else { as_bad (_("invalid switch -m%s"), arg); @@ -413,17 +419,18 @@ md_show_usage (stream) FILE *stream; { fprintf (stream, _("\ - S390 options:\n\ - -mregnames \tAllow symbolic names for registers\n\ - -mno-regnames\tDo not allow symbolic names for registers\n")); + S390 options:\n\ + -mregnames Allow symbolic names for registers\n\ + -mwarn-areg-zero Warn about zero base/index registers\n\ + -mno-regnames Do not allow symbolic names for registers\n")); fprintf (stream, _("\ - -V \tprint assembler version number\n\ - -Qy, -Qn \tignored\n")); + -V print assembler version number\n\ + -Qy, -Qn ignored\n")); } /* This function is called when the assembler starts up. It is called after the options have been parsed and the output file has been - opened. */ + opened. */ void md_begin () @@ -433,7 +440,7 @@ md_begin () boolean dup_insn = false; const char *retval; - /* Set the ELF flags if desired. */ + /* Set the ELF flags if desired. */ if (s390_flags) bfd_set_private_flags (stdoutput, s390_flags); @@ -638,8 +645,8 @@ s390_elf_suffix (str_p, exp_p) len = str - ident; for (ptr = &mapping[0]; ptr->length > 0; ptr++) - if (len == ptr->length && - strncasecmp (ident, ptr->string, ptr->length) == 0) + if (len == ptr->length + && strncasecmp (ident, ptr->string, ptr->length) == 0) { if (exp_p->X_add_number != 0) as_warn (_("identifier+constant@%s means identifier@%s+constant"), @@ -732,8 +739,8 @@ s390_exp_compare(exp1, exp2) case O_uminus: case O_bit_not: case O_logical_not: - return (exp1->X_add_symbol == exp2->X_add_symbol) && - (exp1->X_add_number == exp2->X_add_number); + return (exp1->X_add_symbol == exp2->X_add_symbol) + && (exp1->X_add_number == exp2->X_add_number); case O_multiply: /* X_add_symbol,X_op_symbol&X_add_number must be equal. */ case O_divide: @@ -754,9 +761,9 @@ s390_exp_compare(exp1, exp2) case O_gt: case O_logical_and: case O_logical_or: - return (exp1->X_add_symbol == exp2->X_add_symbol) && - (exp1->X_op_symbol == exp2->X_op_symbol) && - (exp1->X_add_number == exp2->X_add_number); + return (exp1->X_add_symbol == exp2->X_add_symbol) + && (exp1->X_op_symbol == exp2->X_op_symbol) + && (exp1->X_add_number == exp2->X_add_number); default: return 0; } @@ -785,8 +792,8 @@ s390_lit_suffix (str_p, exp_p, suffix) while (ISALNUM (*str)) str++; len = str - ident; - if (len != 4 || strncasecmp (ident, "lit", 3) != 0 || - (ident[3]!='1' && ident[3]!='2' && ident[3]!='4' && ident[3]!='8')) + if (len != 4 || strncasecmp (ident, "lit", 3) != 0 + || (ident[3]!='1' && ident[3]!='2' && ident[3]!='4' && ident[3]!='8')) return suffix; /* no modification */ nbytes = ident[3] - '0'; @@ -838,8 +845,8 @@ s390_lit_suffix (str_p, exp_p, suffix) { /* Processing for 'normal' data types. */ for (lpe = lpe_list; lpe != NULL; lpe = lpe->next) - if (lpe->nbytes == nbytes && lpe->reloc == reloc && - s390_exp_compare(exp_p, &lpe->ex) != 0) + if (lpe->nbytes == nbytes && lpe->reloc == reloc + && s390_exp_compare(exp_p, &lpe->ex) != 0) break; } @@ -1062,9 +1069,13 @@ md_gather_operands (str, insn, opcode) } else { - if ((operand->flags & S390_OPERAND_INDEX) && ex.X_add_number == 0) + if ((operand->flags & S390_OPERAND_INDEX) + && ex.X_add_number == 0 + && warn_areg_zero == TRUE) as_warn ("index register specified but zero"); - if ((operand->flags & S390_OPERAND_BASE) && ex.X_add_number == 0) + if ((operand->flags & S390_OPERAND_BASE) + && ex.X_add_number == 0 + && warn_areg_zero == TRUE) as_warn ("base register specified but zero"); s390_insert_operand (insn, operand, ex.X_add_number, NULL, 0); } @@ -1079,26 +1090,26 @@ md_gather_operands (str, insn, opcode) { if (operand->flags & S390_OPERAND_DISP) reloc = BFD_RELOC_390_GOT12; - else if ((operand->flags & S390_OPERAND_SIGNED) && - (operand->bits == 16)) + else if ((operand->flags & S390_OPERAND_SIGNED) + && (operand->bits == 16)) reloc = BFD_RELOC_390_GOT16; - else if ((operand->flags & S390_OPERAND_PCREL) && - (operand->bits == 32)) + else if ((operand->flags & S390_OPERAND_PCREL) + && (operand->bits == 32)) reloc = BFD_RELOC_390_GOTENT; } else if (suffix == ELF_SUFFIX_PLT) { - if ((operand->flags & S390_OPERAND_PCREL) && - (operand->bits == 16)) + if ((operand->flags & S390_OPERAND_PCREL) + && (operand->bits == 16)) reloc = BFD_RELOC_390_PLT16DBL; - else if ((operand->flags & S390_OPERAND_PCREL) && - (operand->bits == 32)) + else if ((operand->flags & S390_OPERAND_PCREL) + && (operand->bits == 32)) reloc = BFD_RELOC_390_PLT32DBL; } else if (suffix == ELF_SUFFIX_GOTENT) { - if ((operand->flags & S390_OPERAND_PCREL) && - (operand->bits == 32)) + if ((operand->flags & S390_OPERAND_PCREL) + && (operand->bits == 32)) reloc = BFD_RELOC_390_GOTENT; } @@ -1243,8 +1254,8 @@ md_gather_operands (str, insn, opcode) /* Turn off overflow checking in fixup_segment. This is necessary because fixup_segment will signal an overflow for large 4 byte quantities for GOT12 relocations. */ - if (fixups[i].reloc == BFD_RELOC_390_GOT12 || - fixups[i].reloc == BFD_RELOC_390_GOT16) + if ( fixups[i].reloc == BFD_RELOC_390_GOT12 + || fixups[i].reloc == BFD_RELOC_390_GOT16) fixP->fx_no_overflow = 1; } else @@ -1354,18 +1365,18 @@ s390_insn (ignore) expression (&exp); if (exp.X_op == O_constant) { - if ((opformat->oplen == 6 && exp.X_op > 0 && exp.X_op < (1ULL << 48)) || - (opformat->oplen == 4 && exp.X_op > 0 && exp.X_op < (1ULL << 32)) || - (opformat->oplen == 2 && exp.X_op > 0 && exp.X_op < (1ULL << 16))) + if ( ((opformat->oplen == 6) && (exp.X_op > 0) && (exp.X_op < (1ULL << 48))) + || ((opformat->oplen == 4) && (exp.X_op > 0) && (exp.X_op < (1ULL << 32))) + || ((opformat->oplen == 2) && (exp.X_op > 0) && (exp.X_op < (1ULL << 16)))) md_number_to_chars (insn, exp.X_add_number, opformat->oplen); else as_bad (_("Invalid .insn format\n")); } else if (exp.X_op == O_big) { - if (exp.X_add_number > 0 && - opformat->oplen == 6 && - generic_bignum[3] == 0) + if (exp.X_add_number > 0 + && opformat->oplen == 6 + && generic_bignum[3] == 0) { md_number_to_chars (insn, generic_bignum[2], 2); md_number_to_chars (&insn[2], generic_bignum[1], 2); @@ -1614,7 +1625,7 @@ tc_s390_fix_adjustable(fixP) if (S_IS_WEAK (fixP->fx_addsy)) return 0; /* adjust_reloc_syms doesn't know about the GOT. */ - if (fixP->fx_r_type == BFD_RELOC_32_GOTOFF + if ( fixP->fx_r_type == BFD_RELOC_32_GOTOFF || fixP->fx_r_type == BFD_RELOC_390_PLT16DBL || fixP->fx_r_type == BFD_RELOC_390_PLT32 || fixP->fx_r_type == BFD_RELOC_390_PLT32DBL @@ -1726,8 +1737,8 @@ md_apply_fix3 (fixp, valuep, seg) else fixp->fx_r_type = BFD_RELOC_16; } - else if (operand->bits == 32 && operand->shift == 16 && - (operand->flags & S390_OPERAND_PCREL)) + else if (operand->bits == 32 && operand->shift == 16 + && (operand->flags & S390_OPERAND_PCREL)) { fixp->fx_size = 4; fixp->fx_where += 2; @@ -1890,8 +1901,8 @@ tc_gen_reloc (seg, fixp) code = fixp->fx_r_type; if (GOT_symbol && fixp->fx_addsy == GOT_symbol) { - if ((s390_arch_size == 32 && code == BFD_RELOC_32_PCREL) || - (s390_arch_size == 64 && code == BFD_RELOC_64_PCREL)) + if ( (s390_arch_size == 32 && code == BFD_RELOC_32_PCREL) + || (s390_arch_size == 64 && code == BFD_RELOC_64_PCREL)) code = BFD_RELOC_390_GOTPC; if (code == BFD_RELOC_390_PC32DBL) code = BFD_RELOC_390_GOTPCDBL; |