binutils-gdb/include/opcode
Thomas Preud'homme 2c6b98ea6f [ARM] Rework Tag_CPU_arch build attribute value selection
=== Context ===

This patch is part of a patch series to add support for ARMv8-R
architecture. Its purpose is to rework the Tag_CPU_arch build attribute
value selection to (i) match architecture or CPU if specified by user
without any need for hack and (ii) match an architecture with all the
features used if in autodetection mode or return an error.

=== Motivation ===

Currently, Tag_CPU_arch build attribute value selection assumes that an
architecture is always a superset of architectures released earlier. As
such, the logic is to browse architectures in chronological order of
release and selecting the Tag_CPU_arch value of the last one to
contribute a feature used[1]/requested[2] not contributed by earlier
architectures.

[1] in case of autodetection mode
[2] otherwise, ie. in case of -mcpu/-march or associated directives

This logic fails the two objectives mentionned in the Context section.
First, due to the assumption it does an architecture can be selected
while not having all the features used/requested which fails the second
objective. Second, not doing an exact match when an architecture or CPU
is selected by the user means the wrong value is chosen when a later
architecture provides a subset of the feature bits of an earlier
architecture. This is the case for the implementation of ARMv8-R (see
later patch).

An added benefit of this patch is that it is possible to easily generate
more consistent build attribute by setting the feature bits from the
architecture matched in aeabi_set_public_attributes in autodetection
mode. This is better done as a separate patch because lots of testcase'
expected results must then be updated accordingly.

=== Patch description ===

The patch changes the main logic for Tag_CPU_arch and
Tag_CPU_arch_profile
values selection to:
- look for an exact match in case an architecture or CPU was specified
  on the command line or in a directive
- select the first released architecture that provides a superset of the
  feature used in the autodetection case
- select the most featureful architecture in case of -march=all
The array cpu_arch_ver is updated to include all architectures in order
to make the first point work.

Note that when looking for an exact match, the architecture with
selected extension is tried first and then only the architecture. This
is because some architectures are exactly equivalent to an earlier
architecture with its extensions selected. ARMv6S-M (= ARMv6-M + OS
extension) and ARMv6KZ (ARMv6K + security extension) are two such
examples.

Other adjustments are also necessary in aeabi_set_public_attributes to
make this change work.

1) The logic to set Tag_ARM_ISA_use and Tag_THUMB_ISA_use must check the
absence of feature bit used/requested to decide whether to give the
default value for empty files (see EABI attribute defaults test). It was
previously checking that arch == 0 which would only happen if no feature
bit could be matched by any architecture, ie there is no feature bit to
match.

2) A fallback to a superset match must exist when no_cpu_selected ()
returns true. This is because aeabi_set_public_attributes is called
again after relaxation and at this point selected_cpu is set from the
previous execution of that function. There is therefore no way to check
whether the user specified an architecture or CPU.

3) Tag_CPU_arch lines are removed from expected output when the
detected architecture should be pre-ARMv4, since 0 is the Tag_CPU_arch
value for pre-ARMv4 architectures and default value for an absent entry
is 0.

2017-06-21  Thomas Preud'homme  <thomas.preudhomme@arm.com>

gas/
	* config/tc-arm.c (fpu_any): Defined from FPU_ANY.
	(cpu_arch_ver): Add all architectures and sort by release date.
	(have_ext_for_needed_feat_p): New.
	(get_aeabi_cpu_arch_from_fset): New.
	(aeabi_set_public_attributes): Call above function to determine
	Tag_CPU_arch and Tag_CPU_arch_profile values.  Adapt Tag_ARM_ISA_use
	and Tag_THUMB_ISA_use selection logic to check absence of feature bit
	accordingly.
	* testsuite/gas/arm/attr-march-armv1.d: Fix expected Tag_CPU_arch build
	attribute value.
	* testsuite/gas/arm/attr-march-armv2.d: Likewise.
	* testsuite/gas/arm/attr-march-armv2a.d: Likewise.
	* testsuite/gas/arm/attr-march-armv2s.d: Likewise.
	* testsuite/gas/arm/attr-march-armv3.d: Likewise.
	* testsuite/gas/arm/attr-march-armv3m.d: Likewise.
	* testsuite/gas/arm/pr12198-2.d: Likewise.

include/
	* opcode/arm.h (FPU_ANY): New macro.
2017-06-21 16:42:01 +01:00
..
aarch64.h [AArch64] Additional SVE instructions 2017-02-24 18:29:00 +00:00
alpha.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
arc-attrs.h [ARC] Object attributes. 2017-05-10 14:42:22 +02:00
arc-func.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
arc.h [ARC] Update MAX_INSN_FLGS. 2017-05-23 12:18:10 +02:00
arm.h [ARM] Rework Tag_CPU_arch build attribute value selection 2017-06-21 16:42:01 +01:00
avr.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
bfin.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
cgen.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
ChangeLog-0415 binutils ChangeLog rotation 2016-01-01 22:59:17 +10:30
ChangeLog-9103 Add copyright notices 2012-12-10 12:48:03 +00:00
convex.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
cr16.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
cris.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
crx.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
d10v.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
d30v.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
dlx.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
ft32.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
h8300.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
hppa.h Fix match and mask for 64-bit bb opcode. 2017-05-14 16:06:06 -04:00
i370.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
i386.h x86: Add NOTRACK prefix support 2017-05-22 11:02:58 -07:00
i860.h Clarify that include/opcode/ files are part of GNU opcodes 2017-01-25 12:30:52 +00:00
i960.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
ia64.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
m68hc11.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
m68k.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
m88k.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
metag.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
mips.h MIPS16e2: Add MIPS16e2 ASE support 2017-05-15 13:57:10 +01:00
mmix.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
mn10200.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
mn10300.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
moxie.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
msp430-decode.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
msp430.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
nds32.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
nios2.h Clarify that include/opcode/ files are part of GNU opcodes 2017-01-25 12:30:52 +00:00
nios2r1.h Clarify that include/opcode/ files are part of GNU opcodes 2017-01-25 12:30:52 +00:00
nios2r2.h Clarify that include/opcode/ files are part of GNU opcodes 2017-01-25 12:30:52 +00:00
np1.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
ns32k.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
pdp11.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
pj.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
pn.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
ppc.h Reorder PPC_OPCODE_* and set PPC_OPCODE_TMR for e6500 2017-04-11 07:43:21 +09:30
pru.h Clarify that include/opcode/ files are part of GNU opcodes 2017-01-25 12:30:52 +00:00
pyr.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
riscv-opc.h RISC-V: Add physical memory protection CSRs 2017-03-31 09:35:11 -07:00
riscv.h Add support for the Q extension to the RISCV ISA. 2017-01-03 17:42:01 +00:00
rl78.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
rx.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
s390.h S/390: Improve error checking for optional operands 2017-05-30 10:22:25 +02:00
score-datadep.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
score-inst.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
sparc.h binutils: support for the SPARC M8 processor 2017-05-19 09:27:08 -07:00
spu-insns.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
spu.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
tahoe.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
tic4x.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
tic6x-control-registers.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
tic6x-insn-formats.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
tic6x-opcode-table.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
tic6x.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
tic30.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
tic54x.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
tic80.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
tilegx.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
tilepro.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
v850.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
vax.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
visium.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30
wasm.h Add support for the WebAssembly file format and the wasm32 ELF conversion to gas and the binutils. 2017-03-30 10:57:21 +01:00
xgate.h Update year range in copyright notice of all files. 2017-01-02 14:08:56 +10:30