[llvm] r309005 - Revert "This patch enables the usage of constant Enum identifiers within Microsoft style inline assembly statements."

Eric Christopher via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 25 12:22:09 PDT 2017


Author: echristo
Date: Tue Jul 25 12:22:09 2017
New Revision: 309005

URL: http://llvm.org/viewvc/llvm-project?rev=309005&view=rev
Log:
Revert "This patch enables the usage of constant Enum identifiers within Microsoft style inline assembly statements."

This reverts commit r308966.

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

Modified: llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h?rev=309005&r1=309004&r2=309005&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h (original)
+++ llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h Tue Jul 25 12:22:09 2017
@@ -35,30 +35,17 @@ class MCTargetAsmParser;
 class SourceMgr;
 
 class InlineAsmIdentifierInfo {
-private:
-  enum IdDeclKind : uint8_t {
-    Default,
-    Variable,
-    ConstEnum,
-  };
-  IdDeclKind Kind;
-
 public:
   void *OpDecl;
+  bool IsVarDecl;
   unsigned Length, Size, Type;
-  APInt ConstIntValue;
-  bool isVarDecl() { return Kind == Variable; }
-  bool isConstEnum() { return Kind == ConstEnum; }
-  void setKindVariable() { Kind = Variable; }
-  void setKindConstEnum() { Kind = ConstEnum; }
+
   void clear() {
     OpDecl = nullptr;
-    Kind = Default;
+    IsVarDecl = false;
     Length = 1;
     Size = 0;
     Type = 0;
-    // On clear flush possibly old APInt value as a precaution;
-    ConstIntValue = APInt();
   }
 };
 

Modified: llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp?rev=309005&r1=309004&r2=309005&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp (original)
+++ llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp Tue Jul 25 12:22:09 2017
@@ -777,7 +777,7 @@ private:
   std::unique_ptr<X86Operand> ParseIntelOffsetOfOperator();
   bool ParseIntelDotOperator(const MCExpr *Disp, const MCExpr *&NewDisp);
   unsigned IdentifyIntelOperator(StringRef Name);
-  unsigned ParseIntelOperator(unsigned OpKind, bool AddImmPrefix);
+  unsigned ParseIntelOperator(unsigned OpKind);
   std::unique_ptr<X86Operand>
   ParseIntelSegmentOverride(unsigned SegReg, SMLoc Start, unsigned Size);
   std::unique_ptr<X86Operand> ParseRoundingModeOp(SMLoc Start, SMLoc End);
