aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2009-11-06 18:24:05 +0000
committerDevang Patel <dpatel@apple.com>2009-11-06 18:24:05 +0000
commit5ebfa2d181dccee5e23421a41910a7a1851d358e (patch)
treea02f7ec0c860ca99a9a0f89e431238d9ea098c3e
parentf7807f6b9e9a215f365ce98a4c252aced4f651fb (diff)
downloadexternal_llvm-5ebfa2d181dccee5e23421a41910a7a1851d358e.zip
external_llvm-5ebfa2d181dccee5e23421a41910a7a1851d358e.tar.gz
external_llvm-5ebfa2d181dccee5e23421a41910a7a1851d358e.tar.bz2
Tolerate invalid derived type.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86269 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Analysis/DebugInfo.cpp4
-rw-r--r--test/DebugInfo/2009-11-06-InvalideDerivedType.ll13
2 files changed, 17 insertions, 0 deletions
diff --git a/lib/Analysis/DebugInfo.cpp b/lib/Analysis/DebugInfo.cpp
index 7c1cc35..24b5ad4 100644
--- a/lib/Analysis/DebugInfo.cpp
+++ b/lib/Analysis/DebugInfo.cpp
@@ -409,6 +409,10 @@ uint64_t DIDerivedType::getOriginalTypeSize() const {
Tag == dwarf::DW_TAG_const_type || Tag == dwarf::DW_TAG_volatile_type ||
Tag == dwarf::DW_TAG_restrict_type) {
DIType BaseType = getTypeDerivedFrom();
+ // If this type is not derived from any type then take conservative
+ // approach.
+ if (BaseType.isNull())
+ return getSizeInBits();
if (BaseType.isDerivedType())
return DIDerivedType(BaseType.getNode()).getOriginalTypeSize();
else
diff --git a/test/DebugInfo/2009-11-06-InvalideDerivedType.ll b/test/DebugInfo/2009-11-06-InvalideDerivedType.ll
new file mode 100644
index 0000000..73211bb
--- /dev/null
+++ b/test/DebugInfo/2009-11-06-InvalideDerivedType.ll
@@ -0,0 +1,13 @@
+; RUN: llc %s -o /dev/null
+%struct._t = type { i32 }
+
+@s1 = common global %struct._t zeroinitializer, align 4 ; <%struct._t*> [#uses=0]
+
+!llvm.dbg.gv = !{!0}
+
+!0 = metadata !{i32 458804, i32 0, metadata !1, metadata !"s1", metadata !"s1", metadata !"s1", metadata !1, i32 3, metadata !2, i1 false, i1 true, %struct._t* @s1}; [DW_TAG_variable ]
+!1 = metadata !{i32 458769, i32 0, i32 12, metadata !"t.c", metadata !"/tmp", metadata !"clang 1.1", i1 true, i1 false, metadata !"", i32 0}; [DW_TAG_compile_unit ]
+!2 = metadata !{i32 458771, metadata !1, metadata !"_t", metadata !1, i32 1, i64 32, i64 32, i64 0, i32 0, null, metadata !3, i32 0}; [DW_TAG_structure_type ]
+!3 = metadata !{metadata !4}
+!4 = metadata !{i32 458765, metadata !1, metadata !"j", metadata !1, i32 2, i64 32, i64 32, i64 0, i32 0, metadata !5}; [DW_TAG_member ]
+!5 = metadata !{i32 458790, metadata !1, metadata !"", null, i32 0, i64 0, i64 0, i64 0, i32 0, null}; [DW_TAG_const_type ]