[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:
parent
6c5c6aa9d8
commit
c48388d3d3
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue