From 03ded27bbc08c2ac2277666bac861a6fffa730c0 Mon Sep 17 00:00:00 2001 From: Oliver Stannard Date: Tue, 24 Oct 2017 14:19:08 +0000 Subject: [PATCH] [ARM] Error for invalid shift in memory operand Report a diagnostic when we fail to parse a shift in a memory operand because the shift type is not an identifier. Without this, we were silently ignoring the whole instruction. Differential revision: https://reviews.llvm.org/D39237 llvm-svn: 316441 --- llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 2 +- llvm/test/MC/ARM/diagnostics.s | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index 0f31fd2..6a3dba7 100644 --- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -5097,7 +5097,7 @@ bool ARMAsmParser::parseMemRegOffsetShift(ARM_AM::ShiftOpc &St, SMLoc Loc = Parser.getTok().getLoc(); const AsmToken &Tok = Parser.getTok(); if (Tok.isNot(AsmToken::Identifier)) - return true; + return Error(Loc, "illegal shift operator"); StringRef ShiftName = Tok.getString(); if (ShiftName == "lsl" || ShiftName == "LSL" || ShiftName == "asl" || ShiftName == "ASL") diff --git a/llvm/test/MC/ARM/diagnostics.s b/llvm/test/MC/ARM/diagnostics.s index 223dbab..92272f6 100644 --- a/llvm/test/MC/ARM/diagnostics.s +++ b/llvm/test/MC/ARM/diagnostics.s @@ -60,6 +60,7 @@ ldr r4, [r5, r6, ror #-1] pld r4, [r5, r6, ror #32] pld r4, [r5, r6, rrx #0] + ldr r4, [r5, r6, not_a_shift] @ CHECK-ERRORS: error: shift amount must be an immediate @ CHECK-ERRORS: str r1, [r2, r3, lsl #invalid] @@ -89,6 +90,8 @@ @ CHECK-ERRORS: pld r4, [r5, r6, ror #32] @ CHECK-ERRORS: error: ']' expected @ CHECK-ERRORS: pld r4, [r5, r6, rrx #0] +@ CHECK-ERRORS: error: illegal shift operator +@ CHECK-ERRORS: ldr r4, [r5, r6, not_a_shift] @ Out of range 16-bit immediate on BKPT bkpt #65536 -- 2.7.4