diff options
author | Claudiu Zissulescu <claziss@synopsys.com> | 2015-12-04 10:49:57 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2015-12-04 10:49:57 +0000 |
commit | 24b368f8532b4775f9fd5bcc7958a84d4218aa46 (patch) | |
tree | df221eb545296594c1801556ba1c9ae3fb555bb8 /gas/config | |
parent | 5cc854a862fef488bd08190eb5822ab6e2a50ef3 (diff) | |
download | gdb-24b368f8532b4775f9fd5bcc7958a84d4218aa46.zip gdb-24b368f8532b4775f9fd5bcc7958a84d4218aa46.tar.gz gdb-24b368f8532b4775f9fd5bcc7958a84d4218aa46.tar.bz2 |
Fix failures in the GAS testsuite for the ARC architecture.
gas * config/tc-arc.c (arc_option): Sets all internal gas options when
parsing .cpu directive.
(declare_register_set): Declare all 64 registers.
(md_section_align): Refactor.
(md_pcrel_from_section): Remove assert.
(pseudo_operand_match): Fix pseudo operand match.
(find_reloc): Use flags filed, extend matching.
* config/tc-arc.h (TC_VALIDATE_FIX): Don't fixup any PLT
relocation.
testsuite * gas/arc/bic.d: Update test.
* gas/arc/add_s-err.s: New file.
* gas/arc/cpu-warn1.s: Likewise.
* gas/arc/pcl-relocs.d: Likewise.
* gas/arc/pcl-relocs.s: Likewise.
* gas/arc/pcrel-relocs.d: Likewise.
* gas/arc/pcrel-relocs.s: Likewise.
* gas/arc/pic-relocs.d: Likewise.
* gas/arc/pic-relocs.s: Likewise.
* gas/arc/plt-relocs.d: Likewise.
* gas/arc/plt-relocs.s: Likewise.
* gas/arc/pseudos.d: Likewise.
* gas/arc/pseudos.s: Likewise.
* gas/arc/sda-relocs.d: Likewise.
* gas/arc/sda-relocs.s: Likewise.
* gas/arc/sda-relocs2.d: Likewise.
* gas/arc/sda-relocs2.s: Likewise.
* gas/arc/tls-relocs.d: Likewise.
* gas/arc/tls-relocs.s: Likewise.
opcode * arc.h (arc_reloc_equiv_tab): Replace flagcode with flags[32].
opcodes * arc-dis.c (special_flag_p): Match full mnemonic.
* arc-opc.c (print_insn_arc): Check section size to read
appropriate number of bytes. Fix printing.
* arc-tbl.h: Fix instruction table. Allow clri/seti instruction without
arguments.
Diffstat (limited to 'gas/config')
-rw-r--r-- | gas/config/tc-arc.c | 79 | ||||
-rw-r--r-- | gas/config/tc-arc.h | 22 |
2 files changed, 71 insertions, 30 deletions
diff --git a/gas/config/tc-arc.c b/gas/config/tc-arc.c index ca43566..cbf2180 100644 --- a/gas/config/tc-arc.c +++ b/gas/config/tc-arc.c @@ -155,9 +155,9 @@ struct option md_longopts[] = { "EL", no_argument, NULL, OPTION_EL }, { "mcpu", required_argument, NULL, OPTION_MCPU }, { "mA6", no_argument, NULL, OPTION_ARC600 }, - { "mARC600", no_argument, NULL, OPTION_ARC600 }, - { "mARC601", no_argument, NULL, OPTION_ARC601 }, - { "mARC700", no_argument, NULL, OPTION_ARC700 }, + { "mARC600", no_argument, NULL, OPTION_ARC600 }, + { "mARC601", no_argument, NULL, OPTION_ARC601 }, + { "mARC700", no_argument, NULL, OPTION_ARC700 }, { "mA7", no_argument, NULL, OPTION_ARC700 }, { "mEM", no_argument, NULL, OPTION_ARCEM }, { "mHS", no_argument, NULL, OPTION_ARCHS }, @@ -512,28 +512,47 @@ arc_option (int ignore ATTRIBUTE_UNUSED) c = get_symbol_name (&cpu); mach = arc_get_mach (cpu); - restore_line_pointer (c); if (mach == -1) goto bad_cpu; if (!mach_type_specified_p) { - arc_mach_type = mach; + if ((!strcmp ("ARC600", cpu)) + || (!strcmp ("ARC601", cpu)) + || (!strcmp ("A6", cpu))) + { + md_parse_option (OPTION_MCPU, "arc600"); + } + else if ((!strcmp ("ARC700", cpu)) + || (!strcmp ("A7", cpu))) + { + md_parse_option (OPTION_MCPU, "arc700"); + } + else if (!strcmp ("EM", cpu)) + { + md_parse_option (OPTION_MCPU, "arcem"); + } + else if (!strcmp ("HS", cpu)) + { + md_parse_option (OPTION_MCPU, "archs"); + } + else + as_fatal ("could not find the architecture"); + if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, mach)) as_fatal ("could not set architecture and machine"); - - mach_type_specified_p = 1; } else if (arc_mach_type != mach) as_warn ("Command-line value overrides \".cpu\" directive"); + restore_line_pointer (c); demand_empty_rest_of_line (); - return; bad_cpu: + restore_line_pointer (c); as_bad ("invalid identifier for \".cpu\""); ignore_rest_of_line (); } @@ -964,7 +983,7 @@ static void declare_register_set (void) { int i; - for (i = 0; i < 32; ++i) + for (i = 0; i < 64; ++i) { char name[7]; @@ -1067,7 +1086,7 @@ md_section_align (segT segment, { int align = bfd_get_section_alignment (stdoutput, segment); - return ((size + (1 << align) - 1) & -(1 << align)); + return ((size + (1 << align) - 1) & (-((valueT) 1 << align))); } /* The location from which a PC relative jump should be calculated, @@ -1105,11 +1124,10 @@ md_pcrel_from_section (fixS *fixP, case BFD_RELOC_ARC_PC32: /* The hardware calculates relative to the start of the insn, but this relocation is relative to location of the - LIMM, compensate. TIP: the base always needs to be + LIMM, compensate. The base always needs to be substracted by 4 as we do not support this type of PCrel relocation for short instructions. */ - base -= fixP->fx_where - fixP->fx_dot_value; - gas_assert ((fixP->fx_where - fixP->fx_dot_value) == 4); + base -= 4; /* Fall through. */ case BFD_RELOC_ARC_PLT32: case BFD_RELOC_ARC_S25H_PCREL_PLT: @@ -1930,7 +1948,7 @@ pseudo_operand_match (const expressionS *tok, ret = 1; else if (!(operand_real->flags & ARC_OPERAND_IR)) { - val = tok->X_add_number; + val = tok->X_add_number + op->count; if (operand_real->flags & ARC_OPERAND_SIGNED) { max = (1 << (operand_real->bits - 1)) - 1; @@ -2539,7 +2557,7 @@ find_reloc (const char *name, { unsigned int i; int j; - bfd_boolean found_flag; + bfd_boolean found_flag, tmp; extended_bfd_reloc_code_real_type ret = BFD_RELOC_UNUSED; for (i = 0; i < arc_num_equiv_tab; i++) @@ -2551,17 +2569,34 @@ find_reloc (const char *name, continue; if (r->mnemonic && (strcmp (r->mnemonic, opcodename))) continue; - if (r->flagcode) + if (r->flags[0]) { if (!nflg) continue; found_flag = FALSE; - for (j = 0; j < nflg; j++) - if (pflags[i].code == r->flagcode) - { - found_flag = TRUE; - break; - } + unsigned * psflg = (unsigned *)r->flags; + do + { + tmp = FALSE; + for (j = 0; j < nflg; j++) + if (!strcmp (pflags[j].name, + arc_flag_operands[*psflg].name)) + { + tmp = TRUE; + break; + } + if (!tmp) + { + found_flag = FALSE; + break; + } + else + { + found_flag = TRUE; + } + ++ psflg; + } while (*psflg); + if (!found_flag) continue; } diff --git a/gas/config/tc-arc.h b/gas/config/tc-arc.h index 8fff767..fa0bbd9 100644 --- a/gas/config/tc-arc.h +++ b/gas/config/tc-arc.h @@ -125,14 +125,20 @@ extern long md_pcrel_from_section (struct fix *, segT); arc_cons_fix_new ((FRAG), (OFF), (LEN), (EXP), (RELOC)) /* We don't want gas to fixup the following program memory related - relocations. */ -#define TC_VALIDATE_FIX(FIXP,SEG,SKIP) \ - if ((FIXP->fx_r_type == BFD_RELOC_ARC_GOTPC32) \ - && FIXP->fx_addsy != NULL \ - && FIXP->fx_subsy == NULL) \ - { \ - symbol_mark_used_in_reloc (FIXP->fx_addsy); \ - goto SKIP; \ + relocations. Check also that fx_addsy is not NULL, in order to + make sure that the fixup refers to some sort of label. */ +#define TC_VALIDATE_FIX(FIXP,SEG,SKIP) \ + if ((FIXP->fx_r_type == BFD_RELOC_ARC_GOTPC32 \ + || FIXP->fx_r_type == BFD_RELOC_ARC_PLT32 \ + || FIXP->fx_r_type == BFD_RELOC_ARC_S25W_PCREL_PLT \ + || FIXP->fx_r_type == BFD_RELOC_ARC_S25H_PCREL_PLT \ + || FIXP->fx_r_type == BFD_RELOC_ARC_S21W_PCREL_PLT \ + || FIXP->fx_r_type == BFD_RELOC_ARC_S21H_PCREL_PLT) \ + && FIXP->fx_addsy != NULL \ + && FIXP->fx_subsy == NULL) \ + { \ + symbol_mark_used_in_reloc (FIXP->fx_addsy); \ + goto SKIP; \ } /* BFD_RELOC_ARC_TLS_GD_LD may use fx_subsy to store a label that is |