From: Chad Rosier Date: Thu, 11 Apr 2013 21:49:30 +0000 (+0000) Subject: [ms-inline asm] Remove brackets from around a symbol reference in the target X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=f06cc981495991d2095ed4066f0eb9c0241c0a61;p=oota-llvm.git [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 --- diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index c50177cb0a4..f34bbe90ed9 100644 --- a/lib/MC/MCParser/AsmParser.cpp +++ b/lib/MC/MCParser/AsmParser.cpp @@ -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. diff --git a/lib/Target/X86/AsmParser/X86AsmParser.cpp b/lib/Target/X86/AsmParser/X86AsmParser.cpp index f587d36232c..aaf571ae9d3 100644 --- a/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -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(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());