[llvm-branch-commits] [llvm-branch] r340329 - Merging r339895 and r339896:

Hans Wennborg via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Aug 21 12:58:01 PDT 2018


Author: hans
Date: Tue Aug 21 12:58:00 2018
New Revision: 340329

URL: http://llvm.org/viewvc/llvm-project?rev=340329&view=rev
Log:
Merging r339895 and r339896:
------------------------------------------------------------------------
r339895 | niravd | 2018-08-16 18:31:14 +0200 (Thu, 16 Aug 2018) | 13 lines

[MC][X86] Enhance X86 Register expression handling to more closely match GCC.

Allow the comparison of x86 registers in the evaluation of assembler
directives. This generalizes and simplifies the extension from r334022
to catch another case found in the Linux kernel.

Reviewers: rnk, void

Reviewed By: rnk

Subscribers: hiraditya, nickdesaulniers, llvm-commits

Differential Revision: https://reviews.llvm.org/D50795
------------------------------------------------------------------------

------------------------------------------------------------------------
r339896 | d0k | 2018-08-16 18:50:23 +0200 (Thu, 16 Aug 2018) | 1 line

[MC] Remove unused variable
------------------------------------------------------------------------

Modified:
    llvm/branches/release_70/   (props changed)
    llvm/branches/release_70/include/llvm/MC/MCExpr.h
    llvm/branches/release_70/include/llvm/MC/MCParser/MCAsmParserUtils.h
    llvm/branches/release_70/include/llvm/MC/MCParser/MCTargetAsmParser.h
    llvm/branches/release_70/lib/MC/MCExpr.cpp
    llvm/branches/release_70/lib/MC/MCParser/AsmParser.cpp
    llvm/branches/release_70/lib/Target/X86/AsmParser/X86AsmParser.cpp
    llvm/branches/release_70/lib/Target/X86/MCTargetDesc/X86MCExpr.h
    llvm/branches/release_70/test/MC/X86/pr37425.s

Propchange: llvm/branches/release_70/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Aug 21 12:58:00 2018
@@ -1,3 +1,3 @@
 /llvm/branches/Apple/Pertwee:110850,110961
 /llvm/branches/type-system-rewrite:133420-134817
-/llvm/trunk:155241,338552,338554,338569,338599,338610,338658,338665,338682,338703,338709,338716,338751,338762,338817,338841,338902,338915,338968,339073,339166,339179,339184,339190,339225,339316,339319,339411,339492,339515,339533,339535-339536,339600,339636,339769,339822,339883,339945
+/llvm/trunk:155241,338552,338554,338569,338599,338610,338658,338665,338682,338703,338709,338716,338751,338762,338817,338841,338902,338915,338968,339073,339166,339179,339184,339190,339225,339316,339319,339411,339492,339515,339533,339535-339536,339600,339636,339769,339822,339883,339895-339896,339945

Modified: llvm/branches/release_70/include/llvm/MC/MCExpr.h
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_70/include/llvm/MC/MCExpr.h?rev=340329&r1=340328&r2=340329&view=diff
==============================================================================
--- llvm/branches/release_70/include/llvm/MC/MCExpr.h (original)
+++ llvm/branches/release_70/include/llvm/MC/MCExpr.h Tue Aug 21 12:58:00 2018
@@ -588,6 +588,8 @@ public:
   virtual bool evaluateAsRelocatableImpl(MCValue &Res,
                                          const MCAsmLayout *Layout,
                                          const MCFixup *Fixup) const = 0;
+  // allow Target Expressions to be checked for equality
+  virtual bool isEqualTo(const MCExpr *x) const { return false; }
   // This should be set when assigned expressions are not valid ".set"
   // expressions, e.g. registers, and must be inlined.
   virtual bool inlineAssignedExpr() const { return false; }

