diff options
-rw-r--r-- | lib/CodeGen/CGDebugInfo.cpp | 29 | ||||
-rw-r--r-- | lib/CodeGen/CGDebugInfo.h | 1 | ||||
-rw-r--r-- | test/CodeGenCXX/debug-info-fwd-ref.cpp | 9 |
3 files changed, 30 insertions, 9 deletions
diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index dd76640ba3..af6d25d363 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -488,6 +488,11 @@ llvm::DIType CGDebugInfo::CreatePointeeType(QualType PointeeTy, // Limit debug info for the pointee type. + // If we have an existing type, use that, it's still smaller than creating + // a new type. + llvm::DIType Ty = getTypeOrNull(PointeeTy); + if (Ty.Verify()) return Ty; + // Handle qualifiers. if (PointeeTy.hasLocalQualifiers()) return CreateQualifiedType(PointeeTy, Unit); @@ -1565,15 +1570,12 @@ static QualType UnwrapTypeForDebugInfo(QualType T) { return T; } -/// getOrCreateType - Get the type from the cache or create a new -/// one if necessary. -llvm::DIType CGDebugInfo::getOrCreateType(QualType Ty, llvm::DIFile Unit) { - if (Ty.isNull()) - return llvm::DIType(); +/// getType - Get the type from the cache or return null type if it doesn't exist. +llvm::DIType CGDebugInfo::getTypeOrNull(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()); @@ -1583,6 +1585,21 @@ llvm::DIType CGDebugInfo::getOrCreateType(QualType Ty, llvm::DIFile Unit) { return llvm::DIType(cast<llvm::MDNode>(it->second)); } + return llvm::DIType(); +} + +/// getOrCreateType - Get the type from the cache or create a new +/// one if necessary. +llvm::DIType CGDebugInfo::getOrCreateType(QualType Ty, llvm::DIFile Unit) { + if (Ty.isNull()) + return llvm::DIType(); + + // Unwrap the type as needed for debug information. + Ty = UnwrapTypeForDebugInfo(Ty); + + llvm::DIType T = getTypeOrNull(Ty); + if (T.Verify()) return T; + // Otherwise create the type. llvm::DIType Res = CreateTypeNode(Ty, Unit); diff --git a/lib/CodeGen/CGDebugInfo.h b/lib/CodeGen/CGDebugInfo.h index 087cdd08a4..8831c535fa 100644 --- a/lib/CodeGen/CGDebugInfo.h +++ b/lib/CodeGen/CGDebugInfo.h @@ -93,6 +93,7 @@ class CGDebugInfo { llvm::DIType CreateType(const MemberPointerType *Ty, llvm::DIFile F); llvm::DIType CreateType(const AtomicType *Ty, llvm::DIFile F); llvm::DIType CreateEnumType(const EnumDecl *ED); + llvm::DIType getTypeOrNull(const QualType); llvm::DIType getOrCreateMethodType(const CXXMethodDecl *Method, llvm::DIFile F); llvm::DIType getOrCreateFunctionType(const Decl *D, QualType FnType, diff --git a/test/CodeGenCXX/debug-info-fwd-ref.cpp b/test/CodeGenCXX/debug-info-fwd-ref.cpp index e01733c777..4946815458 100644 --- a/test/CodeGenCXX/debug-info-fwd-ref.cpp +++ b/test/CodeGenCXX/debug-info-fwd-ref.cpp @@ -16,8 +16,11 @@ int main(int argc, char** argv) { return 0; } -// Make sure we have two DW_TAG_class_types for baz and bar for their forward +// Make sure we have two DW_TAG_class_types for baz and bar and no forward // references. // FIXME: These should be struct types to match the declaration. -// CHECK: !17 = metadata !{i32 720898, null, metadata !"baz", metadata !6, i32 3, i64 0, i64 0, i32 0, i32 4, null, null, i32 0, null, null} ; [ DW_TAG_class_type ] -// CHECK: !26 = metadata !{i32 720898, null, metadata !"bar", metadata !6, i32 8, i64 0, i64 0, i32 0, i32 4, null, null, i32 0, null, null} ; [ DW_TAG_class_type ] +// CHECK: metadata !{i32 720898, null, metadata !"bar", metadata !6, i32 8, i64 128, i64 64, i32 0, i32 0, null, metadata !7, i32 0, null, null} ; [ DW_TAG_class_type ] +// CHECK: metadata !{i32 720898, null, metadata !"baz", metadata !6, i32 3, i64 32, i64 32, i32 0, i32 0, null, metadata !10, i32 0, null, null} ; [ DW_TAG_class_type ] +// CHECK-NOT: metadata !{i32 720915, null, metadata !"bar", metadata !6, i32 9, i64 0, i64 0, i32 0, i32 4, i32 0, null, i32 0, i32 0} ; [ DW_TAG_class_type ] +// CHECK-NOT: metadata !{i32 720898, null, metadata !"baz", metadata !6, i32 3, i64 0, i64 0, i32 0, i32 4, null, null, i32 0, null, null} ; [ DW_TAG_class_type ] + |