From: Chad Rosier Date: Thu, 16 Aug 2012 19:52:25 +0000 (+0000) Subject: [ms-inline asm] Perform symbol table lookup on variables. The idea is to use X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2863c0e0f6cd7c0b9d8b999905b1688d3f2f2377;p=clang [ms-inline asm] Perform symbol table lookup on variables. The idea is to use this information to determine valid MC operands. This will also be used for semantic analysis. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@162043 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index 5bd5c8a96b..49d1cae03a 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -2824,7 +2824,8 @@ static void patchMSAsmStrings(Sema &SemaRef, bool &IsSimple, break; } case tok::identifier: { - StringRef Name = AsmToks[i].getIdentifierInfo()->getName(); + IdentifierInfo *II = AsmToks[i].getIdentifierInfo(); + StringRef Name = II->getName(); // Valid register? if (TI.isValidGCCRegisterName(Name)) { @@ -2841,16 +2842,37 @@ static void patchMSAsmStrings(Sema &SemaRef, bool &IsSimple, break; } - // Not a register, so this must be a variable, function or label - // reference. Track these as they are either an Input or an Output. - // Unfortunately, we don't know which is which until after we feed - // the patched asms to the AsmParser. - AsmNames[NumAsmStrings].set(i); + // 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 = SemaRef.getCurScope(); + LookupResult R(SemaRef, DeclName, AsmLoc, Sema::LookupOrdinaryName); + if (!SemaRef.LookupName(R, CurScope, false/*AllowBuiltinCreation*/)) + break; - // TODO: Lookup the identifier and patch appropriately. + 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: + AsmNames[NumAsmStrings].set(i); + + VarDecl *Var = cast(Decl); + QualType Ty = Var->getType(); + (void)Ty; // Avoid warning. + // TODO: Patch identifier with valid operand. One potential idea is to + // probe the backend with type information to guess the possible + // operand. + break; + } + } break; } - } // AsmToks[i].getKind() + } } // Emit the final (and possibly only) asm string.