X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-mt.c;h=303004bcc3b339ac83a7fd0a7c131fb14d86180b;hb=07e7fdfd429985f061630c46e91cb10579607233;hp=f9a610e049c17d9d186abeca198720df1244761b;hpb=01f0fe5e0450edf168c1f612feb93cf588e4e7ea;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/config/tc-mt.c b/gas/config/tc-mt.c index f9a610e049..303004bcc3 100644 --- a/gas/config/tc-mt.c +++ b/gas/config/tc-mt.c @@ -1,11 +1,11 @@ /* tc-mt.c -- Assembler for the Morpho Technologies mt . - Copyright (C) 2005 Free Software Foundation. + Copyright (C) 2005-2020 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. GAS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) + the Free Software Foundation; either version 3, or (at your option) any later version. GAS is distributed in the hope that it will be useful, @@ -14,21 +14,19 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ -#include #include "as.h" #include "dwarf2dbg.h" -#include "subsegs.h" +#include "subsegs.h" #include "symcat.h" #include "opcodes/mt-desc.h" #include "opcodes/mt-opc.h" #include "cgen.h" #include "elf/common.h" #include "elf/mt.h" -#include "libbfd.h" /* Structure to hold all of the different components describing an individual instruction. */ @@ -55,14 +53,14 @@ mt_insn; const char comment_chars[] = ";"; const char line_comment_chars[] = "#"; -const char line_separator_chars[] = ""; +const char line_separator_chars[] = ""; const char EXP_CHARS[] = "eE"; const char FLT_CHARS[] = "dD"; /* The target specific pseudo-ops which we support. */ const pseudo_typeS md_pseudo_table[] = { - { "word", cons, 4 }, + { "word", cons, 4 }, { NULL, NULL, 0 } }; @@ -70,7 +68,7 @@ const pseudo_typeS md_pseudo_table[] = static int no_scheduling_restrictions = 0; -struct option md_longopts[] = +struct option md_longopts[] = { #define OPTION_NO_SCHED_REST (OPTION_MD_BASE) { "nosched", no_argument, NULL, OPTION_NO_SCHED_REST }, @@ -102,7 +100,7 @@ enum mt_architectures static enum mt_architectures mt_arch = ms1_16_002; int -md_parse_option (int c ATTRIBUTE_UNUSED, char * arg) +md_parse_option (int c ATTRIBUTE_UNUSED, const char * arg) { switch (c) { @@ -135,6 +133,7 @@ md_parse_option (int c ATTRIBUTE_UNUSED, char * arg) mt_mach_bitmask = 1 << MACH_MS2; mt_arch = ms2; } + break; case OPTION_NO_SCHED_REST: no_scheduling_restrictions = 1; break; @@ -162,7 +161,7 @@ void md_begin (void) { /* Initialize the `cgen' interface. */ - + /* Set the machine number and endian. */ gas_cgen_cpu_desc = mt_cgen_cpu_open (CGEN_CPU_OPEN_MACHS, mt_mach_bitmask, CGEN_CPU_OPEN_ENDIAN, @@ -179,6 +178,8 @@ md_begin (void) /* Set the machine type. */ bfd_default_set_arch_mach (stdoutput, bfd_arch_mt, mt_mach); + + literal_prefix_dollar_hex = TRUE; } void @@ -259,16 +260,16 @@ md_assemble (char * str) && insn.fields.f_sr1 == delayed_load_register) || (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_USES_FRSR2) && insn.fields.f_sr2 == delayed_load_register)) - as_warn (_("operand references R%ld of previous instrutcion."), + as_warn (_("operand references R%ld of previous instruction."), delayed_load_register); else if ((CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_USES_FRSR1) && insn.fields.f_sr1 == prev_delayed_load_register) || (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_USES_FRSR2) && insn.fields.f_sr2 == prev_delayed_load_register)) - as_warn (_("operand references R%ld of instructcion before previous."), + as_warn (_("operand references R%ld of instruction before previous."), prev_delayed_load_register); } - + /* Detect data dependency between conditional branch instruction and an immediately preceding arithmetic or logical instruction. */ if (last_insn_was_arithmetic_or_logic @@ -295,6 +296,7 @@ md_assemble (char * str) last_insn_had_delay_slot = CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_DELAY_SLOT); + (void) last_insn_had_delay_slot; last_insn_has_load_delay = CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_LOAD_DELAY); @@ -310,30 +312,30 @@ md_assemble (char * str) last_insn_was_branch_insn = CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_BR_INSN); - + last_insn_was_conditional_branch_insn = CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_BR_INSN) && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_USES_FRSR2); - + prev_delayed_load_register = delayed_load_register; - + if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_USES_FRDR)) - delayed_load_register = insn.fields.f_dr; + delayed_load_register = insn.fields.f_dr; else if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_USES_FRDRRR)) - delayed_load_register = insn.fields.f_drrr; + delayed_load_register = insn.fields.f_drrr; else /* Insns has no destination register. */ - delayed_load_register = 0; + delayed_load_register = 0; /* Generate dwarf2 line numbers. */ - dwarf2_emit_insn (4); + dwarf2_emit_insn (4); } valueT md_section_align (segT segment, valueT size) { - int align = bfd_get_section_alignment (stdoutput, segment); + int align = bfd_section_alignment (segment); - return ((size + (1 << align) - 1) & (-1 << align)); + return ((size + (1 << align) - 1) & -(1 << align)); } symbolS * @@ -348,7 +350,7 @@ md_estimate_size_before_relax (fragS * fragP ATTRIBUTE_UNUSED, { as_fatal (_("md_estimate_size_before_relax\n")); return 1; -} +} /* *fragP has been relaxed to its final size, and now needs to have the bytes inside it modified to conform to the new size. @@ -433,61 +435,10 @@ md_number_to_chars (char * buf, valueT val, int n) number_to_chars_bigendian (buf, val, n); } -/* Turn a string in input_line_pointer into a floating point constant of type - type, and store the appropriate bytes in *litP. The number of LITTLENUMS - emitted is stored in *sizeP . An error message is returned, or NULL on OK. */ - -/* Equal to MAX_PRECISION in atof-ieee.c. */ -#define MAX_LITTLENUMS 6 - -char * -md_atof (type, litP, sizeP) - char type; - char * litP; - int * sizeP; +const char * +md_atof (int type, char * litP, int * sizeP) { - int prec; - LITTLENUM_TYPE words [MAX_LITTLENUMS]; - LITTLENUM_TYPE * wordP; - char * t; - - switch (type) - { - case 'f': - case 'F': - case 's': - case 'S': - prec = 2; - break; - - case 'd': - case 'D': - case 'r': - case 'R': - prec = 4; - break; - - /* FIXME: Some targets allow other format chars for bigger sizes here. */ - - default: - * sizeP = 0; - return _("Bad call to md_atof()"); - } - - t = atof_ieee (input_line_pointer, type, words); - if (t) - input_line_pointer = t; - * sizeP = prec * sizeof (LITTLENUM_TYPE); - - /* This loops outputs the LITTLENUMs in REVERSE order; - in accord with the mt endianness. */ - for (wordP = words; prec--;) - { - md_number_to_chars (litP, (valueT) (*wordP++), sizeof (LITTLENUM_TYPE)); - litP += sizeof (LITTLENUM_TYPE); - } - - return 0; + return ieee_md_atof (type, litP, sizeP, FALSE); } /* See whether we need to force a relocation into the output file. */ @@ -510,8 +461,6 @@ mt_apply_fix (fixS *fixP, valueT *valueP, segT seg) bfd_boolean mt_fix_adjustable (fixS * fixP) { - bfd_reloc_code_real_type reloc_type; - if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED) { const CGEN_INSN *insn = NULL; @@ -519,20 +468,18 @@ mt_fix_adjustable (fixS * fixP) const CGEN_OPERAND *operand; operand = cgen_operand_lookup_by_num(gas_cgen_cpu_desc, opindex); - reloc_type = md_cgen_lookup_reloc (insn, operand, fixP); + md_cgen_lookup_reloc (insn, operand, fixP); } - else - reloc_type = fixP->fx_r_type; if (fixP->fx_addsy == NULL) return TRUE; - + /* Prevent all adjustments to global symbols. */ if (S_IS_EXTERNAL (fixP->fx_addsy)) return FALSE; - + if (S_IS_WEAK (fixP->fx_addsy)) return FALSE; - + return 1; }