[ms-inline asm] Remove brackets from around a symbol reference in the target

specific logic.  This makes the code much less fragile.  Test case coming on the
clang side in a moment.
rdar://13634327


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179323 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chad Rosier 2013-04-11 21:49:30 +00:00
parent 38dd366b30
commit f06cc98149
2 changed files with 11 additions and 10 deletions

View File

@ -4196,12 +4196,8 @@ AsmParser::parseMSInlineAsm(void *AsmLoc, std::string &AsmString,
// Emit everything up to the immediate/expression.
unsigned Len = Loc - AsmStart;
if (Len) {
// For Input/Output operands we need to remove the brackets, if present.
if ((Kind == AOK_Input || Kind == AOK_Output) && Loc[-1] == '[')
--Len;
if (Len)
OS << StringRef(AsmStart, Len);
}
// Skip the original expression.
if (Kind == AOK_Skip) {
@ -4255,11 +4251,6 @@ AsmParser::parseMSInlineAsm(void *AsmLoc, std::string &AsmString,
// Skip the original expression.
AsmStart = Loc + (*I).Len + AdditionalSkip;
// For Input/Output operands we need to remove the brackets, if present.
if ((Kind == AOK_Input || Kind == AOK_Output) && AsmStart != AsmEnd &&
*AsmStart == ']')
++AsmStart;
}
// Emit the remainder of the asm string.

View File

@ -1140,6 +1140,11 @@ X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned SegReg,
if (getLexer().isNot(AsmToken::RBrac))
return ErrorOperand(Tok.getLoc(), "Expected ']' token!");
if (isParsingInlineAsm()) {
// Remove the '[' and ']' from the IR string.
InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_Skip, Start, 1));
InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_Skip, Tok.getLoc(), 1));
}
unsigned Len = Tok.getLoc().getPointer() - IdentStart.getPointer();
StringRef SymName(IdentStart.getPointer(), Len);
Parser.Lex(); // Eat ']'
@ -1211,6 +1216,11 @@ X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned SegReg,
Parser.Lex(); // Consume the token.
}
}
if (isParsingInlineAsm() && Disp && isa<MCSymbolRefExpr>(Disp)) {
// Remove the '[' and ']' from the IR string.
InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_Skip, Start, 1));
InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_Skip, End, 1));
}
if (!Disp)
Disp = MCConstantExpr::Create(SM.getDisp(), getContext());