diff options
author | Chad Rosier <mcrosier@apple.com> | 2012-12-12 22:45:52 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2012-12-12 22:45:52 +0000 |
commit | 149e8e042f236d92f675add0248c6f8e802d3377 (patch) | |
tree | aec1bebb347c4cca1b084c146e1b65fcab397c70 /llvm/lib/MC/MCParser/AsmParser.cpp | |
parent | 36b0f1247400848455bf5f7c7551c08a56e2d53d (diff) | |
download | bcm5719-llvm-149e8e042f236d92f675add0248c6f8e802d3377.tar.gz bcm5719-llvm-149e8e042f236d92f675add0248c6f8e802d3377.zip |
[ms-inline asm] Make sure we fail gracefully on parse errors. Parse errors
should only occur on invalid input. Instruction matching errors aren't
unexpected, so we can't rely on the AsmParsers HadError variable directly.
rdar://12840278
llvm-svn: 170037
Diffstat (limited to 'llvm/lib/MC/MCParser/AsmParser.cpp')
-rw-r--r-- | llvm/lib/MC/MCParser/AsmParser.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp index 2c06604be2b..f7798c511f9 100644 --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -97,11 +97,14 @@ struct ParseStatementInfo { /// Opcode - The opcode from the last parsed instruction. unsigned Opcode; + /// Error - Was there an error parsing the inline assembly? + bool ParseError; + SmallVectorImpl<AsmRewrite> *AsmRewrites; - ParseStatementInfo() : Opcode(~0U), AsmRewrites(0) {} + ParseStatementInfo() : Opcode(~0U), ParseError(false), AsmRewrites(0) {} ParseStatementInfo(SmallVectorImpl<AsmRewrite> *rewrites) - : Opcode(~0), AsmRewrites(rewrites) {} + : Opcode(~0), ParseError(false), AsmRewrites(rewrites) {} ~ParseStatementInfo() { // Free any parsed operands. @@ -1385,6 +1388,7 @@ bool AsmParser::ParseStatement(ParseStatementInfo &Info) { ParseInstructionInfo IInfo(Info.AsmRewrites); bool HadError = getTargetParser().ParseInstruction(IInfo, OpcodeStr.str(), IDLoc,Info.ParsedOperands); + Info.ParseError = HadError; // Dump the parsed representation, if requested. if (getShowParsedOperands()) { @@ -3705,6 +3709,9 @@ bool AsmParser::ParseMSInlineAsm(void *AsmLoc, std::string &AsmString, if (ParseStatement(Info)) return true; + if (Info.ParseError) + return true; + if (Info.Opcode != ~0U) { const MCInstrDesc &Desc = MII->get(Info.Opcode); |