Cache imported types

llvm-svn: 95543
This commit is contained in:
Douglas Gregor 2010-02-08 15:18:58 +00:00
parent 4583dfc651
commit f65bbb31e8
2 changed files with 15 additions and 2 deletions

View File

@ -17,6 +17,7 @@
#include "clang/AST/Type.h"
#include "clang/AST/DeclarationName.h"
#include "clang/Basic/SourceLocation.h"
#include "llvm/ADT/DenseMap.h"
namespace clang {
class ASTContext;
@ -38,7 +39,11 @@ namespace clang {
/// \brief The diagnostics object that we should use to emit diagnostics
/// within the context we're importing to and from.
Diagnostic &ToDiags, &FromDiags;
/// \brief Mapping from the already-imported types in the "from" context
/// to the corresponding types in the "to" context.
llvm::DenseMap<Type *, Type *> ImportedTypes;
public:
ASTImporter(ASTContext &ToContext, Diagnostic &ToDiags,
ASTContext &FromContext, Diagnostic &FromDiags);

View File

@ -434,13 +434,21 @@ QualType ASTImporter::Import(QualType FromT) {
if (FromT.isNull())
return QualType();
// FIXME: Cache type mappings?
// Check whether we've already imported this type.
llvm::DenseMap<Type *, Type *>::iterator Pos
= ImportedTypes.find(FromT.getTypePtr());
if (Pos != ImportedTypes.end())
return ToContext.getQualifiedType(Pos->second, FromT.getQualifiers());
// Import the type
ASTNodeImporter Importer(*this);
QualType ToT = Importer.Visit(FromT.getTypePtr());
if (ToT.isNull())
return ToT;
// Record the imported type.
ImportedTypes[FromT.getTypePtr()] = ToT.getTypePtr();
return ToContext.getQualifiedType(ToT, FromT.getQualifiers());
}