[PATCH] D31537: [ARM, Asm] Use correct source location for register tokens

Oliver Stannard via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 31 08:49:28 PDT 2017


olista01 created this revision.
Herald added a subscriber: aemerson.

tryParseRegister advances the lexer, so we need to take copies of the start and end locations of the register operand before calling it.

Previously, the caret in the diagnostic pointer to the comma after the r0 operand in the test, rather than the start of the operand.


Repository:
  rL LLVM

https://reviews.llvm.org/D31537

Files:
  lib/Target/ARM/AsmParser/ARMAsmParser.cpp
  test/MC/ARM/register-token-source-loc.s


Index: test/MC/ARM/register-token-source-loc.s
===================================================================
--- /dev/null
+++ test/MC/ARM/register-token-source-loc.s
@@ -0,0 +1,12 @@
+// RUN: not llvm-mc -triple armv6m--none-eabi < %s 2>&1 | FileCheck %s
+
+// Some of these CHECK lines need to uses regexes to that the amount of
+// whitespace between the start of the line and the caret is significant.
+
+  add sp, r0, #4
+// CHECK: error: invalid instruction, multiple near-miss encodings found
+// CHECK: note: for one encoding: instruction requires: thumb2
+// CHECK: note: for one encoding: invalid operand for instruction
+// CHECK-NEXT: {{^  add sp, r0, #4}}
+// CHECK-NEXT: {{^          \^}}
+// CHECK: note: for one encoding: too many operands for instruction
Index: lib/Target/ARM/AsmParser/ARMAsmParser.cpp
===================================================================
--- lib/Target/ARM/AsmParser/ARMAsmParser.cpp
+++ lib/Target/ARM/AsmParser/ARMAsmParser.cpp
@@ -3404,13 +3404,13 @@
 /// parse for a specific register type.
 bool ARMAsmParser::tryParseRegisterWithWriteBack(OperandVector &Operands) {
   MCAsmParser &Parser = getParser();
-  const AsmToken &RegTok = Parser.getTok();
+  SMLoc RegStartLoc = Parser.getTok().getLoc();
+  SMLoc RegEndLoc = Parser.getTok().getEndLoc();
   int RegNo = tryParseRegister();
   if (RegNo == -1)
     return true;
 
-  Operands.push_back(ARMOperand::CreateReg(RegNo, RegTok.getLoc(),
-                                           RegTok.getEndLoc()));
+  Operands.push_back(ARMOperand::CreateReg(RegNo, RegStartLoc, RegEndLoc));
 
   const AsmToken &ExclaimTok = Parser.getTok();
   if (ExclaimTok.is(AsmToken::Exclaim)) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D31537.93649.patch
Type: text/x-patch
Size: 1691 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170331/803379fc/attachment.bin>


More information about the llvm-commits mailing list