X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-m32r.c;h=3387fe3038098c08df551dd18e429ea08259b406;hb=4512dafa508c4b148996f2d67222a82dd018cdd3;hp=51619451aafdde369117b02f0dd7a6bddfb9f64e;hpb=4b4da1607aeed19ac399963a3aa12b0417e477ae;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/config/tc-m32r.c b/gas/config/tc-m32r.c index 51619451aa..3387fe3038 100644 --- a/gas/config/tc-m32r.c +++ b/gas/config/tc-m32r.c @@ -1,12 +1,11 @@ /* tc-m32r.c -- Assembler for the Renesas M32R. - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 - Free Software Foundation, Inc. + Copyright (C) 1996-2016 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, @@ -19,7 +18,6 @@ the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ -#include #include "as.h" #include "safe-ctype.h" #include "subsegs.h" @@ -120,7 +118,7 @@ static int warn_explicit_parallel_conflicts = 1; static int ignore_parallel_conflicts = 0; /* Non-zero if insns can be made parallel. */ -static int use_parallel = 1; +static int use_parallel = 0; /* Non-zero if optimizations should be performed. */ static int optimize; @@ -166,7 +164,7 @@ struct m32r_hi_fixup static struct m32r_hi_fixup *m32r_hi_fixup_list; -struct +static const struct { enum bfd_architecture bfd_mach; int mach_flags; @@ -268,7 +266,7 @@ parallel (void) } int -md_parse_option (int c, char *arg ATTRIBUTE_UNUSED) +md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED) { switch (c) { @@ -407,11 +405,11 @@ md_show_usage (FILE *stream) fprintf (stream, _("\ -ignore-parallel-conflicts do not check parallel instructions\n")); fprintf (stream, _("\ - fo contraint violations\n")); + for constraint violations\n")); fprintf (stream, _("\ -no-ignore-parallel-conflicts check parallel instructions for\n")); fprintf (stream, _("\ - contraint violations\n")); + constraint violations\n")); fprintf (stream, _("\ -Ip synonym for -ignore-parallel-conflicts\n")); fprintf (stream, _("\ @@ -479,7 +477,7 @@ m32r_check_fixup (expressionS *main_exp, bfd_reloc_code_real_type *r_type_p) return 0; } - if (exp->X_op == O_PIC_reloc || exp->X_md != BFD_RELOC_UNUSED) + if (exp->X_op == O_PIC_reloc) { *r_type_p = exp->X_md; if (exp == main_exp) @@ -569,13 +567,10 @@ debug_sym (int ignore ATTRIBUTE_UNUSED) { char *name; char delim; - char *end_name; symbolS *symbolP; - sym_linkS *link; + sym_linkS *lnk; - name = input_line_pointer; - delim = get_symbol_end (); - end_name = input_line_pointer; + delim = get_symbol_name (&name); if ((symbolP = symbol_find (name)) == NULL && (symbolP = md_undefined_symbol (name)) == NULL) @@ -590,14 +585,14 @@ debug_sym (int ignore ATTRIBUTE_UNUSED) else { - link = (sym_linkS *) xmalloc (sizeof (sym_linkS)); - link->symbol = symbolP; - link->next = debug_sym_link; - debug_sym_link = link; + lnk = XNEW (sym_linkS); + lnk->symbol = symbolP; + lnk->next = debug_sym_link; + debug_sym_link = lnk; symbol_get_obj (symbolP)->local = 1; } - *end_name = delim; + (void) restore_line_pointer (delim); demand_empty_rest_of_line (); } @@ -618,7 +613,7 @@ expand_debug_syms (sym_linkS *syms, int align) { symbolS *symbolP = syms->symbol; next_syms = syms->next; - input_line_pointer = ".\n"; + input_line_pointer = (char *) ".\n"; pseudo_set (symbolP); free ((char *) syms); } @@ -714,6 +709,7 @@ md_begin (void) /* The sbss section is for local .scomm symbols. */ sbss_section = subseg_new (".sbss", 0); + seg_info (sbss_section)->bss = 1; /* This is copied from perform_an_assembly_pass. */ applicable = bfd_applicable_section_flags (stdoutput); @@ -723,12 +719,12 @@ md_begin (void) /* We must construct a fake section similar to bfd_com_section but with the name .scommon. */ - scom_section = bfd_com_section; + scom_section = *bfd_com_section_ptr; scom_section.name = ".scommon"; scom_section.output_section = & scom_section; scom_section.symbol = & scom_symbol; scom_section.symbol_ptr_ptr = & scom_section.symbol; - scom_symbol = * bfd_com_section.symbol; + scom_symbol = * bfd_com_section_ptr->symbol; scom_symbol.name = ".scommon"; scom_symbol.section = & scom_section; @@ -920,7 +916,7 @@ assemble_two_insns (char *str1, char *str2, int parallel_p) if (! (first.insn = m32r_cgen_assemble_insn (gas_cgen_cpu_desc, str1, & first.fields, first.buffer, & errmsg))) { - as_bad (errmsg); + as_bad ("%s", errmsg); return; } @@ -1034,7 +1030,7 @@ assemble_two_insns (char *str1, char *str2, int parallel_p) if (! (second.insn = m32r_cgen_assemble_insn (gas_cgen_cpu_desc, str1, & second.fields, second.buffer, & errmsg))) { - as_bad (errmsg); + as_bad ("%s", errmsg); return; } @@ -1225,7 +1221,7 @@ md_assemble (char *str) if (!insn.insn) { - as_bad (errmsg); + as_bad ("%s", errmsg); return; } @@ -1454,7 +1450,7 @@ md_section_align (segT segment, valueT size) { int align = bfd_get_section_alignment (stdoutput, segment); - return ((size + (1 << align) - 1) & (-1 << align)); + return ((size + (1 << align) - 1) & -(1 << align)); } symbolS * @@ -1481,13 +1477,12 @@ m32r_scomm (int ignore ATTRIBUTE_UNUSED) offsetT align; int align2; - name = input_line_pointer; - c = get_symbol_end (); + c = get_symbol_name (&name); /* Just after name is now '\0'. */ p = input_line_pointer; *p = c; - SKIP_WHITESPACE (); + SKIP_WHITESPACE_AFTER_NAME (); if (*input_line_pointer != ',') { as_bad (_("Expected comma after symbol-name: rest of line ignored.")); @@ -1809,8 +1804,8 @@ md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, { fixS *fixP; - assert (fragP->fr_subtype != 1); - assert (fragP->fr_cgen.insn != 0); + gas_assert (fragP->fr_subtype != 1); + gas_assert (fragP->fr_cgen.insn != 0); fixP = gas_cgen_record_fixup (fragP, /* Offset of branch insn in frag. */ @@ -1900,10 +1895,10 @@ m32r_record_hi16 (int reloc_type, { struct m32r_hi_fixup *hi_fixup; - assert (reloc_type == BFD_RELOC_M32R_HI16_SLO + gas_assert (reloc_type == BFD_RELOC_M32R_HI16_SLO || reloc_type == BFD_RELOC_M32R_HI16_ULO); - hi_fixup = xmalloc (sizeof (* hi_fixup)); + hi_fixup = XNEW (struct m32r_hi_fixup); hi_fixup->fixp = fixP; hi_fixup->seg = now_seg; hi_fixup->next = m32r_hi_fixup_list; @@ -1995,7 +1990,7 @@ m32r_cgen_record_fixup_exp (fragS *frag, #define FX_OPINFO_R_TYPE(f) ((f)->fx_cgen.opinfo) /* Sort any unmatched HI16 relocs so that they immediately precede - the corresponding LO16 reloc. This is called before md_apply_fix3 and + the corresponding LO16 reloc. This is called before md_apply_fix and tc_gen_reloc. */ void @@ -2008,7 +2003,7 @@ m32r_frob_file (void) segment_info_type *seginfo; int pass; - assert (FX_OPINFO_R_TYPE (l->fixp) == BFD_RELOC_M32R_HI16_SLO + gas_assert (FX_OPINFO_R_TYPE (l->fixp) == BFD_RELOC_M32R_HI16_SLO || FX_OPINFO_R_TYPE (l->fixp) == BFD_RELOC_M32R_HI16_ULO); /* Check quickly whether the next fixup happens to be a matching low. */ @@ -2049,7 +2044,7 @@ m32r_frob_file (void) for (pf = &seginfo->fix_root; *pf != l->fixp; pf = & (*pf)->fx_next) - assert (*pf != NULL); + gas_assert (*pf != NULL); *pf = l->fixp->fx_next; @@ -2111,63 +2106,10 @@ md_number_to_chars (char *buf, valueT val, int n) /* Equal to MAX_PRECISION in atof-ieee.c. */ #define MAX_LITTLENUMS 6 -char * +const char * md_atof (int type, char *litP, int *sizeP) { - int i; - int prec; - LITTLENUM_TYPE words[MAX_LITTLENUMS]; - 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); - - if (target_big_endian) - { - for (i = 0; i < prec; i++) - { - md_number_to_chars (litP, (valueT) words[i], - sizeof (LITTLENUM_TYPE)); - litP += sizeof (LITTLENUM_TYPE); - } - } - else - { - for (i = prec - 1; i >= 0; i--) - { - md_number_to_chars (litP, (valueT) words[i], - sizeof (LITTLENUM_TYPE)); - litP += sizeof (LITTLENUM_TYPE); - } - } - - return 0; + return ieee_md_atof (type, litP, sizeP, target_big_endian); } void @@ -2252,13 +2194,24 @@ tc_gen_reloc (asection * section, fixS * fixP) { arelent * reloc; bfd_reloc_code_real_type code; - - reloc = xmalloc (sizeof (* reloc)); - - reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *)); + + reloc = XNEW (arelent); + + reloc->sym_ptr_ptr = XNEW (asymbol *); *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy); reloc->address = fixP->fx_frag->fr_address + fixP->fx_where; - + + if (fixP->fx_pcrel) + { + if (fixP->fx_r_type == BFD_RELOC_32) + fixP->fx_r_type = BFD_RELOC_32_PCREL; + else if (fixP->fx_r_type == BFD_RELOC_16) + { + fixP->fx_r_type = BFD_RELOC_16_PCREL; + bfd_set_error (bfd_error_bad_value); + } + } + code = fixP->fx_r_type; if (pic_code) { @@ -2310,7 +2263,7 @@ printf("%s",bfd_get_reloc_code_name(code)); printf(" => %s",bfd_get_reloc_code_name(code)); #endif } - + reloc->howto = bfd_reloc_type_lookup (stdoutput, code); #ifdef DEBUG_PIC @@ -2324,10 +2277,11 @@ printf(" => %s\n",reloc->howto->name); fixP->fx_r_type, bfd_get_reloc_code_name (code)); return NULL; } - + /* Use fx_offset for these cases. */ if ( fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY - || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT) + || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT + || fixP->fx_r_type == BFD_RELOC_32_PCREL) reloc->addend = fixP->fx_offset; else if ((!pic_code && code != BFD_RELOC_M32R_26_PLTREL) @@ -2341,12 +2295,12 @@ printf(" => %s\n",reloc->howto->name); reloc->addend = fixP->fx_offset; else reloc->addend = fixP->fx_addnumber; - + return reloc; } inline static char * -m32r_end_of_match (char *cont, char *what) +m32r_end_of_match (char *cont, const char *what) { int len = strlen (what); @@ -2358,7 +2312,10 @@ m32r_end_of_match (char *cont, char *what) } int -m32r_parse_name (char const *name, expressionS *exprP, char *nextcharP) +m32r_parse_name (char const *name, + expressionS *exprP, + enum expr_mode mode, + char *nextcharP) { char *next = input_line_pointer; char *next_end; @@ -2379,13 +2336,13 @@ m32r_parse_name (char const *name, expressionS *exprP, char *nextcharP) /* If we have an absolute symbol or a reg, then we know its value now. */ segment = S_GET_SEGMENT (exprP->X_add_symbol); - if (segment == absolute_section) + if (mode != expr_defer && segment == absolute_section) { exprP->X_op = O_constant; exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol); exprP->X_add_symbol = NULL; } - else if (segment == reg_section) + else if (mode != expr_defer && segment == reg_section) { exprP->X_op = O_register; exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);