diff options
author | Devang Patel <dpatel@apple.com> | 2007-10-25 18:32:36 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2007-10-25 18:32:36 +0000 |
commit | 29e38244539bc058a8ee607965bb7e171967c0f0 (patch) | |
tree | 26ab283e477da65c217a8ef938e03faa842f6aaf /clang/CodeGen/CodeGenTypes.cpp | |
parent | 222211a42563842d3378e224e14e9796ceba6b3d (diff) | |
download | bcm5719-llvm-29e38244539bc058a8ee607965bb7e171967c0f0.tar.gz bcm5719-llvm-29e38244539bc058a8ee607965bb7e171967c0f0.zip |
Cache llvm::Type through PATypeHolder.
llvm-svn: 43355
Diffstat (limited to 'clang/CodeGen/CodeGenTypes.cpp')
-rw-r--r-- | clang/CodeGen/CodeGenTypes.cpp | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/clang/CodeGen/CodeGenTypes.cpp b/clang/CodeGen/CodeGenTypes.cpp index 31c76b3306a..0b225291d25 100644 --- a/clang/CodeGen/CodeGenTypes.cpp +++ b/clang/CodeGen/CodeGenTypes.cpp @@ -69,7 +69,21 @@ CodeGenTypes::~CodeGenTypes() { /// ConvertType - Convert the specified type to its LLVM form. const llvm::Type *CodeGenTypes::ConvertType(QualType T) { - // FIXME: Cache these, move the CodeGenModule, expand, etc. + // See if type is already cached. + llvm::DenseMap<Type *, llvm::PATypeHolder *>::iterator + I = TypeHolderMap.find(T.getTypePtr()); + if (I != TypeHolderMap.end()) { + llvm::PATypeHolder *PAT = I->second; + return PAT->get(); + } + + const llvm::Type *ResultType = ConvertNewType(T); + llvm::PATypeHolder *PAT = new llvm::PATypeHolder(ResultType); + TypeHolderMap[T.getTypePtr()] = PAT; + return ResultType; +} + +const llvm::Type *CodeGenTypes::ConvertNewType(QualType T) { const clang::Type &Ty = *T.getCanonicalType(); switch (Ty.getTypeClass()) { @@ -166,7 +180,10 @@ const llvm::Type *CodeGenTypes::ConvertType(QualType T) { // Struct return passes the struct byref. if (!ResultType->isFirstClassType() && ResultType != llvm::Type::VoidTy) { - ArgTys.push_back(llvm::PointerType::get(ResultType)); + const llvm::Type *RType = llvm::PointerType::get(ResultType); + QualType RTy = Context.getPointerType(FP.getResultType()); + TypeHolderMap[RTy.getTypePtr()] = new llvm::PATypeHolder(RType); + ArgTys.push_back(RType); ResultType = llvm::Type::VoidTy; } @@ -215,6 +232,8 @@ const llvm::Type *CodeGenTypes::ConvertType(QualType T) { // Reevaluate this when performance analyis finds tons of opaque types. llvm::OpaqueType *OpaqueTy = llvm::OpaqueType::get(); RecordTypesToResolve[RD] = OpaqueTy; + QualType Opq; + TypeHolderMap[Opq.getTypePtr()] = new llvm::PATypeHolder(OpaqueTy); // Layout fields. RecordOrganizer RO; @@ -281,8 +300,12 @@ void CodeGenTypes::DecodeArgumentTypes(const FunctionTypeProto &FTP, const llvm::Type *Ty = ConvertType(FTP.getArgType(i)); if (Ty->isFirstClassType()) ArgTys.push_back(Ty); - else - ArgTys.push_back(llvm::PointerType::get(Ty)); + else { + QualType PTy = Context.getPointerType(FTP.getArgType(i)); + const llvm::Type *PtrTy = llvm::PointerType::get(Ty); + TypeHolderMap[PTy.getTypePtr()] = new llvm::PATypeHolder(PtrTy); + ArgTys.push_back(PtrTy); + } } } |