From: Chad Rosier Date: Tue, 9 Apr 2013 19:34:59 +0000 (+0000) Subject: [ms-inline asm] Use parsePrimaryExpr in lieu of parseExpression if we need to X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=d4727e3798981af3d1308418464a10a398290851;p=oota-llvm.git [ms-inline asm] Use parsePrimaryExpr in lieu of parseExpression if we need to parse an identifier. Otherwise, parseExpression may parse multiple tokens, which makes it impossible to properly compute an immediate displacement. An example of such a case is the source operand (i.e., [Symbol + ImmDisp]) in the below example: __asm mov eax, [Symbol + ImmDisp] The existing test cases exercise this patch. rdar://13611297 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179115 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/MC/MCParser/MCAsmParser.h b/include/llvm/MC/MCParser/MCAsmParser.h index d7e3902ac47..601f8f7734b 100644 --- a/include/llvm/MC/MCParser/MCAsmParser.h +++ b/include/llvm/MC/MCParser/MCAsmParser.h @@ -151,6 +151,13 @@ public: virtual bool parseExpression(const MCExpr *&Res, SMLoc &EndLoc) = 0; bool parseExpression(const MCExpr *&Res); + /// parsePrimaryExpr - Parse a primary expression. + /// + /// @param Res - The value of the expression. The result is undefined + /// on error. + /// @result - False on success. + virtual bool parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) = 0; + /// parseParenExpression - Parse an arbitrary expression, assuming that an /// initial '(' has already been consumed. /// diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index 14577f79bee..c50177cb0a4 100644 --- a/lib/MC/MCParser/AsmParser.cpp +++ b/lib/MC/MCParser/AsmParser.cpp @@ -221,6 +221,7 @@ public: bool parseExpression(const MCExpr *&Res); virtual bool parseExpression(const MCExpr *&Res, SMLoc &EndLoc); + virtual bool parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc); virtual bool parseParenExpression(const MCExpr *&Res, SMLoc &EndLoc); virtual bool parseAbsoluteExpression(int64_t &Res); @@ -869,6 +870,10 @@ bool AsmParser::parseExpression(const MCExpr *&Res) { return parseExpression(Res, EndLoc); } +bool AsmParser::parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) { + return ParsePrimaryExpr(Res, EndLoc); +} + const MCExpr * AsmParser::ApplyModifierToExpr(const MCExpr *E, MCSymbolRefExpr::VariantKind Variant) { diff --git a/lib/Target/X86/AsmParser/X86AsmParser.cpp b/lib/Target/X86/AsmParser/X86AsmParser.cpp index 85caa042e32..11248bd5d45 100644 --- a/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -1130,7 +1130,7 @@ X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned SegReg, if (ParseRegister(TmpReg, Start, End)) { const MCExpr *Disp; SMLoc IdentStart = Tok.getLoc(); - if (getParser().parseExpression(Disp, End)) + if (getParser().parsePrimaryExpr(Disp, End)) return 0; if (X86Operand *Err = ParseIntelVarWithQualifier(Disp, IdentStart)) @@ -1182,7 +1182,7 @@ X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned SegReg, SM.onRegister(TmpReg); UpdateLocLex = false; break; - } else if (!getParser().parseExpression(Disp, End)) { + } else if (!getParser().parsePrimaryExpr(Disp, End)) { SM.onDispExpr(); UpdateLocLex = false; break; @@ -1324,7 +1324,7 @@ X86Operand *X86AsmParser::ParseIntelMemOperand(unsigned SegReg, const MCExpr *Disp = 0; SMLoc IdentStart = Tok.getLoc(); - if (getParser().parseExpression(Disp, End)) + if (getParser().parsePrimaryExpr(Disp, End)) return 0; if (!isParsingInlineAsm()) @@ -1401,7 +1401,7 @@ X86Operand *X86AsmParser::ParseIntelOffsetOfOperator(SMLoc Start) { SMLoc End; const MCExpr *Val; - if (getParser().parseExpression(Val, End)) + if (getParser().parsePrimaryExpr(Val, End)) return ErrorOperand(Start, "Unable to parse expression!"); // Don't emit the offset operator. @@ -1437,7 +1437,7 @@ X86Operand *X86AsmParser::ParseIntelOperator(SMLoc Start, unsigned OpKind) { SMLoc End; const MCExpr *Val; - if (getParser().parseExpression(Val, End)) + if (getParser().parsePrimaryExpr(Val, End)) return 0; unsigned Length = 0, Size = 0, Type = 0;