diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-09-19 19:27:24 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-09-19 19:27:24 +0000 |
commit | 23e81bae8c91ccd408e31ca472dca25faed85028 (patch) | |
tree | fba999a3786e0f7c4f049d6adb8acab1ddc7de3a | |
parent | 03faac3b8c85263804ffe501a01eb3da7c5198e9 (diff) |
Switch CGDebugInfo type cache to using an AssertingVH.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82321 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/CGDebugInfo.cpp | 35 | ||||
-rw-r--r-- | lib/CodeGen/CGDebugInfo.h | 7 |
2 files changed, 23 insertions, 19 deletions
diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 4d80d02b55..e1dca0e483 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -443,7 +443,7 @@ llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty, // Otherwise, insert it into the TypeCache so that recursive uses will find // it. - TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = FwdDecl; + TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = FwdDecl.getNode(); // Convert all the elements. llvm::SmallVector<llvm::DIDescriptor, 16> EltTys; @@ -511,12 +511,13 @@ llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty, DebugFactory.CreateCompositeType(Tag, Unit, Name, DefUnit, Line, Size, Align, 0, 0, llvm::DIType(), Elements); + // Update TypeCache. + TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = RealDecl.getNode(); + // Now that we have a real decl for the struct, replace anything using the // old decl with the new one. This will recursively update the debug info. FwdDecl.replaceAllUsesWith(RealDecl); - // Update TypeCache. - TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = RealDecl; return RealDecl; } @@ -555,7 +556,7 @@ llvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, // Otherwise, insert it into the TypeCache so that recursive uses will find // it. - TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = FwdDecl; + TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = FwdDecl.getNode(); // Convert all the elements. llvm::SmallVector<llvm::DIDescriptor, 16> EltTys; @@ -637,12 +638,13 @@ llvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty, Align, 0, 0, llvm::DIType(), Elements, RuntimeLang); + // Update TypeCache. + TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = RealDecl.getNode(); + // Now that we have a real decl for the struct, replace anything using the // old decl with the new one. This will recursively update the debug info. FwdDecl.replaceAllUsesWith(RealDecl); - // Update TypeCache. - TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = RealDecl; return RealDecl; } @@ -749,25 +751,22 @@ llvm::DIType CGDebugInfo::getOrCreateType(QualType Ty, if (Ty.isNull()) return llvm::DIType(); - // Lookup the cache slot. - llvm::DIType &Slot = TypeCache[Ty.getAsOpaquePtr()]; + // Check for existing entry. + std::map<void *, llvm::AssertingVH<llvm::MDNode> >::iterator it = + TypeCache.find(Ty.getAsOpaquePtr()); + if (it != TypeCache.end()) + return llvm::DIType(it->second); - // Create the type if necessary. - if (Slot.isNull()) - Slot = CreateTypeNode(Ty, Unit); - - return Slot; + // Otherwise create the type. + llvm::DIType Res = CreateTypeNode(Ty, Unit); + TypeCache.insert(std::make_pair(Ty.getAsOpaquePtr(), Res.getNode())); + return Res; } /// getOrCreateTypeNode - Get the type metadata node from the cache or create a /// new one if necessary. llvm::DIType CGDebugInfo::CreateTypeNode(QualType Ty, llvm::DICompileUnit Unit) { - // Make sure the type cache has a null entry, to deal with recursion. - assert(TypeCache.count(Ty.getAsOpaquePtr()) && - TypeCache[Ty.getAsOpaquePtr()].isNull() && - "Invalid CreateTypeNode call!"); - // Handle CVR qualifiers, which recursively handles what they refer to. if (Ty.getCVRQualifiers()) return CreateCVRType(Ty, Unit); diff --git a/lib/CodeGen/CGDebugInfo.h b/lib/CodeGen/CGDebugInfo.h index 3308a6b952..d0f0731d6b 100644 --- a/lib/CodeGen/CGDebugInfo.h +++ b/lib/CodeGen/CGDebugInfo.h @@ -18,10 +18,15 @@ #include "clang/Basic/SourceLocation.h" #include "llvm/ADT/DenseMap.h" #include "llvm/Analysis/DebugInfo.h" +#include "llvm/Support/ValueHandle.h" #include <map> #include "CGBuilder.h" +namespace llvm { + class MDNode; +} + namespace clang { class VarDecl; class ObjCInterfaceDecl; @@ -44,7 +49,7 @@ class CGDebugInfo { /// TypeCache - Cache of previously constructed Types. // FIXME: Eliminate this map. Be careful of iterator invalidation. - std::map<void *, llvm::DIType> TypeCache; + std::map<void *, llvm::AssertingVH<llvm::MDNode> > TypeCache; bool BlockLiteralGenericSet; llvm::DIType BlockLiteralGeneric; |