mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-05 03:10:41 +00:00
[ARM64] Improve load/store diagnostics and forbid 32-bit register addresses
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208864 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e7856db583
commit
75aa5372bc
@ -2985,12 +2985,16 @@ bool ARM64AsmParser::parseMemory(OperandVector &Operands) {
|
||||
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 @@ bool ARM64AsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
|
||||
// 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 @@ bool ARM64AsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
|
||||
case Match_InvalidMovImm32Shift:
|
||||
case Match_InvalidMovImm64Shift:
|
||||
case Match_InvalidFPImm:
|
||||
case Match_InvalidMemoryIndexed:
|
||||
case Match_InvalidMemoryIndexed8:
|
||||
case Match_InvalidMemoryIndexed16:
|
||||
case Match_InvalidMemoryIndexed32SImm7:
|
||||
|
@ -42,15 +42,15 @@ foo:
|
||||
; 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: ^
|
||||
|
Loading…
Reference in New Issue
Block a user