gas,opcodes: fix hardware capabilities bumping in the sparc assembler.
authorJose E. Marchesi <jose.marchesi@oracle.com>
Tue, 22 Nov 2016 12:40:37 +0000 (04:40 -0800)
committerJose E. Marchesi <jose.marchesi@oracle.com>
Tue, 22 Nov 2016 12:40:37 +0000 (04:40 -0800)
commit6884417a0ff3555b192d4aceeacc5e7232cad207
treea13845af3304184f587a5d9341184a1e3373b74a
parentc4b943d7aed5edbfc31aa1e9dc9e7bcf108d76a0
gas,opcodes: fix hardware capabilities bumping in the sparc assembler.

When the assembler finds an instruction which is part of a higher
opcode architecture it bumps the current opcode architecture.  For
example:

   $ echo "mwait" | as -bump
   {standard input}: Assembler messages:
   {standard input}:1: Warning: architecture bumped from "v6" to "v9m" on "mwait"

However, when two instructions pertaining to the same opcode
architecture but associated to different SPARC hardware capabilities
are found in the input stream, and no GAS architecture is specified in
the command line, the assembler bangs:

   $ echo "mwait; wr %g0,%g1,%mcdper" | as -bump
   {standard input}: Assembler messages:
   {standard input}:1: Warning: architecture bumped from "v6" to "v9m" on "mwait"
   {standard input}:1: Error: Hardware capability "sparc5" not enabled for "wr".

... and it should'nt, as WRMCDPER pertains to the same architecture
level than MWAIT.

This patch fixes this by extending the definition of sparc opcode
architectures to contain a set of hardware capabilities and making the
assembler to take these capabilities into account when updating the
set of allowed hwcaps when an architecture bump is triggered by some
instruction.

This way, hwcaps associated to architecture levels are maintained in
opcodes, while the assembler keeps the flexibiity of defining GAS
architectures including additional hwcaps (like -Asparcfmaf or the
v8plus* variants).

A test covering this failure case is included.

gas/ChangeLog:

2016-11-22  Jose E. Marchesi  <jose.marchesi@oracle.com>

        * config/tc-sparc.c: Move HWS_* and HWS2_* definitions to
        opcodes/sparc-opc.c.
        (sparc_arch): Clarify the new role of the hwcap_allowed and
        hwcap2_allowed fields.
        (sparc_arch_table): Remove HWS_* and HWS2_* instances from
        hwcap_allowed and hwcap2_allowed respectively.
        (md_parse_option): Include the opcode arch hwcaps when processing
        -A.
        (sparc_ip): Use the current opcode arch hwcaps to update
        hwcap_allowed, as well of the hwcaps of the instruction triggering
        the bump.
        * testsuite/gas/sparc/hwcaps-bump.s: New file.
        * testsuite/gas/sparc/hwcaps-bump.l: Likewise.
        * testsuite/gas/sparc/sparc.exp (gas_64_check): Run tests in
        hwcaps-bump.

include/ChangeLog:

2016-11-22  Jose E. Marchesi  <jose.marchesi@oracle.com>

        * opcode/sparc.h (sparc_opcode_arch): New fields hwcaps and
        hwcaps2.

opcodes/ChangeLog:

2016-11-22  Jose E. Marchesi  <jose.marchesi@oracle.com>

        * sparc-opc.c (HWS_V8): Definition moved from
        gas/config/tc-sparc.c.
        (HWS_V9): Likewise.
        (HWS_VA): Likewise.
        (HWS_VB): Likewise.
        (HWS_VC): Likewise.
        (HWS_VD): Likewise.
        (HWS_VE): Likewise.
        (HWS_VV): Likewise.
        (HWS_VM): Likewise.
        (HWS2_VM): Likewise.
        (sparc_opcode_archs): Initialize hwcaps and hwcaps2 fields of
        existing entries.
gas/ChangeLog
gas/config/tc-sparc.c
gas/testsuite/gas/sparc/hwcaps-bump.l [new file with mode: 0644]
gas/testsuite/gas/sparc/hwcaps-bump.s [new file with mode: 0644]
gas/testsuite/gas/sparc/sparc.exp
include/ChangeLog
include/opcode/sparc.h
opcodes/ChangeLog
opcodes/sparc-opc.c