diff options
author | Chad Rosier <mcrosier@apple.com> | 2012-08-16 19:52:25 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2012-08-16 19:52:25 +0000 |
commit | 2863c0e0f6cd7c0b9d8b999905b1688d3f2f2377 (patch) | |
tree | 2a89250a77f32852320607cda4245c7a0b5504f3 /lib/Sema/SemaStmt.cpp | |
parent | 183e8ae7a372744f3a66da5b0c7eda6e2b2bf5fb (diff) |
[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
Diffstat (limited to 'lib/Sema/SemaStmt.cpp')
-rw-r--r-- | lib/Sema/SemaStmt.cpp | 38 |
1 files changed, 30 insertions, 8 deletions
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<VarDecl>(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. |