From 3329ad1dc678d0f659f5ab4f122af824477ca788 Mon Sep 17 00:00:00 2001 From: Chad Rosier Date: Tue, 2 Oct 2012 21:49:14 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165058 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaStmtAsm.cpp | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/lib/Sema/SemaStmtAsm.cpp b/lib/Sema/SemaStmtAsm.cpp index 3c3a9eb0b5..de485b9f95 100644 --- a/lib/Sema/SemaStmtAsm.cpp +++ b/lib/Sema/SemaStmtAsm.cpp @@ -575,6 +575,43 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, // If we had an error parsing the operands, fail gracefully. 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(Decl); + QualType Ty = Var->getType(); + // Set the expected operand size. + Operands[i]->setMSAsmWildcard(Context.getTypeInfo(Ty).first); + break; + } + } + } + // Match the MCInstr. unsigned Kind; unsigned Opcode; @@ -619,8 +656,7 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, // Expr/Input or Output. StringRef Name = getMSInlineAsmExprName(Pieces[StrIdx][i]); - // The expr may be a register. - // E.g., DWORD PTR [eax] + // The expr may be a register. E.g., DWORD PTR [eax] if (Context.getTargetInfo().isValidGCCRegisterName(Name)) continue; -- 2.40.0