summaryrefslogtreecommitdiff
path: root/lib/MC
diff options
context:
space:
mode:
authorChad Rosier <mcrosier@apple.com>2012-10-20 00:47:08 +0000
committerChad Rosier <mcrosier@apple.com>2012-10-20 00:47:08 +0000
commit17feeec8d861e99e5860389839e805b2653a2977 (patch)
tree1e5ca376d12feb13f22353f671ae571890858557 /lib/MC
parent4ade92b6145a0d298b3c5ae1af79aca2598a327d (diff)
downloadllvm-17feeec8d861e99e5860389839e805b2653a2977.tar.gz
llvm-17feeec8d861e99e5860389839e805b2653a2977.tar.bz2
llvm-17feeec8d861e99e5860389839e805b2653a2977.tar.xz
[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.cpp27
1 files changed, 25 insertions, 2 deletions
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;