From 17feeec8d861e99e5860389839e805b2653a2977 Mon Sep 17 00:00:00 2001 From: Chad Rosier Date: Sat, 20 Oct 2012 00:47:08 +0000 Subject: [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 --- lib/MC/MCParser/AsmParser.cpp | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) (limited to 'lib/MC') diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index dc21c928ed..c8fc4c02bc 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; -- cgit v1.2.3