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 | 240b7b963a79f11734463508b2ef63d82c17eeb6 (patch) | |
tree | bd5183201c8cd4159d607065457099f53cca643a /llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp | |
parent | 5c56364be935950ec433799b68a05dc7e00201e2 (diff) | |
download | bcm5719-llvm-240b7b963a79f11734463508b2ef63d82c17eeb6.tar.gz bcm5719-llvm-240b7b963a79f11734463508b2ef63d82c17eeb6.zip |
[ms-inline asm] Perform field lookups with the dot operator.
llvm-svn: 166724
Diffstat (limited to 'llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp')
-rw-r--r-- | llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp index 00e95596a0a..7f47ef4c63e 100644 --- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/llvm/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()); |