[PATCH] [ARM64] Improve load/store diagnostics and forbid 32-bit register addresses
Bradley Smith
bradley.smith at arm.com
Thu May 15 02:48:07 PDT 2014
Hi t.p.northover,
This patch somewhat improves load/store diagnostics (as best as possible given it's implementation which Tim is looking at changing), particularly for literal loads and disallowing 32-bit register addresses.
As with my previous patches, there is no testcase for this as it is part of the merge of MC/AArch64/basic-a64-diagnostics.s.
http://reviews.llvm.org/D3783
Files:
lib/Target/ARM64/AsmParser/ARM64AsmParser.cpp
test/MC/ARM64/diags.s
Index: lib/Target/ARM64/AsmParser/ARM64AsmParser.cpp
===================================================================
--- lib/Target/ARM64/AsmParser/ARM64AsmParser.cpp
+++ lib/Target/ARM64/AsmParser/ARM64AsmParser.cpp
@@ -2985,12 +2985,16 @@
Parser.Lex(); // Eat left bracket token.
const AsmToken &BaseRegTok = Parser.getTok();
+ SMLoc BaseRegLoc = BaseRegTok.getLoc();
if (BaseRegTok.isNot(AsmToken::Identifier))
- return Error(BaseRegTok.getLoc(), "register expected");
+ return Error(BaseRegLoc, "register expected");
int64_t Reg = tryParseRegister();
if (Reg == -1)
- return Error(BaseRegTok.getLoc(), "register expected");
+ return Error(BaseRegLoc, "register expected");
+
+ if (!ARM64MCRegisterClasses[ARM64::GPR64spRegClassID].contains(Reg))
+ return Error(BaseRegLoc, "invalid operand for instruction");
// If there is an offset expression, parse it.
const MCExpr *OffsetExpr = nullptr;
@@ -4148,6 +4152,10 @@
// diagnose.
MatchResult = Match_InvalidMemoryIndexed;
}
+ else if(Operands.size() == 3 && Operands.size() == ErrorInfo + 1 &&
+ ((ARM64Operand *)Operands[ErrorInfo])->isImm()) {
+ MatchResult = Match_InvalidLabel;
+ }
SMLoc ErrorLoc = ((ARM64Operand *)Operands[ErrorInfo])->getStartLoc();
if (ErrorLoc == SMLoc())
ErrorLoc = IDLoc;
@@ -4172,6 +4180,7 @@
case Match_InvalidMovImm32Shift:
case Match_InvalidMovImm64Shift:
case Match_InvalidFPImm:
+ case Match_InvalidMemoryIndexed:
case Match_InvalidMemoryIndexed8:
case Match_InvalidMemoryIndexed16:
case Match_InvalidMemoryIndexed32SImm7:
Index: test/MC/ARM64/diags.s
===================================================================
--- test/MC/ARM64/diags.s
+++ test/MC/ARM64/diags.s
@@ -42,15 +42,15 @@
; CHECK-ERRORS: error: index must be an integer in range [-256, 255].
; CHECK-ERRORS: ldr x0, [x0, #804]!
; CHECK-ERRORS: ^
-; CHECK-ERRORS: error: index must be an integer in range [-256, 255].
+; CHECK-ERRORS: error: invalid operand for instruction
; CHECK-ERRORS: ldr w0, [w0, #301]!
-; CHECK-ERRORS: ^
+; CHECK-ERRORS: ^
; CHECK-ERRORS: error: index must be an integer in range [-256, 255].
; CHECK-ERRORS: ldr x0, [x0], #804
; CHECK-ERRORS: ^
-; CHECK-ERRORS: error: index must be an integer in range [-256, 255].
+; CHECK-ERRORS: error: invalid operand for instruction
; CHECK-ERRORS: ldr w0, [w0], #301
-; CHECK-ERRORS: ^
+; CHECK-ERRORS: ^
; CHECK-ERRORS: error: index must be a multiple of 4 in range [-256, 252].
; CHECK-ERRORS: ldp w3, w4, [x5, #11]!
; CHECK-ERRORS: ^
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D3783.9425.patch
Type: text/x-patch
Size: 2764 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140515/d6491416/attachment.bin>
More information about the llvm-commits
mailing list