Add __builtin_va_start to the list of builtins, make __builtin_va_list available to builtin functions.

llvm-svn: 42857
This commit is contained in:
Anders Carlsson 2007-10-11 01:00:40 +00:00
parent 70e8f1024a
commit 87c149bf51
5 changed files with 31 additions and 1 deletions

View File

@ -830,3 +830,11 @@ QualType ASTContext::getCFConstantStringType() {
return getTagDeclType(CFConstantStringTypeDecl);
}
void ASTContext::setBuiltinVaListType(QualType T)
{
assert(BuiltinVaListType.isNull() && "__builtin_va_list type already set!");
BuiltinVaListType = T;
}

View File

@ -133,6 +133,9 @@ static QualType DecodeTypeFromStr(const char *&Str, ASTContext &Context) {
case 'F':
Type = Context.getCFConstantStringType();
break;
case 'V':
Type = Context.getBuiltinVaListType();
break;
}
Done = false;

View File

@ -137,7 +137,16 @@ ScopedDecl *Sema::LazilyCreateBuiltin(IdentifierInfo *II, unsigned bid,
Scope *S) {
Builtin::ID BID = (Builtin::ID)bid;
QualType R = Context.BuiltinInfo.GetBuiltinType(BID, Context);
if (BID == Builtin::BI__builtin_va_start &&
Context.getBuiltinVaListType().isNull()) {
IdentifierInfo *VaIdent = &Context.Idents.get("__builtin_va_list");
ScopedDecl *VaDecl = LookupScopedDecl(VaIdent, Decl::IDNS_Ordinary,
SourceLocation(), TUScope);
TypedefDecl *VaTypedef = cast<TypedefDecl>(VaDecl);
Context.setBuiltinVaListType(Context.getTypedefType(VaTypedef));
}
QualType R = Context.BuiltinInfo.GetBuiltinType(BID, Context);
FunctionDecl *New = new FunctionDecl(SourceLocation(), II, R,
FunctionDecl::Extern, false, 0);

View File

@ -41,6 +41,11 @@ class ASTContext {
llvm::FoldingSet<ObjcQualifiedInterfaceType> ObjcQualifiedInterfaceTypes;
llvm::DenseMap<const RecordDecl*, const RecordLayout*> RecordLayoutInfo;
RecordDecl *CFConstantStringTypeDecl;
/// BuiltinVaListType - built-in va list type.
/// This is initially null and set by Sema::LazilyCreateBuiltin when
/// a builtin that takes a valist is encountered.
QualType BuiltinVaListType;
public:
SourceManager &SourceMgr;
@ -145,6 +150,9 @@ public:
// getCFConstantStringType - Return the type used for constant CFStrings.
QualType getCFConstantStringType();
void setBuiltinVaListType(QualType T);
QualType getBuiltinVaListType() const { return BuiltinVaListType; }
//===--------------------------------------------------------------------===//
// Type Sizing and Analysis
//===--------------------------------------------------------------------===//

View File

@ -30,6 +30,7 @@
// f -> float
// d -> double
// F -> constant CFString
// V -> __builtin_va_list
// . -> "...". This may only occur at the end of the function list.
//
// Types maybe prefixed with the following modifiers:
@ -58,5 +59,6 @@ BUILTIN(__builtin_fabsl, "LdLd", "ncF")
BUILTIN(__builtin_constant_p, "UsUs", "nc")
BUILTIN(__builtin_classify_type, "i.", "nc")
BUILTIN(__builtin___CFStringMakeConstantString, "FC*cC*", "nc")
BUILTIN(__builtin_va_start, "vV.", "nc")
#undef BUILTIN