diff options
author | Manman Ren <manman.ren@gmail.com> | 2013-10-31 17:54:35 +0000 |
---|---|---|
committer | Manman Ren <manman.ren@gmail.com> | 2013-10-31 17:54:35 +0000 |
commit | b8b70e10a2b3f252314e0d176379778fe8f3b582 (patch) | |
tree | bc8eda4c9cd5ed6c4cd419ba90c867160b6d3005 /test | |
parent | 6d6e66a3eeb579794378dd528e73645ea54bc69b (diff) | |
download | llvm-b8b70e10a2b3f252314e0d176379778fe8f3b582.tar.gz llvm-b8b70e10a2b3f252314e0d176379778fe8f3b582.tar.bz2 llvm-b8b70e10a2b3f252314e0d176379778fe8f3b582.tar.xz |
Debug Info: remove duplication of DIEs when a DIE can be shared across CUs.
We add a map in DwarfDebug to map MDNodes that are shareable across CUs to the
corresponding DIEs: MDTypeNodeToDieMap. These DIEs can be shared across CUs,
that is why we keep the maps in DwarfDebug instead of CompileUnit.
We make the assumption that if a DIE is not added to an owner yet, we assume
it belongs to the current CU. Since DIEs for the type system are added to
their owners immediately after creation, and other DIEs belong to the current
CU, the assumption should be true.
A testing case is added to show that we only create a single DIE for a type
MDNode and we use ref_addr to refer to the type DIE.
We also add a testing case to show ref_addr relocations for non-darwin
platforms.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193779 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r-- | test/DebugInfo/X86/ref_addr_relocation.ll | 70 | ||||
-rw-r--r-- | test/Linker/Inputs/type-unique-simple2-a.ll | 10 | ||||
-rw-r--r-- | test/Linker/type-unique-simple-a.ll | 24 | ||||
-rw-r--r-- | test/Linker/type-unique-simple2.ll | 2 |
4 files changed, 101 insertions, 5 deletions
diff --git a/test/DebugInfo/X86/ref_addr_relocation.ll b/test/DebugInfo/X86/ref_addr_relocation.ll new file mode 100644 index 0000000000..3c1221fcba --- /dev/null +++ b/test/DebugInfo/X86/ref_addr_relocation.ll @@ -0,0 +1,70 @@ +; RUN: llc -filetype=asm -O0 -mtriple=x86_64-linux-gnu < %s | FileCheck %s +; RUN: llc -filetype=obj -O0 %s -mtriple=x86_64-linux-gnu -o %t +; RUN: llvm-dwarfdump %t | FileCheck %s -check-prefix=CHECK-DWARF + +; RUN: llc -filetype=obj %s -mtriple=x86_64-apple-darwin -o %t2 +; RUN: llvm-dwarfdump %t2 | FileCheck %s -check-prefix=DARWIN-DWARF + +; Testing case generated from: +; clang++ tu1.cpp tu2.cpp -g -emit-llvm -c +; llvm-link tu1.bc tu2.bc -o tu12.ll -S +; cat hdr.h +; struct foo { +; }; +; cat tu1.cpp +; #include "hdr.h" +; foo f; +; cat tu2.cpp +; #include "hdr.h" +; foo g; + +; Make sure we use relocation for ref_addr on non-darwin platforms. +; CHECK: DW_TAG_compile_unit +; CHECK: DW_TAG_variable +; CHECK: .long [[TYPE:.*]] # DW_AT_type +; CHECK: DW_TAG_structure_type +; CHECK: debug_info_end0 +; CHECK: DW_TAG_compile_unit +; CHECK-NOT: DW_TAG_structure_type +; This variable's type is in the 1st CU. +; CHECK: DW_TAG_variable +; Make sure this is relocatable. +; CHECK: .quad .Lsection_info+[[TYPE]] # DW_AT_type +; CHECK-NOT: DW_TAG_structure_type +; CHECK: debug_info_end1 + +; CHECK-DWARF: DW_TAG_compile_unit +; CHECK-DWARF: 0x[[ADDR:.*]]: DW_TAG_structure_type +; CHECK-DWARF: DW_TAG_compile_unit +; CHECK-DWARF: DW_TAG_variable +; CHECK-DWARF: DW_AT_type [DW_FORM_ref_addr] {{.*}}[[ADDR]]) + +; DARWIN-DWARF: DW_TAG_compile_unit +; DARWIN-DWARF: 0x[[ADDR:.*]]: DW_TAG_structure_type +; DARWIN-DWARF: DW_TAG_compile_unit +; DARWIN-DWARF: DW_TAG_variable +; DARWIN-DWARF: DW_AT_type [DW_FORM_ref_addr] {{.*}}[[ADDR]]) + +%struct.foo = type { i8 } + +@f = global %struct.foo zeroinitializer, align 1 +@g = global %struct.foo zeroinitializer, align 1 + +!llvm.dbg.cu = !{!0, !9} +!llvm.module.flags = !{!14} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 (trunk 191799)", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !2, metadata !6, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/Users/manmanren/test-Nov/type_unique_air/ref_addr/tu1.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"tu1.cpp", metadata !"/Users/manmanren/test-Nov/type_unique_air/ref_addr"} +!2 = metadata !{i32 0} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786451, metadata !5, null, metadata !"foo", i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !2, i32 0, null, null, metadata !"_ZTS3foo"} ; [ DW_TAG_structure_type ] [foo] [line 1, size 8, align 8, offset 0] [def] [from ] +!5 = metadata !{metadata !"./hdr.h", metadata !"/Users/manmanren/test-Nov/type_unique_air/ref_addr"} +!6 = metadata !{metadata !7} +!7 = metadata !{i32 786484, i32 0, null, metadata !"f", metadata !"f", metadata !"", metadata !8, i32 2, metadata !4, i32 0, i32 1, %struct.foo* @f, null} ; [ DW_TAG_variable ] [f] [line 2] [def] +!8 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/Users/manmanren/test-Nov/type_unique_air/ref_addr/tu1.cpp] +!9 = metadata !{i32 786449, metadata !10, i32 4, metadata !"clang version 3.4 (trunk 191799)", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !2, metadata !11, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/Users/manmanren/test-Nov/type_unique_air/ref_addr/tu2.cpp] [DW_LANG_C_plus_plus] +!10 = metadata !{metadata !"tu2.cpp", metadata !"/Users/manmanren/test-Nov/type_unique_air/ref_addr"} +!11 = metadata !{metadata !12} +!12 = metadata !{i32 786484, i32 0, null, metadata !"g", metadata !"g", metadata !"", metadata !13, i32 2, metadata !4, i32 0, i32 1, %struct.foo* @g, null} ; [ DW_TAG_variable ] [g] [line 2] [def] +!13 = metadata !{i32 786473, metadata !10} ; [ DW_TAG_file_type ] [/Users/manmanren/test-Nov/type_unique_air/ref_addr/tu2.cpp] +!14 = metadata !{i32 2, metadata !"Dwarf Version", i32 2} diff --git a/test/Linker/Inputs/type-unique-simple2-a.ll b/test/Linker/Inputs/type-unique-simple2-a.ll index 20cfd54505..50581267d5 100644 --- a/test/Linker/Inputs/type-unique-simple2-a.ll +++ b/test/Linker/Inputs/type-unique-simple2-a.ll @@ -1,14 +1,18 @@ -; CHECK: 0x[[INT:.*]]: DW_TAG_base_type -; CHECK-NEXT: DW_AT_name {{.*}} = "int" -; CHECK-NOT: DW_TAG_base_type +; Make sure the backend generates a single DIE and uses ref_addr. ; CHECK: 0x[[BASE:.*]]: DW_TAG_structure_type ; CHECK-NEXT: DW_AT_name {{.*}} = "Base" ; CHECK-NOT: DW_TAG_structure_type +; CHECK: 0x[[INT:.*]]: DW_TAG_base_type +; CHECK-NEXT: DW_AT_name {{.*}} = "int" +; CHECK-NOT: DW_TAG_base_type + +; CHECK: DW_TAG_compile_unit ; CHECK: DW_TAG_formal_parameter ; CHECK: DW_AT_type [DW_FORM_ref_addr] {{.*}}[[INT]]) ; CHECK: DW_TAG_variable ; CHECK: DW_AT_type [DW_FORM_ref_addr] {{.*}}[[BASE]]) +; Make sure llvm-link only generates a single copy of the struct. ; LINK: DW_TAG_structure_type ; LINK-NOT: DW_TAG_structure_type diff --git a/test/Linker/type-unique-simple-a.ll b/test/Linker/type-unique-simple-a.ll index c8f9462d80..808563f293 100644 --- a/test/Linker/type-unique-simple-a.ll +++ b/test/Linker/type-unique-simple-a.ll @@ -1,7 +1,27 @@ -; RUN: llvm-link %s %p/type-unique-simple-b.ll -S -o - | FileCheck %s +; REQUIRES: object-emission -; CHECK: DW_TAG_structure_type +; RUN: llvm-link %s %p/type-unique-simple-b.ll -S -o %t +; RUN: cat %t | FileCheck %s -check-prefix=LINK +; RUN: llc -filetype=obj -O0 < %t > %t2 +; RUN: llvm-dwarfdump -debug-dump=info %t2 | FileCheck %s + +; Make sure the backend generates a single DIE and uses ref_addr. +; CHECK: 0x[[BASE:.*]]: DW_TAG_structure_type +; CHECK-NEXT: DW_AT_name {{.*}} = "Base" ; CHECK-NOT: DW_TAG_structure_type +; CHECK: 0x[[INT:.*]]: DW_TAG_base_type +; CHECK-NEXT: DW_AT_name {{.*}} = "int" +; CHECK-NOT: DW_TAG_base_type + +; CHECK: DW_TAG_compile_unit +; CHECK: DW_TAG_formal_parameter +; CHECK: DW_AT_type [DW_FORM_ref_addr] {{.*}}[[INT]]) +; CHECK: DW_TAG_variable +; CHECK: DW_AT_type [DW_FORM_ref_addr] {{.*}}[[BASE]]) + +; Make sure llvm-link only generates a single copy of the struct. +; LINK: DW_TAG_structure_type +; LINK-NOT: DW_TAG_structure_type ; Content of header files: ; struct Base { ; int a; diff --git a/test/Linker/type-unique-simple2.ll b/test/Linker/type-unique-simple2.ll index 83e4715bf0..ead91df6da 100644 --- a/test/Linker/type-unique-simple2.ll +++ b/test/Linker/type-unique-simple2.ll @@ -2,3 +2,5 @@ ; RUN: llvm-link %S/Inputs/type-unique-simple2-a.ll %S/Inputs/type-unique-simple2-b.ll -S -o %t ; RUN: cat %t | FileCheck %S/Inputs/type-unique-simple2-a.ll -check-prefix=LINK +; RUN: llc -filetype=obj -O0 < %t > %t2 +; RUN: llvm-dwarfdump -debug-dump=info %t2 | FileCheck %S/Inputs/type-unique-simple2-a.ll |