[AArch64] ldr= pseudo-instruction silently ignored if register invalid
authorOliver Stannard <oliver.stannard@arm.com>
Mon, 16 Nov 2015 10:25:19 +0000 (10:25 +0000)
committerOliver Stannard <oliver.stannard@arm.com>
Mon, 16 Nov 2015 10:25:19 +0000 (10:25 +0000)
The AArch64 assembler was silently ignoring instructions like this:
  ldr foo, =bar

AArch64AsmParser::parseOperand was returning true as the parse failed, but was
not calling AArch64AsmParser::Error to report this to the user, so the
instruction was ignored without printing an error message.

Differential Revision: http://reviews.llvm.org/D14651

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253193 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
test/MC/AArch64/ldr-pseudo-diagnostics.s

index 278c4b8f489665ca5566c65581d8287c12064438..a1f32e099e3a633aa0de85e64ee0f873c82aab34 100644 (file)
@@ -3178,7 +3178,7 @@ bool AArch64AsmParser::parseOperand(OperandVector &Operands, bool isCondCode,
 
     if (Operands.size() < 2 ||
         !static_cast<AArch64Operand &>(*Operands[1]).isReg())
-      return true;
+      return Error(Loc, "Only valid when first operand is register");
 
     bool IsXReg =
         AArch64MCRegisterClasses[AArch64::GPR64allRegClassID].contains(
index e32c516795282bf00db0dd02ab1b67df93ff9956..e83ca93f6d2dc8fe82cd4a98889b408ee3513908 100644 (file)
@@ -12,3 +12,21 @@ f2:
 // CHECK-ERROR: error: Immediate too large for register
 // CHECK-ERROR:  ldr w0, =-0x80000001
 // CHECK-ERROR:          ^
+
+f3:
+  ldr foo, =1
+// CHECK-ERROR: error: Only valid when first operand is register
+// CHECK-ERROR:   ldr foo, =1
+// CHECK-ERROR:            ^
+
+f4:
+  add r0, r0, =1
+// CHECK-ERROR: error: unexpected token in operand
+// CHECK-ERROR:   add r0, r0, =1
+// CHECK-ERROR:               ^
+
+f5:
+  ldr x0, =())
+// CHECK-ERROR: error: unknown token in expression
+// CHECK-ERROR:   ldr x0, =())
+// CHECK-ERROR:             ^