Add AsmToken::getEndLoc and use it to add ranges to x86 asm register parsing.
authorBenjamin Kramer <benny.kra@googlemail.com>
Sun, 16 Oct 2011 12:10:27 +0000 (12:10 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Sun, 16 Oct 2011 12:10:27 +0000 (12:10 +0000)
<stdin>:1:12: error: register %rax is only available in 64-bit mode
   incl    %rax
           ^~~~

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

include/llvm/MC/MCParser/MCAsmLexer.h
lib/MC/MCParser/MCAsmLexer.cpp
lib/Target/X86/AsmParser/X86AsmParser.cpp

index 9bbb75581c2586642b79574d0fc04add9bd3c7e6..ac04483ccf1672d8bd39eeb4fb1cfe3006ff8f22 100644 (file)
@@ -71,6 +71,7 @@ public:
   bool isNot(TokenKind K) const { return Kind != K; }
 
   SMLoc getLoc() const;
+  SMLoc getEndLoc() const;
 
   /// getStringContents - Get the contents of a string token (without quotes).
   StringRef getStringContents() const {
index dceece78ba10b8a7fb1fca774474a3a93fc18340..3a3ff147117ef65d1eb67ed86914b739b99d848a 100644 (file)
@@ -25,3 +25,7 @@ SMLoc MCAsmLexer::getLoc() const {
 SMLoc AsmToken::getLoc() const {
   return SMLoc::getFromPointer(Str.data());
 }
+
+SMLoc AsmToken::getEndLoc() const {
+  return SMLoc::getFromPointer(Str.data() + Str.size() - 1);
+}
index 42512a7c50dc1ed4b14dba2cdf62184ff92de9bd..6bedd524070e9bd9804e90eef4ea3fe54e7ae34d 100644 (file)
@@ -405,7 +405,8 @@ bool X86ATTAsmParser::ParseRegister(unsigned &RegNo,
 
   const AsmToken &Tok = Parser.getTok();
   if (Tok.isNot(AsmToken::Identifier))
-    return Error(Tok.getLoc(), "invalid register name");
+    return Error(StartLoc, "invalid register name",
+                 SMRange(StartLoc, Tok.getEndLoc()));
 
   RegNo = MatchRegisterName(Tok.getString());
 
@@ -423,8 +424,9 @@ bool X86ATTAsmParser::ParseRegister(unsigned &RegNo,
         X86MCRegisterClasses[X86::GR64RegClassID].contains(RegNo) ||
         X86II::isX86_64NonExtLowByteReg(RegNo) ||
         X86II::isX86_64ExtendedReg(RegNo))
-      return Error(Tok.getLoc(), "register %"
-                   + Tok.getString() + " is only available in 64-bit mode");
+      return Error(StartLoc, "register %"
+                   + Tok.getString() + " is only available in 64-bit mode",
+                   SMRange(StartLoc, Tok.getEndLoc()));
   }
 
   // Parse "%st" as "%st(0)" and "%st(1)", which is multiple tokens.
@@ -485,9 +487,10 @@ bool X86ATTAsmParser::ParseRegister(unsigned &RegNo,
   }
 
   if (RegNo == 0)
-    return Error(Tok.getLoc(), "invalid register name");
+    return Error(StartLoc, "invalid register name",
+                 SMRange(StartLoc, Tok.getEndLoc()));
 
-  EndLoc = Tok.getLoc();
+  EndLoc = Tok.getEndLoc();
   Parser.Lex(); // Eat identifier token.
   return false;
 }
@@ -503,7 +506,8 @@ X86Operand *X86ATTAsmParser::ParseOperand() {
     SMLoc Start, End;
     if (ParseRegister(RegNo, Start, End)) return 0;
     if (RegNo == X86::EIZ || RegNo == X86::RIZ) {
-      Error(Start, "%eiz and %riz can only be used as index registers");
+      Error(Start, "%eiz and %riz can only be used as index registers",
+            SMRange(Start, End));
       return 0;
     }
 
@@ -587,10 +591,11 @@ X86Operand *X86ATTAsmParser::ParseMemOperand(unsigned SegReg, SMLoc MemStart) {
   unsigned BaseReg = 0, IndexReg = 0, Scale = 1;
 
   if (getLexer().is(AsmToken::Percent)) {
-    SMLoc L;
-    if (ParseRegister(BaseReg, L, L)) return 0;
+    SMLoc StartLoc, EndLoc;
+    if (ParseRegister(BaseReg, StartLoc, EndLoc)) return 0;
     if (BaseReg == X86::EIZ || BaseReg == X86::RIZ) {
-      Error(L, "eiz and riz can only be used as index registers");
+      Error(StartLoc, "eiz and riz can only be used as index registers",
+            SMRange(StartLoc, EndLoc));
       return 0;
     }
   }