[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
This commit is contained in:
Chad Rosier 2012-08-16 19:52:25 +00:00
parent 9f143c5c5f
commit efb2911664
1 changed files with 30 additions and 8 deletions

View File

@ -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.