diff options
| author | Adrian Prantl <aprantl@apple.com> | 2013-06-20 21:17:24 +0000 |
|---|---|---|
| committer | Adrian Prantl <aprantl@apple.com> | 2013-06-20 21:17:24 +0000 |
| commit | dba725c0bef93923437d4c6d5ab75896d604c4ba (patch) | |
| tree | e244112a40e3ed27f5a562c70da82f69ff7d00fa | |
| parent | 2cd24bd52d090bc9454c56fa19592a2a2acac58c (diff) | |
| download | bcm5719-llvm-dba725c0bef93923437d4c6d5ab75896d604c4ba.tar.gz bcm5719-llvm-dba725c0bef93923437d4c6d5ab75896d604c4ba.zip | |
Debug Info: Attempt to resolve forward declarations if we are not emitting
limited debug info.
This is another small addendum to r184252.
rdar://problem/14101097
llvm-svn: 184473
| -rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.cpp | 29 | ||||
| -rw-r--r-- | clang/test/CodeGen/debug-info-record.c | 2 | ||||
| -rw-r--r-- | clang/test/CodeGen/debug-info-record2.c | 21 |
3 files changed, 49 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 8240c0846d5..f8c814cb94f 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -1886,6 +1886,22 @@ llvm::DIType CGDebugInfo::getTypeOrNull(QualType Ty) { return llvm::DIType(); } +/// ContainsFwdDecl - True if Ty is either a forward declaration or a +/// derived type of a forward declaration. +static bool ContainsFwdDecl(llvm::DIType Ty) { + // Composite types such as structs inherit from DIDerivedType, so + // check this first and do an early exit. + if (Ty.isForwardDecl()) + return true; + + if (Ty.isDerivedType()) { + llvm::DIDerivedType DTy(Ty); + return ContainsFwdDecl(DTy.getTypeDerivedFrom()); + } + + return false; +} + /// getCompletedTypeOrNull - Get the type from the cache or return null if it /// doesn't exist. llvm::DIType CGDebugInfo::getCompletedTypeOrNull(QualType Ty) { @@ -1904,8 +1920,17 @@ llvm::DIType CGDebugInfo::getCompletedTypeOrNull(QualType Ty) { } // Verify that any cached debug info still exists. - if (V != 0) - return llvm::DIType(cast<llvm::MDNode>(V)); + if (V != 0) { + llvm::DIType CachedType(cast<llvm::MDNode>(V)); + + // Unless we are limiting debug info, attempt to resolve any + // forward declarations. + if (DebugKind > CodeGenOptions::LimitedDebugInfo && + ContainsFwdDecl(CachedType)) + return llvm::DIType(); + + return CachedType; + } return llvm::DIType(); } diff --git a/clang/test/CodeGen/debug-info-record.c b/clang/test/CodeGen/debug-info-record.c index 55927ca667a..546a8b9806e 100644 --- a/clang/test/CodeGen/debug-info-record.c +++ b/clang/test/CodeGen/debug-info-record.c @@ -1,5 +1,5 @@ // RUN: %clang_cc1 -triple x86_64-unk-unk -fno-limit-debug-info -o - -emit-llvm -g %s | FileCheck %s -// Check that we emit debug info for a struct even if it is typedef'd before using. +// Check that we emit debug info for a struct even if it is typedef'd. // rdar://problem/14101097 // // FIXME: This should work with -flimit-debug-info, too. diff --git a/clang/test/CodeGen/debug-info-record2.c b/clang/test/CodeGen/debug-info-record2.c new file mode 100644 index 00000000000..3f28296318c --- /dev/null +++ b/clang/test/CodeGen/debug-info-record2.c @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -triple x86_64-unk-unk -fno-limit-debug-info -o - -emit-llvm -g %s | FileCheck %s +// Check that we emit debug info for a struct even if it is typedef'd before using. +// rdar://problem/14101097 +// +// FIXME: This should work with -flimit-debug-info, too. + +// Make sure this is not a forward declaration. +// CHECK-NOT: [ DW_TAG_structure_type ] [elusive_s] {{.*}} [fwd] +// CHECK: [ DW_TAG_member ] [foo] +// CHECK: [ DW_TAG_member ] [bar] +typedef struct elusive_s* elusive_t; +elusive_t first_use = (void*)0; +struct elusive_s { + int foo; + float bar; +}; + +int baz(void* x) { + elusive_t s = x; + return s->foo; +} |

