OSDN Git Service

[X86][InlineAsm][Ms Compatibility]Prefer variable name over a register when the two...
authorCoby Tayree <coby.tayree@intel.com>
Mon, 24 Jul 2017 07:04:55 +0000 (07:04 +0000)
committerCoby Tayree <coby.tayree@intel.com>
Mon, 24 Jul 2017 07:04:55 +0000 (07:04 +0000)
On MS-style, the following snippet:

int eax;
__asm mov eax, ebx

should yield loading of ebx, into the location pointed by the variable eax

This patch sees to it.

Currently, a reg-to-reg move would have been invoked.

clang: D34740

Differential Revision: https://reviews.llvm.org/D34739

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308866 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/AsmParser/X86AsmParser.cpp

index c1d216c..31951c9 100644 (file)
@@ -944,7 +944,8 @@ bool X86AsmParser::ParseRegister(unsigned &RegNo,
   EndLoc = Tok.getEndLoc();
 
   if (Tok.isNot(AsmToken::Identifier)) {
-    if (isParsingIntelSyntax()) return true;
+    if (isParsingIntelSyntax())
+      return true;
     return Error(StartLoc, "invalid register name",
                  SMRange(StartLoc, EndLoc));
   }
@@ -955,6 +956,16 @@ bool X86AsmParser::ParseRegister(unsigned &RegNo,
   if (RegNo == 0)
     RegNo = MatchRegisterName(Tok.getString().lower());
 
+  // In MS inline-asm we allow variables to be named as registers, and
+  // give them precedence over actual registers
+  // However - we require the match to be case sensitive
+  if (isParsingInlineAsm() && isParsingIntelSyntax() && RegNo) {
+    StringRef LineBuf(Tok.getIdentifier().data());
+    InlineAsmIdentifierInfo Info;
+    if (SemaCallback->LookupInlineAsmIdentifier(LineBuf, Info, false))
+      return true;
+  }
+
   // The "flags" register cannot be referenced directly.
   // Treat it as an identifier instead.
   if (isParsingInlineAsm() && isParsingIntelSyntax() && RegNo == X86::EFLAGS)