From efb291166414b7bfe2fa11737a650d93210f184d Mon Sep 17 00:00:00 2001 From: Chad Rosier Date: Thu, 16 Aug 2012 19:52:25 +0000 Subject: [PATCH] [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. llvm-svn: 162043 --- clang/lib/Sema/SemaStmt.cpp | 38 +++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index 5bd5c8a96b25..49d1cae03ae9 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/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.