Index: lib/CodeGen/MIRParser/MILexer.h =================================================================== --- lib/CodeGen/MIRParser/MILexer.h +++ lib/CodeGen/MIRParser/MILexer.h @@ -91,26 +91,38 @@ private: TokenKind Kind; - unsigned StringOffset; - bool HasStringValue; StringRef Range; - std::string StringValue; + StringRef StringValue; + std::string StringValueStorage; APSInt IntVal; public: MIToken(TokenKind Kind, StringRef Range, unsigned StringOffset = 0) - : Kind(Kind), StringOffset(StringOffset), HasStringValue(false), - Range(Range) {} + : Kind(Kind), Range(Range), StringValue(Range.drop_front(StringOffset)) {} - MIToken(TokenKind Kind, StringRef Range, std::string StringValue, - unsigned StringOffset = 0) - : Kind(Kind), StringOffset(StringOffset), HasStringValue(true), - Range(Range), StringValue(std::move(StringValue)) {} + MIToken(TokenKind Kind, StringRef Range, std::string StrVal) + : Kind(Kind), Range(Range), StringValueStorage(std::move(StrVal)) { + StringValue = StringValueStorage; + } MIToken(TokenKind Kind, StringRef Range, const APSInt &IntVal, unsigned StringOffset = 0) - : Kind(Kind), StringOffset(StringOffset), HasStringValue(false), - Range(Range), IntVal(IntVal) {} + : Kind(Kind), Range(Range), StringValue(Range.drop_front(StringOffset)), + IntVal(IntVal) {} + + MIToken &operator=(MIToken &&Other) { + Kind = Other.Kind; + Range = std::move(Other.Range); + StringValueStorage = std::move(Other.StringValueStorage); + if (StringValueStorage.empty()) + StringValue = std::move(Other.StringValue); + else { + StringValue = StringValueStorage; + Other.StringValue = ""; + } + IntVal = std::move(Other.IntVal); + return *this; + } TokenKind kind() const { return Kind; } @@ -135,17 +147,10 @@ StringRef::iterator location() const { return Range.begin(); } - /// Return the token's raw string value. - /// - /// If the string value is quoted, this method returns that quoted string as - /// it is, without unescaping the string value. - StringRef rawStringValue() const { return Range.drop_front(StringOffset); } + StringRef range() const { return Range; } /// Return the token's string value. - StringRef stringValue() const { - return HasStringValue ? StringRef(StringValue) - : Range.drop_front(StringOffset); - } + StringRef stringValue() const { return StringValue; } const APSInt &integerValue() const { return IntVal; } Index: lib/CodeGen/MIRParser/MILexer.cpp =================================================================== --- lib/CodeGen/MIRParser/MILexer.cpp +++ lib/CodeGen/MIRParser/MILexer.cpp @@ -125,8 +125,7 @@ if (Cursor R = lexStringConstant(C, ErrorCallback)) { StringRef String = Range.upto(R); Token = MIToken(Type, String, - unescapeQuotedString(String.drop_front(PrefixLength)), - PrefixLength); + unescapeQuotedString(String.drop_front(PrefixLength))); return R; } Token = MIToken(MIToken::Error, Range.remaining()); Index: lib/CodeGen/MIRParser/MIParser.cpp =================================================================== --- lib/CodeGen/MIRParser/MIParser.cpp +++ lib/CodeGen/MIRParser/MIParser.cpp @@ -670,8 +670,8 @@ const Module *M = MF.getFunction()->getParent(); GV = M->getNamedValue(Token.stringValue()); if (!GV) - return error(Twine("use of undefined global value '@") + - Token.rawStringValue() + "'"); + return error(Twine("use of undefined global value '") + Token.range() + + "'"); break; } case MIToken::GlobalValue: { @@ -844,8 +844,7 @@ BB = dyn_cast_or_null( F.getValueSymbolTable().lookup(Token.stringValue())); if (!BB) - return error(Twine("use of undefined IR block '%ir-block.") + - Token.rawStringValue() + "'"); + return error(Twine("use of undefined IR block '") + Token.range() + "'"); break; } case MIToken::IRBlock: { @@ -1005,8 +1004,7 @@ case MIToken::NamedIRValue: { V = MF.getFunction()->getValueSymbolTable().lookup(Token.stringValue()); if (!V) - return error(Twine("use of undefined IR value '%ir.") + - Token.rawStringValue() + "'"); + return error(Twine("use of undefined IR value '") + Token.range() + "'"); break; } // TODO: Parse unnamed IR value references.