summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChad Rosier <mcrosier@apple.com>2012-10-25 21:51:10 +0000
committerChad Rosier <mcrosier@apple.com>2012-10-25 21:51:10 +0000
commit240b7b963a79f11734463508b2ef63d82c17eeb6 (patch)
treebd5183201c8cd4159d607065457099f53cca643a
parent5c56364be935950ec433799b68a05dc7e00201e2 (diff)
downloadbcm5719-llvm-240b7b963a79f11734463508b2ef63d82c17eeb6.tar.gz
bcm5719-llvm-240b7b963a79f11734463508b2ef63d82c17eeb6.zip
[ms-inline asm] Perform field lookups with the dot operator.
llvm-svn: 166724
-rw-r--r--llvm/include/llvm/MC/MCParser/MCAsmParser.h2
-rw-r--r--llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp23
2 files changed, 21 insertions, 4 deletions
diff --git a/llvm/include/llvm/MC/MCParser/MCAsmParser.h b/llvm/include/llvm/MC/MCParser/MCAsmParser.h
index 8a5f37cb0c8..a71d3c32174 100644
--- a/llvm/include/llvm/MC/MCParser/MCAsmParser.h
+++ b/llvm/include/llvm/MC/MCParser/MCAsmParser.h
@@ -37,6 +37,8 @@ public:
virtual ~MCAsmParserSemaCallback();
virtual void *LookupInlineAsmIdentifier(StringRef Name, void *Loc,
unsigned &Size) = 0;
+ virtual bool LookupInlineAsmField(StringRef Base, StringRef Member,
+ unsigned &Offset) = 0;
};
/// MCAsmParser - Generic assembler parser interface, for use by target specific
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());
OpenPOWER on IntegriCloud