@@ -1251,7 +1251,7 @@ std::unique_ptr<X86Operand> X86AsmParser
     InlineAsmIdentifierInfo &Info, bool AllowBetterSizeMatch) {
   // If we found a decl other than a VarDecl, then assume it is a FuncDecl or
   // some other label reference.
-  if (isa<MCSymbolRefExpr>(Disp) && Info.OpDecl && !Info.isVarDecl()) {
+  if (isa<MCSymbolRefExpr>(Disp) && Info.OpDecl && !Info.IsVarDecl) {
     // Insert an explicit size if the user didn't have one.
     if (!Size) {
       Size = getPointerWidth();
@@ -1427,7 +1427,7 @@ bool X86AsmParser::ParseIntelExpression(
         if (OpKind == IOK_OFFSET) 
           return Error(IdentLoc, "Dealing OFFSET operator as part of"
             "a compound immediate expression is yet to be supported");
-        int64_t Val = ParseIntelOperator(OpKind,SM.getAddImmPrefix());
+        int64_t Val = ParseIntelOperator(OpKind);
         if (!Val)
           return true;
         if (SM.onInteger(Val, ErrMsg))
@@ -1436,38 +1436,11 @@ bool X86AsmParser::ParseIntelExpression(
             PrevTK == AsmToken::RBrac) {
           return false;
       } else {
-        InlineAsmIdentifierInfo Info;
-        if (ParseIntelIdentifier(Val, Identifier, Info,
+        InlineAsmIdentifierInfo &Info = SM.getIdentifierInfo();
+        if (ParseIntelIdentifier(Val, Identifier, Info,
                                  /*Unevaluated=*/false, End))
-          return true;
-        // Check if the parsed identifier was a constant Integer. Here we
-        // assume Val is of type MCConstantExpr only when it is safe to replace
-        // the identifier with its constant value.
-        if (const MCConstantExpr *CE =
-                dyn_cast_or_null<const MCConstantExpr>(Val)) {
-          StringRef ErrMsg;
-          // Pass the enum identifier integer value to the SM calculator.
-          if (SM.onInteger(CE->getValue(), ErrMsg))
-            return Error(IdentLoc, ErrMsg);
-          // Match the behavior of integer tokens when getAddImmPrefix flag is
-          // set.
-          if (SM.getAddImmPrefix()) {
-            assert(isParsingInlineAsm() &&
-                   "Expected to be parsing inline assembly.");
-            // A single rewrite of the integer value is preformed for each enum
-            // identifier. This is only done when we are inside a bracketed
-            // expression.
-            size_t Len = End.getPointer() - IdentLoc.getPointer();
-            InstInfo->AsmRewrites->emplace_back(AOK_Imm, IdentLoc, Len,
-                                                CE->getValue());
-            break;
-          }
-        } else {
-          // Notify the SM a variable identifier was found.
-          InlineAsmIdentifierInfo &SMInfo = SM.getIdentifierInfo();
-          SMInfo = Info;
-          SM.onIdentifierExpr(Val, Identifier);
-        }
+          return true;
+        SM.onIdentifierExpr(Val, Identifier);
       }
       break;
     }
@@ -1660,14 +1633,6 @@ bool X86AsmParser::ParseIntelIdentifier(
   assert((End.getPointer() == EndPtr || !Result) &&
          "frontend claimed part of a token?");
 
-  // Check if the search yielded a constant integer (enum identifier).
-  if (Result && Info.isConstEnum()) {
-    // By creating MCConstantExpr we let the user of Val know it is safe
-    // to use as an explicit constant with value = ConstVal.
-    Val = MCConstantExpr::create(Info.ConstIntValue.getSExtValue(),
-                                 getParser().getContext());
-    return false;
-  }
   // If the identifier lookup was unsuccessful, assume that we are dealing with
   // a label.
   if (!Result) {
@@ -1865,7 +1830,7 @@ unsigned X86AsmParser::IdentifyIntelOper
 /// variable.  A variable's size is the product of its LENGTH and TYPE.  The
 /// TYPE operator returns the size of a C or C++ type or variable. If the
 /// variable is an array, TYPE returns the size of a single element.
-unsigned X86AsmParser::ParseIntelOperator(unsigned OpKind, bool AddImmPrefix) {
+unsigned X86AsmParser::ParseIntelOperator(unsigned OpKind) {
   MCAsmParser &Parser = getParser();
   const AsmToken &Tok = Parser.getTok();
   SMLoc TypeLoc = Tok.getLoc();
@@ -1891,17 +1856,12 @@ unsigned X86AsmParser::ParseIntelOperato
   case IOK_SIZE: CVal = Info.Size; break;
   case IOK_TYPE: CVal = Info.Type; break;
   }
-  
-  // Only when in bracketed mode, preform explicit rewrite. This is requierd to
-  // avoid rewrite collision.
-  if (AddImmPrefix) {
-    // Rewrite the type operator and the C or C++ type or variable in terms of
-    // an immediate. e.g. mov eax, [eax + SIZE _foo * $$4] ->
-    // mov eax, [eax + $$1 * $$4].
-    unsigned Len = End.getPointer() - TypeLoc.getPointer();
-    InstInfo->AsmRewrites->emplace_back(AOK_Imm, TypeLoc, Len, CVal);
-  }
-  
+
+  // Rewrite the type operator and the C or C++ type or variable in terms of an
+  // immediate.  E.g. TYPE foo -> $$4
+  unsigned Len = End.getPointer() - TypeLoc.getPointer();
+  InstInfo->AsmRewrites->emplace_back(AOK_Imm, TypeLoc, Len, CVal);
+
   return CVal;
 }
 
@@ -1972,8 +1932,14 @@ std::unique_ptr<X86Operand> X86AsmParser
   if (SM.getSym() && SM.getSym()->getKind() == MCExpr::Constant)
     SM.getSym()->evaluateAsAbsolute(Imm);
 
-  if (isParsingInlineAsm() && !isSymbol) {
+  if (StartTok.isNot(AsmToken::Identifier) &&
+      StartTok.isNot(AsmToken::String) && isParsingInlineAsm()) {
     unsigned Len = Tok.getLoc().getPointer() - Start.getPointer();
+    if (StartTok.getString().size() == Len)
+      // Just add a prefix if this wasn't a complex immediate expression.
+      InstInfo->AsmRewrites->emplace_back(AOK_ImmPrefix, Start);
+    else
+      // Otherwise, rewrite the complex expression as a single immediate.
       InstInfo->AsmRewrites->emplace_back(AOK_Imm, Start, Len, Imm);
   }
 




More information about the llvm-commits mailing list