[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