summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdrian Prantl <aprantl@apple.com>2013-06-20 21:17:24 +0000
committerAdrian Prantl <aprantl@apple.com>2013-06-20 21:17:24 +0000
commitdba725c0bef93923437d4c6d5ab75896d604c4ba (patch)
treee244112a40e3ed27f5a562c70da82f69ff7d00fa
parent2cd24bd52d090bc9454c56fa19592a2a2acac58c (diff)
downloadbcm5719-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.cpp29
-rw-r--r--clang/test/CodeGen/debug-info-record.c2
-rw-r--r--clang/test/CodeGen/debug-info-record2.c21
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;
+}
OpenPOWER on IntegriCloud