X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-bfin.c;h=1dc88fce0667f0b0db18fd5b295a6a87308f0bd0;hb=feb4bea70a297eb6316d1b0685bbbb8095b7fb29;hp=e854dce059e281da905402cab94f9c8178e6912f;hpb=71ef6f79bc8926dfd6e1b49456a67795af9e2069;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/config/tc-bfin.c b/gas/config/tc-bfin.c index e854dce059..1dc88fce06 100644 --- a/gas/config/tc-bfin.c +++ b/gas/config/tc-bfin.c @@ -1,6 +1,5 @@ /* tc-bfin.c -- Assembler for the ADI Blackfin. - Copyright 2005, 2006, 2007, 2008, 2009, 2010 - Free Software Foundation, Inc. + Copyright (C) 2005-2016 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -27,7 +26,6 @@ #ifdef OBJ_ELF #include "dwarf2dbg.h" #endif -#include "libbfd.h" #include "elf/common.h" #include "elf/bfin.h" @@ -112,7 +110,7 @@ bfin_pic_ptr (int nbytes) static void bfin_s_bss (int ignore ATTRIBUTE_UNUSED) { - register int temp; + int temp; temp = get_absolute_expression (); subseg_set (bss_section, (subsegT) temp); @@ -286,30 +284,35 @@ struct bfin_cpu bfin_cpus[] = {"bf542m", BFIN_CPU_BF542M, 0x0003, AC_05000074}, + {"bf542", BFIN_CPU_BF542, 0x0004, AC_05000074}, {"bf542", BFIN_CPU_BF542, 0x0002, AC_05000074}, {"bf542", BFIN_CPU_BF542, 0x0001, AC_05000074}, {"bf542", BFIN_CPU_BF542, 0x0000, AC_05000074}, {"bf544m", BFIN_CPU_BF544M, 0x0003, AC_05000074}, + {"bf544", BFIN_CPU_BF544, 0x0004, AC_05000074}, {"bf544", BFIN_CPU_BF544, 0x0002, AC_05000074}, {"bf544", BFIN_CPU_BF544, 0x0001, AC_05000074}, {"bf544", BFIN_CPU_BF544, 0x0000, AC_05000074}, {"bf547m", BFIN_CPU_BF547M, 0x0003, AC_05000074}, + {"bf547", BFIN_CPU_BF547, 0x0004, AC_05000074}, {"bf547", BFIN_CPU_BF547, 0x0002, AC_05000074}, {"bf547", BFIN_CPU_BF547, 0x0001, AC_05000074}, {"bf547", BFIN_CPU_BF547, 0x0000, AC_05000074}, {"bf548m", BFIN_CPU_BF548M, 0x0003, AC_05000074}, + {"bf548", BFIN_CPU_BF548, 0x0004, AC_05000074}, {"bf548", BFIN_CPU_BF548, 0x0002, AC_05000074}, {"bf548", BFIN_CPU_BF548, 0x0001, AC_05000074}, {"bf548", BFIN_CPU_BF548, 0x0000, AC_05000074}, {"bf549m", BFIN_CPU_BF549M, 0x0003, AC_05000074}, + {"bf549", BFIN_CPU_BF549, 0x0004, AC_05000074}, {"bf549", BFIN_CPU_BF549, 0x0002, AC_05000074}, {"bf549", BFIN_CPU_BF549, 0x0001, AC_05000074}, {"bf549", BFIN_CPU_BF549, 0x0000, AC_05000074}, @@ -320,8 +323,6 @@ struct bfin_cpu bfin_cpus[] = {"bf592", BFIN_CPU_BF592, 0x0001, AC_05000074}, {"bf592", BFIN_CPU_BF592, 0x0000, AC_05000074}, - - {NULL, 0, 0, 0} }; /* Define bfin-specific command-line options (there are none). */ @@ -344,7 +345,7 @@ size_t md_longopts_size = sizeof (md_longopts); int -md_parse_option (int c ATTRIBUTE_UNUSED, char *arg ATTRIBUTE_UNUSED) +md_parse_option (int c ATTRIBUTE_UNUSED, const char *arg ATTRIBUTE_UNUSED) { switch (c) { @@ -353,23 +354,22 @@ md_parse_option (int c ATTRIBUTE_UNUSED, char *arg ATTRIBUTE_UNUSED) case OPTION_MCPU: { - const char *p, *q; - int i; + const char *q; + unsigned int i; - i = 0; - while ((p = bfin_cpus[i].name) != NULL) + for (i = 0; i < ARRAY_SIZE (bfin_cpus); i++) { + const char *p = bfin_cpus[i].name; if (strncmp (arg, p, strlen (p)) == 0) break; - i++; } - if (p == NULL) + if (i == ARRAY_SIZE (bfin_cpus)) as_fatal ("-mcpu=%s is not valid", arg); bfin_cpu_type = bfin_cpus[i].type; - q = arg + strlen (p); + q = arg + strlen (bfin_cpus[i].name); if (*q == '\0') { @@ -381,7 +381,8 @@ md_parse_option (int c ATTRIBUTE_UNUSED, char *arg ATTRIBUTE_UNUSED) else if (strcmp (q, "-any") == 0) { bfin_si_revision = 0xffff; - while (bfin_cpus[i].type == bfin_cpu_type) + while (i < ARRAY_SIZE (bfin_cpus) + && bfin_cpus[i].type == bfin_cpu_type) { bfin_anomaly_checks |= bfin_cpus[i].anomaly_checks; i++; @@ -404,11 +405,13 @@ md_parse_option (int c ATTRIBUTE_UNUSED, char *arg ATTRIBUTE_UNUSED) bfin_si_revision = (si_major << 8) | si_minor; - while (bfin_cpus[i].type == bfin_cpu_type + while (i < ARRAY_SIZE (bfin_cpus) + && bfin_cpus[i].type == bfin_cpu_type && bfin_cpus[i].si_revision != bfin_si_revision) i++; - if (bfin_cpus[i].type != bfin_cpu_type) + if (i == ARRAY_SIZE (bfin_cpus) + || bfin_cpus[i].type != bfin_cpu_type) goto invalid_silicon_revision; bfin_anomaly_checks |= bfin_cpus[i].anomaly_checks; @@ -442,7 +445,7 @@ md_show_usage (FILE * stream) /* Perform machine-specific initializations. */ void -md_begin () +md_begin (void) { /* Set the ELF flags if desired. */ if (bfin_flags) @@ -481,20 +484,18 @@ void md_assemble (char *line) { char *toP = 0; - extern char *current_inputline; int size, insn_size; struct bfin_insn *tmp_insn; size_t len; static size_t buffer_len = 0; + static char *current_inputline; parse_state state; len = strlen (line); if (len + 2 > buffer_len) { - if (buffer_len > 0) - free (current_inputline); buffer_len = len + 40; - current_inputline = xmalloc (buffer_len); + current_inputline = XRESIZEVEC (char, current_inputline, buffer_len); } memcpy (current_inputline, line, len); current_inputline[len] = ';'; @@ -787,16 +788,14 @@ md_apply_fix (fixS *fixP, valueT *valueP, segT seg ATTRIBUTE_UNUSED) /* Round up a section size to the appropriate boundary. */ valueT -md_section_align (segment, size) - segT segment; - valueT size; +md_section_align (segT segment, valueT size) { int boundary = bfd_get_section_alignment (stdoutput, segment); - return ((size + (1 << boundary) - 1) & (-1 << boundary)); + return ((size + (1 << boundary) - 1) & -(1 << boundary)); } -char * +const char * md_atof (int type, char * litP, int * sizeP) { return ieee_md_atof (type, litP, sizeP, FALSE); @@ -807,14 +806,12 @@ md_atof (int type, char * litP, int * sizeP) then it is done here. */ arelent * -tc_gen_reloc (seg, fixp) - asection *seg ATTRIBUTE_UNUSED; - fixS *fixp; +tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp) { arelent *reloc; - reloc = (arelent *) xmalloc (sizeof (arelent)); - reloc->sym_ptr_ptr = (asymbol **) 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; @@ -840,9 +837,7 @@ tc_gen_reloc (seg, fixp) given a PC relative reloc. */ long -md_pcrel_from_section (fixP, sec) - fixS *fixP; - segT sec; +md_pcrel_from_section (fixS *fixP, segT sec) { if (fixP->fx_addsy != (symbolS *) NULL && (!S_IS_DEFINED (fixP->fx_addsy) @@ -933,7 +928,7 @@ note_reloc2 (INSTR_T code, const char *symbol, int reloc, int value, int pcrel) INSTR_T gencode (unsigned long x) { - INSTR_T cell = obstack_alloc (&mempool, sizeof (struct bfin_insn)); + INSTR_T cell = XOBNEW (&mempool, struct bfin_insn); memset (cell, 0, sizeof (struct bfin_insn)); cell->value = (x); return cell; @@ -944,7 +939,7 @@ int ninsns; int count_insns; static void * -allocate (int n) +allocate (size_t n) { return obstack_alloc (&mempool, n); } @@ -1904,6 +1899,15 @@ bfin_gen_loop (Expr_Node *exp, REG_T reg, int rop, REG_T preg) return bfin_gen_loopsetup (lbegin, reg, rop, lend, preg); } +void +bfin_loop_attempt_create_label (Expr_Node *exp, int is_begin) +{ + char *name; + name = fb_label_name (exp->value.i_value, is_begin); + exp->value.s_value = xstrdup (name); + exp->type = Expr_Node_Reloc; +} + void bfin_loop_beginend (Expr_Node *exp, int begin) { @@ -1957,9 +1961,9 @@ bfin_eol_in_insn (char *line) } bfd_boolean -bfin_start_label (char *s, char *ptr) +bfin_start_label (char *s) { - while (s != ptr) + while (*s != 0) { if (*s == '(' || *s == '[') return FALSE;