[llvm] r284978 - [MC] Fix Various End Of Line Comment checkings
Nirav Dave via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 24 07:35:29 PDT 2016
Author: niravd
Date: Mon Oct 24 09:35:29 2016
New Revision: 284978
URL: http://llvm.org/viewvc/llvm-project?rev=284978&view=rev
Log:
[MC] Fix Various End Of Line Comment checkings
Fix AsmParser lines to correctly handle end-of-line pre-processor
comments parsing when '#' is not the assembly line comment prefix.
Reviewers: rnk
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D25567
Added:
llvm/trunk/test/MC/AsmParser/AArch64/
llvm/trunk/test/MC/AsmParser/AArch64/directive-parse-err.s
llvm/trunk/test/MC/AsmParser/AArch64/lit.local.cfg
Modified:
llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h
llvm/trunk/lib/MC/MCParser/AsmParser.cpp
llvm/trunk/lib/MC/MCParser/MCAsmParser.cpp
llvm/trunk/test/MC/AsmParser/exprs-invalid.s
Modified: llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h?rev=284978&r1=284977&r2=284978&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h (original)
+++ llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h Mon Oct 24 09:35:29 2016
@@ -166,6 +166,8 @@ public:
return rv;
}
+ bool addErrorSuffix(const Twine &Suffix);
+
/// \brief Get the next AsmToken in the stream, possibly handling file
/// inclusion first.
virtual const AsmToken &Lex() = 0;
@@ -177,11 +179,15 @@ public:
bool TokError(const Twine &Msg, SMRange Range = None);
bool parseTokenLoc(SMLoc &Loc);
- bool parseToken(AsmToken::TokenKind T, const Twine &Msg);
- bool parseOptionalToken(AsmToken::TokenKind T, bool &Present);
+ bool parseToken(AsmToken::TokenKind T, const Twine &Msg = "unexpected token");
+ /// \brief Attempt to parse and consume token, returning true on
+ /// success.
+ bool parseOptionalToken(AsmToken::TokenKind T);
bool parseEOL(const Twine &ErrMsg);
+ bool parseMany(std::function<bool()> parseOne, bool hasComma = true);
+
bool parseIntToken(int64_t &V, const Twine &ErrMsg);
bool check(bool P, const llvm::Twine &Msg);
Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=284978&r1=284977&r2=284978&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
+++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Mon Oct 24 09:35:29 2016
@@ -425,9 +425,11 @@ private:
// ".ascii", ".asciz", ".string"
bool parseDirectiveAscii(StringRef IDVal, bool ZeroTerminated);
bool parseDirectiveReloc(SMLoc DirectiveLoc); // ".reloc"
- bool parseDirectiveValue(unsigned Size); // ".byte", ".long", ...
- bool parseDirectiveOctaValue(); // ".octa"
- bool parseDirectiveRealValue(const fltSemantics &); // ".single", ...
+ bool parseDirectiveValue(StringRef IDVal,
+ unsigned Size); // ".byte", ".long", ...
+ bool parseDirectiveOctaValue(StringRef IDVal); // ".octa", ...
+ bool parseDirectiveRealValue(StringRef IDVal,
+ const fltSemantics &); // ".single", ...
bool parseDirectiveFill(); // ".fill"
bool parseDirectiveZero(); // ".zero"
// ".set", ".equ", ".equiv"
@@ -1732,25 +1734,34 @@ bool AsmParser::parseStatement(ParseStat
case DK_STRING:
return parseDirectiveAscii(IDVal, true);
case DK_BYTE:
- return parseDirectiveValue(1);
+ case DK_DC_B:
+ return parseDirectiveValue(IDVal, 1);
+ case DK_DC:
+ case DK_DC_W:
case DK_SHORT:
case DK_VALUE:
case DK_2BYTE:
- return parseDirectiveValue(2);
+ return parseDirectiveValue(IDVal, 2);
case DK_LONG:
case DK_INT:
case DK_4BYTE:
- return parseDirectiveValue(4);
+ case DK_DC_L:
+ return parseDirectiveValue(IDVal, 4);
case DK_QUAD:
case DK_8BYTE:
- return parseDirectiveValue(8);
+ return parseDirectiveValue(IDVal, 8);
+ case DK_DC_A:
+ return parseDirectiveValue(IDVal,
+ getContext().getAsmInfo()->getPointerSize());
case DK_OCTA:
- return parseDirectiveOctaValue();
+ return parseDirectiveOctaValue(IDVal);
case DK_SINGLE:
case DK_FLOAT:
- return parseDirectiveRealValue(APFloat::IEEEsingle);
+ case DK_DC_S:
+ return parseDirectiveRealValue(IDVal, APFloat::IEEEsingle);
case DK_DOUBLE:
- return parseDirectiveRealValue(APFloat::IEEEdouble);
+ case DK_DC_D:
+ return parseDirectiveRealValue(IDVal, APFloat::IEEEdouble);
case DK_ALIGN: {
bool IsPow2 = !getContext().getAsmInfo()->getAlignmentIsInBytes();
return parseDirectiveAlign(IsPow2, /*ExprSize=*/1);
@@ -1923,20 +1934,6 @@ bool AsmParser::parseStatement(ParseStat
return parseDirectiveWarning(IDLoc);
case DK_RELOC:
return parseDirectiveReloc(IDLoc);
- case DK_DC:
- return parseDirectiveValue(2);
- case DK_DC_A:
- return parseDirectiveValue(getContext().getAsmInfo()->getPointerSize());
- case DK_DC_B:
- return parseDirectiveValue(1);
- case DK_DC_D:
- return parseDirectiveRealValue(APFloat::IEEEdouble);
- case DK_DC_L:
- return parseDirectiveValue(4);
- case DK_DC_S:
- return parseDirectiveRealValue(APFloat::IEEEsingle);
- case DK_DC_W:
- return parseDirectiveValue(2);
case DK_DCB:
case DK_DCB_W:
return parseDirectiveDCB(IDVal, 2);
@@ -2645,17 +2642,15 @@ bool AsmParser::parseIdentifier(StringRe
/// ::= .set identifier ',' expression
bool AsmParser::parseDirectiveSet(StringRef IDVal, bool allow_redef) {
StringRef Name;
-
- if (check(parseIdentifier(Name),
- "expected identifier after '" + Twine(IDVal) + "'") ||
- parseToken(AsmToken::Comma, "unexpected token in '" + Twine(IDVal) + "'"))
- return true;
-
- return parseAssignment(Name, allow_redef, true);
+ if (check(parseIdentifier(Name), "expected identifier") ||
+ parseToken(AsmToken::Comma) || parseAssignment(Name, allow_redef, true))
+ return addErrorSuffix(" in '" + Twine(IDVal) + "' directive");
+ return false;
}
bool AsmParser::parseEscapedString(std::string &Data) {
- assert(getLexer().is(AsmToken::String) && "Unexpected current token!");
+ if (check(getTok().isNot(AsmToken::String), "expected string"))
+ return true;
Data = "";
StringRef Str = getTok().getStringContents();
@@ -2716,31 +2711,18 @@ bool AsmParser::parseEscapedString(std::
/// parseDirectiveAscii:
/// ::= ( .ascii | .asciz | .string ) [ "string" ( , "string" )* ]
bool AsmParser::parseDirectiveAscii(StringRef IDVal, bool ZeroTerminated) {
- if (getLexer().isNot(AsmToken::EndOfStatement)) {
- if (checkForValidSection())
- return true;
-
- while (true) {
- std::string Data;
- if (check(getTok().isNot(AsmToken::String),
- "expected string in '" + Twine(IDVal) + "' directive") ||
- parseEscapedString(Data))
- return true;
-
- getStreamer().EmitBytes(Data);
- if (ZeroTerminated)
- getStreamer().EmitBytes(StringRef("\0", 1));
-
- if (getLexer().is(AsmToken::EndOfStatement))
- break;
-
- if (parseToken(AsmToken::Comma,
- "unexpected token in '" + Twine(IDVal) + "' directive"))
- return true;
- }
- }
+ auto parseOp = [&]() -> bool {
+ std::string Data;
+ if (checkForValidSection() || parseEscapedString(Data))
+ return true;
+ getStreamer().EmitBytes(Data);
+ if (ZeroTerminated)
+ getStreamer().EmitBytes(StringRef("\0", 1));
+ return false;
+ };
- Lex();
+ if (parseMany(parseOp))
+ return addErrorSuffix(" in '" + Twine(IDVal) + "' directive");
return false;
}
@@ -2751,11 +2733,12 @@ bool AsmParser::parseDirectiveReloc(SMLo
const MCExpr *Expr = nullptr;
SMLoc OffsetLoc = Lexer.getTok().getLoc();
+ int64_t OffsetValue;
+ // We can only deal with constant expressions at the moment.
+
if (parseExpression(Offset))
return true;
- // We can only deal with constant expressions at the moment.
- int64_t OffsetValue;
if (check(!Offset->evaluateAsAbsolute(OffsetValue), OffsetLoc,
"expression is not a constant value") ||
check(OffsetValue < 0, OffsetLoc, "expression is negative") ||
@@ -2790,86 +2773,63 @@ bool AsmParser::parseDirectiveReloc(SMLo
/// parseDirectiveValue
/// ::= (.byte | .short | ... ) [ expression (, expression)* ]
-bool AsmParser::parseDirectiveValue(unsigned Size) {
- if (getLexer().isNot(AsmToken::EndOfStatement)) {
- if (checkForValidSection())
- return true;
-
- while (true) {
- const MCExpr *Value;
- SMLoc ExprLoc = getLexer().getLoc();
- if (parseExpression(Value))
- return true;
-
- // Special case constant expressions to match code generator.
- if (const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(Value)) {
- assert(Size <= 8 && "Invalid size");
- uint64_t IntValue = MCE->getValue();
- if (!isUIntN(8 * Size, IntValue) && !isIntN(8 * Size, IntValue))
- return Error(ExprLoc, "literal value out of range for directive");
- getStreamer().EmitIntValue(IntValue, Size);
- } else
- getStreamer().EmitValue(Value, Size, ExprLoc);
-
- if (getLexer().is(AsmToken::EndOfStatement))
- break;
-
- // FIXME: Improve diagnostic.
- if (parseToken(AsmToken::Comma, "unexpected token in directive"))
- return true;
- }
- }
+bool AsmParser::parseDirectiveValue(StringRef IDVal, unsigned Size) {
+ auto parseOp = [&]() -> bool {
+ const MCExpr *Value;
+ SMLoc ExprLoc = getLexer().getLoc();
+ if (checkForValidSection() || parseExpression(Value))
+ return true;
+ // Special case constant expressions to match code generator.
+ if (const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(Value)) {
+ assert(Size <= 8 && "Invalid size");
+ uint64_t IntValue = MCE->getValue();
+ if (!isUIntN(8 * Size, IntValue) && !isIntN(8 * Size, IntValue))
+ return Error(ExprLoc, "out of range literal value");
+ getStreamer().EmitIntValue(IntValue, Size);
+ } else
+ getStreamer().EmitValue(Value, Size, ExprLoc);
+ return false;
+ };
- Lex();
+ if (parseMany(parseOp))
+ return addErrorSuffix(" in '" + Twine(IDVal) + "' directive");
return false;
}
/// ParseDirectiveOctaValue
/// ::= .octa [ hexconstant (, hexconstant)* ]
-bool AsmParser::parseDirectiveOctaValue() {
- if (getLexer().isNot(AsmToken::EndOfStatement)) {
+
+bool AsmParser::parseDirectiveOctaValue(StringRef IDVal) {
+ auto parseOp = [&]() -> bool {
if (checkForValidSection())
return true;
-
- while (true) {
- if (getTok().is(AsmToken::Error))
- return true;
- if (getTok().isNot(AsmToken::Integer) && getTok().isNot(AsmToken::BigNum))
- return TokError("unknown token in expression");
-
- SMLoc ExprLoc = getLexer().getLoc();
- APInt IntValue = getTok().getAPIntVal();
- Lex();
-
- uint64_t hi, lo;
- if (IntValue.isIntN(64)) {
- hi = 0;
- lo = IntValue.getZExtValue();
- } else if (IntValue.isIntN(128)) {
- // It might actually have more than 128 bits, but the top ones are zero.
- hi = IntValue.getHiBits(IntValue.getBitWidth() - 64).getZExtValue();
- lo = IntValue.getLoBits(64).getZExtValue();
- } else
- return Error(ExprLoc, "literal value out of range for directive");
-
- if (MAI.isLittleEndian()) {
- getStreamer().EmitIntValue(lo, 8);
- getStreamer().EmitIntValue(hi, 8);
- } else {
- getStreamer().EmitIntValue(hi, 8);
- getStreamer().EmitIntValue(lo, 8);
- }
-
- if (getLexer().is(AsmToken::EndOfStatement))
- break;
-
- // FIXME: Improve diagnostic.
- if (parseToken(AsmToken::Comma, "unexpected token in directive"))
- return true;
+ if (getTok().isNot(AsmToken::Integer) && getTok().isNot(AsmToken::BigNum))
+ return TokError("unknown token in expression");
+ SMLoc ExprLoc = getTok().getLoc();
+ APInt IntValue = getTok().getAPIntVal();
+ uint64_t hi, lo;
+ Lex();
+ if (!IntValue.isIntN(128))
+ return Error(ExprLoc, "out of range literal value");
+ if (!IntValue.isIntN(64)) {
+ hi = IntValue.getHiBits(IntValue.getBitWidth() - 64).getZExtValue();
+ lo = IntValue.getLoBits(64).getZExtValue();
+ } else {
+ hi = 0;
+ lo = IntValue.getZExtValue();
}
- }
+ if (MAI.isLittleEndian()) {
+ getStreamer().EmitIntValue(lo, 8);
+ getStreamer().EmitIntValue(hi, 8);
+ } else {
+ getStreamer().EmitIntValue(hi, 8);
+ getStreamer().EmitIntValue(lo, 8);
+ }
+ return false;
+ };
- Lex();
+ if (parseMany(parseOp))
+ return addErrorSuffix(" in '" + Twine(IDVal) + "' directive");
return false;
}
@@ -2915,28 +2875,19 @@ bool AsmParser::parseRealValue(const flt
/// parseDirectiveRealValue
/// ::= (.single | .double) [ expression (, expression)* ]
-bool AsmParser::parseDirectiveRealValue(const fltSemantics &Semantics) {
- if (getLexer().isNot(AsmToken::EndOfStatement)) {
- if (checkForValidSection())
+bool AsmParser::parseDirectiveRealValue(StringRef IDVal,
+ const fltSemantics &Semantics) {
+ auto parseOp = [&]() -> bool {
+ APInt AsInt;
+ if (checkForValidSection() || parseRealValue(Semantics, AsInt))
return true;
+ getStreamer().EmitIntValue(AsInt.getLimitedValue(),
+ AsInt.getBitWidth() / 8);
+ return false;
+ };
- while (true) {
- APInt AsInt;
- if (parseRealValue(Semantics, AsInt))
- return true;
-
- getStreamer().EmitIntValue(AsInt.getLimitedValue(),
- AsInt.getBitWidth() / 8);
-
- if (Lexer.is(AsmToken::EndOfStatement))
- break;
-
- if (parseToken(AsmToken::Comma, "unexpected token in directive"))
- return true;
- }
- }
-
- Lex();
+ if (parseMany(parseOp))
+ return addErrorSuffix(" in '" + Twine(IDVal) + "' directive");
return false;
}
@@ -2975,21 +2926,20 @@ bool AsmParser::parseDirectiveFill() {
int64_t FillExpr = 0;
SMLoc SizeLoc, ExprLoc;
- if (getLexer().isNot(AsmToken::EndOfStatement)) {
- if (parseToken(AsmToken::Comma, "unexpected token in '.fill' directive") ||
- parseTokenLoc(SizeLoc) || parseAbsoluteExpression(FillSize))
+ if (parseOptionalToken(AsmToken::Comma)) {
+ SizeLoc = getTok().getLoc();
+ if (parseAbsoluteExpression(FillSize))
return true;
-
- if (getLexer().isNot(AsmToken::EndOfStatement)) {
- if (parseToken(AsmToken::Comma,
- "unexpected token in '.fill' directive") ||
- parseTokenLoc(ExprLoc) || parseAbsoluteExpression(FillExpr) ||
- parseToken(AsmToken::EndOfStatement,
- "unexpected token in '.fill' directive"))
+ if (parseOptionalToken(AsmToken::Comma)) {
+ ExprLoc = getTok().getLoc();
+ if (parseAbsoluteExpression(FillExpr))
return true;
}
}
+ if (parseToken(AsmToken::EndOfStatement,
+ "unexpected token in '.fill' directive"))
+ return true;
if (FillSize < 0) {
Warning(SizeLoc, "'.fill' directive with negative size has no effect");
@@ -3017,15 +2967,11 @@ bool AsmParser::parseDirectiveOrg() {
// Parse optional fill expression.
int64_t FillExpr = 0;
- if (getLexer().isNot(AsmToken::EndOfStatement)) {
- if (parseToken(AsmToken::Comma, "unexpected token in '.org' directive") ||
- parseAbsoluteExpression(FillExpr))
- return true;
- }
-
- if (parseToken(AsmToken::EndOfStatement,
- "unexpected token in '.org' directive"))
- return true;
+ if (parseOptionalToken(AsmToken::Comma))
+ if (parseAbsoluteExpression(FillExpr))
+ return addErrorSuffix(" in '.org' directive");
+ if (parseToken(AsmToken::EndOfStatement))
+ return addErrorSuffix(" in '.org' directive");
getStreamer().emitValueToOffset(Offset, FillExpr);
return false;
@@ -3036,38 +2982,33 @@ bool AsmParser::parseDirectiveOrg() {
bool AsmParser::parseDirectiveAlign(bool IsPow2, unsigned ValueSize) {
SMLoc AlignmentLoc = getLexer().getLoc();
int64_t Alignment;
- if (checkForValidSection() || parseAbsoluteExpression(Alignment))
- return true;
-
SMLoc MaxBytesLoc;
bool HasFillExpr = false;
int64_t FillExpr = 0;
int64_t MaxBytesToFill = 0;
- if (getLexer().isNot(AsmToken::EndOfStatement)) {
- if (parseToken(AsmToken::Comma, "unexpected token in directive"))
- return true;
- // The fill expression can be omitted while specifying a maximum number of
- // alignment bytes, e.g:
- // .align 3,,4
- if (getTok().isNot(AsmToken::Comma)) {
- HasFillExpr = true;
- if (parseAbsoluteExpression(FillExpr))
- return true;
- }
-
- if (getTok().isNot(AsmToken::EndOfStatement)) {
- if (parseToken(AsmToken::Comma, "unexpected token in directive") ||
- parseTokenLoc(MaxBytesLoc) || parseAbsoluteExpression(MaxBytesToFill))
- return true;
+ auto parseAlign = [&]() -> bool {
+ if (checkForValidSection() || parseAbsoluteExpression(Alignment))
+ return true;
+ if (parseOptionalToken(AsmToken::Comma)) {
+ // The fill expression can be omitted while specifying a maximum number of
+ // alignment bytes, e.g:
+ // .align 3,,4
+ if (getTok().isNot(AsmToken::Comma)) {
+ HasFillExpr = true;
+ if (parseAbsoluteExpression(FillExpr))
+ return true;
+ }
+ if (parseOptionalToken(AsmToken::Comma))
+ if (parseTokenLoc(MaxBytesLoc) ||
+ parseAbsoluteExpression(MaxBytesToFill))
+ return true;
}
- }
+ return parseToken(AsmToken::EndOfStatement);
+ };
- if (parseToken(AsmToken::EndOfStatement, "unexpected token in directive"))
- return true;
-
- if (!HasFillExpr)
- FillExpr = 0;
+ if (parseAlign())
+ return addErrorSuffix(" in directive");
// Always emit an alignment here even if we thrown an error.
bool ReturnVal = false;
@@ -3185,7 +3126,7 @@ bool AsmParser::parseDirectiveFile(SMLoc
/// ::= .line [number]
bool AsmParser::parseDirectiveLine() {
int64_t LineNumber;
- if (getLexer().isNot(AsmToken::EndOfStatement)) {
+ if (getLexer().is(AsmToken::Integer)) {
if (parseIntToken(LineNumber, "unexpected token in '.line' directive"))
return true;
(void)LineNumber;
@@ -3234,65 +3175,61 @@ bool AsmParser::parseDirectiveLoc() {
unsigned Flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0;
unsigned Isa = 0;
int64_t Discriminator = 0;
- if (getLexer().isNot(AsmToken::EndOfStatement)) {
- while (true) {
- if (getLexer().is(AsmToken::EndOfStatement))
- break;
- StringRef Name;
- SMLoc Loc = getTok().getLoc();
- if (parseIdentifier(Name))
- return TokError("unexpected token in '.loc' directive");
-
- if (Name == "basic_block")
- Flags |= DWARF2_FLAG_BASIC_BLOCK;
- else if (Name == "prologue_end")
- Flags |= DWARF2_FLAG_PROLOGUE_END;
- else if (Name == "epilogue_begin")
- Flags |= DWARF2_FLAG_EPILOGUE_BEGIN;
- else if (Name == "is_stmt") {
- Loc = getTok().getLoc();
- const MCExpr *Value;
- if (parseExpression(Value))
- return true;
- // The expression must be the constant 0 or 1.
- if (const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(Value)) {
- int Value = MCE->getValue();
- if (Value == 0)
- Flags &= ~DWARF2_FLAG_IS_STMT;
- else if (Value == 1)
- Flags |= DWARF2_FLAG_IS_STMT;
- else
- return Error(Loc, "is_stmt value not 0 or 1");
- } else {
- return Error(Loc, "is_stmt value not the constant value of 0 or 1");
- }
- } else if (Name == "isa") {
- Loc = getTok().getLoc();
- const MCExpr *Value;
- if (parseExpression(Value))
- return true;
- // The expression must be a constant greater or equal to 0.
- if (const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(Value)) {
- int Value = MCE->getValue();
- if (Value < 0)
- return Error(Loc, "isa number less than zero");
- Isa = Value;
- } else {
- return Error(Loc, "isa number not a constant value");
- }
- } else if (Name == "discriminator") {
- if (parseAbsoluteExpression(Discriminator))
- return true;
+ auto parseLocOp = [&]() -> bool {
+ StringRef Name;
+ SMLoc Loc = getTok().getLoc();
+ if (parseIdentifier(Name))
+ return TokError("unexpected token in '.loc' directive");
+
+ if (Name == "basic_block")
+ Flags |= DWARF2_FLAG_BASIC_BLOCK;
+ else if (Name == "prologue_end")
+ Flags |= DWARF2_FLAG_PROLOGUE_END;
+ else if (Name == "epilogue_begin")
+ Flags |= DWARF2_FLAG_EPILOGUE_BEGIN;
+ else if (Name == "is_stmt") {
+ Loc = getTok().getLoc();
+ const MCExpr *Value;
+ if (parseExpression(Value))
+ return true;
+ // The expression must be the constant 0 or 1.
+ if (const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(Value)) {
+ int Value = MCE->getValue();
+ if (Value == 0)
+ Flags &= ~DWARF2_FLAG_IS_STMT;
+ else if (Value == 1)
+ Flags |= DWARF2_FLAG_IS_STMT;
+ else
+ return Error(Loc, "is_stmt value not 0 or 1");
} else {
- return Error(Loc, "unknown sub-directive in '.loc' directive");
+ return Error(Loc, "is_stmt value not the constant value of 0 or 1");
}
-
- if (getLexer().is(AsmToken::EndOfStatement))
- break;
+ } else if (Name == "isa") {
+ Loc = getTok().getLoc();
+ const MCExpr *Value;
+ if (parseExpression(Value))
+ return true;
+ // The expression must be a constant greater or equal to 0.
+ if (const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(Value)) {
+ int Value = MCE->getValue();
+ if (Value < 0)
+ return Error(Loc, "isa number less than zero");
+ Isa = Value;
+ } else {
+ return Error(Loc, "isa number not a constant value");
+ }
+ } else if (Name == "discriminator") {
+ if (parseAbsoluteExpression(Discriminator))
+ return true;
+ } else {
+ return Error(Loc, "unknown sub-directive in '.loc' directive");
}
- }
- Lex();
+ return false;
+ };
+
+ if (parseMany(parseLocOp))
+ return true;
getStreamer().EmitDwarfLocDirective(FileNumber, LineNumber, ColumnPos, Flags,
Isa, Discriminator, StringRef());
@@ -3326,7 +3263,7 @@ bool AsmParser::parseDirectiveCVFile() {
return true;
if (!getStreamer().EmitCVFileDirective(FileNumber, Filename))
- Error(FileNumberLoc, "file number already allocated");
+ return Error(FileNumberLoc, "file number already allocated");
return false;
}
@@ -3366,7 +3303,7 @@ bool AsmParser::parseDirectiveCVFuncId()
return true;
if (!getStreamer().EmitCVFuncIdDirective(FunctionId))
- Error(FunctionIdLoc, "function id already allocated");
+ return Error(FunctionIdLoc, "function id already allocated");
return false;
}
@@ -3465,12 +3402,12 @@ bool AsmParser::parseDirectiveCVLoc() {
bool PrologueEnd = false;
uint64_t IsStmt = 0;
- while (getLexer().isNot(AsmToken::EndOfStatement)) {
+
+ auto parseOp = [&]() -> bool {
StringRef Name;
SMLoc Loc = getTok().getLoc();
if (parseIdentifier(Name))
return TokError("unexpected token in '.cv_loc' directive");
-
if (Name == "prologue_end")
PrologueEnd = true;
else if (Name == "is_stmt") {
@@ -3488,8 +3425,11 @@ bool AsmParser::parseDirectiveCVLoc() {
} else {
return Error(Loc, "unknown sub-directive in '.cv_loc' directive");
}
- }
- Lex();
+ return false;
+ };
+
+ if (parseMany(parseOp, false /*hasComma*/))
+ return true;
getStreamer().EmitCVLocDirective(FunctionId, FileNumber, LineNumber,
ColumnPos, PrologueEnd, IsStmt, StringRef(),
@@ -3636,12 +3576,12 @@ bool AsmParser::parseDirectiveCFISection
/// ::= .cfi_startproc [simple]
bool AsmParser::parseDirectiveCFIStartProc() {
StringRef Simple;
- if (getLexer().isNot(AsmToken::EndOfStatement))
- if (parseIdentifier(Simple) || Simple != "simple")
- return TokError("unexpected token in .cfi_startproc directive");
-
- if (parseToken(AsmToken::EndOfStatement, "Expected end of statement"))
- return true;
+ if (!parseOptionalToken(AsmToken::EndOfStatement)) {
+ if (check(parseIdentifier(Simple) || Simple != "simple",
+ "unexpected token") ||
+ parseToken(AsmToken::EndOfStatement))
+ return addErrorSuffix(" in '.cfi_startproc' directive");
+ }
getStreamer().EmitCFIStartProc(!Simple.empty());
return false;
@@ -4214,22 +4154,20 @@ bool AsmParser::parseDirectiveBundleLock
return true;
bool AlignToEnd = false;
- if (getLexer().isNot(AsmToken::EndOfStatement)) {
- StringRef Option;
- SMLoc Loc = getTok().getLoc();
- const char *kInvalidOptionError =
- "invalid option for '.bundle_lock' directive";
+ StringRef Option;
+ SMLoc Loc = getTok().getLoc();
+ const char *kInvalidOptionError =
+ "invalid option for '.bundle_lock' directive";
+ if (!parseOptionalToken(AsmToken::EndOfStatement)) {
if (check(parseIdentifier(Option), Loc, kInvalidOptionError) ||
check(Option != "align_to_end", Loc, kInvalidOptionError) ||
- check(getTok().isNot(AsmToken::EndOfStatement), Loc,
- "unexpected token after '.bundle_lock' directive option"))
+ parseToken(AsmToken::EndOfStatement,
+ "unexpected token after '.bundle_lock' directive option"))
return true;
AlignToEnd = true;
}
- Lex();
-
getStreamer().EmitBundleLock(AlignToEnd);
return false;
}
@@ -4256,17 +4194,11 @@ bool AsmParser::parseDirectiveSpace(Stri
return true;
int64_t FillExpr = 0;
- if (getLexer().isNot(AsmToken::EndOfStatement)) {
-
- if (parseToken(AsmToken::Comma,
- "unexpected token in '" + Twine(IDVal) + "' directive") ||
- parseAbsoluteExpression(FillExpr))
- return true;
- }
-
- if (parseToken(AsmToken::EndOfStatement,
- "unexpected token in '" + Twine(IDVal) + "' directive"))
- return true;
+ if (parseOptionalToken(AsmToken::Comma))
+ if (parseAbsoluteExpression(FillExpr))
+ return addErrorSuffix("in '" + Twine(IDVal) + "' directive");
+ if (parseToken(AsmToken::EndOfStatement))
+ return addErrorSuffix("in '" + Twine(IDVal) + "' directive");
// FIXME: Sometimes the fill expr is 'nop' if it isn't supplied, instead of 0.
getStreamer().emitFill(*NumBytes, FillExpr, NumBytesLoc);
@@ -4378,24 +4310,19 @@ bool AsmParser::parseDirectiveLEB128(boo
if (checkForValidSection())
return true;
- const MCExpr *Value;
-
- while (true) {
+ auto parseOp = [&]() -> bool {
+ const MCExpr *Value;
if (parseExpression(Value))
return true;
-
if (Signed)
getStreamer().EmitSLEB128Value(Value);
else
getStreamer().EmitULEB128Value(Value);
+ return false;
+ };
- if (getLexer().is(AsmToken::EndOfStatement))
- break;
-
- if (parseToken(AsmToken::Comma, "unexpected token in directive"))
- return true;
- }
- Lex();
+ if (parseMany(parseOp))
+ return addErrorSuffix(" in directive");
return false;
}
@@ -4403,32 +4330,24 @@ bool AsmParser::parseDirectiveLEB128(boo
/// parseDirectiveSymbolAttribute
/// ::= { ".globl", ".weak", ... } [ identifier ( , identifier )* ]
bool AsmParser::parseDirectiveSymbolAttribute(MCSymbolAttr Attr) {
- if (getLexer().isNot(AsmToken::EndOfStatement)) {
- while (true) {
- StringRef Name;
- SMLoc Loc = getTok().getLoc();
-
- if (parseIdentifier(Name))
- return Error(Loc, "expected identifier in directive");
-
- MCSymbol *Sym = getContext().getOrCreateSymbol(Name);
-
- // Assembler local symbols don't make any sense here. Complain loudly.
- if (Sym->isTemporary())
- return Error(Loc, "non-local symbol required in directive");
-
- if (!getStreamer().EmitSymbolAttribute(Sym, Attr))
- return Error(Loc, "unable to emit symbol attribute");
+ auto parseOp = [&]() -> bool {
+ StringRef Name;
+ SMLoc Loc = getTok().getLoc();
+ if (parseIdentifier(Name))
+ return Error(Loc, "expected identifier");
+ MCSymbol *Sym = getContext().getOrCreateSymbol(Name);
- if (getLexer().is(AsmToken::EndOfStatement))
- break;
+ // Assembler local symbols don't make any sense here. Complain loudly.
+ if (Sym->isTemporary())
+ return Error(Loc, "non-local symbol required");
- if (parseToken(AsmToken::Comma, "unexpected token in directive"))
- return true;
- }
- }
+ if (!getStreamer().EmitSymbolAttribute(Sym, Attr))
+ return Error(Loc, "unable to emit symbol attribute");
+ return false;
+ };
- Lex();
+ if (parseMany(parseOp))
+ return addErrorSuffix(" in directive");
return false;
}
@@ -4476,10 +4395,9 @@ bool AsmParser::parseDirectiveComm(bool
}
}
- if (getLexer().isNot(AsmToken::EndOfStatement))
- return TokError("unexpected token in '.comm' or '.lcomm' directive");
-
- Lex();
+ if (parseToken(AsmToken::EndOfStatement,
+ "unexpected token in '.comm' or '.lcomm' directive"))
+ return true;
// NOTE: a size of zero for a .comm should create a undefined symbol
// but a size of .lcomm creates a bss symbol of size zero.
@@ -4562,20 +4480,16 @@ bool AsmParser::parseDirectiveIncbin() {
int64_t Skip = 0;
const MCExpr *Count = nullptr;
SMLoc SkipLoc, CountLoc;
- if (getLexer().isNot(AsmToken::EndOfStatement)) {
- if (parseToken(AsmToken::Comma, "unexpected token in '.incbin' directive"))
- return true;
-
+ if (parseOptionalToken(AsmToken::Comma)) {
// The skip expression can be omitted while specifying the count, e.g:
// .incbin "filename",,4
if (getTok().isNot(AsmToken::Comma)) {
if (parseTokenLoc(SkipLoc) || parseAbsoluteExpression(Skip))
return true;
}
-
- if (getLexer().isNot(AsmToken::EndOfStatement)) {
- if (parseToken(AsmToken::Comma, "unexpected token in '.incbin' directive") ||
- parseTokenLoc(CountLoc) || parseExpression(Count))
+ if (parseOptionalToken(AsmToken::Comma)) {
+ CountLoc = getTok().getLoc();
+ if (parseExpression(Count))
return true;
}
}
@@ -4771,10 +4685,10 @@ bool AsmParser::parseDirectiveElseIf(SML
if (parseAbsoluteExpression(ExprValue))
return true;
- if (getLexer().isNot(AsmToken::EndOfStatement))
- return TokError("unexpected token in '.elseif' directive");
+ if (parseToken(AsmToken::EndOfStatement,
+ "unexpected token in '.elseif' directive"))
+ return true;
- Lex();
TheCondState.CondMet = ExprValue;
TheCondState.Ignore = !TheCondState.CondMet;
}
@@ -4813,7 +4727,7 @@ bool AsmParser::parseDirectiveEnd(SMLoc
return true;
while (Lexer.isNot(AsmToken::Eof))
- Lex();
+ Lexer.Lex();
return false;
}
@@ -4855,12 +4769,16 @@ bool AsmParser::parseDirectiveWarning(SM
}
StringRef Message = ".warning directive invoked in source file";
- if (Lexer.isNot(AsmToken::EndOfStatement)) {
+
+ if (!parseOptionalToken(AsmToken::EndOfStatement)) {
if (Lexer.isNot(AsmToken::String))
return TokError(".warning argument must be a string");
Message = getTok().getStringContents();
Lex();
+ if (parseToken(AsmToken::EndOfStatement,
+ "expected end of statement in '.warning' directive"))
+ return true;
}
return Warning(L, Message);
@@ -5547,19 +5465,15 @@ bool parseAssignmentExpression(StringRef
SMLoc EqualLoc = Parser.getTok().getLoc();
if (Parser.parseExpression(Value)) {
- Parser.TokError("missing expression");
- return true;
+ return Parser.TokError("missing expression");
}
// Note: we don't count b as used in "a = b". This is to allow
// a = b
// b = c
- if (Parser.getTok().isNot(AsmToken::EndOfStatement))
- return Parser.TokError("unexpected token in assignment");
-
- // Eat the end of statement marker.
- Parser.Lex();
+ if (Parser.parseToken(AsmToken::EndOfStatement))
+ return true;
// Validate that the LHS is allowed to be a variable (either it has not been
// used as a symbol, or it is an absolute symbol).
Modified: llvm/trunk/lib/MC/MCParser/MCAsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/MCAsmParser.cpp?rev=284978&r1=284977&r2=284978&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCParser/MCAsmParser.cpp (original)
+++ llvm/trunk/lib/MC/MCParser/MCAsmParser.cpp Mon Oct 24 09:35:29 2016
@@ -68,11 +68,14 @@ bool MCAsmParser::parseIntToken(int64_t
return false;
}
-bool MCAsmParser::parseOptionalToken(AsmToken::TokenKind T, bool &Present) {
- Present = (getTok().getKind() == T);
+bool MCAsmParser::parseOptionalToken(AsmToken::TokenKind T) {
+ bool Present = (getTok().getKind() == T);
+ // if token is EOL and current token is # this is an EOL comment.
+ if (getTok().getKind() == AsmToken::Hash && T == AsmToken::EndOfStatement)
+ Present = true;
if (Present)
- Lex();
- return false;
+ parseToken(T);
+ return Present;
}
bool MCAsmParser::check(bool P, const Twine &Msg) {
@@ -97,9 +100,38 @@ bool MCAsmParser::Error(SMLoc L, const T
Msg.toVector(PErr.Msg);
PErr.Range = Range;
PendingErrors.push_back(PErr);
+
+ // If we threw this parsing error after a lexing error, this should
+ // supercede the lexing error and so we remove it from the Lexer
+ // before it can propagate
+ if (getTok().is(AsmToken::Error))
+ getLexer().Lex();
+ return true;
+}
+
+bool MCAsmParser::addErrorSuffix(const Twine &Suffix) {
+ // Make sure lexing errors have propagated to the parser.
+ if (getTok().is(AsmToken::Error))
+ Lex();
+ for (auto &PErr : PendingErrors)
+ Suffix.toVector(PErr.Msg);
return true;
}
+bool MCAsmParser::parseMany(std::function<bool()> parseOne, bool hasComma) {
+ if (parseOptionalToken(AsmToken::EndOfStatement))
+ return false;
+ while (1) {
+ if (parseOne())
+ return true;
+ if (parseOptionalToken(AsmToken::EndOfStatement))
+ return false;
+ if (hasComma && parseToken(AsmToken::Comma))
+ return true;
+ }
+ return false;
+}
+
bool MCAsmParser::parseExpression(const MCExpr *&Res) {
SMLoc L;
return parseExpression(Res, L);
Added: llvm/trunk/test/MC/AsmParser/AArch64/directive-parse-err.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/AArch64/directive-parse-err.s?rev=284978&view=auto
==============================================================================
--- llvm/trunk/test/MC/AsmParser/AArch64/directive-parse-err.s (added)
+++ llvm/trunk/test/MC/AsmParser/AArch64/directive-parse-err.s Mon Oct 24 09:35:29 2016
@@ -0,0 +1,258 @@
+// RUN: not llvm-mc -triple aarch64-unknown-unknown %s 2>&1 | FileCheck %s
+// RUN: not llvm-mc -triple aarch64-unknown-unknown %s 2>&1 | grep "error:" | count 60
+
+ // CHECK: [[@LINE+1]]:19: error: unexpected token in '.equ' directive
+ .equ ident1, 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .equ ident1, 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:19: error: unexpected token in '.equiv' directive
+ .equiv ident2, 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .equiv ident2, 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:19: error: unexpected token in '.set' directive
+ .set ident3, 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .set ident3, 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:20: error: unexpected token in '.ascii' directive
+ .ascii "string1" $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .ascii "string1" # EOL COMMENT
+ // CHECK: [[@LINE+1]]:20: error: unexpected token in '.asciz' directive
+ .asciz "string2" $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .asciz "string2" # EOL COMMENT
+ // CHECK: [[@LINE+1]]:20: error: unexpected token in '.string' directive
+ .string "string3" $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .string "string3" # EOL COMMENT
+ // CHECK: [[@LINE+1]]:10: error: unexpected token in '.byte' directive
+ .byte 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .byte 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:10: error: unexpected token in '.dc.b' directive
+ .dc.b 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .dc.b 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:8: error: unexpected token in '.dc' directive
+ .dc 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .dc.b 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:10: error: unexpected token in '.dc.w' directive
+ .dc.w 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .dc.w 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:11: error: unexpected token in '.short' directive
+ .short 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .short 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:11: error: unexpected token in '.value' directive
+ .value 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .value 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:11: error: unexpected token in '.2byte' directive
+ .2byte 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .2byte 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:10: error: unexpected token in '.long' directive
+ .long 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .long 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:10: error: unexpected token in '.int' directive
+ .int 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .int 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:11: error: unexpected token in '.4byte' directive
+ .4byte 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .4byte 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:10: error: unexpected token in '.dc.l' directive
+ .dc.l 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .dc.l 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:10: error: unexpected token in '.quad' directive
+ .quad 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .quad 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:11: error: unexpected token in '.8byte' directive
+ .8byte 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .8byte 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:10: error: unexpected token in '.dc.a' directive
+ .dc.a 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .dc.a 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:10: error: unexpected token in '.octa' directive
+ .octa 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .octa 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:12: error: unexpected token in '.single' directive
+ .single 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .single 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:11: error: unexpected token in '.float' directive
+ .float 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .float 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:10: error: unexpected token in '.dc.s' directive
+ .dc.s 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .dc.s 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:12: error: unexpected token in '.double' directive
+ .double 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .double 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:10: error: unexpected token in '.dc.d' directive
+ .dc.d 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .dc.d 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:13: error: unexpected token in '.fill' directive
+ .fill 1, 1 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .fill 1, 1 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:17: error: unexpected token in '.fill' directive
+ .fill 1, 1, 10 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .fill 1, 1, 10 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:16: error: unexpected token in '.org' directive
+ .org 1 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .org 1 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:11: error: unexpected token in directive
+ .align 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .align 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:13: error: unexpected token in directive
+ .align32 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .align32 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:12: error: unexpected token in directive
+ .balign 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .balign 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:13: error: unexpected token in directive
+ .balignw 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .balignw 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:13: error: unexpected token in directive
+ .balignl 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .balignl 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:13: error: unexpected token in directive
+ .p2align 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .p2align 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:14: error: unexpected token in directive
+ .p2alignw 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .p2alignw 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:14: error: unexpected token in directive
+ .p2alignl 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .p2alignl 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:8: error: unexpected token in '.line' directive
+ .line $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .line # EOL COMMENT
+ // CHECK: [[@LINE+1]]:10: error: unexpected token in '.line' directive
+ .line 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .line 0 # EOL COMMENT
+
+ .file 1 "hello"
+ // CHECK: [[@LINE+1]]:16: error: unexpected token in '.loc' directive
+ .loc 1 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .loc 1 # EOL COMMENT
+
+ // CHECK: [[@LINE+1]]:21: error: unexpected token in '.cv_file' directive
+ .cv_file 1 "hello" $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .cv_file 1 "hello" # EOL COMMENT
+
+ .cv_func_id 1
+ // CHECK: [[@LINE+1]]:14: error: unexpected token in '.cv_loc' directive
+ .cv_loc 1 1 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .cv_loc 1 1 # EOL COMMENT
+
+ // CHECK: [[@LINE+1]]:28: error: unexpected token after '.bundle_lock' directive option
+ .bundle_lock align_to_end $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .bundle_lock align_to_end # EOL COMMENT
+
+ // CHECK: [[@LINE+1]]:11: error: invalid token in expression in directive
+ .sleb128 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .sleb128 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:13: error: unexpected token in directive
+ .sleb128 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .sleb128 0 # EOL COMMENT
+
+ // CHECK: [[@LINE+1]]:11: error: invalid token in expression in directive
+ .uleb128 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .uleb128 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:13: error: unexpected token in directive
+ .uleb128 0 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .uleb128 0 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:31: error: unexpected token
+ .globl a1 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .globl a1 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:31: error: unexpected token in directive
+ .global a2 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .global a2 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:31: error: unexpected token in directive
+ .lazy_reference a3 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .lazy_reference a3 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:31: error: unexpected token in directive
+ .symbol_resolver a4 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .symbol_resolver a4 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:31: error: unexpected token in directive
+ .private_extern a5 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .private_extern a5 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:31: error: unexpected token in directive
+ .reference a6 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .reference a6 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:31: error: unexpected token in directive
+ .weak_definition a7 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .weak_definition a7 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:31: error: unexpected token in directive
+ .weak_reference a8 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .weak_reference a8 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:31: error: unexpected token in directive
+ .weak_def_can_be_hidden a9 $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .weak_def_can_be_hidden a9 # EOL COMMENT
+ // CHECK: [[@LINE+1]]:12: error: .warning argument must be a string
+ .warning $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .warning # EOL COMMENT
+ // CHECK: [[@LINE+1]]:21: error: expected end of statement in '.warning' directive
+ .warning "warning" $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .warning "warning" # EOL COMMENT
+
+
+ // CHECK: [[@LINE+1]]:17: error: unexpected token in '.cfi_startproc' directive
+ .cfi_startproc $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .cfi_startproc # EOL COMMENT
+ .cfi_endproc
+ // CHECK: [[@LINE+1]]:24: error: unexpected token in '.cfi_startproc' directive
+ .cfi_startproc simple $
+ // CHECK-NOT: [[@LINE+1]]:{{[0-9]+}}: error:
+ .cfi_startproc simple # EOL COMMENT
+ .cfi_endproc
+
+
+ // CHECK-NOT: error:
Added: llvm/trunk/test/MC/AsmParser/AArch64/lit.local.cfg
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/AArch64/lit.local.cfg?rev=284978&view=auto
==============================================================================
--- llvm/trunk/test/MC/AsmParser/AArch64/lit.local.cfg (added)
+++ llvm/trunk/test/MC/AsmParser/AArch64/lit.local.cfg Mon Oct 24 09:35:29 2016
@@ -0,0 +1,2 @@
+if 'AArch64' not in config.root.targets:
+ config.unsupported = True
Modified: llvm/trunk/test/MC/AsmParser/exprs-invalid.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/exprs-invalid.s?rev=284978&r1=284977&r2=284978&view=diff
==============================================================================
--- llvm/trunk/test/MC/AsmParser/exprs-invalid.s (original)
+++ llvm/trunk/test/MC/AsmParser/exprs-invalid.s Mon Oct 24 09:35:29 2016
@@ -1,17 +1,17 @@
// RUN: not llvm-mc -triple x86_64-apple-darwin10 %s 2> %t.err | FileCheck %s
// RUN: FileCheck --check-prefix=CHECK-ERRORS %s < %t.err
// CHECK: .section __TEXT,__text,regular,pure_instructions
-// CHECK-ERRORS: error: invalid octal number
+// CHECK-ERRORS: [[@LINE+1]]:10: error: invalid octal number in '.long' directive
.long 80+08
-// CHECK-ERRORS: error: invalid hexadecimal number
+// CHECK-ERRORS: [[@LINE+1]]:10: error: invalid hexadecimal number in '.long' directive
.long 80+0xzz
-// CHECK-ERRORS: error: literal value out of range for directive
+// CHECK-ERRORS: [[@LINE+1]]:7: error: out of range literal value in '.byte' directive
.byte 256
-// CHECK-ERRORS: error: literal value out of range for directive
+// CHECK-ERRORS: [[@LINE+1]]:7: error: out of range literal value in '.long' directive
.long 4e71cf69 // double floating point constant due to missing "0x"
-// CHECK-ERRORS: error: literal value out of range for directive
+// CHECK-ERRORS: [[@LINE+1]]:7: error: literal value out of range for directive
.word 0xfffffffff
More information about the llvm-commits
mailing list