OSDN Git Service

Change the ARM assembler to require a :lower16: or :upper16 on non-constant
authorKevin Enderby <enderby@apple.com>
Fri, 18 Apr 2014 23:06:39 +0000 (23:06 +0000)
committerKevin Enderby <enderby@apple.com>
Fri, 18 Apr 2014 23:06:39 +0000 (23:06 +0000)
commit1a47d664964d238323c0cad6f9c29b06d1274b12
tree3e418204275220729a2a9ee4f8628d05044ebd57
parentad326ae3f6ac0be8b95fd41288b0e0d68b775774
Change the ARM assembler to require a :lower16: or :upper16 on non-constant
expressions for mov instructions instead of silently truncating by default.

For the ARM assembler, we want to avoid misleadingly allowing something
like "mov r0, <symbol>" especially when we turn it into a movw and the
expression <symbol> does not have a :lower16: or :upper16" as part of the
expression.  We don't want the behavior of silently truncating, which can be
unexpected and lead to bugs that are difficult to find since this is an easy
mistake to make.

This does change the previous behavior of llvm but actually matches an
older gnu assembler that would not allow this but print less useful errors
of like “invalid constant (0x927c0) after fixup” and “unsupported relocation on
symbol foo”.  The error for llvm is "immediate expression for mov requires
:lower16: or :upper16" with correct location information on the operand
as shown in the added test cases.

rdar://12342160

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206669 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/ARM/AsmParser/ARMAsmParser.cpp
lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp
test/MC/ARM/arm_fixups.s
test/MC/ARM/complex-operands.s
test/MC/ARM/diagnostics.s
test/MC/ARM/thumb2-diagnostics.s