Currently the assembler will happily assemble, e.g. ldr r0, [s0, #12] and similar.
This patch add checks that only general-purpose registers are used in address operands, shifted registers, and shift amounts.
This is done in the asm parser, as it results in better error messages, compared do doing the check in the various AsmOperandClass predicates.
Details
Diff Detail
Event Timeline
Hi Momchil,
I think your alternative patch is actually the right way to go here. The problem with doing this in ARMAsmParser::parseMemory and friends is that we can't reject SP and PC for instructions where they are not valid. Doing that here would require moving a lot more instruction-specific logic into these functions, which isn't going to scale well.
I have some WIP patches that do something similar to D39910, and also expand the diagnostics. These patches aren't complete (need to cover more operand types and more tests), but I'll send you a copy of them.
Correct me if I'm wrong ...
For me it seems that the approach of returning just true/false from the asm operand class predicates, while
good for weeding out invalid instructions, isn't that great for diagnostics. The operand may be invalid for
a variety of reasons, but we have only one diagnostics string, which can at best list all the possible constraints
and let the user figure out by themselves what's wrong.
For example, assembling:
vld1.16 {d0}, [s0:64]
with llvm-mc -triple=armv7a-eabi gives error: alignment must be 64 or omitted, and if we need to improve
this message, we'd have to list the constrain that the register must be GPR. And do that for all/lot-of the other
AsmOperandClassses, which would create a huge number of repetetetetitions of the constraint "X must be a GPR".
If we instead diagnose usage of non-GPR registers in the parser, and leave checking more specific constraints
(like "X must not be PC" or "X must be SP") to asm operand class predicates, some diagnostics will be more
precise and the rest will require less effort by the user, because that'd list a comparatively small number of
constraints to manually check.