forked from OSchip/llvm-project
[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:
parent
25f5cbcd13
commit
09d7710e04
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue