[cfe-commits] r150858 - in /cfe/trunk: lib/CodeGen/CGDebugInfo.cpp lib/CodeGen/CGDebugInfo.h test/CodeGenCXX/debug-info-dup-fwd-decl.cpp
Eric Christopher
echristo at apple.com
Fri Feb 17 16:50:17 PST 2012
Author: echristo
Date: Fri Feb 17 18:50:17 2012
New Revision: 150858
URL: http://llvm.org/viewvc/llvm-project?rev=150858&view=rev
Log:
Add in a caching mechanism so that forward declarations are replaced
with full types if they exist.
rdar://10809898 and rdar://10209967 and rdar://10400981
Modified:
cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
cfe/trunk/lib/CodeGen/CGDebugInfo.h
cfe/trunk/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp
Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=150858&r1=150857&r2=150858&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Fri Feb 17 18:50:17 2012
@@ -553,9 +553,7 @@
RecordDecl *RD = RTy->getDecl();
llvm::DIDescriptor FDContext =
getContextDescriptor(cast<Decl>(RD->getDeclContext()));
- llvm::DIType RetTy = createRecordFwdDecl(RD, FDContext);
- TypeCache[PointeeTy.getAsOpaquePtr()] = RetTy;
- return RetTy;
+ return createRecordFwdDecl(RD, FDContext);
}
return getOrCreateType(PointeeTy, Unit);
@@ -1616,6 +1614,10 @@
// Otherwise create the type.
llvm::DIType Res = CreateTypeNode(Ty, Unit);
+
+ llvm::DIType TC = getTypeOrNull(Ty);
+ if (TC.Verify() && TC.isForwardDecl())
+ ReplaceMap.push_back(std::make_pair(Ty.getAsOpaquePtr(), TC));
// And update the type cache.
TypeCache[Ty.getAsOpaquePtr()] = Res;
@@ -1725,6 +1727,9 @@
// Otherwise create the type.
llvm::DIType Res = CreateLimitedTypeNode(Ty, Unit);
+ if (T.Verify() && T.isForwardDecl())
+ ReplaceMap.push_back(std::make_pair(Ty.getAsOpaquePtr(), T));
+
// And update the type cache.
TypeCache[Ty.getAsOpaquePtr()] = Res;
return Res;
@@ -1747,11 +1752,8 @@
// If this is just a forward declaration, construct an appropriately
// marked node and just return it.
- if (!RD->getDefinition()) {
- llvm::DIType RTy = createRecordFwdDecl(RD, RDContext);
- TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = RTy;
- return RTy;
- }
+ if (!RD->getDefinition())
+ return createRecordFwdDecl(RD, RDContext);
uint64_t Size = CGM.getContext().getTypeSize(Ty);
uint64_t Align = CGM.getContext().getTypeAlign(Ty);
@@ -2561,3 +2563,25 @@
NameSpaceCache[NSDecl] = llvm::WeakVH(NS);
return NS;
}
+
+void CGDebugInfo::finalize(void) {
+ for (std::vector<std::pair<void *, llvm::WeakVH> >::const_iterator VI
+ = ReplaceMap.begin(), VE = ReplaceMap.end(); VI != VE; ++VI) {
+ llvm::DIType Ty, RepTy;
+ // Verify that the debug info still exists.
+ if (&*VI->second)
+ Ty = llvm::DIType(cast<llvm::MDNode>(VI->second));
+
+ llvm::DenseMap<void *, llvm::WeakVH>::iterator it =
+ TypeCache.find(VI->first);
+ if (it != TypeCache.end()) {
+ // Verify that the debug info still exists.
+ if (&*it->second)
+ RepTy = llvm::DIType(cast<llvm::MDNode>(it->second));
+ }
+
+ if (Ty.Verify() && RepTy.Verify())
+ Ty.replaceAllUsesWith(RepTy);
+ }
+ DBuilder.finalize();
+}
Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.h?rev=150858&r1=150857&r2=150858&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGDebugInfo.h (original)
+++ cfe/trunk/lib/CodeGen/CGDebugInfo.h Fri Feb 17 18:50:17 2012
@@ -56,6 +56,10 @@
/// CompleteTypeCache - Cache of previously constructed complete RecordTypes.
llvm::DenseMap<void *, llvm::WeakVH> CompletedTypeCache;
+ /// ReplaceMap - Cache of forward declared types to RAUW at the end of
+ /// compilation.
+ std::vector<std::pair<void *, llvm::WeakVH> >ReplaceMap;
+
bool BlockLiteralGenericSet;
llvm::DIType BlockLiteralGeneric;
@@ -160,7 +164,8 @@
public:
CGDebugInfo(CodeGenModule &CGM);
~CGDebugInfo();
- void finalize() { DBuilder.finalize(); }
+
+ void finalize(void);
/// setLocation - Update the current source location. If \arg loc is
/// invalid it is ignored.
Modified: cfe/trunk/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp?rev=150858&r1=150857&r2=150858&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp Fri Feb 17 18:50:17 2012
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -emit-llvm -g -triple x86_64-apple-darwin %s -o - | FileCheck %s
-// XFAIL: *
+// RUN: %clang_cc1 -emit-llvm -g -triple x86_64-apple-darwin -fno-limit-debug-info %s -o - | FileCheck %s
+
class Test
{
public:
@@ -19,6 +19,6 @@
Test t;
-// CHECK: metadata !"data", metadata !7, i32 14, i64 32, i64 32, i32 0, i32 0
-// CHECK: metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !5} ; [ DW_TAG_pointer_type ]
-// CHECK-NOT: metadata !"data", metadata !7, i32 13, i64 0, i64 0, i32 0, i32 4,
+// CHECK: metadata !"", null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata {{.*}} [ DW_TAG_pointer_type ]
+// CHECK: metadata !"data", metadata !6, i32 14, i64 32, i64 32, i32 0, i32 0
+// CHECK-NOT: metadata !"data", metadata {{.*}}, i32 14, i64 0, i64 0, i32 0, i32 4,
More information about the cfe-commits
mailing list