]> granicus.if.org Git - clang/commitdiff
Update type cache when a type is completed.
authorDevang Patel <dpatel@apple.com>
Wed, 23 Mar 2011 16:29:39 +0000 (16:29 +0000)
committerDevang Patel <dpatel@apple.com>
Wed, 23 Mar 2011 16:29:39 +0000 (16:29 +0000)
Radar 9168773

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@128150 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGDebugInfo.cpp
lib/CodeGen/CGDebugInfo.h
lib/CodeGen/CodeGenModule.cpp
lib/CodeGen/CodeGenModule.h

index bf5e7a5d1a964a4653a30378b86c65881f65e28f..80bec0f0eebebd612666c74d54720492748755a0 100644 (file)
@@ -1396,7 +1396,7 @@ llvm::DIType CGDebugInfo::getOrCreateType(QualType Ty,
 
   // Unwrap the type as needed for debug information.
   Ty = UnwrapTypeForDebugInfo(Ty);
-  
+
   // Check for existing entry.
   llvm::DenseMap<void *, llvm::WeakVH>::iterator it =
     TypeCache.find(Ty.getAsOpaquePtr());
@@ -2205,3 +2205,17 @@ CGDebugInfo::getOrCreateNameSpace(const NamespaceDecl *NSDecl) {
   NameSpaceCache[NSDecl] = llvm::WeakVH(NS);
   return NS;
 }
+
+/// UpdateCompletedType - Update type cache because the type is now
+/// translated.
+void CGDebugInfo::UpdateCompletedType(const TagDecl *TD) {
+  QualType Ty = CGM.getContext().getTagDeclType(TD);
+
+  // If the type exist in type cache then remove it from the cache.
+  // There is no need to prepare debug info for the completed type
+  // right now. It will be generated on demand lazily.
+  llvm::DenseMap<void *, llvm::WeakVH>::iterator it =
+    TypeCache.find(Ty.getAsOpaquePtr());
+  if (it != TypeCache.end()) 
+    TypeCache.erase(it);
+}
index 2e0f7194ca8149b00790bbfa1a1a23bb10433d94..cdc6ce65430272fdee4e8b6d40495edc2cd20644 100644 (file)
@@ -158,6 +158,10 @@ public:
   /// has introduced scope change.
   void UpdateLineDirectiveRegion(CGBuilderTy &Builder);
 
+  /// UpdateCompletedType - Update type cache because the type is now
+  /// translated.
+  void UpdateCompletedType(const TagDecl *TD);
+
   /// EmitRegionStart - Emit a call to llvm.dbg.region.start to indicate start
   /// of a new block.
   void EmitRegionStart(CGBuilderTy &Builder);
index 647dcc50a973399d9af38464a1235eb851abf889..156819c9b6fd95e12cddf90d70b5aca5b94eac79 100644 (file)
@@ -131,6 +131,13 @@ void CodeGenModule::Release() {
     EmitDeclMetadata();
 }
 
+void CodeGenModule::UpdateCompletedType(const TagDecl *TD) {
+  // Make sure that this type is translated.
+  Types.UpdateCompletedType(TD);
+  if (DebugInfo)
+    DebugInfo->UpdateCompletedType(TD);
+}
+
 llvm::MDNode *CodeGenModule::getTBAAInfo(QualType QTy) {
   if (!TBAA)
     return 0;
index 5b8164f6be366a7823aaa618918fed7e3ea3d9d6..e6fcf61473e8a811a68de58fdf636935a7d55cc2 100644 (file)
@@ -506,10 +506,8 @@ public:
 
   ///@}
 
-  void UpdateCompletedType(const TagDecl *TD) {
-    // Make sure that this type is translated.
-    Types.UpdateCompletedType(TD);
-  }
+  // UpdateCompleteType - Make sure that this type is translated.
+  void UpdateCompletedType(const TagDecl *TD);
 
   llvm::Constant *getMemberPointerConstant(const UnaryOperator *e);