* gas/config/tc-arm.c (deprecated_coproc_regs_s): New structure.

(deprecated_coproc_regs): New variable.
	(deprecated_coproc_reg_count): Likewise.
	(do_co_reg): Error on obsolete & warn on deprecated registers.
	* gas/testsuite/gas/arm/armv8-a-bad.l: Update testcase.
	* gas/testsuite/gas/arm/armv8-a-bad.s: Likewise.
This commit is contained in:
Matthew Gretton-Dann 2012-08-24 07:54:45 +00:00
parent 59d09be6f5
commit dcbd0d713c
5 changed files with 83 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2012-08-24 Matthew Gretton-Dann <matthew.gretton-dann@arm.com>
* config/tc-arm.c (deprecated_coproc_regs_s): New structure.
(deprecated_coproc_regs): New variable.
(deprecated_coproc_reg_count): Likewise.
(do_co_reg): Error on obsolete & warn on deprecated registers.
2012-08-24 Matthew Gretton-Dann <matthew.gretton-dann@arm.com>
* config/tc-arm.c (check_obsolete): New function.

View File

@ -7710,10 +7710,52 @@ do_cmp (void)
No special properties. */
struct deprecated_coproc_regs_s
{
unsigned cp;
int opc1;
unsigned crn;
unsigned crm;
int opc2;
arm_feature_set deprecated;
arm_feature_set obsoleted;
const char *dep_msg;
const char *obs_msg;
};
#define DEPR_ACCESS_V8 \
N_("This coprocessor register access is deprecated in ARMv8")
/* Table of all deprecated coprocessor registers. */
static struct deprecated_coproc_regs_s deprecated_coproc_regs[] =
{
{15, 0, 7, 10, 5, /* CP15DMB. */
ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
DEPR_ACCESS_V8, NULL},
{15, 0, 7, 10, 4, /* CP15DSB. */
ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
DEPR_ACCESS_V8, NULL},
{15, 0, 7, 5, 4, /* CP15ISB. */
ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
DEPR_ACCESS_V8, NULL},
{14, 6, 1, 0, 0, /* TEEHBR. */
ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
DEPR_ACCESS_V8, NULL},
{14, 6, 0, 0, 0, /* TEECR. */
ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
DEPR_ACCESS_V8, NULL},
};
#undef DEPR_ACCESS_V8
static const size_t deprecated_coproc_reg_count =
sizeof (deprecated_coproc_regs) / sizeof (deprecated_coproc_regs[0]);
static void
do_co_reg (void)
{
unsigned Rd;
size_t i;
Rd = inst.operands[2].reg;
if (thumb_mode)
@ -7733,6 +7775,23 @@ do_co_reg (void)
constraint (Rd == REG_PC, BAD_PC);
}
for (i = 0; i < deprecated_coproc_reg_count; ++i)
{
const struct deprecated_coproc_regs_s *r =
deprecated_coproc_regs + i;
if (inst.operands[0].reg == r->cp
&& inst.operands[1].imm == r->opc1
&& inst.operands[3].reg == r->crn
&& inst.operands[4].reg == r->crm
&& inst.operands[5].imm == r->opc2)
{
if (!check_obsolete (&r->obsoleted, r->obs_msg)
&& warn_on_deprecated
&& ARM_CPU_HAS_FEATURE (cpu_variant, r->deprecated))
as_warn ("%s", r->dep_msg);
}
}
inst.instruction |= inst.operands[0].reg << 8;
inst.instruction |= inst.operands[1].imm << 21;

View File

@ -1,3 +1,8 @@
2012-08-24 Matthew Gretton-Dann <matthew.gretton-dann@arm.com>
* gas/arm/armv8-a-bad.l: Update testcase.
* gas/arm/armv8-a-bad.s: Likewise.
2012-08-24 Matthew Gretton-Dann <matthew.gretton-dann@arm.com>
* gas/arm/armv8-a-bad.d: New testcase.

View File

@ -1,2 +1,7 @@
.*: Assembler messages:
.*:7: Error: swp{b} use is obsoleted for ARMv8 and later
.*:10: Warning: This coprocessor register access is deprecated in ARMv8
.*:11: Warning: This coprocessor register access is deprecated in ARMv8
.*:12: Warning: This coprocessor register access is deprecated in ARMv8
.*:13: Warning: This coprocessor register access is deprecated in ARMv8
.*:14: Warning: This coprocessor register access is deprecated in ARMv8

View File

@ -5,3 +5,10 @@
// SWP
.arm
swp r0, r1, [r2]
// deprecated MCRs
mcr p15, 0, r0, c7, c5, 4
mcr p15, 0, r1, c7, c10, 4
mcr p15, 0, r2, c7, c10, 5
mrc p14, 6, r1, c0, c0, 0
mrc p14, 6, r0, c1, c0, 0