[ms-inline asm] Use parsePrimaryExpr in lieu of parseExpression if we need to
authorChad Rosier <mcrosier@apple.com>
Tue, 9 Apr 2013 19:34:59 +0000 (19:34 +0000)
committerChad Rosier <mcrosier@apple.com>
Tue, 9 Apr 2013 19:34:59 +0000 (19:34 +0000)
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

include/llvm/MC/MCParser/MCAsmParser.h
lib/MC/MCParser/AsmParser.cpp
lib/Target/X86/AsmParser/X86AsmParser.cpp

index d7e3902ac478d0e6ac8fc5d5871fbf0d2aecefc3..601f8f7734b42efa6cf3cb648663455ba0886240 100644 (file)
@@ -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.
   ///
index 14577f79beedf983d21de486cf017bebf19ed6f6..c50177cb0a41dbeff96cb61a702732cb16c7a3e6 100644 (file)
@@ -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) {
index 85caa042e32d4e496853cdce59d1dbc6d94ba340..11248bd5d45fd2abae3a1f115d24cadbbef5be2c 100644 (file)
@@ -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;