[X86][InlineAsm][Ms Compatibility]Prefer variable name over a register when the two collides

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

llvm-svn: 308866
This commit is contained in:
Coby Tayree 2017-07-24 07:04:55 +00:00
parent 6c5c6aa9d8
commit c48388d3d3
1 changed files with 12 additions and 1 deletions

View File

@ -944,7 +944,8 @@ bool X86AsmParser::ParseRegister(unsigned &RegNo,
EndLoc = Tok.getEndLoc(); EndLoc = Tok.getEndLoc();
if (Tok.isNot(AsmToken::Identifier)) { if (Tok.isNot(AsmToken::Identifier)) {
if (isParsingIntelSyntax()) return true; if (isParsingIntelSyntax())
return true;
return Error(StartLoc, "invalid register name", return Error(StartLoc, "invalid register name",
SMRange(StartLoc, EndLoc)); SMRange(StartLoc, EndLoc));
} }
@ -955,6 +956,16 @@ bool X86AsmParser::ParseRegister(unsigned &RegNo,
if (RegNo == 0) if (RegNo == 0)
RegNo = MatchRegisterName(Tok.getString().lower()); 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. // The "flags" register cannot be referenced directly.
// Treat it as an identifier instead. // Treat it as an identifier instead.
if (isParsingInlineAsm() && isParsingIntelSyntax() && RegNo == X86::EFLAGS) if (isParsingInlineAsm() && isParsingIntelSyntax() && RegNo == X86::EFLAGS)