diff options
author | Chad Rosier <mcrosier@apple.com> | 2012-10-25 21:51:10 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2012-10-25 21:51:10 +0000 |
commit | ec13022c392747ef166e6be738fc6f00bd7c52d3 (patch) | |
tree | aac10c84bc6a4ee6a10a95e8452fb1082ea5165e /lib/Target/X86/AsmParser/X86AsmParser.cpp | |
parent | b6cbb6215ccf56c6580746d3471b45577165605f (diff) |
[ms-inline asm] Perform field lookups with the dot operator.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166724 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/AsmParser/X86AsmParser.cpp')
-rw-r--r-- | lib/Target/X86/AsmParser/X86AsmParser.cpp | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/Target/X86/AsmParser/X86AsmParser.cpp b/lib/Target/X86/AsmParser/X86AsmParser.cpp index 00e95596a0..7f47ef4c63 100644 --- a/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -841,15 +841,30 @@ bool X86AsmParser::ParseIntelDotOperator(const MCExpr *Disp, APInt DotDisp; DotDispStr.getAsInteger(10, DotDisp); DotDispVal = DotDisp.getZExtValue(); + } else if (Tok.is(AsmToken::Identifier)) { + // We should only see an identifier when parsing the original inline asm. + // The front-end should rewrite this in terms of immediates. + assert (isParsingInlineAsm() && "Unexpected field name!"); + + unsigned DotDisp; + std::pair<StringRef, StringRef> BaseMember = DotDispStr.split('.'); + if (SemaCallback->LookupInlineAsmField(BaseMember.first, BaseMember.second, + DotDisp)) { + Err = "Unable to lookup field reference!"; + return true; + } + DotDispVal = DotDisp; } else { Err = "Unexpected token type!"; return true; } - // Special case zero dot displacement. - if (!DotDispVal) { - *NewDisp = Disp; - return false; + if (isParsingInlineAsm() && Tok.is(AsmToken::Identifier)) { + SMLoc Loc = SMLoc::getFromPointer(DotDispStr.data()); + unsigned Len = DotDispStr.size(); + unsigned Val = OrigDispVal + DotDispVal; + InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_DotOperator, Loc, Len, + Val)); } *NewDisp = MCConstantExpr::Create(OrigDispVal + DotDispVal, getContext()); |