Modified: llvm/branches/release_70/include/llvm/MC/MCParser/MCAsmParserUtils.h
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_70/include/llvm/MC/MCParser/MCAsmParserUtils.h?rev=340329&r1=340328&r2=340329&view=diff
==============================================================================
--- llvm/branches/release_70/include/llvm/MC/MCParser/MCAsmParserUtils.h (original)
+++ llvm/branches/release_70/include/llvm/MC/MCParser/MCAsmParserUtils.h Tue Aug 21 12:58:00 2018
@@ -25,7 +25,7 @@ namespace MCParserUtils {
 /// On success, returns false and sets the Symbol and Value output parameters.
 bool parseAssignmentExpression(StringRef Name, bool allow_redef,
                                MCAsmParser &Parser, MCSymbol *&Symbol,
-                               const MCExpr *&Value, bool AllowExtendedExpr = false);
+                               const MCExpr *&Value);
 
 } // namespace MCParserUtils
 

Modified: llvm/branches/release_70/include/llvm/MC/MCParser/MCTargetAsmParser.h
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_70/include/llvm/MC/MCParser/MCTargetAsmParser.h?rev=340329&r1=340328&r2=340329&view=diff
==============================================================================
--- llvm/branches/release_70/include/llvm/MC/MCParser/MCTargetAsmParser.h (original)
+++ llvm/branches/release_70/include/llvm/MC/MCParser/MCTargetAsmParser.h Tue Aug 21 12:58:00 2018
@@ -372,9 +372,9 @@ public:
     SemaCallback = Callback;
   }
 
-  // Target-specific parsing of assembler-level variable assignment.
-  virtual bool parseAssignmentExpression(const MCExpr *&Res, SMLoc &EndLoc) {
-    return getParser().parseExpression(Res, EndLoc);
+  // Target-specific parsing of expression.
+  virtual bool parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) {
+    return getParser().parsePrimaryExpr(Res, EndLoc);
   }
 
   virtual bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc,

Modified: llvm/branches/release_70/lib/MC/MCExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_70/lib/MC/MCExpr.cpp?rev=340329&r1=340328&r2=340329&view=diff
==============================================================================
--- llvm/branches/release_70/lib/MC/MCExpr.cpp (original)
+++ llvm/branches/release_70/lib/MC/MCExpr.cpp Tue Aug 21 12:58:00 2018
@@ -750,8 +750,22 @@ bool MCExpr::evaluateAsRelocatableImpl(M
     if (!ABE->getLHS()->evaluateAsRelocatableImpl(LHSValue, Asm, Layout, Fixup,
                                                   Addrs, InSet) ||
         !ABE->getRHS()->evaluateAsRelocatableImpl(RHSValue, Asm, Layout, Fixup,
-                                                  Addrs, InSet))
+                                                  Addrs, InSet)) {
+      // Check if both are Target Expressions, see if we can compare them.
+      if (const MCTargetExpr *L = dyn_cast<MCTargetExpr>(ABE->getLHS()))
+        if (const MCTargetExpr *R = cast<MCTargetExpr>(ABE->getRHS())) {
+          switch (ABE->getOpcode()) {
+          case MCBinaryExpr::EQ:
+            Res = MCValue::get((L->isEqualTo(R)) ? -1 : 0);
+            return true;
+          case MCBinaryExpr::NE:
+            Res = MCValue::get((R->isEqualTo(R)) ? 0 : -1);
+            return true;
+          default: {}
+          }
+        }
       return false;
+    }
 
     // We only support a few operations on non-constant expressions, handle
     // those first.

Modified: llvm/branches/release_70/lib/MC/MCParser/AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_70/lib/MC/MCParser/AsmParser.cpp?rev=340329&r1=340328&r2=340329&view=diff
==============================================================================
--- llvm/branches/release_70/lib/MC/MCParser/AsmParser.cpp (original)
+++ llvm/branches/release_70/lib/MC/MCParser/AsmParser.cpp Tue Aug 21 12:58:00 2018
@@ -337,7 +337,7 @@ private:
   StringRef parseStringToComma();
 
   bool parseAssignment(StringRef Name, bool allow_redef,
-                       bool NoDeadStrip = false, bool AllowExtendedExpr = false);
+                       bool NoDeadStrip = false);
 
   unsigned getBinOpPrecedence(AsmToken::TokenKind K,
                               MCBinaryExpr::Opcode &Kind);
@@ -1363,7 +1363,8 @@ void AsmParser::altMacroString(StringRef
 bool AsmParser::parseExpression(const MCExpr *&Res, SMLoc &EndLoc) {
   // Parse the expression.
   Res = nullptr;
-  if (parsePrimaryExpr(Res, EndLoc) || parseBinOpRHS(1, Res, EndLoc))
+  if (getTargetParser().parsePrimaryExpr(Res, EndLoc) ||
+      parseBinOpRHS(1, Res, EndLoc))
     return true;
 
   // As a special case, we support 'a op b @ modifier' by rewriting the
@@ -1617,7 +1618,7 @@ bool AsmParser::parseBinOpRHS(unsigned P
 
     // Eat the next primary expression.
     const MCExpr *RHS;
-    if (parsePrimaryExpr(RHS, EndLoc))
+    if (getTargetParser().parsePrimaryExpr(RHS, EndLoc))
       return true;
 
     // If BinOp binds less tightly with RHS than the operator after RHS, let
@@ -1826,7 +1827,7 @@ bool AsmParser::parseStatement(ParseStat
     // identifier '=' ... -> assignment statement
     Lex();
 
-    return parseAssignment(IDVal, true, /*NoDeadStrip*/ false, /*AllowExtendedExpr*/true);
+    return parseAssignment(IDVal, true);
 
   default: // Normal instruction or directive.
     break;
@@ -2766,11 +2767,11 @@ void AsmParser::handleMacroExit() {
 }
 
 bool AsmParser::parseAssignment(StringRef Name, bool allow_redef,
-                                bool NoDeadStrip, bool AllowExtendedExpr) {
+                                bool NoDeadStrip) {
   MCSymbol *Sym;
   const MCExpr *Value;
   if (MCParserUtils::parseAssignmentExpression(Name, allow_redef, *this, Sym,
-                                               Value, AllowExtendedExpr))
+                                               Value))
     return true;
 
   if (!Sym) {
@@ -5839,17 +5840,12 @@ static bool isSymbolUsedInExpression(con
 
 bool parseAssignmentExpression(StringRef Name, bool allow_redef,
                                MCAsmParser &Parser, MCSymbol *&Sym,
-                               const MCExpr *&Value, bool AllowExtendedExpr) {
+                               const MCExpr *&Value) {
 
   // FIXME: Use better location, we should use proper tokens.
   SMLoc EqualLoc = Parser.getTok().getLoc();
-  SMLoc EndLoc;
-  if (AllowExtendedExpr) {
-    if (Parser.getTargetParser().parseAssignmentExpression(Value, EndLoc)) {
-      return Parser.TokError("missing expression");
-    }
-  } else if (Parser.parseExpression(Value, EndLoc))
-      return Parser.TokError("missing expression");
+  if (Parser.parseExpression(Value))
+    return Parser.TokError("missing expression");
 
   // Note: we don't count b as used in "a = b". This is to allow
   // a = b

Modified: llvm/branches/release_70/lib/Target/X86/AsmParser/X86AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_70/lib/Target/X86/AsmParser/X86AsmParser.cpp?rev=340329&r1=340328&r2=340329&view=diff
==============================================================================
--- llvm/branches/release_70/lib/Target/X86/AsmParser/X86AsmParser.cpp (original)
+++ llvm/branches/release_70/lib/Target/X86/AsmParser/X86AsmParser.cpp Tue Aug 21 12:58:00 2018
@@ -955,7 +955,7 @@ public:
 
   void SetFrameRegister(unsigned RegNo) override;
 
-  bool parseAssignmentExpression(const MCExpr *&Res, SMLoc &EndLoc) override;
+  bool parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) override;
 
   bool ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
                         SMLoc NameLoc, OperandVector &Operands) override;
@@ -2260,15 +2260,17 @@ std::unique_ptr<X86Operand> X86AsmParser
   return X86Operand::CreateMem(getPointerWidth(), Disp, MemStart, MemEnd);
 }
 
-// Parse either a standard expression or a register.
-bool X86AsmParser::parseAssignmentExpression(const MCExpr *&Res,
-                                             SMLoc &EndLoc) {
+// Parse either a standard primary expression or a register.
+bool X86AsmParser::parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) {
   MCAsmParser &Parser = getParser();
-  if (Parser.parseExpression(Res, EndLoc)) {
+  if (Parser.parsePrimaryExpr(Res, EndLoc)) {
     SMLoc StartLoc = Parser.getTok().getLoc();
     // Normal Expression parse fails, check if it could be a register.
     unsigned RegNo;
-    if (Parser.getTargetParser().ParseRegister(RegNo, StartLoc, EndLoc))
+    bool TryRegParse =
+        getTok().is(AsmToken::Percent) ||
+        (isParsingIntelSyntax() && getTok().is(AsmToken::Identifier));
+    if (!TryRegParse || ParseRegister(RegNo, StartLoc, EndLoc))
       return true;
     // Clear previous parse error and return correct expression.
     Parser.clearPendingErrors();

Modified: llvm/branches/release_70/lib/Target/X86/MCTargetDesc/X86MCExpr.h
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_70/lib/Target/X86/MCTargetDesc/X86MCExpr.h?rev=340329&r1=340328&r2=340329&view=diff
==============================================================================
--- llvm/branches/release_70/lib/Target/X86/MCTargetDesc/X86MCExpr.h (original)
+++ llvm/branches/release_70/lib/Target/X86/MCTargetDesc/X86MCExpr.h Tue Aug 21 12:58:00 2018
@@ -48,7 +48,7 @@ public:
   /// @}
 
   void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override {
-    if (MAI->getAssemblerDialect() == 0)
+    if (!MAI || MAI->getAssemblerDialect() == 0)
       OS << '%';
     OS << X86ATTInstPrinter::getRegisterName(RegNo);
   }
@@ -59,6 +59,11 @@ public:
   }
   // Register values should be inlined as they are not valid .set expressions.
   bool inlineAssignedExpr() const override { return true; }
+  bool isEqualTo(const MCExpr *X) const override {
+    if (auto *E = dyn_cast<X86MCExpr>(X))
+      return getRegNo() == E->getRegNo();
+    return false;
+  }
   void visitUsedExpr(MCStreamer &Streamer) const override{};
   MCFragment *findAssociatedFragment() const override { return nullptr; }
 

Modified: llvm/branches/release_70/test/MC/X86/pr37425.s
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_70/test/MC/X86/pr37425.s?rev=340329&r1=340328&r2=340329&view=diff
==============================================================================
--- llvm/branches/release_70/test/MC/X86/pr37425.s (original)
+++ llvm/branches/release_70/test/MC/X86/pr37425.s Tue Aug 21 12:58:00 2018
@@ -1,5 +1,4 @@
-// RUN: llvm-mc -triple x86_64-unknown-unknown -defsym=ERR=0 %s -o -      | FileCheck %s
-// RUN: not llvm-mc -triple x86_64-unknown-unknown -defsym=ERR=1 %s -o - 2>&1 | FileCheck --check-prefix=ERR %s
+// RUN: llvm-mc -triple x86_64-unknown-unknown %s -o -      | FileCheck %s
 	
 // CHECK-NOT: .set var_xdata
 var_xdata = %rcx
@@ -7,10 +6,15 @@ var_xdata = %rcx
 // CHECK: xorq %rcx, %rcx
 xorq var_xdata, var_xdata
 
-.if (ERR==1)
-// ERR: [[@LINE+2]]:15: error: unknown token in expression in '.set' directive
-// ERR: [[@LINE+1]]:15: error: missing expression in '.set' directive
-.set err_var, %rcx
-.endif	
+// CHECK: .data
+// CHECK-NEXT: .byte 1	
+.data 
+.if var_xdata == %rax
+  .byte 0
+.elseif var_xdata == %rcx
+  .byte 1
+.else
+  .byte 2	
+.endif
 
 	




More information about the llvm-branch-commits mailing list