diff options
author | Chad Rosier <mcrosier@apple.com> | 2012-10-20 00:47:08 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2012-10-20 00:47:08 +0000 |
commit | 17feeec8d861e99e5860389839e805b2653a2977 (patch) | |
tree | 1e5ca376d12feb13f22353f671ae571890858557 /lib/MC | |
parent | 4ade92b6145a0d298b3c5ae1af79aca2598a327d (diff) | |
download | external_llvm-17feeec8d861e99e5860389839e805b2653a2977.zip external_llvm-17feeec8d861e99e5860389839e805b2653a2977.tar.gz external_llvm-17feeec8d861e99e5860389839e805b2653a2977.tar.bz2 |
[ms-inline asm] If the state of the parser is ignore, then don't parse the
inline assembly. Also make sure the remove the ignored statements from the IR.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166357 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC')
-rw-r--r-- | lib/MC/MCParser/AsmParser.cpp | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index dc21c92..c8fc4c0 100644 --- a/lib/MC/MCParser/AsmParser.cpp +++ b/lib/MC/MCParser/AsmParser.cpp @@ -1138,7 +1138,7 @@ bool AsmParser::ParseStatement() { return ParseDirectiveEndIf(IDLoc); // If we are in a ".if 0" block, ignore this statement. - if (TheCondState.Ignore && !ParsingInlineAsm) { + if (TheCondState.Ignore) { EatToEndOfStatement(); return false; } @@ -3579,7 +3579,8 @@ enum AsmOpRewriteKind { AOK_Imm, AOK_Input, AOK_Output, - AOK_SizeDirective + AOK_SizeDirective, + AOK_Skip }; struct AsmOpRewrite { @@ -3619,9 +3620,24 @@ bool AsmParser::ParseMSInlineAsm(void *AsmLoc, std::string &AsmString, // Clear the opcode. setOpcode(~0x0); + // Save the conditional ignore state of the parser prior to parsing the statement. + bool PreParseCondStateIgnore = TheCondState.Ignore; + + // Save the starting point of this statement in case we need to skip it. + SMLoc Start = getLexer().getLoc(); + if (ParseStatement()) return true; + // If PreParseCondStateIgnore is false, but TheCondState.Ignore is true, then we + // just parsed a directive that changed the state to ignore. Don't skip + // emitting this directive. + if (PreParseCondStateIgnore && TheCondState.Ignore) { + unsigned Len = getLexer().getLoc().getPointer() - Start.getPointer(); + AsmStrRewrites.push_back(AsmOpRewrite(AOK_Skip, Start, Len)); + continue; + } + if (isInstruction()) { const MCInstrDesc &Desc = MII->get(getOpcode()); @@ -3727,8 +3743,15 @@ bool AsmParser::ParseMSInlineAsm(void *AsmLoc, std::string &AsmString, OS << StringRef(Start, Loc - Start); PrevKind = Kind; + // Skip the original expression. + if (Kind == AOK_Skip) { + Start = Loc + (*I).Len; + continue; + } + // Rewrite expressions in $N notation. switch (Kind) { + default: break; case AOK_Imm: OS << Twine("$$") + StringRef(Loc, (*I).Len); break; |