aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaStmt.cpp
diff options
context:
space:
mode:
authorChad Rosier <mcrosier@apple.com>2012-08-16 19:52:25 +0000
committerChad Rosier <mcrosier@apple.com>2012-08-16 19:52:25 +0000
commit2863c0e0f6cd7c0b9d8b999905b1688d3f2f2377 (patch)
tree2a89250a77f32852320607cda4245c7a0b5504f3 /lib/Sema/SemaStmt.cpp
parent183e8ae7a372744f3a66da5b0c7eda6e2b2bf5fb (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.cpp38
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.