[ms-inline asm] Rewrite the symbol references as wildcard MCParsedAsmOperands.

A Sema lookup is used to determine the size of the variable, which is in turn
used during wildcard matching.

llvm-svn: 165058
This commit is contained in:
Chad Rosier 2012-10-02 21:49:14 +00:00
parent 25f5cbcd13
commit 09d7710e04
1 changed files with 38 additions and 2 deletions

View File

@ -575,6 +575,43 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
// If we had an error parsing the operands, fail gracefully. // If we had an error parsing the operands, fail gracefully.
if (HadError) { DEF_SIMPLE_MSASM(EmptyAsmStr); return Owned(NS); } if (HadError) { DEF_SIMPLE_MSASM(EmptyAsmStr); return Owned(NS); }
// Rewrite the symbol references as wildcard MCParsedAsmOperands.
for (unsigned i = 1, e = Operands.size(); i != e; ++i)
if (Operands[i]->isMem()) {
StringRef Name = getMSInlineAsmExprName(Pieces[StrIdx][i]);
// The expr may be a register. E.g., DWORD PTR [eax]
if (Context.getTargetInfo().isValidGCCRegisterName(Name))
continue;
IdentifierInfo *II = getIdentifierInfo(Name, AsmToks,
AsmTokRanges[StrIdx].first,
AsmTokRanges[StrIdx].second);
// Lookup the identifier.
// TODO: Someone with more experience with clang should verify this the
// proper way of doing a symbol lookup.
DeclarationName DeclName(II);
Scope *CurScope = getCurScope();
LookupResult R(*this, DeclName, AsmLoc, Sema::LookupOrdinaryName);
if (!this->LookupName(R, CurScope, false/*AllowBuiltinCreation*/))
assert(0 && "Sema::LookupName failed!");
assert (R.isSingleResult() && "Expected a single result?!");
NamedDecl *Decl = R.getFoundDecl();
switch (Decl->getKind()) {
default:
assert(0 && "Unknown decl kind.");
break;
case Decl::Var: {
case Decl::ParmVar:
VarDecl *Var = cast<VarDecl>(Decl);
QualType Ty = Var->getType();
// Set the expected operand size.
Operands[i]->setMSAsmWildcard(Context.getTypeInfo(Ty).first);
break;
}
}
}
// Match the MCInstr. // Match the MCInstr.
unsigned Kind; unsigned Kind;
unsigned Opcode; unsigned Opcode;
@ -619,8 +656,7 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
// Expr/Input or Output. // Expr/Input or Output.
StringRef Name = getMSInlineAsmExprName(Pieces[StrIdx][i]); StringRef Name = getMSInlineAsmExprName(Pieces[StrIdx][i]);
// The expr may be a register. // The expr may be a register. E.g., DWORD PTR [eax]
// E.g., DWORD PTR [eax]
if (Context.getTargetInfo().isValidGCCRegisterName(Name)) if (Context.getTargetInfo().isValidGCCRegisterName(Name))
continue; continue;