[llvm-commits] [llvm] r171765 - in /llvm/trunk: include/llvm/Support/SMLoc.h include/llvm/Support/YAMLParser.h lib/MC/MCParser/AsmParser.cpp lib/MC/MCParser/MCAsmLexer.cpp lib/Support/SourceMgr.cpp lib/Target/ARM/AsmParser/ARMAsmParser.cpp lib/Target/MBlaze/AsmParser/MBlazeAsmParser.cpp lib/Target/Mips/AsmParser/MipsAsmParser.cpp lib/Target/X86/AsmParser/X86AsmParser.cpp
Sean Silva
silvas at purdue.edu
Mon Jan 7 16:41:40 PST 2013
Awesome!
-- Sean Silva
On Mon, Jan 7, 2013 at 2:00 PM, Jordan Rose <jordan_rose at apple.com> wrote:
> Author: jrose
> Date: Mon Jan 7 13:00:49 2013
> New Revision: 171765
>
> URL: http://llvm.org/viewvc/llvm-project?rev=171765&view=rev
> Log:
> Change SMRange to be half-open (exclusive end) instead of closed (inclusive)
>
> This is necessary not only for representing empty ranges, but for handling
> multibyte characters in the input. (If the end pointer in a range refers to
> a multibyte character, should it point to the beginning or the end of the
> character in a char array?) Some of the code in the asm parsers was already
> assuming this anyway.
>
> Modified:
> llvm/trunk/include/llvm/Support/SMLoc.h
> llvm/trunk/include/llvm/Support/YAMLParser.h
> llvm/trunk/lib/MC/MCParser/AsmParser.cpp
> llvm/trunk/lib/MC/MCParser/MCAsmLexer.cpp
> llvm/trunk/lib/Support/SourceMgr.cpp
> llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
> llvm/trunk/lib/Target/MBlaze/AsmParser/MBlazeAsmParser.cpp
> llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
> llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
>
> Modified: llvm/trunk/include/llvm/Support/SMLoc.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/SMLoc.h?rev=171765&r1=171764&r2=171765&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/SMLoc.h (original)
> +++ llvm/trunk/include/llvm/Support/SMLoc.h Mon Jan 7 13:00:49 2013
> @@ -19,7 +19,7 @@
>
> namespace llvm {
>
> -/// SMLoc - Represents a location in source code.
> +/// Represents a location in source code.
> class SMLoc {
> const char *Ptr;
> public:
> @@ -39,9 +39,11 @@
> }
> };
>
> -/// SMRange - Represents a range in source code. Note that unlike standard STL
> -/// ranges, the locations specified are considered to be *inclusive*. For
> -/// example, [X,X] *does* include X, it isn't an empty range.
> +/// Represents a range in source code.
> +///
> +/// SMRange is implemented using a half-open range, as is the convention in C++.
> +/// In the string "abc", the range (1,3] represents the substring "bc", and the
> +/// range (2,2] represents an empty range between the characters "b" and "c".
> class SMRange {
> public:
> SMLoc Start, End;
>
> Modified: llvm/trunk/include/llvm/Support/YAMLParser.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/YAMLParser.h?rev=171765&r1=171764&r2=171765&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/YAMLParser.h (original)
> +++ llvm/trunk/include/llvm/Support/YAMLParser.h Mon Jan 7 13:00:49 2013
> @@ -184,7 +184,7 @@
> : Node(NK_Scalar, D, Anchor)
> , Value(Val) {
> SMLoc Start = SMLoc::getFromPointer(Val.begin());
> - SMLoc End = SMLoc::getFromPointer(Val.end() - 1);
> + SMLoc End = SMLoc::getFromPointer(Val.end());
> SourceRange = SMRange(Start, End);
> }
>
>
> Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=171765&r1=171764&r2=171765&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
> +++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Mon Jan 7 13:00:49 2013
> @@ -732,7 +732,7 @@
> if (ParseExpression(Res)) return true;
> if (Lexer.isNot(AsmToken::RParen))
> return TokError("expected ')' in parentheses expression");
> - EndLoc = Lexer.getLoc();
> + EndLoc = Lexer.getTok().getEndLoc();
> Lex();
> return false;
> }
> @@ -746,7 +746,7 @@
> if (ParseExpression(Res)) return true;
> if (Lexer.isNot(AsmToken::RBrac))
> return TokError("expected ']' in brackets expression");
> - EndLoc = Lexer.getLoc();
> + EndLoc = Lexer.getTok().getEndLoc();
> Lex();
> return false;
> }
> @@ -773,12 +773,12 @@
> case AsmToken::Dollar:
> case AsmToken::String:
> case AsmToken::Identifier: {
> - EndLoc = Lexer.getLoc();
> -
> StringRef Identifier;
> if (ParseIdentifier(Identifier))
> return true;
>
> + EndLoc = SMLoc::getFromPointer(Identifier.end());
> +
> // This is a symbol reference.
> std::pair<StringRef, StringRef> Split = Identifier.split('@');
> MCSymbol *Sym = getContext().GetOrCreateSymbol(Split.first);
> @@ -811,7 +811,7 @@
> SMLoc Loc = getTok().getLoc();
> int64_t IntVal = getTok().getIntVal();
> Res = MCConstantExpr::Create(IntVal, getContext());
> - EndLoc = Lexer.getLoc();
> + EndLoc = Lexer.getTok().getEndLoc();
> Lex(); // Eat token.
> // Look for 'b' or 'f' following an Integer as a directional label
> if (Lexer.getKind() == AsmToken::Identifier) {
> @@ -823,7 +823,7 @@
> getContext());
> if (IDVal == "b" && Sym->isUndefined())
> return Error(Loc, "invalid reference to undefined symbol");
> - EndLoc = Lexer.getLoc();
> + EndLoc = Lexer.getTok().getEndLoc();
> Lex(); // Eat identifier.
> }
> }
> @@ -833,6 +833,7 @@
> APFloat RealVal(APFloat::IEEEdouble, getTok().getString());
> uint64_t IntVal = RealVal.bitcastToAPInt().getZExtValue();
> Res = MCConstantExpr::Create(IntVal, getContext());
> + EndLoc = Lexer.getTok().getEndLoc();
> Lex(); // Eat token.
> return false;
> }
> @@ -842,7 +843,7 @@
> MCSymbol *Sym = Ctx.CreateTempSymbol();
> Out.EmitLabel(Sym);
> Res = MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_None, getContext());
> - EndLoc = Lexer.getLoc();
> + EndLoc = Lexer.getTok().getEndLoc();
> Lex(); // Eat identifier.
> return false;
> }
> @@ -1753,7 +1754,7 @@
> if (IsOperator(Lexer.getKind())) {
> // Check to see whether the token is used as an operator,
> // or part of an identifier
> - const char *NextChar = getTok().getEndLoc().getPointer() + 1;
> + const char *NextChar = getTok().getEndLoc().getPointer();
> if (*NextChar == ' ')
> AddTokens = 2;
> }
> @@ -2982,7 +2983,7 @@
> else if (Name == "epilogue_begin")
> Flags |= DWARF2_FLAG_EPILOGUE_BEGIN;
> else if (Name == "is_stmt") {
> - SMLoc Loc = getTok().getLoc();
> + Loc = getTok().getLoc();
> const MCExpr *Value;
> if (getParser().ParseExpression(Value))
> return true;
> @@ -3001,7 +3002,7 @@
> }
> }
> else if (Name == "isa") {
> - SMLoc Loc = getTok().getLoc();
> + Loc = getTok().getLoc();
> const MCExpr *Value;
> if (getParser().ParseExpression(Value))
> return true;
>
> Modified: llvm/trunk/lib/MC/MCParser/MCAsmLexer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/MCAsmLexer.cpp?rev=171765&r1=171764&r2=171765&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCParser/MCAsmLexer.cpp (original)
> +++ llvm/trunk/lib/MC/MCParser/MCAsmLexer.cpp Mon Jan 7 13:00:49 2013
> @@ -28,5 +28,5 @@
> }
>
> SMLoc AsmToken::getEndLoc() const {
> - return SMLoc::getFromPointer(Str.data() + Str.size() - 1);
> + return SMLoc::getFromPointer(Str.data() + Str.size());
> }
>
> Modified: llvm/trunk/lib/Support/SourceMgr.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/SourceMgr.cpp?rev=171765&r1=171764&r2=171765&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Support/SourceMgr.cpp (original)
> +++ llvm/trunk/lib/Support/SourceMgr.cpp Mon Jan 7 13:00:49 2013
> @@ -304,7 +304,7 @@
> for (unsigned r = 0, e = Ranges.size(); r != e; ++r) {
> std::pair<unsigned, unsigned> R = Ranges[r];
> for (unsigned i = R.first,
> - e = std::min(R.second, (unsigned)LineContents.size())+1; i != e; ++i)
> + e = std::min(R.second, (unsigned)LineContents.size()); i != e; ++i)
> CaretLine[i] = '~';
> }
>
>
> Modified: llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp?rev=171765&r1=171764&r2=171765&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Mon Jan 7 13:00:49 2013
> @@ -178,7 +178,8 @@
> OperandMatchResultTy parseAM3Offset(SmallVectorImpl<MCParsedAsmOperand*>&);
> OperandMatchResultTy parseFPImm(SmallVectorImpl<MCParsedAsmOperand*>&);
> OperandMatchResultTy parseVectorList(SmallVectorImpl<MCParsedAsmOperand*>&);
> - OperandMatchResultTy parseVectorLane(VectorLaneTy &LaneKind, unsigned &Index);
> + OperandMatchResultTy parseVectorLane(VectorLaneTy &LaneKind, unsigned &Index,
> + SMLoc &EndLoc);
>
> // Asm Match Converter Methods
> void cvtT2LdrdPre(MCInst &Inst, const SmallVectorImpl<MCParsedAsmOperand*> &);
> @@ -2450,8 +2451,8 @@
> bool ARMAsmParser::ParseRegister(unsigned &RegNo,
> SMLoc &StartLoc, SMLoc &EndLoc) {
> StartLoc = Parser.getTok().getLoc();
> + EndLoc = Parser.getTok().getEndLoc();
> RegNo = tryParseRegister();
> - EndLoc = Parser.getTok().getLoc();
>
> return (RegNo == (unsigned)-1);
> }
> @@ -2540,6 +2541,8 @@
> if (!PrevOp->isReg())
> return Error(PrevOp->getStartLoc(), "shift must be of a register");
> int SrcReg = PrevOp->getReg();
> +
> + SMLoc EndLoc;
> int64_t Imm = 0;
> int ShiftReg = 0;
> if (ShiftTy == ARM_AM::rrx) {
> @@ -2554,7 +2557,7 @@
> Parser.Lex(); // Eat hash.
> SMLoc ImmLoc = Parser.getTok().getLoc();
> const MCExpr *ShiftExpr = 0;
> - if (getParser().ParseExpression(ShiftExpr)) {
> + if (getParser().ParseExpression(ShiftExpr, EndLoc)) {
> Error(ImmLoc, "invalid immediate shift value");
> return -1;
> }
> @@ -2579,8 +2582,9 @@
> if (Imm == 0)
> ShiftTy = ARM_AM::lsl;
> } else if (Parser.getTok().is(AsmToken::Identifier)) {
> - ShiftReg = tryParseRegister();
> SMLoc L = Parser.getTok().getLoc();
> + EndLoc = Parser.getTok().getEndLoc();
> + ShiftReg = tryParseRegister();
> if (ShiftReg == -1) {
> Error (L, "expected immediate or register in shift operand");
> return -1;
> @@ -2595,10 +2599,10 @@
> if (ShiftReg && ShiftTy != ARM_AM::rrx)
> Operands.push_back(ARMOperand::CreateShiftedRegister(ShiftTy, SrcReg,
> ShiftReg, Imm,
> - S, Parser.getTok().getLoc()));
> + S, EndLoc));
> else
> Operands.push_back(ARMOperand::CreateShiftedImmediate(ShiftTy, SrcReg, Imm,
> - S, Parser.getTok().getLoc()));
> + S, EndLoc));
>
> return 0;
> }
> @@ -2612,12 +2616,13 @@
> /// parse for a specific register type.
> bool ARMAsmParser::
> tryParseRegisterWithWriteBack(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
> - SMLoc S = Parser.getTok().getLoc();
> + const AsmToken &RegTok = Parser.getTok();
> int RegNo = tryParseRegister();
> if (RegNo == -1)
> return true;
>
> - Operands.push_back(ARMOperand::CreateReg(RegNo, S, Parser.getTok().getLoc()));
> + Operands.push_back(ARMOperand::CreateReg(RegNo, RegTok.getLoc(),
> + RegTok.getEndLoc()));
>
> const AsmToken &ExclaimTok = Parser.getTok();
> if (ExclaimTok.is(AsmToken::Exclaim)) {
> @@ -2641,10 +2646,10 @@
> if (!MCE)
> return TokError("immediate value expected for vector index");
>
> - SMLoc E = Parser.getTok().getLoc();
> if (Parser.getTok().isNot(AsmToken::RBrac))
> - return Error(E, "']' expected");
> + return Error(Parser.getTok().getLoc(), "']' expected");
>
> + SMLoc E = Parser.getTok().getEndLoc();
> Parser.Lex(); // Eat right bracket token.
>
> Operands.push_back(ARMOperand::CreateVectorIndex(MCE->getValue(),
> @@ -2794,7 +2799,7 @@
> // Check for and consume the closing '}'
> if (Parser.getTok().isNot(AsmToken::RCurly))
> return MatchOperand_ParseFail;
> - SMLoc E = Parser.getTok().getLoc();
> + SMLoc E = Parser.getTok().getEndLoc();
> Parser.Lex(); // Eat the '}'
>
> Operands.push_back(ARMOperand::CreateCoprocOption(Val, S, E));
> @@ -2891,10 +2896,10 @@
> Parser.getTok().is(AsmToken::Minus)) {
> if (Parser.getTok().is(AsmToken::Minus)) {
> Parser.Lex(); // Eat the minus.
> - SMLoc EndLoc = Parser.getTok().getLoc();
> + SMLoc AfterMinusLoc = Parser.getTok().getLoc();
> int EndReg = tryParseRegister();
> if (EndReg == -1)
> - return Error(EndLoc, "register expected");
> + return Error(AfterMinusLoc, "register expected");
> // Allow Q regs and just interpret them as the two D sub-registers.
> if (ARMMCRegisterClasses[ARM::QPRRegClassID].contains(EndReg))
> EndReg = getDRegFromQReg(EndReg) + 1;
> @@ -2904,10 +2909,10 @@
> continue;
> // The register must be in the same register class as the first.
> if (!RC->contains(EndReg))
> - return Error(EndLoc, "invalid register in register list");
> + return Error(AfterMinusLoc, "invalid register in register list");
> // Ranges must go from low to high.
> if (MRI->getEncodingValue(Reg) > MRI->getEncodingValue(EndReg))
> - return Error(EndLoc, "bad range in register list");
> + return Error(AfterMinusLoc, "bad range in register list");
>
> // Add all the registers in the range to the register list.
> while (Reg != EndReg) {
> @@ -2955,9 +2960,9 @@
> Registers.push_back(std::pair<unsigned, SMLoc>(++Reg, RegLoc));
> }
>
> - SMLoc E = Parser.getTok().getLoc();
> if (Parser.getTok().isNot(AsmToken::RCurly))
> - return Error(E, "'}' expected");
> + return Error(Parser.getTok().getLoc(), "'}' expected");
> + SMLoc E = Parser.getTok().getEndLoc();
> Parser.Lex(); // Eat '}' token.
>
> // Push the register list operand.
> @@ -2974,13 +2979,14 @@
>
> // Helper function to parse the lane index for vector lists.
> ARMAsmParser::OperandMatchResultTy ARMAsmParser::
> -parseVectorLane(VectorLaneTy &LaneKind, unsigned &Index) {
> +parseVectorLane(VectorLaneTy &LaneKind, unsigned &Index, SMLoc &EndLoc) {
> Index = 0; // Always return a defined index value.
> if (Parser.getTok().is(AsmToken::LBrac)) {
> Parser.Lex(); // Eat the '['.
> if (Parser.getTok().is(AsmToken::RBrac)) {
> // "Dn[]" is the 'all lanes' syntax.
> LaneKind = AllLanes;
> + EndLoc = Parser.getTok().getEndLoc();
> Parser.Lex(); // Eat the ']'.
> return MatchOperand_Success;
> }
> @@ -3005,6 +3011,7 @@
> Error(Parser.getTok().getLoc(), "']' expected");
> return MatchOperand_ParseFail;
> }
> + EndLoc = Parser.getTok().getEndLoc();
> Parser.Lex(); // Eat the ']'.
> int64_t Val = CE->getValue();
>
> @@ -3031,21 +3038,19 @@
> // (without encosing curly braces) as a single or double entry list,
> // respectively.
> if (Parser.getTok().is(AsmToken::Identifier)) {
> + SMLoc E = Parser.getTok().getEndLoc();
> int Reg = tryParseRegister();
> if (Reg == -1)
> return MatchOperand_NoMatch;
> - SMLoc E = Parser.getTok().getLoc();
> if (ARMMCRegisterClasses[ARM::DPRRegClassID].contains(Reg)) {
> - OperandMatchResultTy Res = parseVectorLane(LaneKind, LaneIndex);
> + OperandMatchResultTy Res = parseVectorLane(LaneKind, LaneIndex, E);
> if (Res != MatchOperand_Success)
> return Res;
> switch (LaneKind) {
> case NoLanes:
> - E = Parser.getTok().getLoc();
> Operands.push_back(ARMOperand::CreateVectorList(Reg, 1, false, S, E));
> break;
> case AllLanes:
> - E = Parser.getTok().getLoc();
> Operands.push_back(ARMOperand::CreateVectorListAllLanes(Reg, 1, false,
> S, E));
> break;
> @@ -3059,18 +3064,16 @@
> }
> if (ARMMCRegisterClasses[ARM::QPRRegClassID].contains(Reg)) {
> Reg = getDRegFromQReg(Reg);
> - OperandMatchResultTy Res = parseVectorLane(LaneKind, LaneIndex);
> + OperandMatchResultTy Res = parseVectorLane(LaneKind, LaneIndex, E);
> if (Res != MatchOperand_Success)
> return Res;
> switch (LaneKind) {
> case NoLanes:
> - E = Parser.getTok().getLoc();
> Reg = MRI->getMatchingSuperReg(Reg, ARM::dsub_0,
> &ARMMCRegisterClasses[ARM::DPairRegClassID]);
> Operands.push_back(ARMOperand::CreateVectorList(Reg, 2, false, S, E));
> break;
> case AllLanes:
> - E = Parser.getTok().getLoc();
> Reg = MRI->getMatchingSuperReg(Reg, ARM::dsub_0,
> &ARMMCRegisterClasses[ARM::DPairRegClassID]);
> Operands.push_back(ARMOperand::CreateVectorListAllLanes(Reg, 2, false,
> @@ -3111,7 +3114,9 @@
> ++Reg;
> ++Count;
> }
> - if (parseVectorLane(LaneKind, LaneIndex) != MatchOperand_Success)
> +
> + SMLoc E;
> + if (parseVectorLane(LaneKind, LaneIndex, E) != MatchOperand_Success)
> return MatchOperand_ParseFail;
>
> while (Parser.getTok().is(AsmToken::Comma) ||
> @@ -3125,10 +3130,10 @@
> return MatchOperand_ParseFail;
> }
> Parser.Lex(); // Eat the minus.
> - SMLoc EndLoc = Parser.getTok().getLoc();
> + SMLoc AfterMinusLoc = Parser.getTok().getLoc();
> int EndReg = tryParseRegister();
> if (EndReg == -1) {
> - Error(EndLoc, "register expected");
> + Error(AfterMinusLoc, "register expected");
> return MatchOperand_ParseFail;
> }
> // Allow Q regs and just interpret them as the two D sub-registers.
> @@ -3140,24 +3145,24 @@
> continue;
> // The register must be in the same register class as the first.
> if (!ARMMCRegisterClasses[ARM::DPRRegClassID].contains(EndReg)) {
> - Error(EndLoc, "invalid register in register list");
> + Error(AfterMinusLoc, "invalid register in register list");
> return MatchOperand_ParseFail;
> }
> // Ranges must go from low to high.
> if (Reg > EndReg) {
> - Error(EndLoc, "bad range in register list");
> + Error(AfterMinusLoc, "bad range in register list");
> return MatchOperand_ParseFail;
> }
> // Parse the lane specifier if present.
> VectorLaneTy NextLaneKind;
> unsigned NextLaneIndex;
> - if (parseVectorLane(NextLaneKind, NextLaneIndex) != MatchOperand_Success)
> + if (parseVectorLane(NextLaneKind, NextLaneIndex, E) !=
> + MatchOperand_Success)
> return MatchOperand_ParseFail;
> if (NextLaneKind != LaneKind || LaneIndex != NextLaneIndex) {
> - Error(EndLoc, "mismatched lane index in register list");
> + Error(AfterMinusLoc, "mismatched lane index in register list");
> return MatchOperand_ParseFail;
> }
> - EndLoc = Parser.getTok().getLoc();
>
> // Add all the registers in the range to the register list.
> Count += EndReg - Reg;
> @@ -3196,11 +3201,12 @@
> // Parse the lane specifier if present.
> VectorLaneTy NextLaneKind;
> unsigned NextLaneIndex;
> - SMLoc EndLoc = Parser.getTok().getLoc();
> - if (parseVectorLane(NextLaneKind, NextLaneIndex) != MatchOperand_Success)
> + SMLoc LaneLoc = Parser.getTok().getLoc();
> + if (parseVectorLane(NextLaneKind, NextLaneIndex, E) !=
> + MatchOperand_Success)
> return MatchOperand_ParseFail;
> if (NextLaneKind != LaneKind || LaneIndex != NextLaneIndex) {
> - Error(EndLoc, "mismatched lane index in register list");
> + Error(LaneLoc, "mismatched lane index in register list");
> return MatchOperand_ParseFail;
> }
> continue;
> @@ -3221,7 +3227,7 @@
> VectorLaneTy NextLaneKind;
> unsigned NextLaneIndex;
> SMLoc EndLoc = Parser.getTok().getLoc();
> - if (parseVectorLane(NextLaneKind, NextLaneIndex) != MatchOperand_Success)
> + if (parseVectorLane(NextLaneKind, NextLaneIndex, E) != MatchOperand_Success)
> return MatchOperand_ParseFail;
> if (NextLaneKind != LaneKind || LaneIndex != NextLaneIndex) {
> Error(EndLoc, "mismatched lane index in register list");
> @@ -3229,11 +3235,11 @@
> }
> }
>
> - SMLoc E = Parser.getTok().getLoc();
> if (Parser.getTok().isNot(AsmToken::RCurly)) {
> - Error(E, "'}' expected");
> + Error(Parser.getTok().getLoc(), "'}' expected");
> return MatchOperand_ParseFail;
> }
> + E = Parser.getTok().getEndLoc();
> Parser.Lex(); // Eat '}' token.
>
> switch (LaneKind) {
> @@ -3525,7 +3531,8 @@
>
> const MCExpr *ShiftAmount;
> SMLoc Loc = Parser.getTok().getLoc();
> - if (getParser().ParseExpression(ShiftAmount)) {
> + SMLoc EndLoc;
> + if (getParser().ParseExpression(ShiftAmount, EndLoc)) {
> Error(Loc, "illegal expression");
> return MatchOperand_ParseFail;
> }
> @@ -3540,7 +3547,7 @@
> return MatchOperand_ParseFail;
> }
>
> - Operands.push_back(ARMOperand::CreateImm(CE, Loc, Parser.getTok().getLoc()));
> + Operands.push_back(ARMOperand::CreateImm(CE, Loc, EndLoc));
>
> return MatchOperand_Success;
> }
> @@ -3550,7 +3557,7 @@
> const AsmToken &Tok = Parser.getTok();
> SMLoc S = Tok.getLoc();
> if (Tok.isNot(AsmToken::Identifier)) {
> - Error(Tok.getLoc(), "'be' or 'le' operand expected");
> + Error(S, "'be' or 'le' operand expected");
> return MatchOperand_ParseFail;
> }
> int Val = StringSwitch<int>(Tok.getString())
> @@ -3560,12 +3567,12 @@
> Parser.Lex(); // Eat the token.
>
> if (Val == -1) {
> - Error(Tok.getLoc(), "'be' or 'le' operand expected");
> + Error(S, "'be' or 'le' operand expected");
> return MatchOperand_ParseFail;
> }
> Operands.push_back(ARMOperand::CreateImm(MCConstantExpr::Create(Val,
> getContext()),
> - S, Parser.getTok().getLoc()));
> + S, Tok.getEndLoc()));
> return MatchOperand_Success;
> }
>
> @@ -3601,16 +3608,17 @@
> return MatchOperand_ParseFail;
> }
> Parser.Lex(); // Eat hash token.
> + SMLoc ExLoc = Parser.getTok().getLoc();
>
> const MCExpr *ShiftAmount;
> - SMLoc E = Parser.getTok().getLoc();
> - if (getParser().ParseExpression(ShiftAmount)) {
> - Error(E, "malformed shift expression");
> + SMLoc EndLoc;
> + if (getParser().ParseExpression(ShiftAmount, EndLoc)) {
> + Error(ExLoc, "malformed shift expression");
> return MatchOperand_ParseFail;
> }
> const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftAmount);
> if (!CE) {
> - Error(E, "shift amount must be an immediate");
> + Error(ExLoc, "shift amount must be an immediate");
> return MatchOperand_ParseFail;
> }
>
> @@ -3618,25 +3626,24 @@
> if (isASR) {
> // Shift amount must be in [1,32]
> if (Val < 1 || Val > 32) {
> - Error(E, "'asr' shift amount must be in range [1,32]");
> + Error(ExLoc, "'asr' shift amount must be in range [1,32]");
> return MatchOperand_ParseFail;
> }
> // asr #32 encoded as asr #0, but is not allowed in Thumb2 mode.
> if (isThumb() && Val == 32) {
> - Error(E, "'asr #32' shift amount not allowed in Thumb mode");
> + Error(ExLoc, "'asr #32' shift amount not allowed in Thumb mode");
> return MatchOperand_ParseFail;
> }
> if (Val == 32) Val = 0;
> } else {
> // Shift amount must be in [1,32]
> if (Val < 0 || Val > 31) {
> - Error(E, "'lsr' shift amount must be in range [0,31]");
> + Error(ExLoc, "'lsr' shift amount must be in range [0,31]");
> return MatchOperand_ParseFail;
> }
> }
>
> - E = Parser.getTok().getLoc();
> - Operands.push_back(ARMOperand::CreateShifterImm(isASR, Val, S, E));
> + Operands.push_back(ARMOperand::CreateShifterImm(isASR, Val, S, EndLoc));
>
> return MatchOperand_Success;
> }
> @@ -3662,16 +3669,17 @@
> return MatchOperand_ParseFail;
> }
> Parser.Lex(); // Eat hash token.
> + SMLoc ExLoc = Parser.getTok().getLoc();
>
> const MCExpr *ShiftAmount;
> - SMLoc E = Parser.getTok().getLoc();
> - if (getParser().ParseExpression(ShiftAmount)) {
> - Error(E, "malformed rotate expression");
> + SMLoc EndLoc;
> + if (getParser().ParseExpression(ShiftAmount, EndLoc)) {
> + Error(ExLoc, "malformed rotate expression");
> return MatchOperand_ParseFail;
> }
> const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftAmount);
> if (!CE) {
> - Error(E, "rotate amount must be an immediate");
> + Error(ExLoc, "rotate amount must be an immediate");
> return MatchOperand_ParseFail;
> }
>
> @@ -3680,12 +3688,11 @@
> // normally, zero is represented in asm by omitting the rotate operand
> // entirely.
> if (Val != 8 && Val != 16 && Val != 24 && Val != 0) {
> - Error(E, "'ror' rotate amount must be 8, 16, or 24");
> + Error(ExLoc, "'ror' rotate amount must be 8, 16, or 24");
> return MatchOperand_ParseFail;
> }
>
> - E = Parser.getTok().getLoc();
> - Operands.push_back(ARMOperand::CreateRotImm(Val, S, E));
> + Operands.push_back(ARMOperand::CreateRotImm(Val, S, EndLoc));
>
> return MatchOperand_Success;
> }
> @@ -3735,7 +3742,8 @@
> Parser.Lex(); // Eat hash token.
>
> const MCExpr *WidthExpr;
> - if (getParser().ParseExpression(WidthExpr)) {
> + SMLoc EndLoc;
> + if (getParser().ParseExpression(WidthExpr, EndLoc)) {
> Error(E, "malformed immediate expression");
> return MatchOperand_ParseFail;
> }
> @@ -3751,9 +3759,8 @@
> Error(E, "'width' operand must be in the range [1,32-lsb]");
> return MatchOperand_ParseFail;
> }
> - E = Parser.getTok().getLoc();
>
> - Operands.push_back(ARMOperand::CreateBitfield(LSB, Width, S, E));
> + Operands.push_back(ARMOperand::CreateBitfield(LSB, Width, S, EndLoc));
>
> return MatchOperand_Success;
> }
> @@ -3772,7 +3779,6 @@
> SMLoc S = Tok.getLoc();
> bool haveEaten = false;
> bool isAdd = true;
> - int Reg = -1;
> if (Tok.is(AsmToken::Plus)) {
> Parser.Lex(); // Eat the '+' token.
> haveEaten = true;
> @@ -3781,15 +3787,15 @@
> isAdd = false;
> haveEaten = true;
> }
> - if (Parser.getTok().is(AsmToken::Identifier))
> - Reg = tryParseRegister();
> +
> + SMLoc E = Parser.getTok().getEndLoc();
> + int Reg = tryParseRegister();
> if (Reg == -1) {
> if (!haveEaten)
> return MatchOperand_NoMatch;
> Error(Parser.getTok().getLoc(), "register expected");
> return MatchOperand_ParseFail;
> }
> - SMLoc E = Parser.getTok().getLoc();
>
> ARM_AM::ShiftOpc ShiftTy = ARM_AM::no_shift;
> unsigned ShiftImm = 0;
> @@ -3797,6 +3803,9 @@
> Parser.Lex(); // Eat the ','.
> if (parseMemRegOffsetShift(ShiftTy, ShiftImm))
> return MatchOperand_ParseFail;
> +
> + // FIXME: Only approximates end...may include intervening whitespace.
> + E = Parser.getTok().getLoc();
> }
>
> Operands.push_back(ARMOperand::CreatePostIdxReg(Reg, isAdd, ShiftTy,
> @@ -3829,14 +3838,14 @@
> // differently.
> bool isNegative = Parser.getTok().is(AsmToken::Minus);
> const MCExpr *Offset;
> - if (getParser().ParseExpression(Offset))
> + SMLoc E;
> + if (getParser().ParseExpression(Offset, E))
> return MatchOperand_ParseFail;
> const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Offset);
> if (!CE) {
> Error(S, "constant expression expected");
> return MatchOperand_ParseFail;
> }
> - SMLoc E = Tok.getLoc();
> // Negative zero is encoded as the flag value INT32_MIN.
> int32_t Val = CE->getValue();
> if (isNegative && Val == 0)
> @@ -3851,7 +3860,6 @@
>
> bool haveEaten = false;
> bool isAdd = true;
> - int Reg = -1;
> if (Tok.is(AsmToken::Plus)) {
> Parser.Lex(); // Eat the '+' token.
> haveEaten = true;
> @@ -3860,18 +3868,18 @@
> isAdd = false;
> haveEaten = true;
> }
> - if (Parser.getTok().is(AsmToken::Identifier))
> - Reg = tryParseRegister();
> +
> + Tok = Parser.getTok();
> + int Reg = tryParseRegister();
> if (Reg == -1) {
> if (!haveEaten)
> return MatchOperand_NoMatch;
> - Error(Parser.getTok().getLoc(), "register expected");
> + Error(Tok.getLoc(), "register expected");
> return MatchOperand_ParseFail;
> }
> - SMLoc E = Parser.getTok().getLoc();
>
> Operands.push_back(ARMOperand::CreatePostIdxReg(Reg, isAdd, ARM_AM::no_shift,
> - 0, S, E));
> + 0, S, Tok.getEndLoc()));
>
> return MatchOperand_Success;
> }
> @@ -4224,7 +4232,7 @@
> return Error(Tok.getLoc(), "malformed memory operand");
>
> if (Tok.is(AsmToken::RBrac)) {
> - E = Tok.getLoc();
> + E = Tok.getEndLoc();
> Parser.Lex(); // Eat right bracket token.
>
> Operands.push_back(ARMOperand::CreateMem(BaseRegNum, 0, 0, ARM_AM::no_shift,
> @@ -4272,9 +4280,9 @@
> }
>
> // Now we should have the closing ']'
> - E = Parser.getTok().getLoc();
> if (Parser.getTok().isNot(AsmToken::RBrac))
> - return Error(E, "']' expected");
> + return Error(Parser.getTok().getLoc(), "']' expected");
> + E = Parser.getTok().getEndLoc();
> Parser.Lex(); // Eat right bracket token.
>
> // Don't worry about range checking the value here. That's handled by
> @@ -4321,9 +4329,9 @@
> CE = MCConstantExpr::Create(INT32_MIN, getContext());
>
> // Now we should have the closing ']'
> - E = Parser.getTok().getLoc();
> if (Parser.getTok().isNot(AsmToken::RBrac))
> - return Error(E, "']' expected");
> + return Error(Parser.getTok().getLoc(), "']' expected");
> + E = Parser.getTok().getEndLoc();
> Parser.Lex(); // Eat right bracket token.
>
> // Don't worry about range checking the value here. That's handled by
> @@ -4367,9 +4375,9 @@
> }
>
> // Now we should have the closing ']'
> - E = Parser.getTok().getLoc();
> if (Parser.getTok().isNot(AsmToken::RBrac))
> - return Error(E, "']' expected");
> + return Error(Parser.getTok().getLoc(), "']' expected");
> + E = Parser.getTok().getEndLoc();
> Parser.Lex(); // Eat right bracket token.
>
> Operands.push_back(ARMOperand::CreateMem(BaseRegNum, 0, OffsetRegNum,
>
> Modified: llvm/trunk/lib/Target/MBlaze/AsmParser/MBlazeAsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/MBlaze/AsmParser/MBlazeAsmParser.cpp?rev=171765&r1=171764&r2=171765&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/MBlaze/AsmParser/MBlazeAsmParser.cpp (original)
> +++ llvm/trunk/lib/Target/MBlaze/AsmParser/MBlazeAsmParser.cpp Mon Jan 7 13:00:49 2013
> @@ -35,7 +35,8 @@
> bool Error(SMLoc L, const Twine &Msg) { return Parser.Error(L, Msg); }
>
> MBlazeOperand *ParseMemory(SmallVectorImpl<MCParsedAsmOperand*> &Operands);
> - MBlazeOperand *ParseRegister(unsigned &RegNo);
> + MBlazeOperand *ParseRegister();
> + MBlazeOperand *ParseRegister(SMLoc &StartLoc, SMLoc &EndLoc);
> MBlazeOperand *ParseImmediate();
> MBlazeOperand *ParseFsl();
> MBlazeOperand* ParseOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands);
> @@ -383,23 +384,31 @@
>
> bool MBlazeAsmParser::ParseRegister(unsigned &RegNo,
> SMLoc &StartLoc, SMLoc &EndLoc) {
> - return (ParseRegister(RegNo) == 0);
> + MBlazeOperand *Reg = ParseRegister(StartLoc, EndLoc);
> + if (!Reg)
> + return true;
> + RegNo = Reg->getReg();
> + return false;
> }
>
> -MBlazeOperand *MBlazeAsmParser::ParseRegister(unsigned &RegNo) {
> - SMLoc S = Parser.getTok().getLoc();
> - SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
> +MBlazeOperand *MBlazeAsmParser::ParseRegister() {
> + SMLoc S, E;
> + return ParseRegister(S, E);
> +}
>
> - switch (getLexer().getKind()) {
> - default: return 0;
> - case AsmToken::Identifier:
> - RegNo = MatchRegisterName(getLexer().getTok().getIdentifier());
> - if (RegNo == 0)
> - return 0;
> +MBlazeOperand *MBlazeAsmParser::ParseRegister(SMLoc &StartLoc, SMLoc &EndLoc) {
> + StartLoc = Parser.getTok().getLoc();
> + EndLoc = Parser.getTok().getEndLoc();
>
> - getLexer().Lex();
> - return MBlazeOperand::CreateReg(RegNo, S, E);
> - }
> + if (getLexer().getKind() != AsmToken::Identifier)
> + return 0;
> +
> + unsigned RegNo = MatchRegisterName(getLexer().getTok().getIdentifier());
> + if (RegNo == 0)
> + return 0;
> +
> + getLexer().Lex();
> + return MBlazeOperand::CreateReg(RegNo, StartLoc, EndLoc);
> }
>
> static unsigned MatchFslRegister(StringRef String) {
> @@ -415,7 +424,7 @@
>
> MBlazeOperand *MBlazeAsmParser::ParseFsl() {
> SMLoc S = Parser.getTok().getLoc();
> - SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
> + SMLoc E = Parser.getTok().getEndLoc();
>
> switch (getLexer().getKind()) {
> default: return 0;
> @@ -432,7 +441,7 @@
>
> MBlazeOperand *MBlazeAsmParser::ParseImmediate() {
> SMLoc S = Parser.getTok().getLoc();
> - SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
> + SMLoc E = Parser.getTok().getEndLoc();
>
> const MCExpr *EVal;
> switch (getLexer().getKind()) {
> @@ -454,8 +463,7 @@
> MBlazeOperand *Op;
>
> // Attempt to parse the next token as a register name
> - unsigned RegNo;
> - Op = ParseRegister(RegNo);
> + Op = ParseRegister();
>
> // Attempt to parse the next token as an FSL immediate
> if (!Op)
>
> Modified: llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp?rev=171765&r1=171764&r2=171765&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp (original)
> +++ llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp Mon Jan 7 13:00:49 2013
> @@ -107,7 +107,7 @@
> bool reportParseError(StringRef ErrorMsg);
>
> bool parseMemOffset(const MCExpr *&Res);
> - bool parseRelocOperand(const MCExpr *&Res);
> + bool parseRelocOperand(const MCExpr *&Res, SMLoc &E);
>
> bool parseDirectiveSet();
>
> @@ -692,6 +692,7 @@
> StringRef Mnemonic){
>
> SMLoc S = Parser.getTok().getLoc();
> + SMLoc E = Parser.getTok().getEndLoc();
> int RegNo = -1;
>
> // FIXME: we should make a more generic method for CCR
> @@ -706,8 +707,7 @@
> if (RegNo == -1)
> return true;
>
> - Operands.push_back(MipsOperand::CreateReg(RegNo, S,
> - Parser.getTok().getLoc()));
> + Operands.push_back(MipsOperand::CreateReg(RegNo, S, E));
> Parser.Lex(); // Eat register token.
> return false;
> }
> @@ -760,7 +760,7 @@
> if (Parser.ParseIdentifier(Identifier))
> return true;
>
> - SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
> + SMLoc E = SMLoc::getFromPointer(Identifier.end());
>
> MCSymbol *Sym = getContext().GetOrCreateSymbol("$" + Identifier);
>
> @@ -780,9 +780,9 @@
> // quoted label names
> const MCExpr *IdVal;
> SMLoc S = Parser.getTok().getLoc();
> - if (getParser().ParseExpression(IdVal))
> + SMLoc E;
> + if (getParser().ParseExpression(IdVal, E))
> return true;
> - SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
> Operands.push_back(MipsOperand::CreateImm(IdVal, S, E));
> return false;
> }
> @@ -790,11 +790,10 @@
> // it is a symbol reference or constant expression
> const MCExpr *IdVal;
> SMLoc S = Parser.getTok().getLoc(); // start location of the operand
> - if (parseRelocOperand(IdVal))
> + SMLoc E;
> + if (parseRelocOperand(IdVal, E))
> return true;
>
> - SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
> -
> Operands.push_back(MipsOperand::CreateImm(IdVal, S, E));
> return false;
> } // case AsmToken::Percent
> @@ -802,7 +801,7 @@
> return true;
> }
>
> -bool MipsAsmParser::parseRelocOperand(const MCExpr *&Res) {
> +bool MipsAsmParser::parseRelocOperand(const MCExpr *&Res, SMLoc &EndLoc) {
>
> Parser.Lex(); // eat % token
> const AsmToken &Tok = Parser.getTok(); // get next token, operation
> @@ -814,7 +813,6 @@
> Parser.Lex(); // eat identifier
> // now make expression from the rest of the operand
> const MCExpr *IdVal;
> - SMLoc EndLoc;
>
> if (getLexer().getKind() == AsmToken::LParen) {
> while (1) {
> @@ -835,8 +833,10 @@
> if (getParser().ParseParenExpression(IdVal,EndLoc))
> return true;
>
> - while (getLexer().getKind() == AsmToken::RParen)
> + while (getLexer().getKind() == AsmToken::RParen) {
> + EndLoc = Parser.getTok().getEndLoc();
> Parser.Lex(); // eat ')' token
> + }
>
> } else
> return true; // parenthesis must follow reloc operand
> @@ -868,24 +868,23 @@
> SMLoc &EndLoc) {
>
> StartLoc = Parser.getTok().getLoc();
> + EndLoc = Parser.getTok().getEndLoc();
> RegNo = tryParseRegister("");
> - EndLoc = Parser.getTok().getLoc();
> return (RegNo == (unsigned)-1);
> }
>
> bool MipsAsmParser::parseMemOffset(const MCExpr *&Res) {
> -
> - SMLoc S;
> -
> switch(getLexer().getKind()) {
> default:
> return true;
> case AsmToken::Integer:
> case AsmToken::Minus:
> case AsmToken::Plus:
> - return (getParser().ParseExpression(Res));
> - case AsmToken::Percent:
> - return parseRelocOperand(Res);
> + return getParser().ParseExpression(Res);
> + case AsmToken::Percent: {
> + SMLoc E;
> + return parseRelocOperand(Res, E);
> + }
> case AsmToken::LParen:
> return false; // it's probably assuming 0
> }
> @@ -896,9 +895,8 @@
> SmallVectorImpl<MCParsedAsmOperand*>&Operands) {
>
> const MCExpr *IdVal = 0;
> - SMLoc S;
> - // first operand is the offset
> - S = Parser.getTok().getLoc();
> + SMLoc S = Parser.getTok().getLoc();
> + SMLoc E = Parser.getTok().getEndLoc();
>
> if (parseMemOffset(IdVal))
> return MatchOperand_ParseFail;
> @@ -907,7 +905,6 @@
> if (Tok.isNot(AsmToken::LParen)) {
> MipsOperand *Mnemonic = static_cast<MipsOperand*>(Operands[0]);
> if (Mnemonic->getToken() == "la") {
> - SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer()-1);
> Operands.push_back(MipsOperand::CreateImm(IdVal, S, E));
> return MatchOperand_Success;
> }
> @@ -936,8 +933,7 @@
> return MatchOperand_ParseFail;
> }
>
> - SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
> -
> + E = Parser.getTok().getEndLoc();
> Parser.Lex(); // Eat ')' token.
>
> if (IdVal == 0)
> @@ -1087,8 +1083,8 @@
> if (Cc == -1) {
> return Error(NameLoc, "Invalid conditional code");
> }
> - SMLoc E = SMLoc::getFromPointer(
> - Parser.getTok().getLoc().getPointer() -1 );
> + // FIXME: May include trailing whitespace...
> + SMLoc E = Parser.getTok().getLoc();
> Operands.push_back(MipsOperand::CreateImm(
> MCConstantExpr::Create(Cc, getContext()), NameLoc, E));
> } else {
>
> Modified: llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp?rev=171765&r1=171764&r2=171765&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp (original)
> +++ llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp Mon Jan 7 13:00:49 2013
> @@ -463,7 +463,7 @@
> }
>
> static X86Operand *CreateToken(StringRef Str, SMLoc Loc) {
> - SMLoc EndLoc = SMLoc::getFromPointer(Loc.getPointer() + Str.size() - 1);
> + SMLoc EndLoc = SMLoc::getFromPointer(Loc.getPointer() + Str.size());
> X86Operand *Res = new X86Operand(Token, Loc, EndLoc);
> Res->Tok.Data = Str.data();
> Res->Tok.Length = Str.size();
> @@ -558,10 +558,12 @@
> Parser.Lex(); // Eat percent token.
>
> const AsmToken &Tok = Parser.getTok();
> + EndLoc = Tok.getEndLoc();
> +
> if (Tok.isNot(AsmToken::Identifier)) {
> if (isParsingIntelSyntax()) return true;
> return Error(StartLoc, "invalid register name",
> - SMRange(StartLoc, Tok.getEndLoc()));
> + SMRange(StartLoc, EndLoc));
> }
>
> RegNo = MatchRegisterName(Tok.getString());
> @@ -582,13 +584,12 @@
> X86II::isX86_64ExtendedReg(RegNo))
> return Error(StartLoc, "register %"
> + Tok.getString() + " is only available in 64-bit mode",
> - SMRange(StartLoc, Tok.getEndLoc()));
> + SMRange(StartLoc, EndLoc));
> }
>
> // Parse "%st" as "%st(0)" and "%st(1)", which is multiple tokens.
> if (RegNo == 0 && (Tok.getString() == "st" || Tok.getString() == "ST")) {
> RegNo = X86::ST0;
> - EndLoc = Tok.getLoc();
> Parser.Lex(); // Eat 'st'
>
> // Check to see if we have '(4)' after %st.
> @@ -615,11 +616,13 @@
> if (getParser().Lex().isNot(AsmToken::RParen))
> return Error(Parser.getTok().getLoc(), "expected ')'");
>
> - EndLoc = Tok.getLoc();
> + EndLoc = Parser.getTok().getEndLoc();
> Parser.Lex(); // Eat ')'
> return false;
> }
>
> + EndLoc = Parser.getTok().getEndLoc();
> +
> // If this is "db[0-7]", match it as an alias
> // for dr[0-7].
> if (RegNo == 0 && Tok.getString().size() == 3 &&
> @@ -636,7 +639,7 @@
> }
>
> if (RegNo != 0) {
> - EndLoc = Tok.getLoc();
> + EndLoc = Parser.getTok().getEndLoc();
> Parser.Lex(); // Eat it.
> return false;
> }
> @@ -645,10 +648,9 @@
> if (RegNo == 0) {
> if (isParsingIntelSyntax()) return true;
> return Error(StartLoc, "invalid register name",
> - SMRange(StartLoc, Tok.getEndLoc()));
> + SMRange(StartLoc, EndLoc));
> }
>
> - EndLoc = Tok.getEndLoc();
> Parser.Lex(); // Eat identifier token.
> return false;
> }
> @@ -677,7 +679,7 @@
> unsigned Size) {
> unsigned BaseReg = 0, IndexReg = 0, Scale = 1;
> const AsmToken &Tok = Parser.getTok();
> - SMLoc Start = Tok.getLoc(), End;
> + SMLoc Start = Tok.getLoc(), End = Tok.getEndLoc();
>
> const MCExpr *Disp = MCConstantExpr::Create(0, getContext());
> // Parse [ BaseReg + Scale*IndexReg + Disp ] or [ symbol ]
> @@ -693,9 +695,9 @@
> // Handle '[' 'symbol' ']'
> if (getParser().ParseExpression(Disp, End)) return 0;
> if (getLexer().isNot(AsmToken::RBrac))
> - return ErrorOperand(Start, "Expected ']' token!");
> + return ErrorOperand(Parser.getTok().getLoc(), "Expected ']' token!");
> + End = Parser.getTok().getEndLoc();
> Parser.Lex();
> - End = Tok.getLoc();
> return X86Operand::CreateMem(Disp, Start, End, Size);
> }
> } else if (getLexer().is(AsmToken::Integer)) {
> @@ -704,8 +706,8 @@
> SMLoc Loc = Tok.getLoc();
> if (getLexer().is(AsmToken::RBrac)) {
> // Handle '[' number ']'
> + End = Parser.getTok().getEndLoc();
> Parser.Lex();
> - End = Tok.getLoc();
> const MCExpr *Disp = MCConstantExpr::Create(Val, getContext());
> if (SegReg)
> return X86Operand::CreateMem(SegReg, Disp, 0, 0, Scale,
> @@ -726,8 +728,8 @@
> bool ExpectRBrac = true;
> if (getLexer().is(AsmToken::RBrac)) {
> ExpectRBrac = false;
> + End = Parser.getTok().getEndLoc();
> Parser.Lex();
> - End = Tok.getLoc();
> }
>
> if (getLexer().is(AsmToken::Plus) || getLexer().is(AsmToken::Minus) ||
> @@ -753,18 +755,18 @@
> return ErrorOperand(PlusLoc, "unexpected token after +");
> } else if (getLexer().is(AsmToken::Identifier)) {
> // This could be an index register or a displacement expression.
> - End = Tok.getLoc();
> if (!IndexReg)
> ParseRegister(IndexReg, Start, End);
> - else if (getParser().ParseExpression(Disp, End)) return 0;
> + else if (getParser().ParseExpression(Disp, End))
> + return 0;
> }
> }
>
> // Parse ][ as a plus.
> if (getLexer().is(AsmToken::RBrac)) {
> ExpectRBrac = false;
> + End = Parser.getTok().getEndLoc();
> Parser.Lex();
> - End = Tok.getLoc();
> if (getLexer().is(AsmToken::LBrac)) {
> ExpectRBrac = true;
> Parser.Lex();
> @@ -772,15 +774,15 @@
> return 0;
> }
> } else if (ExpectRBrac) {
> - if (getParser().ParseExpression(Disp, End))
> - return 0;
> + if (getParser().ParseExpression(Disp, End))
> + return 0;
> }
>
> if (ExpectRBrac) {
> if (getLexer().isNot(AsmToken::RBrac))
> return ErrorOperand(End, "expected ']' token!");
> + End = Parser.getTok().getEndLoc();
> Parser.Lex();
> - End = Tok.getLoc();
> }
>
> // Parse the dot operator (e.g., [ebx].foo.bar).
> @@ -790,12 +792,11 @@
> if (ParseIntelDotOperator(Disp, &NewDisp, Err))
> return ErrorOperand(Tok.getLoc(), Err);
>
> + End = Parser.getTok().getEndLoc();
> Parser.Lex(); // Eat the field.
> Disp = NewDisp;
> }
>
> - End = Tok.getLoc();
> -
> // handle [-42]
> if (!BaseReg && !IndexReg)
> return X86Operand::CreateMem(Disp, Start, End, Size);
> @@ -831,8 +832,8 @@
> }
>
> const MCExpr *Disp = MCConstantExpr::Create(0, getParser().getContext());
> - if (getParser().ParseExpression(Disp, End)) return 0;
> - End = Parser.getTok().getLoc();
> + if (getParser().ParseExpression(Disp, End))
> + return 0;
>
> bool NeedSizeDir = false;
> if (!Size && isParsingInlineAsm()) {
> @@ -921,8 +922,6 @@
> if (getParser().ParseExpression(Val, End))
> return ErrorOperand(Start, "Unable to parse expression!");
>
> - End = Parser.getTok().getLoc();
> -
> // Don't emit the offset operator.
> InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_Skip, OffsetOfLoc, 7));
>
> @@ -947,8 +946,6 @@
> if (getParser().ParseExpression(Val, End))
> return 0;
>
> - End = Parser.getTok().getLoc();
> -
> unsigned Size = 0;
> if (const MCSymbolRefExpr *SymRef = dyn_cast<MCSymbolRefExpr>(Val)) {
> const MCSymbol &Sym = SymRef->getSymbol();
> @@ -995,7 +992,6 @@
> getLexer().is(AsmToken::Minus)) {
> const MCExpr *Val;
> if (!getParser().ParseExpression(Val, End)) {
> - End = Parser.getTok().getLoc();
> return X86Operand::CreateImm(Val, Start, End);
> }
> }
> @@ -1006,7 +1002,7 @@
> // If this is a segment register followed by a ':', then this is the start
> // of a memory reference, otherwise this is a normal register reference.
> if (getLexer().isNot(AsmToken::Colon))
> - return X86Operand::CreateReg(RegNo, Start, Parser.getTok().getLoc());
> + return X86Operand::CreateReg(RegNo, Start, End);
>
> getParser().Lex(); // Eat the colon.
> return ParseIntelMemOperand(RegNo, Start);
> @@ -1183,7 +1179,7 @@
> Error(Parser.getTok().getLoc(), "unexpected token in memory operand");
> return 0;
> }
> - SMLoc MemEnd = Parser.getTok().getLoc();
> + SMLoc MemEnd = Parser.getTok().getEndLoc();
> Parser.Lex(); // Eat the ')'.
>
> // If we have both a base register and an index register make sure they are
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list