diff options
Diffstat (limited to 'test/DebugInfo')
205 files changed, 7985 insertions, 1294 deletions
diff --git a/test/DebugInfo/2009-11-05-DeadGlobalVariable.ll b/test/DebugInfo/2009-11-05-DeadGlobalVariable.ll index 6fd788704bc2..65907d679780 100644 --- a/test/DebugInfo/2009-11-05-DeadGlobalVariable.ll +++ b/test/DebugInfo/2009-11-05-DeadGlobalVariable.ll @@ -1,5 +1,5 @@ ; RUN: llc %s -o /dev/null -; Here variable bar is optimzied away. Do not trip over while trying to generate debug info. +; Here variable bar is optimized away. Do not trip over while trying to generate debug info. define i32 @foo() nounwind uwtable readnone ssp { @@ -13,13 +13,11 @@ entry: !0 = metadata !{i32 720913, metadata !17, i32 12, metadata !"clang version 3.0 (trunk 139632)", i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !12, null, metadata !""} ; [ DW_TAG_compile_unit ] !1 = metadata !{i32 0} !3 = metadata !{metadata !5} -!5 = metadata !{i32 720942, metadata !17, metadata !6, metadata !"foo", metadata !"foo", metadata !"", i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 true, i32 ()* @foo, null, null, metadata !10, i32 0} ; [ DW_TAG_subprogram ] [line 1] [def] [scope 0] [foo] +!5 = metadata !{i32 720942, metadata !17, metadata !6, metadata !"foo", metadata !"foo", metadata !"", i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 true, i32 ()* @foo, null, null, null, i32 0} ; [ DW_TAG_subprogram ] [line 1] [def] [scope 0] [foo] !6 = metadata !{i32 720937, metadata !17} ; [ DW_TAG_file_type ] !7 = metadata !{i32 720917, i32 0, null, i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !8 = metadata !{metadata !9} !9 = metadata !{i32 720932, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!10 = metadata !{metadata !11} -!11 = metadata !{i32 720932} ; [ DW_TAG_base_type ] !12 = metadata !{metadata !14} !14 = metadata !{i32 720948, i32 0, metadata !5, metadata !"bar", metadata !"bar", metadata !"", metadata !6, i32 2, metadata !9, i32 1, i32 1, null, null} ; [ DW_TAG_variable ] !15 = metadata !{i32 3, i32 3, metadata !16, null} diff --git a/test/DebugInfo/2009-11-06-NamelessGlobalVariable.ll b/test/DebugInfo/2009-11-06-NamelessGlobalVariable.ll index 5a1045905306..9beab2008b88 100644 --- a/test/DebugInfo/2009-11-06-NamelessGlobalVariable.ll +++ b/test/DebugInfo/2009-11-06-NamelessGlobalVariable.ll @@ -5,7 +5,7 @@ !llvm.module.flags = !{!9} !0 = metadata !{i32 720913, metadata !8, i32 12, metadata !"clang version 3.0 (trunk 139632)", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !2, metadata !3, null, metadata !""} ; [ DW_TAG_compile_unit ] -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 720948, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !6, i32 2, metadata !7, i32 0, i32 1, i32* @0, null} ; [ DW_TAG_variable ] !6 = metadata !{i32 720937, metadata !8} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/2009-11-10-CurrentFn.ll b/test/DebugInfo/2009-11-10-CurrentFn.ll index d154c4399860..151d631d6868 100644 --- a/test/DebugInfo/2009-11-10-CurrentFn.ll +++ b/test/DebugInfo/2009-11-10-CurrentFn.ll @@ -14,7 +14,7 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !llvm.module.flags = !{!18} !0 = metadata !{i32 720913, metadata !17, i32 12, metadata !"clang version 3.0 (trunk 139632)", i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, null, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!1 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 720942, metadata !17, metadata !6, metadata !"bar", metadata !"bar", metadata !"", i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void (i32)* @bar, null, null, metadata !9, metadata !""} ; [ DW_TAG_subprogram ] [line 3] [def] [scope 0] [bar] !6 = metadata !{i32 720937, metadata !17} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/2010-01-19-DbgScope.ll b/test/DebugInfo/2010-01-19-DbgScope.ll deleted file mode 100644 index 1a7e378374cd..000000000000 --- a/test/DebugInfo/2010-01-19-DbgScope.ll +++ /dev/null @@ -1,35 +0,0 @@ -; RUN: llc -O0 < %s -o /dev/null -; Ignore unreachable scopes. -declare void @foo(i32) noreturn - -define i32 @bar() nounwind ssp { -entry: - br i1 undef, label %bb, label %bb11, !dbg !0 - -bb: ; preds = %entry - call void @foo(i32 0) noreturn nounwind, !dbg !7 - unreachable, !dbg !7 - -bb11: ; preds = %entry - ret i32 1, !dbg !11 -} - -!llvm.dbg.cu = !{!3} -!llvm.module.flags = !{!15} - -!0 = metadata !{i32 8647, i32 0, metadata !1, null} -!1 = metadata !{i32 458763, metadata !12, metadata !2, i32 0, i32 0, i32 0} ; [ DW_TAG_lexical_block ] -!2 = metadata !{i32 458798, null, metadata !3, metadata !"bar", metadata !"bar", metadata !"bar", i32 8639, metadata !4, i1 true, i1 true, i32 0, i32 0, null, i32 0, i32 0, null, null, null, null, i32 0} ; [ DW_TAG_subprogram ] -!3 = metadata !{i32 458769, metadata !12, i32 1, metadata !"LLVM build 00", i1 true, metadata !"", i32 0, metadata !13, metadata !13, metadata !14, null, null, metadata !""} ; [ DW_TAG_compile_unit ] -!4 = metadata !{i32 458773, null, metadata !3, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !5, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!5 = metadata !{metadata !6} -!6 = metadata !{i32 458788, null, metadata !3, metadata !"char", i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] -!7 = metadata !{i32 8648, i32 0, metadata !8, null} -!8 = metadata !{i32 458763, metadata !12, metadata !9, i32 0, i32 0, i32 0} ; [ DW_TAG_lexical_block ] -!9 = metadata !{i32 458763, metadata !12, metadata !10, i32 0, i32 0, i32 0} ; [ DW_TAG_lexical_block ] -!10 = metadata !{i32 458798, null, metadata !3, metadata !"bar2", metadata !"bar2", metadata !"bar2", i32 8639, metadata !4, i1 true, i1 true, i32 0, i32 0, null, i32 0, i32 0, null, null, null, null, i32 0} ; [ DW_TAG_subprogram ] -!11 = metadata !{i32 8652, i32 0, metadata !1, null} -!12 = metadata !{metadata !"c-parser.c", metadata !"llvmgcc"} -!13 = metadata !{i32 0} -!14 = metadata !{metadata !2} -!15 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/DebugInfo/2010-03-19-DbgDeclare.ll b/test/DebugInfo/2010-03-19-DbgDeclare.ll index d1afade4ad9f..94aa259d31b6 100644 --- a/test/DebugInfo/2010-03-19-DbgDeclare.ll +++ b/test/DebugInfo/2010-03-19-DbgDeclare.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -verify -S -asm-verbose | FileCheck %s +; RUN: opt < %s -verify -S | FileCheck %s ; CHECK: lang 0x8001 @@ -9,7 +9,7 @@ entry: } !llvm.dbg.cu = !{!2} !llvm.module.flags = !{!5} -!2 = metadata !{i32 786449, metadata !4, i32 32769, metadata !"clang version 3.3 ", i1 false, metadata !"", i32 0, metadata !3, metadata !3, metadata !3, metadata !3, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/blaikie/dev/scratch/scratch.cpp] [lang 0x8001] +!2 = metadata !{i32 786449, metadata !4, i32 32769, metadata !"clang version 3.3 ", i1 false, metadata !"", i32 0, metadata !3, metadata !3, metadata !3, metadata !3, metadata !3, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/blaikie/dev/scratch/scratch.cpp] [lang 0x8001] !3 = metadata !{} !0 = metadata !{i32 662302, i32 26, metadata !1, null} !1 = metadata !{i32 4, metadata !"foo"} diff --git a/test/DebugInfo/2010-03-24-MemberFn.ll b/test/DebugInfo/2010-03-24-MemberFn.ll index 1689fe6c91a8..4ea9d2cf9861 100644 --- a/test/DebugInfo/2010-03-24-MemberFn.ll +++ b/test/DebugInfo/2010-03-24-MemberFn.ll @@ -1,4 +1,4 @@ -; RUN: llc -O0 < %s | grep AT_decl_file | grep 2 +; RUN: %llc_dwarf -O0 < %s | grep AT_decl_file | grep 2 ; Here _ZN1S3fooEv is defined in header file identified as AT_decl_file no. 2 in debug info. %struct.S = type <{ i8 }> diff --git a/test/DebugInfo/2010-04-06-NestedFnDbgInfo.ll b/test/DebugInfo/2010-04-06-NestedFnDbgInfo.ll index 4d4d61665c07..5f7cb696d738 100644 --- a/test/DebugInfo/2010-04-06-NestedFnDbgInfo.ll +++ b/test/DebugInfo/2010-04-06-NestedFnDbgInfo.ll @@ -1,6 +1,22 @@ -; RUN: llvm-as < %s | llc -asm-verbose -O0 | grep AT_specification | count 2 +; REQUIRES: object-emission + +; RUN: %llc_dwarf -O0 -filetype=obj -o - < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s ; Radar 7833483 -; Do not emit AT_specification for nested function foo. +; Do not emit a separate out-of-line definition DIE for the function-local 'foo' +; function (member of the function local 'A' type) +; CHECK: DW_TAG_class_type +; CHECK: DW_TAG_class_type +; CHECK-NEXT: DW_AT_name {{.*}} "A" +; Check that the subprogram inside the class definition has low_pc, only +; attached to the definition. +; CHECK: [[FOO_INL:0x........]]: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_low_pc +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_MIPS_linkage_name {{.*}} "_ZZN1B2fnEvEN1A3fooEv" +; And just double check that there's no out of line definition that references +; this subprogram. +; CHECK-NOT: DW_AT_specification {{.*}} {[[FOO_INL]]} %class.A = type { i8 } %class.B = type { i8 } diff --git a/test/DebugInfo/2010-04-19-FramePtr.ll b/test/DebugInfo/2010-04-19-FramePtr.ll index 4af2fdcdfa8a..6c772230d93c 100644 --- a/test/DebugInfo/2010-04-19-FramePtr.ll +++ b/test/DebugInfo/2010-04-19-FramePtr.ll @@ -1,6 +1,6 @@ -; RUN: llc -asm-verbose -O1 -o %t < %s +; RUN: %llc_dwarf -asm-verbose -O1 -o %t < %s ; RUN: grep DW_AT_APPLE_omit_frame_ptr %t -; RUN: llc -disable-fp-elim -asm-verbose -O1 -o %t < %s +; RUN: %llc_dwarf -disable-fp-elim -asm-verbose -O1 -o %t < %s ; RUN: grep -v DW_AT_APPLE_omit_frame_ptr %t diff --git a/test/DebugInfo/2010-05-10-MultipleCU.ll b/test/DebugInfo/2010-05-10-MultipleCU.ll index ad7c7d1614a5..75d2e7084d21 100644 --- a/test/DebugInfo/2010-05-10-MultipleCU.ll +++ b/test/DebugInfo/2010-05-10-MultipleCU.ll @@ -1,20 +1,11 @@ -; RUN: llc -O0 -asm-verbose < %s | FileCheck %s -; One for a.c, second one for b.c and third one for abbrev. +; REQUIRES: object-emission -; CHECK: info_begin -; CHECK: DW_TAG_compile_unit -; CHECK-NOT: DW_TAG_compile_unit -; CHECK: info_end +; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s -; CHECK: info_begin -; CHECK: DW_TAG_compile_unit -; CHECK-NOT: DW_TAG_compile_unit -; CHECK: info_end +; Check that two compile units are generated -; CHECK: abbrev_begin -; CHECK: DW_TAG_compile_unit -; CHECK-NOT: DW_TAG_compile_unit -; CHECK: abbrev_end +; CHECK: Compile Unit: +; CHECK: Compile Unit: define i32 @foo() nounwind readnone ssp { return: diff --git a/test/DebugInfo/2010-06-29-InlinedFnLocalVar.ll b/test/DebugInfo/2010-06-29-InlinedFnLocalVar.ll index 50a34222fe63..a461abdcdf5b 100644 --- a/test/DebugInfo/2010-06-29-InlinedFnLocalVar.ll +++ b/test/DebugInfo/2010-06-29-InlinedFnLocalVar.ll @@ -1,4 +1,4 @@ -; RUN: llc -O2 %s -o - | FileCheck %s +; RUN: %llc_dwarf -O2 %s -o - | FileCheck %s ; Check struct X for dead variable xyz from inlined function foo. ; CHECK: DW_TAG_structure_type @@ -15,7 +15,7 @@ define i32 @bar() nounwind ssp { entry: %0 = load i32* @i, align 4, !dbg !17 ; <i32> [#uses=2] tail call void @llvm.dbg.value(metadata !{i32 %0}, i64 0, metadata !9), !dbg !19 - tail call void @llvm.dbg.declare(metadata !20, metadata !10), !dbg !21 + tail call void @llvm.dbg.declare(metadata !29, metadata !10), !dbg !21 %1 = mul nsw i32 %0, %0, !dbg !22 ; <i32> [#uses=2] store i32 %1, i32* @i, align 4, !dbg !17 ret i32 %1, !dbg !23 @@ -26,7 +26,7 @@ entry: !0 = metadata !{i32 786478, metadata !27, metadata !1, metadata !"foo", metadata !"foo", metadata !"", i32 9, metadata !3, i1 true, i1 true, i32 0, i32 0, null, i1 false, i1 true, null, null, null, metadata !24, i32 9} ; [ DW_TAG_subprogram ] !1 = metadata !{i32 786473, metadata !27} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 786449, metadata !27, i32 1, metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, metadata !"", i32 0, metadata !20, metadata !20, metadata !25, metadata !26, metadata !26, metadata !""} ; [ DW_TAG_compile_unit ] +!2 = metadata !{i32 786449, metadata !27, i32 1, metadata !"4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", i1 true, metadata !"", i32 0, metadata !20, metadata !20, metadata !25, metadata !26, metadata !20, metadata !""} ; [ DW_TAG_compile_unit ] !3 = metadata !{i32 786453, metadata !27, metadata !1, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !4 = metadata !{metadata !5, metadata !5} !5 = metadata !{i32 786468, metadata !27, metadata !1, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] @@ -44,7 +44,7 @@ entry: !17 = metadata !{i32 15, i32 0, metadata !18, null} !18 = metadata !{i32 786443, metadata !1, metadata !6, i32 14, i32 0, i32 1} ; [ DW_TAG_lexical_block ] !19 = metadata !{i32 9, i32 0, metadata !0, metadata !17} -!20 = metadata !{null} +!20 = metadata !{} !21 = metadata !{i32 9, i32 0, metadata !11, metadata !17} !22 = metadata !{i32 11, i32 0, metadata !11, metadata !17} !23 = metadata !{i32 16, i32 0, metadata !18, null} @@ -53,3 +53,4 @@ entry: !26 = metadata !{metadata !16} !27 = metadata !{metadata !"bar.c", metadata !"/tmp/"} !28 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!29 = metadata !{null} diff --git a/test/DebugInfo/2010-07-19-Crash.ll b/test/DebugInfo/2010-07-19-Crash.ll index 6b6e61ddc28a..a10b10a7d145 100644 --- a/test/DebugInfo/2010-07-19-Crash.ll +++ b/test/DebugInfo/2010-07-19-Crash.ll @@ -25,6 +25,6 @@ entry: !10 = metadata !{i32 524299, metadata !12, metadata !0, i32 3, i32 11, i32 0} ; [ DW_TAG_lexical_block ] !11 = metadata !{i32 524334, metadata !12, metadata !1, metadata !"foo", metadata !"foo", metadata !"foo", i32 7, metadata !3, i1 true, i1 false, i32 0, i32 0, null, i1 false, i1 true, null, null, null, null, i32 0} ; [ DW_TAG_subprogram ] !12 = metadata !{metadata !"one.c", metadata !"/private/tmp"} -!13 = metadata !{metadata !0, metadata !6, metadata !11} +!13 = metadata !{metadata !0} !14 = metadata !{i32 0} !15 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/DebugInfo/AArch64/cfi-frame.ll b/test/DebugInfo/AArch64/cfi-frame.ll deleted file mode 100644 index 7290ddf357c1..000000000000 --- a/test/DebugInfo/AArch64/cfi-frame.ll +++ /dev/null @@ -1,58 +0,0 @@ -; RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s -; RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -disable-fp-elim < %s | FileCheck %s --check-prefix=CHECK-WITH-FP - -@bigspace = global [8 x i64] zeroinitializer - -declare void @use_addr(i8*) - -define void @test_frame([8 x i64] %val) { -; CHECK: test_frame: -; CHECK: .cfi_startproc - - %var = alloca i8, i32 1000000 -; CHECK: sub sp, sp, #[[SP_INIT_ADJ:[0-9]+]] -; CHECK-NEXT: .Ltmp -; CHECK-NEXT: .cfi_def_cfa sp, [[SP_INIT_ADJ]] - -; Make sure the prologue is reasonably efficient -; CHECK-NEXT: stp x29, x30, [sp, -; CHECK-NEXT: stp x25, x26, [sp, -; CHECK-NEXT: stp x23, x24, [sp, -; CHECK-NEXT: stp x21, x22, [sp, -; CHECK-NEXT: stp x19, x20, [sp, -; CHECK-NEXT: sub sp, sp, #160 -; CHECK-NEXT: sub sp, sp, #244, lsl #12 -; CHECK-NEXT: .Ltmp -; CHECK-NEXT: .cfi_def_cfa sp, 1000080 -; CHECK-NEXT: .Ltmp -; CHECK-NEXT: .cfi_offset x30, -8 -; CHECK-NEXT: .Ltmp -; CHECK-NEXT: .cfi_offset x29, -16 -; [...] -; CHECK: .cfi_offset x19, -80 - -; CHECK: bl use_addr - call void @use_addr(i8* %var) - - store [8 x i64] %val, [8 x i64]* @bigspace - ret void -; CHECK: ret -; CHECK: .cfi_endproc -} - -; CHECK-WITH-FP: test_frame: - -; CHECK-WITH-FP: sub sp, sp, #[[SP_INIT_ADJ:[0-9]+]] -; CHECK-WITH-FP-NEXT: .Ltmp -; CHECK-WITH-FP-NEXT: .cfi_def_cfa sp, [[SP_INIT_ADJ]] - -; CHECK-WITH-FP: stp x29, x30, [sp, [[OFFSET:#[0-9]+]]] -; CHECK-WITH-FP-NEXT: add x29, sp, [[OFFSET]] -; CHECK-WITH-FP-NEXT: .Ltmp -; CHECK-WITH-FP-NEXT: .cfi_def_cfa x29, 16 - - ; We shouldn't emit any kind of update for the second stack adjustment if the - ; FP is in use. -; CHECK-WITH-FP-NOT: .cfi_def_cfa_offset - -; CHECK-WITH-FP: bl use_addr diff --git a/test/DebugInfo/AArch64/dwarfdump.ll b/test/DebugInfo/AArch64/dwarfdump.ll index 4c205077e6d8..98e863dbb4b5 100644 --- a/test/DebugInfo/AArch64/dwarfdump.ll +++ b/test/DebugInfo/AArch64/dwarfdump.ll @@ -1,4 +1,7 @@ -; RUN: llc -mtriple=aarch64-non-linux-gnu < %s -filetype=obj | llvm-dwarfdump - | FileCheck %s +; RUN: llc -mtriple=aarch64-non-linux-gnu -dwarf-version=4 < %s -filetype=obj \ +; RUN: | llvm-dwarfdump - | FileCheck -check-prefix=CHECK -check-prefix=CHECK-4 %s +; RUN: llc -mtriple=aarch64-non-linux-gnu -dwarf-version=3 < %s -filetype=obj \ +; RUN: | llvm-dwarfdump - | FileCheck -check-prefix=CHECK -check-prefix=CHECK-3 %s ; We're mostly checking that relocations are applied correctly ; here. Currently R_AARCH64_ABS32 is used for references to debug data @@ -12,7 +15,8 @@ ; A couple of ABS64s similarly: ; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) -; CHECK: DW_AT_high_pc [DW_FORM_addr] (0x0000000000000008) +; CHECK-4: DW_AT_high_pc [DW_FORM_data4] (0x00000008) +; CHECK-3: DW_AT_high_pc [DW_FORM_addr] (0x0000000000000008) define i32 @main() nounwind { ret i32 0, !dbg !8 @@ -24,7 +28,7 @@ attributes #0 = { nounwind } !llvm.module.flags = !{!10} !0 = metadata !{i32 786449, metadata !9, i32 12, metadata !"clang version 3.3 ", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !2, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/home/timnor01/llvm/build/tmp.c] [DW_LANG_C99] -!1 = metadata !{i32 0} +!1 = metadata !{} !2 = metadata !{metadata !3} !3 = metadata !{i32 786478, metadata !9, metadata !4, metadata !"main", metadata !"main", metadata !"", i32 1, metadata !5, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main, null, null, metadata !1, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [main] !4 = metadata !{i32 786473, metadata !9} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/AArch64/eh_frame.s b/test/DebugInfo/AArch64/eh_frame.s index d8d6b6d9325f..12a58961d717 100644 --- a/test/DebugInfo/AArch64/eh_frame.s +++ b/test/DebugInfo/AArch64/eh_frame.s @@ -17,7 +17,7 @@ foo: // Output is: // CHECK: Contents of section .eh_frame: -// CHECK-NEXT: 0000 10000000 00000000 017a5200 017c1e01 .........zR..|.. +// CHECK-NEXT: 0000 10000000 00000000 037a5200 017c1e01 .........zR..|.. // CHECK-NEXT: 0010 1b0c1f00 10000000 18000000 00000000 ................ @@ -30,7 +30,7 @@ foo: // ------------------- // 10000000: length of first CIE = 0x10 // 00000000: This is a CIE -// 01: version = 0x1 +// 03: version = 0x3 // 7a 52 00: augmentation string "zR" -- pointer format is specified // 01: code alignment factor 1 // 7c: data alignment factor -4 diff --git a/test/DebugInfo/AArch64/eh_frame_personality.ll b/test/DebugInfo/AArch64/eh_frame_personality.ll index d35f2a2fcafb..51d6bf80b950 100644 --- a/test/DebugInfo/AArch64/eh_frame_personality.ll +++ b/test/DebugInfo/AArch64/eh_frame_personality.ll @@ -16,7 +16,7 @@ clean: } ; CHECK: Contents of section .eh_frame: -; CHECK: 0000 1c000000 00000000 017a504c 5200017c .........zPLR..| +; CHECK: 0000 1c000000 00000000 037a504c 5200017c .........zPLR..| ; CHECK: 0010 1e0b0000 00000000 00000000 1b0c1f00 ................ ; Don't really care about the rest: @@ -33,7 +33,7 @@ clean: ; ---------- ; 1c000000: Length = 0x1c ; 00000000: This is a CIE -; 01: Version 1 +; 03: Version 3 ; 7a 50 4c 52 00: Augmentation string "zPLR" (personality routine, language-specific data, pointer format) ; 01: Code alignment factor 1 ; 78: Data alignment factor: -8 diff --git a/test/DebugInfo/AArch64/lit.local.cfg b/test/DebugInfo/AArch64/lit.local.cfg index 9a66a00189ea..cec29af5bbe4 100644 --- a/test/DebugInfo/AArch64/lit.local.cfg +++ b/test/DebugInfo/AArch64/lit.local.cfg @@ -1,4 +1,3 @@ -targets = set(config.root.targets_to_build.split()) -if not 'AArch64' in targets: +if not 'AArch64' in config.root.targets: config.unsupported = True diff --git a/test/DebugInfo/AArch64/struct_by_value.ll b/test/DebugInfo/AArch64/struct_by_value.ll new file mode 100644 index 000000000000..0e336f799c54 --- /dev/null +++ b/test/DebugInfo/AArch64/struct_by_value.ll @@ -0,0 +1,70 @@ +; A by-value struct is a register-indirect value (breg). +; RUN: llc %s -filetype=asm -o - | FileCheck %s + +; CHECK: DW_AT_location +; CHECK-NEXT: .byte 112 +; 112 = 0x70 = DW_OP_breg0 + +; rdar://problem/13658587 +; +; Generated from +; +; struct five +; { +; int a; +; int b; +; int c; +; int d; +; int e; +; }; +; +; int +; return_five_int (struct five f) +; { +; return f.a; +; } + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n32:64-S128" +target triple = "arm64-apple-ios3.0.0" + +%struct.five = type { i32, i32, i32, i32, i32 } + +; Function Attrs: nounwind ssp +define i32 @return_five_int(%struct.five* %f) #0 { +entry: + call void @llvm.dbg.declare(metadata !{%struct.five* %f}, metadata !17), !dbg !18 + %a = getelementptr inbounds %struct.five* %f, i32 0, i32 0, !dbg !19 + %0 = load i32* %a, align 4, !dbg !19 + ret i32 %0, !dbg !19 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +attributes #0 = { nounwind ssp } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!16, !20} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"LLVM version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [struct_by_value.c] [DW_LANG_C99] +!1 = metadata !{metadata !"struct_by_value.c", metadata !""} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"return_five_int", metadata !"return_five_int", metadata !"", i32 13, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (%struct.five*)* @return_five_int, null, null, metadata !2, i32 14} ; [ DW_TAG_subprogram ] [line 13] [def] [scope 14] [return_five_int] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [struct_by_value.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{metadata !8, metadata !9} +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{i32 786451, metadata !1, null, metadata !"five", i32 1, i64 160, i64 32, i32 0, i32 0, null, metadata !10, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [five] [line 1, size 160, align 32, offset 0] [def] [from ] +!10 = metadata !{metadata !11, metadata !12, metadata !13, metadata !14, metadata !15} +!11 = metadata !{i32 786445, metadata !1, metadata !9, metadata !"a", i32 3, i64 32, i64 32, i64 0, i32 0, metadata !8} ; [ DW_TAG_member ] [a] [line 3, size 32, align 32, offset 0] [from int] +!12 = metadata !{i32 786445, metadata !1, metadata !9, metadata !"b", i32 4, i64 32, i64 32, i64 32, i32 0, metadata !8} ; [ DW_TAG_member ] [b] [line 4, size 32, align 32, offset 32] [from int] +!13 = metadata !{i32 786445, metadata !1, metadata !9, metadata !"c", i32 5, i64 32, i64 32, i64 64, i32 0, metadata !8} ; [ DW_TAG_member ] [c] [line 5, size 32, align 32, offset 64] [from int] +!14 = metadata !{i32 786445, metadata !1, metadata !9, metadata !"d", i32 6, i64 32, i64 32, i64 96, i32 0, metadata !8} ; [ DW_TAG_member ] [d] [line 6, size 32, align 32, offset 96] [from int] +!15 = metadata !{i32 786445, metadata !1, metadata !9, metadata !"e", i32 7, i64 32, i64 32, i64 128, i32 0, metadata !8} ; [ DW_TAG_member ] [e] [line 7, size 32, align 32, offset 128] [from int] +!16 = metadata !{i32 2, metadata !"Dwarf Version", i32 2} +!17 = metadata !{i32 786689, metadata !4, metadata !"f", metadata !5, i32 16777229, metadata !9, i32 8192, i32 0} ; [ DW_TAG_arg_variable ] [f] [line 13] +!18 = metadata !{i32 13, i32 0, metadata !4, null} +!19 = metadata !{i32 16, i32 0, metadata !4, null} +!20 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/DebugInfo/AArch64/variable-loc.ll b/test/DebugInfo/AArch64/variable-loc.ll deleted file mode 100644 index f42cb746480b..000000000000 --- a/test/DebugInfo/AArch64/variable-loc.ll +++ /dev/null @@ -1,101 +0,0 @@ -; RUN: llc -mtriple=aarch64-none-linux-gnu -disable-fp-elim < %s | FileCheck %s - -; This is a regression test making sure the location of variables is correct in -; debugging information, even if they're addressed via the frame pointer. - -; In case it needs, regenerating, the following suffices: -; int printf(const char *, ...); -; void populate_array(int *, int); -; int sum_array(int *, int); - -; int main() { -; int main_arr[100], val; -; populate_array(main_arr, 100); -; val = sum_array(main_arr, 100); -; printf("Total is %d\n", val); -; return 0; -; } - - ; First make sure main_arr is where we expect it: sp + 4 == x29 - 412: -; CHECK: main: -; CHECK: sub sp, sp, #432 -; CHECK: stp x29, x30, [sp, #416] -; CHECK: add x29, sp, #416 -; CHECK: add {{x[0-9]+}}, sp, #4 - -; CHECK: .Linfo_string7: -; CHECK-NEXT: main_arr - -; Now check the debugging information reflects this: -; CHECK: DW_TAG_variable -; CHECK-NEXT: .word .Linfo_string7 - - ; Rather hard-coded, but 145 => DW_OP_fbreg and the .ascii is LEB128 encoded -412. -; CHECK: DW_AT_location -; CHECK-NEXT: .byte 145 -; CHECK-NEXT: .ascii "\344|" - - - -target datalayout = "e-p:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-i128:128:128-f32:32:32-f64:64:64-f128:128:128-n32:64-S128" -target triple = "aarch64-none-linux-gnu" - -@.str = private unnamed_addr constant [13 x i8] c"Total is %d\0A\00", align 1 - -declare void @populate_array(i32*, i32) nounwind - -declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone - -declare i32 @sum_array(i32*, i32) nounwind - -define i32 @main() nounwind { -entry: - %retval = alloca i32, align 4 - %main_arr = alloca [100 x i32], align 4 - %val = alloca i32, align 4 - store i32 0, i32* %retval - call void @llvm.dbg.declare(metadata !{[100 x i32]* %main_arr}, metadata !17), !dbg !22 - call void @llvm.dbg.declare(metadata !{i32* %val}, metadata !23), !dbg !24 - %arraydecay = getelementptr inbounds [100 x i32]* %main_arr, i32 0, i32 0, !dbg !25 - call void @populate_array(i32* %arraydecay, i32 100), !dbg !25 - %arraydecay1 = getelementptr inbounds [100 x i32]* %main_arr, i32 0, i32 0, !dbg !26 - %call = call i32 @sum_array(i32* %arraydecay1, i32 100), !dbg !26 - store i32 %call, i32* %val, align 4, !dbg !26 - %0 = load i32* %val, align 4, !dbg !27 - %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([13 x i8]* @.str, i32 0, i32 0), i32 %0), !dbg !27 - ret i32 0, !dbg !28 -} - -declare i32 @printf(i8*, ...) - -!llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!30} - -!0 = metadata !{i32 786449, metadata !29, i32 12, metadata !"clang version 3.2 ", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/home/timnor01/a64-trunk/build/simple.c] [DW_LANG_C99] -!1 = metadata !{i32 0} -!3 = metadata !{metadata !5, metadata !11, metadata !14} -!5 = metadata !{i32 786478, metadata !29, metadata !6, metadata !"populate_array", metadata !"populate_array", metadata !"", i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i32*, i32)* @populate_array, null, null, metadata !1, i32 4} ; [ DW_TAG_subprogram ] [line 4] [def] [populate_array] -!6 = metadata !{i32 786473, metadata !29} ; [ DW_TAG_file_type ] -!7 = metadata !{i32 786453, i32 0, null, i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!8 = metadata !{null, metadata !9, metadata !10} -!9 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !10} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int] -!10 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] -!11 = metadata !{i32 786478, metadata !29, metadata !6, metadata !"sum_array", metadata !"sum_array", metadata !"", i32 9, metadata !12, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32*, i32)* @sum_array, null, null, metadata !1, i32 9} ; [ DW_TAG_subprogram ] [line 9] [def] [sum_array] -!12 = metadata !{i32 786453, i32 0, null, i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !13, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!13 = metadata !{metadata !10, metadata !9, metadata !10} -!14 = metadata !{i32 786478, metadata !29, metadata !6, metadata !"main", metadata !"main", metadata !"", i32 18, metadata !15, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, metadata !1, i32 18} ; [ DW_TAG_subprogram ] [line 18] [def] [main] -!15 = metadata !{i32 786453, i32 0, null, i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !16, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!16 = metadata !{metadata !10} -!17 = metadata !{i32 786688, metadata !18, metadata !"main_arr", metadata !6, i32 19, metadata !19, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [main_arr] [line 19] -!18 = metadata !{i32 786443, metadata !29, metadata !14, i32 18, i32 16, i32 4} ; [ DW_TAG_lexical_block ] [/home/timnor01/a64-trunk/build/simple.c] -!19 = metadata !{i32 786433, null, null, metadata !"", i32 0, i64 3200, i64 32, i32 0, i32 0, metadata !10, metadata !20, i32 0, null, null, null} ; [ DW_TAG_array_type ] [line 0, size 3200, align 32, offset 0] [from int] -!20 = metadata !{i32 786465, i64 0, i64 99} ; [ DW_TAG_subrange_type ] [0, 99] -!22 = metadata !{i32 19, i32 7, metadata !18, null} -!23 = metadata !{i32 786688, metadata !18, metadata !"val", metadata !6, i32 20, metadata !10, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [val] [line 20] -!24 = metadata !{i32 20, i32 7, metadata !18, null} -!25 = metadata !{i32 22, i32 3, metadata !18, null} -!26 = metadata !{i32 23, i32 9, metadata !18, null} -!27 = metadata !{i32 24, i32 3, metadata !18, null} -!28 = metadata !{i32 26, i32 3, metadata !18, null} -!29 = metadata !{metadata !"simple.c", metadata !"/home/timnor01/a64-trunk/build"} -!30 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/DebugInfo/ARM/PR16736.ll b/test/DebugInfo/ARM/PR16736.ll index d01fa22318db..8c025ad487b4 100644 --- a/test/DebugInfo/ARM/PR16736.ll +++ b/test/DebugInfo/ARM/PR16736.ll @@ -43,7 +43,7 @@ attributes #3 = { nounwind } !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 (trunk 190804) (llvm/trunk 190797)", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [//<unknown>] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !"/<unknown>", metadata !""} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4} !4 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"h", metadata !"h", metadata !"_Z1hiiiif", i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void (i32, i32, i32, i32, float)* @_Z1hiiiif, null, null, metadata !11, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [h] !5 = metadata !{metadata !"/arm.cpp", metadata !""} diff --git a/test/DebugInfo/ARM/lit.local.cfg b/test/DebugInfo/ARM/lit.local.cfg index 8a3ba96497e7..98c6700c209d 100644 --- a/test/DebugInfo/ARM/lit.local.cfg +++ b/test/DebugInfo/ARM/lit.local.cfg @@ -1,4 +1,3 @@ -targets = set(config.root.targets_to_build.split()) -if not 'ARM' in targets: +if not 'ARM' in config.root.targets: config.unsupported = True diff --git a/test/DebugInfo/ARM/sectionorder.ll b/test/DebugInfo/ARM/sectionorder.ll new file mode 100644 index 000000000000..a7030cd1b670 --- /dev/null +++ b/test/DebugInfo/ARM/sectionorder.ll @@ -0,0 +1,17 @@ +; RUN: llc -filetype=asm %s -o - | FileCheck %s + +; Verifies that the DWARF* sections come _after_ the __TEXT sections. +; rdar://problem/15623193 + +; CHECK: .section __TEXT,__text, +; CHECK-NOT: __DWARF,__debug +; CHECK: .section __TEXT,__cstring,cstring_literals +target triple = "thumbv7-apple-ios" + +!llvm.module.flags = !{!3, !4} +!llvm.dbg.cu = !{!0} + +!0 = metadata !{i32 786449, i32 0, i32 12, metadata !"test.c", metadata !"/Volumes/Data/radar/15623193", metadata !"LLVM", i1 true, i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !1} ; [ DW_TAG_compile_unit ] [/Volumes/Data/radar/15623193/test.c] [DW_LANG_C99] +!1 = metadata !{} +!3 = metadata !{i32 2, metadata !"Dwarf Version", i32 2} +!4 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/DebugInfo/ARM/tls.ll b/test/DebugInfo/ARM/tls.ll new file mode 100644 index 000000000000..e54d16004762 --- /dev/null +++ b/test/DebugInfo/ARM/tls.ll @@ -0,0 +1,28 @@ +; RUN: llc -O0 -filetype=asm -mtriple=armv7-linux-gnuehabi < %s | FileCheck %s +; +; Generated with clang with source +; __thread int x; + +@x = thread_local global i32 0, align 4 + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!7, !8} +!llvm.ident = !{!9} + +; 6 byte of data +; CHECK: .byte 6 @ DW_AT_location +; DW_OP_const4u +; CHECK: .byte 12 +; The debug relocation of the address of the tls variable +; CHECK: .long x(tlsldo) + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !2, metadata !3, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/tmp/tls.c] [DW_LANG_C99] +!1 = metadata !{metadata !"tls.c", metadata !"/tmp"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786484, i32 0, null, metadata !"x", metadata !"x", metadata !"", metadata !5, i32 1, metadata !6, i32 0, i32 1, i32* @x, null} ; [ DW_TAG_variable ] [x] [line 1] [def] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/tls.c] +!6 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!7 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!8 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!9 = metadata !{metadata !"clang version 3.5 "} diff --git a/test/DebugInfo/COFF/asan-module-ctor.ll b/test/DebugInfo/COFF/asan-module-ctor.ll new file mode 100644 index 000000000000..c1d8e75292cd --- /dev/null +++ b/test/DebugInfo/COFF/asan-module-ctor.ll @@ -0,0 +1,91 @@ +; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -O0 < %s | FileCheck --check-prefix=X86 %s + +; This LL file was generated by running clang on the following code with +; -fsanitize=address +; D:\asan.c: +; 1 int foo(void) { +; 2 return 0; +; 3 } + +; The module ctor has no debug info. All we have to do is don't crash. +; X86: _asan.module_ctor: +; X86-NEXT: # BB +; X86-NEXT: calll ___asan_init_v3 +; X86-NEXT: retl + +; ModuleID = 'asan.c' +target datalayout = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32" +target triple = "i686-pc-win32" + +@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 1, void ()* @asan.module_ctor }] + +; Function Attrs: nounwind sanitize_address +define i32 @foo() #0 { +entry: + ret i32 0, !dbg !10 +} + +define internal void @asan.module_ctor() { + call void @__asan_init_v3() + ret void +} + +declare void @__asan_init_v3() + +declare void @__asan_report_load1(i32) + +declare void @__asan_report_load2(i32) + +declare void @__asan_report_load4(i32) + +declare void @__asan_report_load8(i32) + +declare void @__asan_report_load16(i32) + +declare void @__asan_report_store1(i32) + +declare void @__asan_report_store2(i32) + +declare void @__asan_report_store4(i32) + +declare void @__asan_report_store8(i32) + +declare void @__asan_report_store16(i32) + +declare void @__asan_report_load_n(i32, i32) + +declare void @__asan_report_store_n(i32, i32) + +declare void @__asan_handle_no_return() + +declare void @__sanitizer_cov() + +declare void @__sanitizer_ptr_cmp(i32, i32) + +declare void @__sanitizer_ptr_sub(i32, i32) + +declare void @__asan_before_dynamic_init(i32) + +declare void @__asan_after_dynamic_init() + +declare void @__asan_register_globals(i32, i32) + +declare void @__asan_unregister_globals(i32, i32) + +attributes #0 = { nounwind sanitize_address "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!7, !8} +!llvm.ident = !{!9} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 2} ; [ DW_TAG_compile_unit ] [D:\/asan.c] [DW_LANG_C99] +!1 = metadata !{metadata !"asan.c", metadata !"D:\5C"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"foo", metadata !"foo", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @foo, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [foo] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [D:\/asan.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !2, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!8 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!9 = metadata !{metadata !"clang version 3.5.0 "} +!10 = metadata !{i32 2, i32 0, metadata !4, null} diff --git a/test/DebugInfo/COFF/asan-module-without-functions.ll b/test/DebugInfo/COFF/asan-module-without-functions.ll new file mode 100644 index 000000000000..419faa0e0f35 --- /dev/null +++ b/test/DebugInfo/COFF/asan-module-without-functions.ll @@ -0,0 +1,53 @@ +; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -O0 < %s | FileCheck --check-prefix=X86 %s + +; This LL file was generated by running clang on the following code with +; -fsanitize=address +; D:\asan.c: +; 1 unsigned char c = 42; +; +; This file defines no functions, so just make sure we don't try to emit +; the line table for functions of zero size. +; X86-NOT: .section .debug$S,"rn" + +; ModuleID = 'asan.c' +target datalayout = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32" +target triple = "i686-pc-win32" + +@c = global { i8, [63 x i8] } { i8 42, [63 x i8] zeroinitializer }, align 32 +@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 1, void ()* @asan.module_ctor }] +@__asan_gen_ = private constant [7 x i8] c"asan.c\00", align 1 +@__asan_gen_1 = private unnamed_addr constant [2 x i8] c"c\00", align 1 +@0 = internal global [1 x { i32, i32, i32, i32, i32, i32 }] [{ i32, i32, i32, i32, i32, i32 } { i32 ptrtoint ({ i8, [63 x i8] }* @c to i32), i32 1, i32 64, i32 ptrtoint ([2 x i8]* @__asan_gen_1 to i32), i32 ptrtoint ([7 x i8]* @__asan_gen_ to i32), i32 0 }] +@llvm.global_dtors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 1, void ()* @asan.module_dtor }] + +define internal void @asan.module_ctor() { + call void @__asan_init_v3() + call void @__asan_register_globals(i32 ptrtoint ([1 x { i32, i32, i32, i32, i32, i32 }]* @0 to i32), i32 1) + ret void +} + +declare void @__asan_init_v3() + +declare void @__asan_before_dynamic_init(i32) + +declare void @__asan_after_dynamic_init() + +declare void @__asan_register_globals(i32, i32) + +declare void @__asan_unregister_globals(i32, i32) + +define internal void @asan.module_dtor() { + call void @__asan_unregister_globals(i32 ptrtoint ([1 x { i32, i32, i32, i32, i32, i32 }]* @0 to i32), i32 1) + ret void +} + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!3, !4} +!llvm.ident = !{!5} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !2, metadata !2, metadata !2, metadata !"", i32 2} ; [ DW_TAG_compile_unit ] [D:\/asan.c] [DW_LANG_C99] +!1 = metadata !{metadata !"asan.c", metadata !"D:\5C"} +!2 = metadata !{} +!3 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!4 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!5 = metadata !{metadata !"clang version 3.5.0 "} diff --git a/test/DebugInfo/COFF/asm.ll b/test/DebugInfo/COFF/asm.ll new file mode 100644 index 000000000000..8c9dff0cdf15 --- /dev/null +++ b/test/DebugInfo/COFF/asm.ll @@ -0,0 +1,184 @@ +; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -O0 < %s | FileCheck --check-prefix=X86 %s +; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -o - -O0 < %s | llvm-mc -triple=i686-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview-linetables | FileCheck --check-prefix=OBJ32 %s +; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -O0 < %s | FileCheck --check-prefix=X64 %s +; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -o - -O0 < %s | llvm-mc -triple=x86_64-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview-linetables | FileCheck --check-prefix=OBJ64 %s + +; This LL file was generated by running clang on the following code: +; D:\asm.c: +; 1 void g(void); +; 2 +; 3 void f(void) { +; 4 __asm align 4; +; 5 g(); +; 6 } + +; X86-LABEL: _f: +; X86-NEXT: # BB +; X86-NEXT: [[ASM_LINE:^L.*]]:{{$}} +; X86: [[CALL_LINE:^L.*]]:{{$}} +; X86-NEXT: calll _g +; X86-NEXT: [[RETURN_STMT:.*]]: +; X86-NEXT: ret +; X86-NEXT: [[END_OF_F:.*]]: +; +; X86-LABEL: .section .debug$S,"rnd" +; X86-NEXT: .long 4 +; X86-NEXT: .long 242 +; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]] +; X86-NEXT: [[F2_START]]: +; X86-NEXT: .secrel32 _f +; X86-NEXT: .secidx _f +; X86-NEXT: .long [[END_OF_F]]-_f +; X86-NEXT: [[FILE_SEGMENT_START:[^:]*]]: +; X86-NEXT: .long 0 +; X86-NEXT: .long 3 +; X86-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]] +; X86-NEXT: .long [[ASM_LINE]]-_f +; X86-NEXT: .long 4 +; X86-NEXT: .long [[CALL_LINE]]-_f +; X86-NEXT: .long 5 +; X86-NEXT: .long [[RETURN_STMT]]-_f +; X86-NEXT: .long 6 +; X86-NEXT: [[FILE_SEGMENT_END]]: +; X86-NEXT: [[F2_END]]: +; File index to string table offset subsection +; X86-NEXT: .long 244 +; X86-NEXT: .long 8 +; X86-NEXT: .long 1 +; X86-NEXT: .long 0 +; String table +; X86-NEXT: .long 243 +; X86-NEXT: .long 10 +; X86-NEXT: .byte 0 +; X86-NEXT: .ascii "D:\\asm.c" +; X86-NEXT: .byte 0 +; Padding +; X86-NEXT: .zero 2 + +; OBJ32: Section { +; OBJ32: Name: .debug$S (2E 64 65 62 75 67 24 53) +; OBJ32: Characteristics [ (0x42100040) +; OBJ32: ] +; OBJ32: Relocations [ +; OBJ32-NEXT: 0xC IMAGE_REL_I386_SECREL _f +; OBJ32-NEXT: 0x10 IMAGE_REL_I386_SECTION _f +; OBJ32-NEXT: ] +; OBJ32: FunctionLineTable [ +; OBJ32-NEXT: Name: _f +; OBJ32-NEXT: CodeSize: 0x6 +; OBJ32-NEXT: FilenameSegment [ +; OBJ32-NEXT: Filename: D:\asm.c +; FIXME: An empty __asm stmt creates an extra entry. +; We seem to know that these offsets are the same statically during the +; execution of endModule(). See PR18679 for the details. +; OBJ32-NEXT: +0x0: 4 +; OBJ32-NEXT: +0x0: 5 +; OBJ32-NEXT: +0x5: 6 +; OBJ32-NEXT: ] +; OBJ32-NEXT: ] +; OBJ32: } + +; X64-LABEL: f: +; X64-NEXT: [[START:.*]]:{{$}} +; X64-NEXT: # BB +; X64-NEXT: subq $40, %rsp +; X64-NEXT: [[ASM_LINE:.*]]:{{$}} +; X64: [[CALL_LINE:.*]]:{{$}} +; X64-NEXT: callq g +; X64-NEXT: [[EPILOG_AND_RET:.*]]: +; X64-NEXT: addq $40, %rsp +; X64-NEXT: ret +; X64-NEXT: [[END_OF_F:.*]]: +; +; X64-LABEL: .section .debug$S,"rnd" +; X64-NEXT: .long 4 +; X64-NEXT: .long 242 +; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]] +; X64-NEXT: [[F2_START]]: +; X64-NEXT: .secrel32 f +; X64-NEXT: .secidx f +; X64-NEXT: .long [[END_OF_F]]-f +; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]: +; X64-NEXT: .long 0 +; X64-NEXT: .long 4 +; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]] +; X64-NEXT: .long [[START]]-f +; X64-NEXT: .long 3 +; X64-NEXT: .long [[ASM_LINE]]-f +; X64-NEXT: .long 4 +; X64-NEXT: .long [[CALL_LINE]]-f +; X64-NEXT: .long 5 +; X64-NEXT: .long [[EPILOG_AND_RET]]-f +; X64-NEXT: .long 6 +; X64-NEXT: [[FILE_SEGMENT_END]]: +; X64-NEXT: [[F2_END]]: +; File index to string table offset subsection +; X64-NEXT: .long 244 +; X64-NEXT: .long 8 +; X64-NEXT: .long 1 +; X64-NEXT: .long 0 +; String table +; X64-NEXT: .long 243 +; X64-NEXT: .long 10 +; X64-NEXT: .byte 0 +; X64-NEXT: .ascii "D:\\asm.c" +; X64-NEXT: .byte 0 +; Padding +; X64-NEXT: .zero 2 + +; OBJ64: Section { +; OBJ64: Name: .debug$S (2E 64 65 62 75 67 24 53) +; OBJ64: Characteristics [ (0x42100040) +; OBJ64: ] +; OBJ64: Relocations [ +; OBJ64-NEXT: 0xC IMAGE_REL_AMD64_SECREL f +; OBJ64-NEXT: 0x10 IMAGE_REL_AMD64_SECTION f +; OBJ64-NEXT: ] +; OBJ64: FunctionLineTable [ +; OBJ64-NEXT: Name: f +; OBJ64-NEXT: CodeSize: 0xE +; OBJ64-NEXT: FilenameSegment [ +; OBJ64-NEXT: Filename: D:\asm.c +; OBJ64-NEXT: +0x0: 3 +; FIXME: An empty __asm stmt creates an extra entry. +; See PR18679 for the details. +; OBJ64-NEXT: +0x4: 4 +; OBJ64-NEXT: +0x4: 5 +; OBJ64-NEXT: +0x9: 6 +; OBJ64-NEXT: ] +; OBJ64-NEXT: ] +; OBJ64: } + +; Function Attrs: nounwind +define void @f() #0 { +entry: + call void asm sideeffect inteldialect ".align 4", "~{dirflag},~{fpsr},~{flags}"() #2, !dbg !12 + call void @g(), !dbg !13 + ret void, !dbg !14 +} + +declare void @g() #1 + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #2 = { nounwind } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!9, !10} +!llvm.ident = !{!11} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [D:\/<unknown>] [DW_LANG_C99] +!1 = metadata !{metadata !"<unknown>", metadata !"D:\5C"} +!2 = metadata !{i32 0} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"f", metadata !"f", metadata !"", i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @f, null, null, metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [f] +!5 = metadata !{metadata !"asm.c", metadata !"D:\5C"} +!6 = metadata !{i32 786473, metadata !5} ; [ DW_TAG_file_type ] [D:\/asm.c] +!7 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{null} +!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!10 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!11 = metadata !{metadata !"clang version 3.5 "} +!12 = metadata !{i32 4, i32 0, metadata !4, null} +!13 = metadata !{i32 5, i32 0, metadata !4, null} +!14 = metadata !{i32 6, i32 0, metadata !4, null} diff --git a/test/DebugInfo/COFF/lit.local.cfg b/test/DebugInfo/COFF/lit.local.cfg new file mode 100644 index 000000000000..c8625f4d9d24 --- /dev/null +++ b/test/DebugInfo/COFF/lit.local.cfg @@ -0,0 +1,2 @@ +if not 'X86' in config.root.targets: + config.unsupported = True diff --git a/test/DebugInfo/COFF/multifile.ll b/test/DebugInfo/COFF/multifile.ll new file mode 100644 index 000000000000..c04bdb3b7c94 --- /dev/null +++ b/test/DebugInfo/COFF/multifile.ll @@ -0,0 +1,257 @@ +; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -O0 < %s | FileCheck --check-prefix=X86 %s +; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -o - -O0 < %s | llvm-mc -triple=i686-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview-linetables | FileCheck --check-prefix=OBJ32 %s +; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -O0 < %s | FileCheck --check-prefix=X64 %s +; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -o - -O0 < %s | llvm-mc -triple=x86_64-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview-linetables | FileCheck --check-prefix=OBJ64 %s + +; This LL file was generated by running clang on the following code: +; D:\input.c: +; 1 void g(void); +; 2 +; 3 void f() { +; 4 #line 1 "one.c" +; 5 g(void); +; 6 #line 2 "two.c" +; 7 g(void); +; 8 #line 7 "one.c" +; 9 g(void); +; 10 } + +; X86-LABEL: _f: +; X86-NEXT: # BB +; X86-NEXT: [[CALL_LINE_1:.*]]:{{$}} +; X86-NEXT: calll _g +; X86-NEXT: [[CALL_LINE_2:.*]]:{{$}} +; X86-NEXT: calll _g +; X86-NEXT: [[CALL_LINE_3:.*]]:{{$}} +; X86-NEXT: calll _g +; X86-NEXT: [[RETURN_STMT:.*]]: +; X86-NEXT: ret +; X86-NEXT: [[END_OF_F:.*]]: +; +; X86-LABEL: .section .debug$S,"rnd" +; X86-NEXT: .long 4 +; X86-NEXT: .long 242 +; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]] +; X86-NEXT: [[F2_START]]: +; X86-NEXT: .secrel32 _f +; X86-NEXT: .secidx _f +; X86-NEXT: .long [[END_OF_F]]-_f +; Segment for file 'D:\\one.c' begins +; X86-NEXT: [[FILE_SEGMENT_START:[^:]*]]: +; X86-NEXT: .long 0 +; X86-NEXT: .long 1 +; X86-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]] +; X86-NEXT: .long [[CALL_LINE_1]]-_f +; X86-NEXT: .long 1 +; X86-NEXT: [[FILE_SEGMENT_END]]: +; Segment for file 'D:\\two.c' begins +; X86-NEXT: [[FILE_SEGMENT_START:[^:]*]]: +; X86-NEXT: .long 8 +; X86-NEXT: .long 1 +; X86-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]] +; X86-NEXT: .long [[CALL_LINE_2]]-_f +; X86-NEXT: .long 2 +; X86-NEXT: [[FILE_SEGMENT_END]]: +; A new segment for file 'D:\\one.c' begins +; X86-NEXT: [[FILE_SEGMENT_START:[^:]*]]: +; X86-NEXT: .long 0 +; X86-NEXT: .long 2 +; X86-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]] +; X86-NEXT: .long [[CALL_LINE_3]]-_f +; X86-NEXT: .long 7 +; X86-NEXT: .long [[RETURN_STMT]]-_f +; X86-NEXT: .long 8 +; X86-NEXT: [[FILE_SEGMENT_END]]: +; X86-NEXT: [[F2_END]]: +; File index to string table offset subsection +; X86-NEXT: .long 244 +; X86-NEXT: .long 16 +; X86-NEXT: .long 1 +; X86-NEXT: .long 0 +; X86-NEXT: .long 10 +; X86-NEXT: .long 0 +; String table +; X86-NEXT: .long 243 +; X86-NEXT: .long 19 +; X86-NEXT: .byte 0 +; X86-NEXT: .ascii "D:\\one.c" +; X86-NEXT: .byte 0 +; X86-NEXT: .ascii "D:\\two.c" +; X86-NEXT: .byte 0 +; X86-NEXT: .zero 1 + +; OBJ32: Section { +; OBJ32: Name: .debug$S (2E 64 65 62 75 67 24 53) +; OBJ32: Characteristics [ (0x42100040) +; OBJ32: ] +; OBJ32: Relocations [ +; OBJ32-NEXT: 0xC IMAGE_REL_I386_SECREL _f +; OBJ32-NEXT: 0x10 IMAGE_REL_I386_SECTION _f +; OBJ32-NEXT: ] +; OBJ32: FunctionLineTable [ +; OBJ32-NEXT: Name: _f +; OBJ32-NEXT: CodeSize: 0x10 +; OBJ32-NEXT: FilenameSegment [ +; OBJ32-NEXT: Filename: D:\one.c +; OBJ32-NEXT: +0x0: 1 +; OBJ32-NEXT: ] +; OBJ32-NEXT: FilenameSegment [ +; OBJ32-NEXT: Filename: D:\two.c +; OBJ32-NEXT: +0x5: 2 +; OBJ32-NEXT: ] +; OBJ32-NEXT: FilenameSegment [ +; OBJ32-NEXT: Filename: D:\one.c +; OBJ32-NEXT: +0xA: 7 +; OBJ32-NEXT: +0xF: 8 +; OBJ32-NEXT: ] +; OBJ32-NEXT: ] +; OBJ32: } + +; X64-LABEL: f: +; X64-NEXT: [[START:.*]]:{{$}} +; X64-NEXT: # BB +; X64-NEXT: subq $40, %rsp +; X64-NEXT: [[CALL_LINE_1:.*]]:{{$}} +; X64-NEXT: callq g +; X64-NEXT: [[CALL_LINE_2:.*]]:{{$}} +; X64-NEXT: callq g +; X64-NEXT: [[CALL_LINE_3:.*]]:{{$}} +; X64-NEXT: callq g +; X64-NEXT: [[EPILOG_AND_RET:.*]]: +; X64-NEXT: addq $40, %rsp +; X64-NEXT: ret +; X64-NEXT: [[END_OF_F:.*]]: +; +; X64-LABEL: .section .debug$S,"rnd" +; X64-NEXT: .long 4 +; X64-NEXT: .long 242 +; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]] +; X64-NEXT: [[F2_START]]: +; X64-NEXT: .secrel32 f +; X64-NEXT: .secidx f +; X64-NEXT: .long [[END_OF_F]]-f +; Segment for file 'D:\\input.c' begins +; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]: +; X64-NEXT: .long 0 +; X64-NEXT: .long 1 +; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]] +; X64-NEXT: .long [[START]]-f +; X64-NEXT: .long 3 +; X64-NEXT: [[FILE_SEGMENT_END]]: +; Segment for file 'D:\\one.c' begins +; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]: +; X64-NEXT: .long 8 +; X64-NEXT: .long 1 +; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]] +; X64-NEXT: .long [[CALL_LINE_1]]-f +; X64-NEXT: .long 1 +; X64-NEXT: [[FILE_SEGMENT_END]]: +; Segment for file 'D:\\two.c' begins +; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]: +; X64-NEXT: .long 16 +; X64-NEXT: .long 1 +; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]] +; X64-NEXT: .long [[CALL_LINE_2]]-f +; X64-NEXT: .long 2 +; X64-NEXT: [[FILE_SEGMENT_END]]: +; A new segment for file 'D:\\one.c' begins +; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]: +; X64-NEXT: .long 8 +; X64-NEXT: .long 2 +; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]] +; X64-NEXT: .long [[CALL_LINE_3]]-f +; X64-NEXT: .long 7 +; X64-NEXT: .long [[EPILOG_AND_RET]]-f +; X64-NEXT: .long 8 +; X64-NEXT: [[FILE_SEGMENT_END]]: +; X64-NEXT: [[F2_END]]: +; File index to string table offset subsection +; X64-NEXT: .long 244 +; X64-NEXT: .long 24 +; X64-NEXT: .long 1 +; X64-NEXT: .long 0 +; X64-NEXT: .long 12 +; X64-NEXT: .long 0 +; X64-NEXT: .long 21 +; X64-NEXT: .long 0 +; String table +; X64-NEXT: .long 243 +; X64-NEXT: .long 30 +; X64-NEXT: .byte 0 +; X64-NEXT: .ascii "D:\\input.c" +; X64-NEXT: .byte 0 +; X64-NEXT: .ascii "D:\\one.c" +; X64-NEXT: .byte 0 +; X64-NEXT: .ascii "D:\\two.c" +; X64-NEXT: .byte 0 +; X64-NEXT: .zero 2 + +; OBJ64: Section { +; OBJ64: Name: .debug$S (2E 64 65 62 75 67 24 53) +; OBJ64: Characteristics [ (0x42100040) +; OBJ64: ] +; OBJ64: Relocations [ +; OBJ64-NEXT: 0xC IMAGE_REL_AMD64_SECREL f +; OBJ64-NEXT: 0x10 IMAGE_REL_AMD64_SECTION f +; OBJ64-NEXT: ] +; OBJ64: FunctionLineTable [ +; OBJ64-NEXT: Name: f +; OBJ64-NEXT: CodeSize: 0x18 +; OBJ64-NEXT: FilenameSegment [ +; OBJ64-NEXT: Filename: D:\input.c +; OBJ64-NEXT: +0x0: 3 +; OBJ64-NEXT: ] +; OBJ64-NEXT: FilenameSegment [ +; OBJ64-NEXT: Filename: D:\one.c +; OBJ64-NEXT: +0x4: 1 +; OBJ64-NEXT: ] +; OBJ64-NEXT: FilenameSegment [ +; OBJ64-NEXT: Filename: D:\two.c +; OBJ64-NEXT: +0x9: 2 +; OBJ64-NEXT: ] +; OBJ64-NEXT: FilenameSegment [ +; OBJ64-NEXT: Filename: D:\one.c +; OBJ64-NEXT: +0xE: 7 +; OBJ64-NEXT: +0x13: 8 +; OBJ64-NEXT: ] +; OBJ64-NEXT: ] +; OBJ64: } + +; Function Attrs: nounwind +define void @f() #0 { +entry: + call void @g(), !dbg !12 + call void @g(), !dbg !15 + call void @g(), !dbg !18 + ret void, !dbg !19 +} + +declare void @g() #1 + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!9, !10} +!llvm.ident = !{!11} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [D:\/<unknown>] [DW_LANG_C99] +!1 = metadata !{metadata !"<unknown>", metadata !"D:\5C"} +!2 = metadata !{i32 0} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"f", metadata !"f", metadata !"", i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @f, null, null, metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [f] +!5 = metadata !{metadata !"input.c", metadata !"D:\5C"} +!6 = metadata !{i32 786473, metadata !5} ; [ DW_TAG_file_type ] [D:\/input.c] +!7 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{null} +!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!10 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!11 = metadata !{metadata !"clang version 3.5 "} +!12 = metadata !{i32 1, i32 0, metadata !13, null} +!13 = metadata !{i32 786443, metadata !14, metadata !4} ; [ DW_TAG_lexical_block ] [D:\/one.c] +!14 = metadata !{metadata !"one.c", metadata !"D:\5C"} +!15 = metadata !{i32 2, i32 0, metadata !16, null} +!16 = metadata !{i32 786443, metadata !17, metadata !4} ; [ DW_TAG_lexical_block ] [D:\/two.c] +!17 = metadata !{metadata !"two.c", metadata !"D:\5C"} +!18 = metadata !{i32 7, i32 0, metadata !13, null} +!19 = metadata !{i32 8, i32 0, metadata !13, null} ; [ DW_TAG_imported_declaration ] diff --git a/test/DebugInfo/COFF/multifunction.ll b/test/DebugInfo/COFF/multifunction.ll new file mode 100644 index 000000000000..5a6555805fd8 --- /dev/null +++ b/test/DebugInfo/COFF/multifunction.ll @@ -0,0 +1,378 @@ +; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -O0 < %s | FileCheck --check-prefix=X86 %s +; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -o - -O0 < %s | llvm-mc -triple=i686-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview-linetables | FileCheck --check-prefix=OBJ32 %s +; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -O0 < %s | FileCheck --check-prefix=X64 %s +; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -o - -O0 < %s | llvm-mc -triple=x86_64-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview-linetables | FileCheck --check-prefix=OBJ64 %s + +; This LL file was generated by running clang on the following code: +; D:\source.c: +; 1 void z(void); +; 2 +; 3 void x(void) { +; 4 z(); +; 5 } +; 6 +; 7 void y(void) { +; 8 z(); +; 9 } +; 10 +; 11 void f(void) { +; 12 x(); +; 13 y(); +; 14 z(); +; 15 } + + +; X86-LABEL: _x: +; X86-NEXT: # BB +; X86-NEXT: [[X_CALL:.*]]:{{$}} +; X86-NEXT: calll _z +; X86-NEXT: [[X_RETURN:.*]]: +; X86-NEXT: ret +; X86-NEXT: [[END_OF_X:.*]]: +; +; X86-LABEL: _y: +; X86-NEXT: # BB +; X86-NEXT: [[Y_CALL:.*]]:{{$}} +; X86-NEXT: calll _z +; X86-NEXT: [[Y_RETURN:.*]]: +; X86-NEXT: ret +; X86-NEXT: [[END_OF_Y:.*]]: +; +; X86-LABEL: _f: +; X86-NEXT: # BB +; X86-NEXT: [[F_CALLS_X:.*]]:{{$}} +; X86-NEXT: calll _x +; X86-NEXT: [[F_CALLS_Y:.*]]: +; X86-NEXT: calll _y +; X86-NEXT: [[F_CALLS_Z:.*]]: +; X86-NEXT: calll _z +; X86-NEXT: [[F_RETURN:.*]]: +; X86-NEXT: ret +; X86-NEXT: [[END_OF_F:.*]]: +; +; X86-LABEL: .section .debug$S,"rnd" +; X86-NEXT: .long 4 +; Line table subsection for x +; X86-NEXT: .long 242 +; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]] +; X86-NEXT: [[F2_START]]: +; X86-NEXT: .secrel32 _x +; X86-NEXT: .secidx _x +; X86-NEXT: .long [[END_OF_X]]-_x +; X86-NEXT: [[FILE_SEGMENT_START:[^:]*]]: +; X86-NEXT: .long 0 +; X86-NEXT: .long 2 +; X86-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]] +; X86-NEXT: .long [[X_CALL]]-_x +; X86-NEXT: .long 4 +; X86-NEXT: .long [[X_RETURN]]-_x +; X86-NEXT: .long 5 +; X86-NEXT: [[FILE_SEGMENT_END]]: +; X86-NEXT: [[F2_END]]: +; Line table subsection for y +; X86-NEXT: .long 242 +; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]] +; X86-NEXT: [[F2_START]]: +; X86-NEXT: .secrel32 _y +; X86-NEXT: .secidx _y +; X86-NEXT: .long [[END_OF_Y]]-_y +; X86-NEXT: [[FILE_SEGMENT_START:[^:]*]]: +; X86-NEXT: .long 0 +; X86-NEXT: .long 2 +; X86-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]] +; X86-NEXT: .long [[Y_CALL]]-_y +; X86-NEXT: .long 8 +; X86-NEXT: .long [[Y_RETURN]]-_y +; X86-NEXT: .long 9 +; X86-NEXT: [[FILE_SEGMENT_END]]: +; X86-NEXT: [[F2_END]]: +; Line table subsection for f +; X86-NEXT: .long 242 +; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]] +; X86-NEXT: [[F2_START]]: +; X86-NEXT: .secrel32 _f +; X86-NEXT: .secidx _f +; X86-NEXT: .long [[END_OF_F]]-_f +; X86-NEXT: [[FILE_SEGMENT_START:[^:]*]]: +; X86-NEXT: .long 0 +; X86-NEXT: .long 4 +; X86-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]] +; X86-NEXT: .long [[F_CALLS_X]]-_f +; X86-NEXT: .long 12 +; X86-NEXT: .long [[F_CALLS_Y]]-_f +; X86-NEXT: .long 13 +; X86-NEXT: .long [[F_CALLS_Z]]-_f +; X86-NEXT: .long 14 +; X86-NEXT: .long [[F_RETURN]]-_f +; X86-NEXT: .long 15 +; X86-NEXT: [[FILE_SEGMENT_END]]: +; X86-NEXT: [[F2_END]]: +; File index to string table offset subsection +; X86-NEXT: .long 244 +; X86-NEXT: .long 8 +; X86-NEXT: .long 1 +; X86-NEXT: .long 0 +; String table +; X86-NEXT: .long 243 +; X86-NEXT: .long 13 +; X86-NEXT: .byte 0 +; X86-NEXT: .ascii "D:\\source.c" +; X86-NEXT: .byte 0 +; X86-NEXT: .zero 3 + +; OBJ32: Section { +; OBJ32: Name: .debug$S (2E 64 65 62 75 67 24 53) +; OBJ32: Characteristics [ (0x42100040) +; OBJ32: ] +; OBJ32: Relocations [ +; OBJ32-NEXT: 0xC IMAGE_REL_I386_SECREL _x +; OBJ32-NEXT: 0x10 IMAGE_REL_I386_SECTION _x +; OBJ32-NEXT: 0x3C IMAGE_REL_I386_SECREL _y +; OBJ32-NEXT: 0x40 IMAGE_REL_I386_SECTION _y +; OBJ32-NEXT: 0x6C IMAGE_REL_I386_SECREL _f +; OBJ32-NEXT: 0x70 IMAGE_REL_I386_SECTION _f +; OBJ32-NEXT: ] +; OBJ32: FunctionLineTable [ +; OBJ32-NEXT: Name: _x +; OBJ32-NEXT: CodeSize: 0x6 +; OBJ32-NEXT: FilenameSegment [ +; OBJ32-NEXT: Filename: D:\source.c +; OBJ32-NEXT: +0x0: 4 +; OBJ32-NEXT: +0x5: 5 +; OBJ32-NEXT: ] +; OBJ32-NEXT: ] +; OBJ32-NEXT: FunctionLineTable [ +; OBJ32-NEXT: Name: _y +; OBJ32-NEXT: CodeSize: 0x6 +; OBJ32-NEXT: FilenameSegment [ +; OBJ32-NEXT: Filename: D:\source.c +; OBJ32-NEXT: +0x0: 8 +; OBJ32-NEXT: +0x5: 9 +; OBJ32-NEXT: ] +; OBJ32-NEXT: ] +; OBJ32-NEXT: FunctionLineTable [ +; OBJ32-NEXT: Name: _f +; OBJ32-NEXT: CodeSize: 0x10 +; OBJ32-NEXT: FilenameSegment [ +; OBJ32-NEXT: Filename: D:\source.c +; OBJ32-NEXT: +0x0: 12 +; OBJ32-NEXT: +0x5: 13 +; OBJ32-NEXT: +0xA: 14 +; OBJ32-NEXT: +0xF: 15 +; OBJ32-NEXT: ] +; OBJ32-NEXT: ] +; OBJ32: } + +; X64-LABEL: x: +; X64-NEXT: [[X_START:.*]]:{{$}} +; X64-NEXT: # BB +; X64-NEXT: subq $40, %rsp +; X64-NEXT: [[X_CALL_LINE:.*]]:{{$}} +; X64-NEXT: callq z +; X64-NEXT: [[X_EPILOG_AND_RET:.*]]: +; X64-NEXT: addq $40, %rsp +; X64-NEXT: ret +; X64-NEXT: [[END_OF_X:.*]]: +; +; X64-LABEL: y: +; X64-NEXT: [[Y_START:.*]]:{{$}} +; X64-NEXT: # BB +; X64-NEXT: subq $40, %rsp +; X64-NEXT: [[Y_CALL_LINE:.*]]:{{$}} +; X64-NEXT: callq z +; X64-NEXT: [[Y_EPILOG_AND_RET:.*]]: +; X64-NEXT: addq $40, %rsp +; X64-NEXT: ret +; X64-NEXT: [[END_OF_Y:.*]]: +; +; X64-LABEL: f: +; X64-NEXT: [[F_START:.*]]:{{$}} +; X64-NEXT: # BB +; X64-NEXT: subq $40, %rsp +; X64-NEXT: [[F_CALLS_X:.*]]:{{$}} +; X64-NEXT: callq x +; X64-NEXT: [[F_CALLS_Y:.*]]: +; X64-NEXT: callq y +; X64-NEXT: [[F_CALLS_Z:.*]]: +; X64-NEXT: callq z +; X64-NEXT: [[F_EPILOG_AND_RET:.*]]: +; X64-NEXT: addq $40, %rsp +; X64-NEXT: ret +; X64-NEXT: [[END_OF_F:.*]]: +; +; X64-LABEL: .section .debug$S,"rnd" +; X64-NEXT: .long 4 +; Line table subsection for x +; X64-NEXT: .long 242 +; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]] +; X64-NEXT: [[F2_START]]: +; X64-NEXT: .secrel32 x +; X64-NEXT: .secidx x +; X64-NEXT: .long [[END_OF_X]]-x +; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]: +; X64-NEXT: .long 0 +; X64-NEXT: .long 3 +; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]] +; X64-NEXT: .long [[X_START]]-x +; X64-NEXT: .long 3 +; X64-NEXT: .long [[X_CALL_LINE]]-x +; X64-NEXT: .long 4 +; X64-NEXT: .long [[X_EPILOG_AND_RET]]-x +; X64-NEXT: .long 5 +; X64-NEXT: [[FILE_SEGMENT_END]]: +; X64-NEXT: [[F2_END]]: +; Line table subsection for y +; X64-NEXT: .long 242 +; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]] +; X64-NEXT: [[F2_START]]: +; X64-NEXT: .secrel32 y +; X64-NEXT: .secidx y +; X64-NEXT: .long [[END_OF_Y]]-y +; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]: +; X64-NEXT: .long 0 +; X64-NEXT: .long 3 +; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]] +; X64-NEXT: .long [[Y_START]]-y +; X64-NEXT: .long 7 +; X64-NEXT: .long [[Y_CALL_LINE]]-y +; X64-NEXT: .long 8 +; X64-NEXT: .long [[Y_EPILOG_AND_RET]]-y +; X64-NEXT: .long 9 +; X64-NEXT: [[FILE_SEGMENT_END]]: +; X64-NEXT: [[F2_END]]: +; Line table subsection for f +; X64-NEXT: .long 242 +; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]] +; X64-NEXT: [[F2_START]]: +; X64-NEXT: .secrel32 f +; X64-NEXT: .secidx f +; X64-NEXT: .long [[END_OF_F]]-f +; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]: +; X64-NEXT: .long 0 +; X64-NEXT: .long 5 +; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]] +; X64-NEXT: .long [[F_START]]-f +; X64-NEXT: .long 11 +; X64-NEXT: .long [[F_CALLS_X]]-f +; X64-NEXT: .long 12 +; X64-NEXT: .long [[F_CALLS_Y]]-f +; X64-NEXT: .long 13 +; X64-NEXT: .long [[F_CALLS_Z]]-f +; X64-NEXT: .long 14 +; X64-NEXT: .long [[F_EPILOG_AND_RET]]-f +; X64-NEXT: .long 15 +; X64-NEXT: [[FILE_SEGMENT_END]]: +; X64-NEXT: [[F2_END]]: +; File index to string table offset subsection +; X64-NEXT: .long 244 +; X64-NEXT: .long 8 +; X64-NEXT: .long 1 +; X64-NEXT: .long 0 +; String table +; X64-NEXT: .long 243 +; X64-NEXT: .long 13 +; X64-NEXT: .byte 0 +; X64-NEXT: .ascii "D:\\source.c" +; X64-NEXT: .byte 0 +; X64-NEXT: .zero 3 + +; OBJ64: Section { +; OBJ64: Name: .debug$S (2E 64 65 62 75 67 24 53) +; OBJ64: Characteristics [ (0x42100040) +; OBJ64: ] +; OBJ64: Relocations [ +; OBJ64-NEXT: 0xC IMAGE_REL_AMD64_SECREL x +; OBJ64-NEXT: 0x10 IMAGE_REL_AMD64_SECTION x +; OBJ64-NEXT: 0x44 IMAGE_REL_AMD64_SECREL y +; OBJ64-NEXT: 0x48 IMAGE_REL_AMD64_SECTION y +; OBJ64-NEXT: 0x7C IMAGE_REL_AMD64_SECREL f +; OBJ64-NEXT: 0x80 IMAGE_REL_AMD64_SECTION f +; OBJ64-NEXT: ] +; OBJ64: FunctionLineTable [ +; OBJ64-NEXT: Name: x +; OBJ64-NEXT: CodeSize: 0xE +; OBJ64-NEXT: FilenameSegment [ +; OBJ64-NEXT: Filename: D:\source.c +; OBJ64-NEXT: +0x0: 3 +; OBJ64-NEXT: +0x4: 4 +; OBJ64-NEXT: +0x9: 5 +; OBJ64-NEXT: ] +; OBJ64-NEXT: ] +; OBJ64-NEXT: FunctionLineTable [ +; OBJ64-NEXT: Name: y +; OBJ64-NEXT: CodeSize: 0xE +; OBJ64-NEXT: FilenameSegment [ +; OBJ64-NEXT: Filename: D:\source.c +; OBJ64-NEXT: +0x0: 7 +; OBJ64-NEXT: +0x4: 8 +; OBJ64-NEXT: +0x9: 9 +; OBJ64-NEXT: ] +; OBJ64-NEXT: ] +; OBJ64-NEXT: FunctionLineTable [ +; OBJ64-NEXT: Name: f +; OBJ64-NEXT: CodeSize: 0x18 +; OBJ64-NEXT: FilenameSegment [ +; OBJ64-NEXT: Filename: D:\source.c +; OBJ64-NEXT: +0x0: 11 +; OBJ64-NEXT: +0x4: 12 +; OBJ64-NEXT: +0x9: 13 +; OBJ64-NEXT: +0xE: 14 +; OBJ64-NEXT: +0x13: 15 +; OBJ64-NEXT: ] +; OBJ64-NEXT: ] +; OBJ64: } + +; Function Attrs: nounwind +define void @x() #0 { +entry: + call void @z(), !dbg !14 + ret void, !dbg !15 +} + +declare void @z() #1 + +; Function Attrs: nounwind +define void @y() #0 { +entry: + call void @z(), !dbg !16 + ret void, !dbg !17 +} + +; Function Attrs: nounwind +define void @f() #0 { +entry: + call void @x(), !dbg !18 + call void @y(), !dbg !19 + call void @z(), !dbg !20 + ret void, !dbg !21 +} + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!11, !12} +!llvm.ident = !{!13} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [D:\/<unknown>] [DW_LANG_C99] +!1 = metadata !{metadata !"<unknown>", metadata !"D:\5C"} +!2 = metadata !{i32 0} +!3 = metadata !{metadata !4, metadata !9, metadata !10} +!4 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"x", metadata !"x", metadata !"", i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @x, null, null, metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [x] +!5 = metadata !{metadata !"source.c", metadata !"D:\5C"} +!6 = metadata !{i32 786473, metadata !5} ; [ DW_TAG_file_type ] [D:\/source.c] +!7 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{null} +!9 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"y", metadata !"y", metadata !"", i32 7, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @y, null, null, metadata !2, i32 7} ; [ DW_TAG_subprogram ] [line 7] [def] [y] +!10 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"f", metadata !"f", metadata !"", i32 11, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @f, null, null, metadata !2, i32 11} ; [ DW_TAG_subprogram ] [line 11] [def] [f] +!11 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!12 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!13 = metadata !{metadata !"clang version 3.5 "} +!14 = metadata !{i32 4, i32 0, metadata !4, null} +!15 = metadata !{i32 5, i32 0, metadata !4, null} +!16 = metadata !{i32 8, i32 0, metadata !9, null} ; [ DW_TAG_imported_declaration ] +!17 = metadata !{i32 9, i32 0, metadata !9, null} +!18 = metadata !{i32 12, i32 0, metadata !10, null} +!19 = metadata !{i32 13, i32 0, metadata !10, null} +!20 = metadata !{i32 14, i32 0, metadata !10, null} +!21 = metadata !{i32 15, i32 0, metadata !10, null} diff --git a/test/DebugInfo/COFF/simple.ll b/test/DebugInfo/COFF/simple.ll new file mode 100644 index 000000000000..2613a18298d3 --- /dev/null +++ b/test/DebugInfo/COFF/simple.ll @@ -0,0 +1,167 @@ +; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -O0 < %s | FileCheck --check-prefix=X86 %s +; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -o - -O0 < %s | llvm-mc -triple=i686-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview-linetables | FileCheck --check-prefix=OBJ32 %s +; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -O0 < %s | FileCheck --check-prefix=X64 %s +; RUN: llc -mcpu=core2 -mtriple=x86_64-pc-win32 -o - -O0 < %s | llvm-mc -triple=x86_64-pc-win32 -filetype=obj | llvm-readobj -s -sr -codeview-linetables | FileCheck --check-prefix=OBJ64 %s + +; This LL file was generated by running clang on the following code: +; D:\test.c: +; 1 void g(void); +; 2 +; 3 void f(void) { +; 4 g(); +; 5 } + +; X86-LABEL: _f: +; X86-NEXT: # BB +; X86-NEXT: [[CALL_LINE:^L.*]]:{{$}} +; X86-NEXT: calll _g +; X86-NEXT: [[RETURN_STMT:.*]]: +; X86-NEXT: ret +; X86-NEXT: [[END_OF_F:.*]]: +; +; X86-LABEL: .section .debug$S,"rnd" +; X86-NEXT: .long 4 +; X86-NEXT: .long 242 +; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]] +; X86-NEXT: [[F2_START]]: +; X86-NEXT: .secrel32 _f +; X86-NEXT: .secidx _f +; X86-NEXT: .long [[END_OF_F]]-_f +; X86-NEXT: [[FILE_SEGMENT_START:[^:]*]]: +; X86-NEXT: .long 0 +; X86-NEXT: .long 2 +; X86-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]] +; X86-NEXT: .long [[CALL_LINE]]-_f +; X86-NEXT: .long 4 +; X86-NEXT: .long [[RETURN_STMT]]-_f +; X86-NEXT: .long 5 +; X86-NEXT: [[FILE_SEGMENT_END]]: +; X86-NEXT: [[F2_END]]: +; File index to string table offset subsection +; X86-NEXT: .long 244 +; X86-NEXT: .long 8 +; X86-NEXT: .long 1 +; X86-NEXT: .long 0 +; String table +; X86-NEXT: .long 243 +; X86-NEXT: .long 11 +; X86-NEXT: .byte 0 +; X86-NEXT: .ascii "D:\\test.c" +; X86-NEXT: .byte 0 +; Padding +; X86-NEXT: .zero 1 + +; OBJ32: Section { +; OBJ32: Name: .debug$S (2E 64 65 62 75 67 24 53) +; OBJ32: Characteristics [ (0x42100040) +; OBJ32: ] +; OBJ32: Relocations [ +; OBJ32-NEXT: 0xC IMAGE_REL_I386_SECREL _f +; OBJ32-NEXT: 0x10 IMAGE_REL_I386_SECTION _f +; OBJ32-NEXT: ] +; OBJ32: FunctionLineTable [ +; OBJ32-NEXT: Name: _f +; OBJ32-NEXT: CodeSize: 0x6 +; OBJ32-NEXT: FilenameSegment [ +; OBJ32-NEXT: Filename: D:\test.c +; OBJ32-NEXT: +0x0: 4 +; OBJ32-NEXT: +0x5: 5 +; OBJ32-NEXT: ] +; OBJ32-NEXT: ] +; OBJ32: } + +; X64-LABEL: f: +; X64-NEXT: [[START:.*]]:{{$}} +; X64-NEXT: # BB +; X64-NEXT: subq $40, %rsp +; X64-NEXT: [[CALL_LINE:.*]]:{{$}} +; X64-NEXT: callq g +; X64-NEXT: [[EPILOG_AND_RET:.*]]: +; X64-NEXT: addq $40, %rsp +; X64-NEXT: ret +; X64-NEXT: [[END_OF_F:.*]]: +; +; X64-LABEL: .section .debug$S,"rnd" +; X64-NEXT: .long 4 +; X64-NEXT: .long 242 +; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]] +; X64-NEXT: [[F2_START]]: +; X64-NEXT: .secrel32 f +; X64-NEXT: .secidx f +; X64-NEXT: .long [[END_OF_F]]-f +; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]: +; X64-NEXT: .long 0 +; X64-NEXT: .long 3 +; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]] +; X64-NEXT: .long [[START]]-f +; X64-NEXT: .long 3 +; X64-NEXT: .long [[CALL_LINE]]-f +; X64-NEXT: .long 4 +; X64-NEXT: .long [[EPILOG_AND_RET]]-f +; X64-NEXT: .long 5 +; X64-NEXT: [[FILE_SEGMENT_END]]: +; X64-NEXT: [[F2_END]]: +; File index to string table offset subsection +; X64-NEXT: .long 244 +; X64-NEXT: .long 8 +; X64-NEXT: .long 1 +; X64-NEXT: .long 0 +; String table +; X64-NEXT: .long 243 +; X64-NEXT: .long 11 +; X64-NEXT: .byte 0 +; X64-NEXT: .ascii "D:\\test.c" +; X64-NEXT: .byte 0 +; Padding +; X64-NEXT: .zero 1 + +; OBJ64: Section { +; OBJ64: Name: .debug$S (2E 64 65 62 75 67 24 53) +; OBJ64: Characteristics [ (0x42100040) +; OBJ64: ] +; OBJ64: Relocations [ +; OBJ64-NEXT: 0xC IMAGE_REL_AMD64_SECREL f +; OBJ64-NEXT: 0x10 IMAGE_REL_AMD64_SECTION f +; OBJ64-NEXT: ] +; OBJ64: FunctionLineTable [ +; OBJ64-NEXT: Name: f +; OBJ64-NEXT: CodeSize: 0xE +; OBJ64-NEXT: FilenameSegment [ +; OBJ64-NEXT: Filename: D:\test.c +; OBJ64-NEXT: +0x0: 3 +; OBJ64-NEXT: +0x4: 4 +; OBJ64-NEXT: +0x9: 5 +; OBJ64-NEXT: ] +; OBJ64-NEXT: ] +; OBJ64: } + +; Function Attrs: nounwind +define void @f() #0 { +entry: + call void @g(), !dbg !12 + ret void, !dbg !13 +} + +declare void @g() #1 + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!9, !10} +!llvm.ident = !{!11} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [D:\/<unknown>] [DW_LANG_C99] +!1 = metadata !{metadata !"<unknown>", metadata !"D:\5C"} +!2 = metadata !{i32 0} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"f", metadata !"f", metadata !"", i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @f, null, null, metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [f] +!5 = metadata !{metadata !"test.c", metadata !"D:\5C"} +!6 = metadata !{i32 786473, metadata !5} ; [ DW_TAG_file_type ] [D:\/test.c] +!7 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{null} +!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!10 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!11 = metadata !{metadata !"clang version 3.5 "} +!12 = metadata !{i32 4, i32 0, metadata !4, null} +!13 = metadata !{i32 5, i32 0, metadata !4, null} diff --git a/test/DebugInfo/COFF/tail-call-without-lexical-scopes.ll b/test/DebugInfo/COFF/tail-call-without-lexical-scopes.ll new file mode 100644 index 000000000000..4d2e42734475 --- /dev/null +++ b/test/DebugInfo/COFF/tail-call-without-lexical-scopes.ll @@ -0,0 +1,78 @@ +; RUN: llc -mcpu=core2 -mtriple=i686-pc-win32 -O0 < %s | FileCheck --check-prefix=X86 %s + +; This LL file was generated by running clang on the following code: +; D:\test.cpp: +; 1 void foo(); +; 2 +; 3 static void bar(int arg, ...) { +; 4 foo(); +; 5 } +; 6 +; 7 void spam(void) { +; 8 bar(42); +; 9 } +; +; The bar function happens to have no lexical scopes, yet it has one instruction +; with debug information available. This used to be PR19239. + +; X86-LABEL: {{^}}"?bar@@YAXHZZ": +; X86-NEXT: # BB +; X86-NEXT: [[JMP_LINE:^L.*]]:{{$}} +; X86-NEXT: jmp "?foo@@YAXXZ" +; X86-NEXT: [[END_OF_BAR:^L.*]]:{{$}} +; X86-NOT: ret + +; X86-LABEL: .section .debug$S,"rnd" +; X86: .secrel32 "?bar@@YAXHZZ" +; X86-NEXT: .secidx "?bar@@YAXHZZ" +; X86: .long 0 +; X86-NEXT: .long 1 +; X86-NEXT: .long {{.*}} +; X86-NEXT: .long [[JMP_LINE]]-"?bar@@YAXHZZ" +; X86-NEXT: .long 4 + +; X86-LABEL: .long 244 + +; ModuleID = 'test.cpp' +target datalayout = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32" +target triple = "i686-pc-win32" + +; Function Attrs: nounwind +define void @"\01?spam@@YAXXZ"() #0 { +entry: + tail call void @"\01?bar@@YAXHZZ"(), !dbg !11 + ret void, !dbg !12 +} + +; Function Attrs: nounwind +define internal void @"\01?bar@@YAXHZZ"() #0 { +entry: + tail call void @"\01?foo@@YAXXZ"() #2, !dbg !13 + ret void, !dbg !14 +} + +declare void @"\01?foo@@YAXXZ"() #1 + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #2 = { nounwind } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!8, !9} +!llvm.ident = !{!10} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 2} ; [ DW_TAG_compile_unit ] [D:\/test.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"test.cpp", metadata !"D:\5C"} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !7} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"spam", metadata !"spam", metadata !"", i32 7, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void ()* @"\01?spam@@YAXXZ", null, null, metadata !2, i32 7} ; [ DW_TAG_subprogram ] [line 7] [def] [spam] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [D:\/test.cpp] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !2, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"bar", metadata !"bar", metadata !"", i32 3, metadata !6, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 true, null, null, null, metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [local] [def] [bar] +!8 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!9 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!10 = metadata !{metadata !"clang version 3.5.0 "} +!11 = metadata !{i32 8, i32 0, metadata !4, null} ; [ DW_TAG_imported_declaration ] +!12 = metadata !{i32 9, i32 0, metadata !4, null} +!13 = metadata !{i32 4, i32 0, metadata !7, null} +!14 = metadata !{i32 5, i32 0, metadata !7, null} diff --git a/test/DebugInfo/Inputs/arange-overlap.cc b/test/DebugInfo/Inputs/arange-overlap.cc new file mode 100644 index 000000000000..82e3f120efda --- /dev/null +++ b/test/DebugInfo/Inputs/arange-overlap.cc @@ -0,0 +1,26 @@ +void call(); + +struct S { + static void foo() { call(); call(); } + static void bar() { call(); call(); } + static void baz() {} +}; + +#ifdef FILE1 +# define FUNC_NAME func1 +# define FUNC_BODY \ + S::foo(); S::bar(); S::baz(); +#else +# define FUNC_NAME func2 +# define FUNC_BODY \ + S::bar(); +#endif + +void FUNC_NAME() { + FUNC_BODY +} + +// Build instructions: +// $ clang -g -fPIC -c -DFILE1 arange-overlap.cc -o obj1.o +// $ clang -g -fPIC -c arange-overlap.cc -o obj2.o +// $ clang -shared obj1.o obj2.o -o <output> diff --git a/test/DebugInfo/Inputs/arange-overlap.elf-x86_64 b/test/DebugInfo/Inputs/arange-overlap.elf-x86_64 Binary files differnew file mode 100755 index 000000000000..075e9c271231 --- /dev/null +++ b/test/DebugInfo/Inputs/arange-overlap.elf-x86_64 diff --git a/test/DebugInfo/Inputs/arm-relocs.elf-arm b/test/DebugInfo/Inputs/arm-relocs.elf-arm Binary files differnew file mode 100644 index 000000000000..4864c36256f3 --- /dev/null +++ b/test/DebugInfo/Inputs/arm-relocs.elf-arm diff --git a/test/DebugInfo/Inputs/dwarfdump-line-dwo.cc b/test/DebugInfo/Inputs/dwarfdump-line-dwo.cc new file mode 100644 index 000000000000..2784ae24ee56 --- /dev/null +++ b/test/DebugInfo/Inputs/dwarfdump-line-dwo.cc @@ -0,0 +1,10 @@ +struct foo { +}; + +foo f; + +// Built with GCC +// $ mkdir -p /tmp/dbginfo +// $ cp dwarfdump-line-dwo.cc /tmp/dbginfo +// $ cd /tmp/dbginfo +// $ g++ -c -fdebug-types-section dwarfdump-line-dwo.cc -o <output> diff --git a/test/DebugInfo/Inputs/dwarfdump-line-dwo.elf-x86-64 b/test/DebugInfo/Inputs/dwarfdump-line-dwo.elf-x86-64 Binary files differnew file mode 100644 index 000000000000..9f1d267dde1e --- /dev/null +++ b/test/DebugInfo/Inputs/dwarfdump-line-dwo.elf-x86-64 diff --git a/test/DebugInfo/Inputs/fission-ranges.cc b/test/DebugInfo/Inputs/fission-ranges.cc new file mode 100644 index 000000000000..a585bf9c0086 --- /dev/null +++ b/test/DebugInfo/Inputs/fission-ranges.cc @@ -0,0 +1,17 @@ +static inline int inlined_f() { + volatile int x = 2; + return x; +} + +int main() { + return inlined_f(); +} + +// Build instructions: +// $ mkdir /tmp/dbginfo +// $ cp fission-ranges.cc /tmp/dbginfo/ +// $ cd /tmp/dbginfo +// $ gcc -gsplit-dwarf -O2 -fPIC fission-ranges.cc -c -o obj2.o +// $ clang -gsplit-dwarf -O2 -fsanitize=address -fPIC -Dmain=foo fission-ranges.cc -c -o obj1.o +// $ gcc obj1.o obj2.o -shared -o <output> +// $ objcopy --remove-section=.debug_aranges <output> diff --git a/test/DebugInfo/Inputs/fission-ranges.elf-x86_64 b/test/DebugInfo/Inputs/fission-ranges.elf-x86_64 Binary files differnew file mode 100755 index 000000000000..3d2fd79dd747 --- /dev/null +++ b/test/DebugInfo/Inputs/fission-ranges.elf-x86_64 diff --git a/test/DebugInfo/Inputs/llvm-symbolizer-dwo-test b/test/DebugInfo/Inputs/llvm-symbolizer-dwo-test Binary files differnew file mode 100755 index 000000000000..c28c3d277a7c --- /dev/null +++ b/test/DebugInfo/Inputs/llvm-symbolizer-dwo-test diff --git a/test/DebugInfo/Inputs/llvm-symbolizer-dwo-test.cc b/test/DebugInfo/Inputs/llvm-symbolizer-dwo-test.cc new file mode 100644 index 000000000000..ea0967a263a8 --- /dev/null +++ b/test/DebugInfo/Inputs/llvm-symbolizer-dwo-test.cc @@ -0,0 +1,18 @@ +int f(int a, int b) { + return a + b; +} + +int g(int a) { + return a + 1; +} + + +int main() { + return f(2, g(2)); +} + +// Built with Clang 3.5.0: +// $ mkdir -p /tmp/dbginfo +// $ cp llvm-symbolizer-dwo-test.cc /tmp/dbginfo +// $ cd /tmp/dbginfo +// $ clang -gsplit-dwarf llvm-symbolizer-dwo-test.cc diff --git a/test/DebugInfo/Inputs/llvm-symbolizer-test.c b/test/DebugInfo/Inputs/llvm-symbolizer-test.c new file mode 100644 index 000000000000..4c40c00c6736 --- /dev/null +++ b/test/DebugInfo/Inputs/llvm-symbolizer-test.c @@ -0,0 +1,18 @@ +int f(int a, int b) { + return a + b; +} + +int g(int a) { + return a + 1; +} + + +int main() { + return f(2, g(2)); +} + +// Built with Clang 3.3: +// $ mkdir -p /tmp/dbginfo +// $ cp llvm-symbolizer-test.c /tmp/dbginfo +// $ cd /tmp/dbginfo +// $ clang -g llvm-symbolizer-test.c -o <output> diff --git a/test/DebugInfo/Inputs/llvm-symbolizer-test.elf-x86-64 b/test/DebugInfo/Inputs/llvm-symbolizer-test.elf-x86-64 Binary files differnew file mode 100755 index 000000000000..99a448a77789 --- /dev/null +++ b/test/DebugInfo/Inputs/llvm-symbolizer-test.elf-x86-64 diff --git a/test/DebugInfo/Inputs/shared-object-stripped.elf-i386 b/test/DebugInfo/Inputs/shared-object-stripped.elf-i386 Binary files differnew file mode 100644 index 000000000000..727c6a67b0ce --- /dev/null +++ b/test/DebugInfo/Inputs/shared-object-stripped.elf-i386 diff --git a/test/DebugInfo/Mips/delay-slot.ll b/test/DebugInfo/Mips/delay-slot.ll new file mode 100644 index 000000000000..9bce4ba6c9d8 --- /dev/null +++ b/test/DebugInfo/Mips/delay-slot.ll @@ -0,0 +1,75 @@ +; RUN: llc -filetype=obj -O0 < %s -mtriple mips-unknown-linux-gnu | llvm-dwarfdump - | FileCheck %s +; PR19815 + +; Generated using clang -target mips-linux-gnu -g test.c -S -o - -flto|opt -sroa -S +; test.c: +; +; int foo(int x) { +; if (x) +; return 0; +; return 1; +; } + +; CHECK: Address Line Column File ISA Discriminator Flags +; CHECK: ------------------ ------ ------ ------ --- ------------- ------------- +; CHECK: 0x0000000000000000 1 0 1 0 0 is_stmt +; CHECK: 0x0000000000000000 1 0 1 0 0 is_stmt prologue_end +; CHECK: 0x0000000000000008 2 0 1 0 0 is_stmt +; CHECK: 0x0000000000000020 3 0 1 0 0 is_stmt +; CHECK: 0x0000000000000030 4 0 1 0 0 is_stmt +; CHECK: 0x0000000000000040 5 0 1 0 0 is_stmt +; CHECK: 0x0000000000000050 5 0 1 0 0 is_stmt end_sequence + +target datalayout = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64" +target triple = "mips--linux-gnu" + +; Function Attrs: nounwind +define i32 @foo(i32 %x) #0 { +entry: + call void @llvm.dbg.value(metadata !{i32 %x}, i64 0, metadata !12), !dbg !13 + %tobool = icmp ne i32 %x, 0, !dbg !14 + br i1 %tobool, label %if.then, label %if.end, !dbg !14 + +if.then: ; preds = %entry + br label %return, !dbg !16 + +if.end: ; preds = %entry + br label %return, !dbg !17 + +return: ; preds = %if.end, %if.then + %retval.0 = phi i32 [ 0, %if.then ], [ 1, %if.end ] + ret i32 %retval.0, !dbg !18 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.value(metadata, i64, metadata) #1 + +attributes #0 = { nounwind } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!9, !10} +!llvm.ident = !{!11} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/test.c] [DW_LANG_C99] +!1 = metadata !{metadata !"test.c", metadata !"/tmp"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"foo", metadata !"foo", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @foo, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [foo] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/test.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{metadata !8, metadata !8} +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!10 = metadata !{i32 2, metadata !"Debug Info Version", i32 1} +!11 = metadata !{metadata !"clang version 3.5.0"} +!12 = metadata !{i32 786689, metadata !4, metadata !"x", metadata !5, i32 16777217, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [x] [line 1] +!13 = metadata !{i32 1, i32 0, metadata !4, null} +!14 = metadata !{i32 2, i32 0, metadata !15, null} +!15 = metadata !{i32 786443, metadata !1, metadata !4, i32 2, i32 0, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [/tmp/test.c] +!16 = metadata !{i32 3, i32 0, metadata !15, null} +!17 = metadata !{i32 4, i32 0, metadata !4, null} +!18 = metadata !{i32 5, i32 0, metadata !4, null} diff --git a/test/DebugInfo/Mips/lit.local.cfg b/test/DebugInfo/Mips/lit.local.cfg new file mode 100644 index 000000000000..7d12f7a9c564 --- /dev/null +++ b/test/DebugInfo/Mips/lit.local.cfg @@ -0,0 +1,2 @@ +if not 'Mips' in config.root.targets: + config.unsupported = True diff --git a/test/DebugInfo/PR20038.ll b/test/DebugInfo/PR20038.ll new file mode 100644 index 000000000000..61145e5c8441 --- /dev/null +++ b/test/DebugInfo/PR20038.ll @@ -0,0 +1,168 @@ +; REQUIRES: object-emission + +; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s + +; IR generated from clang -O0 with: +; struct C { +; ~C(); +; }; +; extern bool b; +; void fun4() { b && (C(), 1); } +; __attribute__((always_inline)) C::~C() { } + +; CHECK: DW_TAG_structure_type +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "C" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: [[C_DTOR_DECL:.*]]: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "~C" + +; CHECK: [[D1_ABS:.*]]: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_MIPS_linkage_name {{.*}} "_ZN1CD1Ev" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: [[D1_THIS_ABS:.*]]: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "this" + +; CHECK: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "fun4" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_lexical_block +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_inlined_subroutine +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_abstract_origin {{.*}} {[[D1_ABS]]} +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_abstract_origin {{.*}} {[[D1_THIS_ABS]]} + +; FIXME: D2 is actually inlined into D1 but doesn't show up here, possibly due +; to there being no work in D2 (calling another member function from the dtor +; causes D2 to show up, calling a free function doesn't). + +; CHECK-NOT: DW_TAG +; CHECK: NULL +; CHECK-NOT: DW_TAG +; CHECK: NULL +; CHECK-NOT: DW_TAG +; CHECK: NULL + +%struct.C = type { i8 } + +@b = external global i8 + +; Function Attrs: nounwind +define void @_Z4fun4v() #0 { +entry: + %this.addr.i.i = alloca %struct.C*, align 8, !dbg !21 + %this.addr.i = alloca %struct.C*, align 8, !dbg !22 + %agg.tmp.ensured = alloca %struct.C, align 1 + %cleanup.cond = alloca i1 + %0 = load i8* @b, align 1, !dbg !24 + %tobool = trunc i8 %0 to i1, !dbg !24 + store i1 false, i1* %cleanup.cond + br i1 %tobool, label %land.rhs, label %land.end, !dbg !24 + +land.rhs: ; preds = %entry + store i1 true, i1* %cleanup.cond, !dbg !25 + br label %land.end + +land.end: ; preds = %land.rhs, %entry + %1 = phi i1 [ false, %entry ], [ true, %land.rhs ] + %cleanup.is_active = load i1* %cleanup.cond, !dbg !27 + br i1 %cleanup.is_active, label %cleanup.action, label %cleanup.done, !dbg !27 + +cleanup.action: ; preds = %land.end + store %struct.C* %agg.tmp.ensured, %struct.C** %this.addr.i, align 8, !dbg !22 + call void @llvm.dbg.declare(metadata !{%struct.C** %this.addr.i}, metadata !29), !dbg !31 + %this1.i = load %struct.C** %this.addr.i, !dbg !22 + store %struct.C* %this1.i, %struct.C** %this.addr.i.i, align 8, !dbg !21 + call void @llvm.dbg.declare(metadata !{%struct.C** %this.addr.i.i}, metadata !32), !dbg !33 + %this1.i.i = load %struct.C** %this.addr.i.i, !dbg !21 + br label %cleanup.done, !dbg !22 + +cleanup.done: ; preds = %cleanup.action, %land.end + ret void, !dbg !34 +} + +; Function Attrs: alwaysinline nounwind +define void @_ZN1CD1Ev(%struct.C* %this) unnamed_addr #1 align 2 { +entry: + %this.addr.i = alloca %struct.C*, align 8, !dbg !37 + %this.addr = alloca %struct.C*, align 8 + store %struct.C* %this, %struct.C** %this.addr, align 8 + call void @llvm.dbg.declare(metadata !{%struct.C** %this.addr}, metadata !29), !dbg !38 + %this1 = load %struct.C** %this.addr + store %struct.C* %this1, %struct.C** %this.addr.i, align 8, !dbg !37 + call void @llvm.dbg.declare(metadata !{%struct.C** %this.addr.i}, metadata !32), !dbg !39 + %this1.i = load %struct.C** %this.addr.i, !dbg !37 + ret void, !dbg !37 +} + +; Function Attrs: alwaysinline nounwind +define void @_ZN1CD2Ev(%struct.C* %this) unnamed_addr #1 align 2 { +entry: + %this.addr = alloca %struct.C*, align 8 + store %struct.C* %this, %struct.C** %this.addr, align 8 + call void @llvm.dbg.declare(metadata !{%struct.C** %this.addr}, metadata !32), !dbg !40 + %this1 = load %struct.C** %this.addr + ret void, !dbg !41 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #2 + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { alwaysinline nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #2 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!18, !19} +!llvm.ident = !{!20} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !11, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/<stdin>] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"<stdin>", metadata !"/tmp/dbginfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786451, metadata !5, null, metadata !"C", i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !6, i32 0, null, null, metadata !"_ZTS1C"} ; [ DW_TAG_structure_type ] [C] [line 1, size 8, align 8, offset 0] [def] [from ] +!5 = metadata !{metadata !"PR20038.cpp", metadata !"/tmp/dbginfo"} +!6 = metadata !{metadata !7} +!7 = metadata !{i32 786478, metadata !5, metadata !"_ZTS1C", metadata !"~C", metadata !"~C", metadata !"", i32 2, metadata !8, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, null, i32 2} ; [ DW_TAG_subprogram ] [line 2] [~C] +!8 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !9, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!9 = metadata !{null, metadata !10} +!10 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !"_ZTS1C"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from _ZTS1C] +!11 = metadata !{metadata !12, metadata !16, metadata !17} +!12 = metadata !{i32 786478, metadata !5, metadata !13, metadata !"fun4", metadata !"fun4", metadata !"_Z4fun4v", i32 5, metadata !14, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_Z4fun4v, null, null, metadata !2, i32 5} ; [ DW_TAG_subprogram ] [line 5] [def] [fun4] +!13 = metadata !{i32 786473, metadata !5} ; [ DW_TAG_file_type ] [/tmp/dbginfo/PR20038.cpp] +!14 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !15, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!15 = metadata !{null} +!16 = metadata !{i32 786478, metadata !5, metadata !"_ZTS1C", metadata !"~C", metadata !"~C", metadata !"_ZN1CD2Ev", i32 6, metadata !8, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.C*)* @_ZN1CD2Ev, null, metadata !7, metadata !2, i32 6} ; [ DW_TAG_subprogram ] [line 6] [def] [~C] +!17 = metadata !{i32 786478, metadata !5, metadata !"_ZTS1C", metadata !"~C", metadata !"~C", metadata !"_ZN1CD1Ev", i32 6, metadata !8, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.C*)* @_ZN1CD1Ev, null, metadata !7, metadata !2, i32 6} ; [ DW_TAG_subprogram ] [line 6] [def] [~C] +!18 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!19 = metadata !{i32 2, metadata !"Debug Info Version", i32 1} +!20 = metadata !{metadata !"clang version 3.5.0 "} +!21 = metadata !{i32 6, i32 0, metadata !17, metadata !22} +!22 = metadata !{i32 5, i32 0, metadata !23, null} +!23 = metadata !{i32 786443, metadata !5, metadata !12, i32 5, i32 0, i32 3, i32 3} ; [ DW_TAG_lexical_block ] [/tmp/dbginfo/PR20038.cpp] +!24 = metadata !{i32 5, i32 0, metadata !12, null} +!25 = metadata !{i32 5, i32 0, metadata !26, null} +!26 = metadata !{i32 786443, metadata !5, metadata !12, i32 5, i32 0, i32 1, i32 1} ; [ DW_TAG_lexical_block ] [/tmp/dbginfo/PR20038.cpp] +!27 = metadata !{i32 5, i32 0, metadata !28, null} +!28 = metadata !{i32 786443, metadata !5, metadata !12, i32 5, i32 0, i32 2, i32 2} ; [ DW_TAG_lexical_block ] [/tmp/dbginfo/PR20038.cpp] +!29 = metadata !{i32 786689, metadata !17, metadata !"this", null, i32 16777216, metadata !30, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!30 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !"_ZTS1C"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from _ZTS1C] +!31 = metadata !{i32 0, i32 0, metadata !17, metadata !22} +!32 = metadata !{i32 786689, metadata !16, metadata !"this", null, i32 16777216, metadata !30, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!33 = metadata !{i32 0, i32 0, metadata !16, metadata !21} +!34 = metadata !{i32 5, i32 0, metadata !35, null} +!35 = metadata !{i32 786443, metadata !5, metadata !36, i32 5, i32 0, i32 5, i32 5} ; [ DW_TAG_lexical_block ] [/tmp/dbginfo/PR20038.cpp] +!36 = metadata !{i32 786443, metadata !5, metadata !12, i32 5, i32 0, i32 4, i32 4} ; [ DW_TAG_lexical_block ] [/tmp/dbginfo/PR20038.cpp] +!37 = metadata !{i32 6, i32 0, metadata !17, null} +!38 = metadata !{i32 0, i32 0, metadata !17, null} +!39 = metadata !{i32 0, i32 0, metadata !16, metadata !37} +!40 = metadata !{i32 0, i32 0, metadata !16, null} +!41 = metadata !{i32 6, i32 0, metadata !16, null} diff --git a/test/DebugInfo/PowerPC/lit.local.cfg b/test/DebugInfo/PowerPC/lit.local.cfg index 193ebebcd50e..091332439b18 100644 --- a/test/DebugInfo/PowerPC/lit.local.cfg +++ b/test/DebugInfo/PowerPC/lit.local.cfg @@ -1,3 +1,2 @@ -targets = set(config.root.targets_to_build.split()) -if not 'PowerPC' in targets: +if not 'PowerPC' in config.root.targets: config.unsupported = True diff --git a/test/DebugInfo/PowerPC/tls-fission.ll b/test/DebugInfo/PowerPC/tls-fission.ll index 4a744c722532..9cde2c79a00b 100644 --- a/test/DebugInfo/PowerPC/tls-fission.ll +++ b/test/DebugInfo/PowerPC/tls-fission.ll @@ -23,7 +23,7 @@ !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !2, metadata !3, metadata !2, metadata !"tls.dwo"} ; [ DW_TAG_compile_unit ] [/tmp/tls.cpp] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !"tls.cpp", metadata !"/tmp"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4} !4 = metadata !{i32 786484, i32 0, null, metadata !"tls", metadata !"tls", metadata !"", metadata !5, i32 1, metadata !6, i32 0, i32 1, i32* @tls, null} ; [ DW_TAG_variable ] [tls] [line 1] [def] !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/tls.cpp] diff --git a/test/DebugInfo/PowerPC/tls.ll b/test/DebugInfo/PowerPC/tls.ll index 6557f5ea47b9..f2586eda4243 100644 --- a/test/DebugInfo/PowerPC/tls.ll +++ b/test/DebugInfo/PowerPC/tls.ll @@ -19,7 +19,7 @@ !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !2, metadata !3, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/tmp/tls.cpp] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !"tls.cpp", metadata !"/tmp"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4} !4 = metadata !{i32 786484, i32 0, null, metadata !"tls", metadata !"tls", metadata !"", metadata !5, i32 1, metadata !6, i32 0, i32 1, i32* @tls, null} ; [ DW_TAG_variable ] [tls] [line 1] [def] !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/tls.cpp] diff --git a/test/DebugInfo/Sparc/gnu-window-save.ll b/test/DebugInfo/Sparc/gnu-window-save.ll new file mode 100644 index 000000000000..303a28777584 --- /dev/null +++ b/test/DebugInfo/Sparc/gnu-window-save.ll @@ -0,0 +1,71 @@ +; RUN: llc -filetype=obj -O0 < %s -mtriple sparc64-unknown-linux-gnu | llvm-dwarfdump - | FileCheck %s --check-prefix=SPARC64 +; RUN: llc -filetype=obj -O0 < %s -mtriple sparc-unknown-linux-gnu | llvm-dwarfdump - | FileCheck %s --check-prefix=SPARC32 + +; Check for DW_CFA_GNU_Window_save in debug_frame. Also, Ensure that relocations +; are performed correctly in debug_info. + +; SPARC64: file format ELF64-sparc + +; SPARC64: .debug_info +; SPARC64: DW_TAG_compile_unit +; SPARC64: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9,A-F,a-f]+}}] = "hello.c") +; SPARC64: DW_TAG_subprogram +; SPARC64: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9,A-F,a-f]+}}] = "main") +; SPARC64: DW_TAG_base_type +; SPARC64: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9,A-F,a-f]+}}] = "int") + +; SPARC64: .debug_frame +; SPARC64: DW_CFA_def_cfa_register +; SPARC64-NEXT: DW_CFA_GNU_window_save +; SPARC64-NEXT: DW_CFA_register + + +; SPARC32: file format ELF32-sparc + +; SPARC32: .debug_info +; SPARC32: DW_TAG_compile_unit +; SPARC32: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9,A-F,a-f]+}}] = "hello.c") +; SPARC32: DW_TAG_subprogram +; SPARC32: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9,A-F,a-f]+}}] = "main") +; SPARC32: DW_TAG_base_type +; SPARC32: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9,A-F,a-f]+}}] = "int") + +; SPARC32: .debug_frame +; SPARC32: DW_CFA_def_cfa_register +; SPARC32-NEXT: DW_CFA_GNU_window_save +; SPARC32-NEXT: DW_CFA_register + +@.str = private unnamed_addr constant [14 x i8] c"hello, world\0A\00", align 1 + +; Function Attrs: nounwind +define signext i32 @main() #0 { +entry: + %retval = alloca i32, align 4 + store i32 0, i32* %retval + %call = call signext i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)), !dbg !12 + ret i32 0, !dbg !13 +} + +declare signext i32 @printf(i8*, ...) #1 + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!9, !10} +!llvm.ident = !{!11} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5 (http://llvm.org/git/clang.git 6a0714fee07fb7c4e32d3972b4fe2ce2f5678cf4) (llvm/ 672e88e934757f76d5c5e5258be41e7615094844)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/home/venkatra/work/benchmarks/test/hello/hello.c] [DW_LANG_C99] +!1 = metadata !{metadata !"hello.c", metadata !"/home/venkatra/work/benchmarks/test/hello"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"main", metadata !"main", metadata !"", i32 3, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, metadata !2, i32 4} ; [ DW_TAG_subprogram ] [line 3] [def] [scope 4] [main] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/home/venkatra/work/benchmarks/test/hello/hello.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{metadata !8} +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!10 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!11 = metadata !{metadata !"clang version 3.5 (http://llvm.org/git/clang.git 6a0714fee07fb7c4e32d3972b4fe2ce2f5678cf4) (llvm/ 672e88e934757f76d5c5e5258be41e7615094844)"} +!12 = metadata !{i32 5, i32 0, metadata !4, null} +!13 = metadata !{i32 6, i32 0, metadata !4, null} diff --git a/test/DebugInfo/Sparc/lit.local.cfg b/test/DebugInfo/Sparc/lit.local.cfg new file mode 100644 index 000000000000..d86c9e6d943a --- /dev/null +++ b/test/DebugInfo/Sparc/lit.local.cfg @@ -0,0 +1,2 @@ +if not 'Sparc' in config.root.targets: + config.unsupported = True diff --git a/test/DebugInfo/SystemZ/eh_frame.s b/test/DebugInfo/SystemZ/eh_frame.s index 4e7afd56e94b..6189b9019673 100644 --- a/test/DebugInfo/SystemZ/eh_frame.s +++ b/test/DebugInfo/SystemZ/eh_frame.s @@ -11,9 +11,25 @@ check_largest_class: .cfi_offset %r13, -56 .cfi_offset %r14, -48 .cfi_offset %r15, -40 - aghi %r15, -160 - .cfi_def_cfa_offset 320 - lmg %r13, %r15, 264(%r15) + aghi %r15, -224 + .cfi_def_cfa_offset 384 + std %f8, 160(%r15) + std %f9, 168(%r15) + std %f10, 176(%r15) + std %f11, 184(%r15) + std %f12, 192(%r15) + std %f13, 200(%r15) + std %f14, 208(%r15) + std %f15, 216(%r15) + .cfi_offset %f8, -224 + .cfi_offset %f9, -216 + .cfi_offset %f10, -208 + .cfi_offset %f11, -200 + .cfi_offset %f12, -192 + .cfi_offset %f13, -184 + .cfi_offset %f14, -176 + .cfi_offset %f15, -168 + lmg %r13, %r15, 328(%r15) br %r14 .size check_largest_class, .-check_largest_class .cfi_endproc @@ -22,8 +38,8 @@ check_largest_class: # # Contents of the .eh_frame section: # -# 00000000 0000001c 00000000 CIE -# Version: 1 +# 00000000 0000000000000014 00000000 CIE +# Version: 3 # Augmentation: "zR" # Code alignment factor: 1 # Data alignment factor: -8 @@ -35,20 +51,29 @@ check_largest_class: # DW_CFA_nop # DW_CFA_nop # -# 00000020 0000001c 00000024 FDE cie=00000000 pc=00000000..00000012 -# DW_CFA_advance_loc: 6 to 00000006 +# 000000.. 000000000000002c 0000001c FDE cie=00000000 pc=0000000000000000..0000000000000032 +# DW_CFA_advance_loc: 6 to 0000000000000006 # DW_CFA_offset: r13 at cfa-56 # DW_CFA_offset: r14 at cfa-48 # DW_CFA_offset: r15 at cfa-40 -# DW_CFA_advance_loc: 4 to 0000000a -# DW_CFA_def_cfa_offset: 320 -# DW_CFA_nop +# DW_CFA_advance_loc: 4 to 000000000000000a +# DW_CFA_def_cfa_offset: 384 +# DW_CFA_advance_loc: 32 to 000000000000002a +# DW_CFA_offset: r24 at cfa-224 +# DW_CFA_offset: r28 at cfa-216 +# DW_CFA_offset: r25 at cfa-208 +# DW_CFA_offset: r29 at cfa-200 +# DW_CFA_offset: r26 at cfa-192 +# DW_CFA_offset: r30 at cfa-184 +# DW_CFA_offset: r27 at cfa-176 +# DW_CFA_offset: r31 at cfa-168 # DW_CFA_nop # DW_CFA_nop # DW_CFA_nop # # CHECK: Contents of section .eh_frame: -# CHECK-NEXT: 0000 00000014 00000000 017a5200 01780e01 .........zR..x.. -# CHECK-NEXT: 0010 1b0c0fa0 01000000 0000001c 0000001c ................ -# CHECK-NEXT: 0020 00000000 00000012 00468d07 8e068f05 .........F...... -# CHECK-NEXT: 0030 440ec002 00000000 D....... +# CHECK-NEXT: 0000 00000014 00000000 037a5200 01780e01 {{.*}} +# CHECK-NEXT: 0010 1b0c0fa0 01000000 0000002c 0000001c {{.*}} +# CHECK-NEXT: 0020 00000000 00000032 00468d07 8e068f05 {{.*}} +# CHECK-NEXT: 0030 440e8003 60981c9c 1b991a9d 199a189e {{.*}} +# CHECK-NEXT: 0040 179b169f 15000000 {{.*}} diff --git a/test/DebugInfo/SystemZ/eh_frame_personality.s b/test/DebugInfo/SystemZ/eh_frame_personality.s index 46b46db1d806..456e0a6e6bdd 100644 --- a/test/DebugInfo/SystemZ/eh_frame_personality.s +++ b/test/DebugInfo/SystemZ/eh_frame_personality.s @@ -37,7 +37,7 @@ DW.ref.__gxx_personality_v0: # Contents of the .eh_frame section: # # 00000000 0000001c 00000000 CIE -# Version: 1 +# Version: 3 # Augmentation: "zPLR" # Code alignment factor: 1 # Data alignment factor: -8 @@ -61,7 +61,7 @@ DW.ref.__gxx_personality_v0: # DW_CFA_nop # # CHECK: Contents of section .eh_frame: -# CHECK-NEXT: 0000 0000001c 00000000 017a504c 52000178 .........zPLR..x +# CHECK-NEXT: 0000 0000001c 00000000 037a504c 52000178 .........zPLR..x # CHECK-NEXT: 0010 0e079b00 0000001b 1b0c0fa0 01000000 ................ # CHECK-NEXT: 0020 0000001c 00000024 00000000 00000012 .......$........ # CHECK-NEXT: 0030 04000000 00468e06 8f05440e c0020000 .....F....D..... diff --git a/test/DebugInfo/SystemZ/lit.local.cfg b/test/DebugInfo/SystemZ/lit.local.cfg index b12af09434be..5c02dd3614a4 100644 --- a/test/DebugInfo/SystemZ/lit.local.cfg +++ b/test/DebugInfo/SystemZ/lit.local.cfg @@ -1,4 +1,3 @@ -targets = set(config.root.targets_to_build.split()) -if not 'SystemZ' in targets: +if not 'SystemZ' in config.root.targets: config.unsupported = True diff --git a/test/DebugInfo/SystemZ/variable-loc.ll b/test/DebugInfo/SystemZ/variable-loc.ll index 560b47747dd8..23df1cb555d3 100644 --- a/test/DebugInfo/SystemZ/variable-loc.ll +++ b/test/DebugInfo/SystemZ/variable-loc.ll @@ -1,8 +1,10 @@ ; RUN: llc -mtriple=s390x-linux-gnu -disable-fp-elim < %s | FileCheck %s +; RUN: llc -mtriple=s390x-linux-gnu -disable-fp-elim -filetype=obj < %s \ +; RUN: | llvm-dwarfdump -debug-dump=info - | FileCheck --check-prefix=DEBUG %s ; ; This is a regression test making sure the location of variables is correct in ; debugging information, even if they're addressed via the frame pointer. -; A copy of the AArch64 test, commandeered for SystemZ. +; Originally a copy of the AArch64 test, commandeered for SystemZ. ; ; First make sure main_arr is where we expect it: %r11 + 164 ; @@ -10,20 +12,13 @@ ; CHECK: aghi %r15, -568 ; CHECK: la %r2, 164(%r11) ; CHECK: brasl %r14, populate_array@PLT -; -; CHECK: .Linfo_string7: -; CHECK-NEXT: main_arr -; -; Now check that the debugging information reflects this: -; CHECK: DW_TAG_variable -; CHECK-NEXT: .long .Linfo_string7 -; -; Rather hard-coded, but 145 => DW_OP_fbreg and the .ascii is the sleb128 -; encoding of 164: -; CHECK: DW_AT_location -; CHECK-NEXT: .byte 145 -; CHECK-NEXT: .ascii "\244\001" -; + +; DEBUG: DW_TAG_variable +; Rather hard-coded, but 0x91 => DW_OP_fbreg and 0xa401 is SLEB128 encoded 164. +; DEBUG-NOT: DW_TAG +; DEBUG: DW_AT_location {{.*}}(<0x3> 91 a4 01 ) +; DEBUG-NOT: DW_TAG +; DEBUG: DW_AT_name {{.*}} "main_arr" @.str = private unnamed_addr constant [13 x i8] c"Total is %d\0A\00", align 2 @@ -39,7 +34,7 @@ entry: %retval = alloca i32, align 4 %main_arr = alloca [100 x i32], align 4 %val = alloca i32, align 4 - store i32 0, i32* %retval + store volatile i32 0, i32* %retval call void @llvm.dbg.declare(metadata !{[100 x i32]* %main_arr}, metadata !17), !dbg !22 call void @llvm.dbg.declare(metadata !{i32* %val}, metadata !23), !dbg !24 %arraydecay = getelementptr inbounds [100 x i32]* %main_arr, i32 0, i32 0, !dbg !25 @@ -58,7 +53,7 @@ declare i32 @printf(i8*, ...) !llvm.module.flags = !{!30} !0 = metadata !{i32 786449, metadata !29, i32 12, metadata !"clang version 3.2 ", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/home/timnor01/a64-trunk/build/simple.c] [DW_LANG_C99] -!1 = metadata !{i32 0} +!1 = metadata !{} !3 = metadata !{metadata !5, metadata !11, metadata !14} !5 = metadata !{i32 786478, metadata !29, metadata !6, metadata !"populate_array", metadata !"populate_array", metadata !"", i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i32*, i32)* @populate_array, null, null, metadata !1, i32 4} ; [ DW_TAG_subprogram ] [line 4] [def] [populate_array] !6 = metadata !{i32 786473, metadata !29} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/2010-08-10-DbgConstant.ll b/test/DebugInfo/X86/2010-08-10-DbgConstant.ll index d0a2dfaa1f31..7f42e7b70ec6 100644 --- a/test/DebugInfo/X86/2010-08-10-DbgConstant.ll +++ b/test/DebugInfo/X86/2010-08-10-DbgConstant.ll @@ -16,7 +16,7 @@ declare void @bar(i32) !0 = metadata !{i32 786478, metadata !12, metadata !1, metadata !"foo", metadata !"foo", metadata !"foo", i32 3, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, void ()* @foo, null, null, null, i32 3} ; [ DW_TAG_subprogram ] !1 = metadata !{i32 786473, metadata !12} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 786449, metadata !12, i32 12, metadata !"clang 2.8", i1 false, metadata !"", i32 0, metadata !4, metadata !4, metadata !10, metadata !11, metadata !11, metadata !""} ; [ DW_TAG_compile_unit ] +!2 = metadata !{i32 786449, metadata !12, i32 12, metadata !"clang 2.8", i1 false, metadata !"", i32 0, metadata !4, metadata !4, metadata !10, metadata !11, metadata !14, metadata !""} ; [ DW_TAG_compile_unit ] !3 = metadata !{i32 786453, metadata !12, metadata !1, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !4 = metadata !{null} !5 = metadata !{i32 786471, i32 0, metadata !1, metadata !"ro", metadata !"ro", metadata !"ro", metadata !1, i32 1, metadata !6, i1 true, i1 true, i32 201, null} ; [ DW_TAG_constant ] @@ -28,3 +28,4 @@ declare void @bar(i32) !11 = metadata !{metadata !5} !12 = metadata !{metadata !"/tmp/l.c", metadata !"/Volumes/Lalgate/clean/D"} !13 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!14 = metadata !{} diff --git a/test/DebugInfo/X86/2011-09-26-GlobalVarContext.ll b/test/DebugInfo/X86/2011-09-26-GlobalVarContext.ll index cdfd9527d005..4dc747f566d2 100644 --- a/test/DebugInfo/X86/2011-09-26-GlobalVarContext.ll +++ b/test/DebugInfo/X86/2011-09-26-GlobalVarContext.ll @@ -19,16 +19,14 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!21} -!0 = metadata !{i32 786449, metadata !20, i32 12, metadata !"clang version 3.0 (trunk)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !12, metadata !12, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !20, i32 12, metadata !"clang version 3.0 (trunk)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !12, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{} !3 = metadata !{metadata !5} -!5 = metadata !{i32 720942, metadata !6, metadata !6, metadata !"f", metadata !"f", metadata !"", i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @f, null, null, metadata !10, i32 0} ; [ DW_TAG_subprogram ] [line 3] [def] [scope 0] [f] +!5 = metadata !{i32 720942, metadata !6, metadata !6, metadata !"f", metadata !"f", metadata !"", i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @f, null, null, null, i32 0} ; [ DW_TAG_subprogram ] [line 3] [def] [scope 0] [f] !6 = metadata !{i32 720937, metadata !20} ; [ DW_TAG_file_type ] !7 = metadata !{i32 720917, i32 0, null, i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !8 = metadata !{metadata !9} !9 = metadata !{i32 720932, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!10 = metadata !{metadata !11} -!11 = metadata !{i32 720932} ; [ DW_TAG_base_type ] !12 = metadata !{metadata !14} !14 = metadata !{i32 720948, i32 0, null, metadata !"GLB", metadata !"GLB", metadata !"", metadata !6, i32 1, metadata !9, i32 0, i32 1, i32* @GLB, null} ; [ DW_TAG_variable ] !15 = metadata !{i32 786688, metadata !16, metadata !"LOC", metadata !6, i32 4, metadata !9, i32 0, i32 0} ; [ DW_TAG_auto_variable ] @@ -39,13 +37,19 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone !20 = metadata !{metadata !"test.c", metadata !"/work/llvm/vanilla/test/DebugInfo"} ; CHECK: DW_TAG_variable -; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "GLB") +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "GLB") +; CHECK-NOT: DW_TAG ; CHECK: DW_AT_decl_file [DW_FORM_data1] (0x01) +; CHECK-NOT: DW_TAG ; CHECK: DW_AT_decl_line [DW_FORM_data1] (0x01) ; CHECK: DW_TAG_variable -; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "LOC") +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "LOC") +; CHECK-NOT: DW_TAG ; CHECK: DW_AT_decl_file [DW_FORM_data1] (0x01) +; CHECK-NOT: DW_TAG ; CHECK: DW_AT_decl_line [DW_FORM_data1] (0x04) !21 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/DebugInfo/X86/2011-12-16-BadStructRef.ll b/test/DebugInfo/X86/2011-12-16-BadStructRef.ll index 5e6a6014d696..21dccd71c4e2 100644 --- a/test/DebugInfo/X86/2011-12-16-BadStructRef.ll +++ b/test/DebugInfo/X86/2011-12-16-BadStructRef.ll @@ -90,7 +90,7 @@ entry: !llvm.module.flags = !{!83} !0 = metadata !{i32 720913, metadata !82, i32 4, metadata !"clang version 3.1 (trunk 146596)", i1 false, metadata !"", i32 0, metadata !1, metadata !3, metadata !27, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!1 = metadata !{} !3 = metadata !{metadata !5, metadata !9} !5 = metadata !{i32 720898, metadata !82, null, metadata !"bar", i32 9, i64 128, i64 64, i32 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_class_type ] [bar] [line 9, size 128, align 64, offset 0] [def] [from ] !6 = metadata !{i32 720937, metadata !82} ; [ DW_TAG_file_type ] @@ -100,22 +100,18 @@ entry: !10 = metadata !{metadata !11, metadata !13} !11 = metadata !{i32 720909, metadata !82, metadata !9, metadata !"h", i32 5, i64 32, i64 32, i64 0, i32 0, metadata !12} ; [ DW_TAG_member ] !12 = metadata !{i32 720932, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!13 = metadata !{i32 720942, metadata !82, metadata !9, metadata !"baz", metadata !"baz", metadata !"", i32 6, metadata !14, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !17, i32 0} ; [ DW_TAG_subprogram ] +!13 = metadata !{i32 720942, metadata !82, metadata !9, metadata !"baz", metadata !"baz", metadata !"", i32 6, metadata !14, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, null, i32 0} ; [ DW_TAG_subprogram ] !14 = metadata !{i32 720917, i32 0, null, i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, null, metadata !15, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !15 = metadata !{null, metadata !16, metadata !12} !16 = metadata !{i32 720911, i32 0, null, i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !9} ; [ DW_TAG_pointer_type ] -!17 = metadata !{metadata !18} -!18 = metadata !{i32 720932} ; [ DW_TAG_base_type ] !19 = metadata !{i32 720909, metadata !82, metadata !5, metadata !"b_ref", i32 12, i64 64, i64 64, i64 64, i32 0, metadata !20} ; [ DW_TAG_member ] !20 = metadata !{i32 720912, null, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !9} ; [ DW_TAG_reference_type ] -!21 = metadata !{i32 720942, metadata !82, metadata !5, metadata !"bar", metadata !"bar", metadata !"", i32 13, metadata !22, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !25, i32 0} ; [ DW_TAG_subprogram ] +!21 = metadata !{i32 720942, metadata !82, metadata !5, metadata !"bar", metadata !"bar", metadata !"", i32 13, metadata !22, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, null, i32 0} ; [ DW_TAG_subprogram ] !22 = metadata !{i32 720917, i32 0, null, i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, null, metadata !23, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !23 = metadata !{null, metadata !24, metadata !12} !24 = metadata !{i32 720911, i32 0, null, i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !5} ; [ DW_TAG_pointer_type ] -!25 = metadata !{metadata !26} -!26 = metadata !{i32 720932} ; [ DW_TAG_base_type ] !27 = metadata !{metadata !29, metadata !37, metadata !40, metadata !43, metadata !46} -!29 = metadata !{i32 720942, metadata !82, metadata !6, metadata !"main", metadata !"main", metadata !"", i32 17, metadata !30, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32, i8**)* @main, null, null, metadata !47, i32 0} ; [ DW_TAG_subprogram ] [line 17] [def] [scope 0] [main] +!29 = metadata !{i32 720942, metadata !82, metadata !6, metadata !"main", metadata !"main", metadata !"", i32 17, metadata !30, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32, i8**)* @main, null, null, null, i32 0} ; [ DW_TAG_subprogram ] [line 17] [def] [scope 0] [main] !30 = metadata !{i32 720917, i32 0, null, i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, null, metadata !31, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !31 = metadata !{metadata !12, metadata !12, metadata !32} !32 = metadata !{i32 720911, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !33} ; [ DW_TAG_pointer_type ] @@ -123,18 +119,16 @@ entry: !34 = metadata !{i32 720932, null, null, metadata !"char", i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] !35 = metadata !{metadata !36} !36 = metadata !{i32 720932} ; [ DW_TAG_base_type ] -!37 = metadata !{i32 720942, metadata !82, null, metadata !"bar", metadata !"bar", metadata !"_ZN3barC1Ei", i32 13, metadata !22, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.bar*, i32)* @_ZN3barC1Ei, null, metadata !21, metadata !47, i32 0} ; [ DW_TAG_subprogram ] [line 13] [def] [scope 0] [bar] +!37 = metadata !{i32 720942, metadata !82, null, metadata !"bar", metadata !"bar", metadata !"_ZN3barC1Ei", i32 13, metadata !22, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.bar*, i32)* @_ZN3barC1Ei, null, metadata !21, null, i32 0} ; [ DW_TAG_subprogram ] [line 13] [def] [scope 0] [bar] !38 = metadata !{metadata !39} !39 = metadata !{i32 720932} ; [ DW_TAG_base_type ] -!40 = metadata !{i32 720942, metadata !82, null, metadata !"bar", metadata !"bar", metadata !"_ZN3barC2Ei", i32 13, metadata !22, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.bar*, i32)* @_ZN3barC2Ei, null, metadata !21, metadata !47, i32 0} ; [ DW_TAG_subprogram ] [line 13] [def] [scope 0] [bar] +!40 = metadata !{i32 720942, metadata !82, null, metadata !"bar", metadata !"bar", metadata !"_ZN3barC2Ei", i32 13, metadata !22, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.bar*, i32)* @_ZN3barC2Ei, null, metadata !21, null, i32 0} ; [ DW_TAG_subprogram ] [line 13] [def] [scope 0] [bar] !41 = metadata !{metadata !42} !42 = metadata !{i32 720932} ; [ DW_TAG_base_type ] -!43 = metadata !{i32 720942, metadata !82, null, metadata !"baz", metadata !"baz", metadata !"_ZN3bazC1Ei", i32 6, metadata !14, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.baz*, i32)* @_ZN3bazC1Ei, null, metadata !13, metadata !47, i32 0} ; [ DW_TAG_subprogram ] [line 6] [def] [scope 0] [baz] +!43 = metadata !{i32 720942, metadata !82, null, metadata !"baz", metadata !"baz", metadata !"_ZN3bazC1Ei", i32 6, metadata !14, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.baz*, i32)* @_ZN3bazC1Ei, null, metadata !13, null, i32 0} ; [ DW_TAG_subprogram ] [line 6] [def] [scope 0] [baz] !44 = metadata !{metadata !45} !45 = metadata !{i32 720932} ; [ DW_TAG_base_type ] -!46 = metadata !{i32 720942, metadata !82, null, metadata !"baz", metadata !"baz", metadata !"_ZN3bazC2Ei", i32 6, metadata !14, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.baz*, i32)* @_ZN3bazC2Ei, null, metadata !13, metadata !47, i32 0} ; [ DW_TAG_subprogram ] [line 6] [def] [scope 0] [baz] -!47 = metadata !{metadata !48} -!48 = metadata !{i32 720932} ; [ DW_TAG_base_type ] +!46 = metadata !{i32 720942, metadata !82, null, metadata !"baz", metadata !"baz", metadata !"_ZN3bazC2Ei", i32 6, metadata !14, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.baz*, i32)* @_ZN3bazC2Ei, null, metadata !13, null, i32 0} ; [ DW_TAG_subprogram ] [line 6] [def] [scope 0] [baz] !49 = metadata !{i32 721153, metadata !29, metadata !"argc", metadata !6, i32 16777232, metadata !12, i32 0, i32 0} ; [ DW_TAG_arg_variable ] !50 = metadata !{i32 16, i32 14, metadata !29, null} !51 = metadata !{i32 721153, metadata !29, metadata !"argv", metadata !6, i32 33554448, metadata !32, i32 0, i32 0} ; [ DW_TAG_arg_variable ] diff --git a/test/DebugInfo/X86/DW_AT_byte_size.ll b/test/DebugInfo/X86/DW_AT_byte_size.ll index 87e242a0bb13..59921bd245c7 100644 --- a/test/DebugInfo/X86/DW_AT_byte_size.ll +++ b/test/DebugInfo/X86/DW_AT_byte_size.ll @@ -27,9 +27,9 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone !llvm.module.flags = !{!21} !0 = metadata !{i32 786449, metadata !20, i32 4, metadata !"clang version 3.1 (trunk 150996)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!1 = metadata !{} !3 = metadata !{metadata !5} -!5 = metadata !{i32 786478, metadata !20, metadata !6, metadata !"foo", metadata !"foo", metadata !"_Z3fooP1A", i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (%struct.A*)* @_Z3fooP1A, null, null, metadata !14, i32 3} ; [ DW_TAG_subprogram ] +!5 = metadata !{i32 786478, metadata !20, metadata !6, metadata !"foo", metadata !"foo", metadata !"_Z3fooP1A", i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (%struct.A*)* @_Z3fooP1A, null, null, null, i32 3} ; [ DW_TAG_subprogram ] !6 = metadata !{i32 786473, metadata !20} ; [ DW_TAG_file_type ] !7 = metadata !{i32 786453, i32 0, null, i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !8 = metadata !{metadata !9, metadata !10} @@ -38,8 +38,6 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone !11 = metadata !{i32 786434, metadata !20, null, metadata !"A", i32 1, i64 32, i64 32, i32 0, i32 0, null, metadata !12, i32 0, null, null, null} ; [ DW_TAG_class_type ] [A] [line 1, size 32, align 32, offset 0] [def] [from ] !12 = metadata !{metadata !13} !13 = metadata !{i32 786445, metadata !20, metadata !11, metadata !"b", i32 1, i64 32, i64 32, i64 0, i32 0, metadata !9} ; [ DW_TAG_member ] -!14 = metadata !{metadata !15} -!15 = metadata !{i32 786468} ; [ DW_TAG_base_type ] !16 = metadata !{i32 786689, metadata !5, metadata !"a", metadata !6, i32 16777219, metadata !10, i32 0, i32 0} ; [ DW_TAG_arg_variable ] !17 = metadata !{i32 3, i32 13, metadata !5, null} !18 = metadata !{i32 4, i32 3, metadata !19, null} diff --git a/test/DebugInfo/X86/DW_AT_linkage_name.ll b/test/DebugInfo/X86/DW_AT_linkage_name.ll new file mode 100644 index 000000000000..dce234aa9002 --- /dev/null +++ b/test/DebugInfo/X86/DW_AT_linkage_name.ll @@ -0,0 +1,116 @@ +; RUN: llc -mtriple=x86_64-apple-macosx %s -o %t -filetype=obj +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s +; +; struct A { +; A(int i); +; ~A(); +; }; +; +; A::~A() {} +; +; void foo() { +; A a(1); +; } +; +; rdar://problem/16362674 +; +; Test that we do not emit a linkage name for the declaration of a destructor. +; Test that we do emit a linkage name for a specific instance of it. + +; CHECK: DW_TAG_subprogram +; CHECK: [[A_DTOR:.*]]: DW_TAG_subprogram +; CHECK: DW_AT_name {{.*}} "~A" +; CHECK-NOT: DW_AT_MIPS_linkage_name +; CHECK: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_MIPS_linkage_name {{.*}} "_ZN1AD2Ev" +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_specification {{.*}}[[A_DTOR]] + + +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.9.0" + +%struct.A = type { i8 } + +; Function Attrs: nounwind ssp uwtable +define void @_ZN1AD2Ev(%struct.A* %this) unnamed_addr #0 align 2 { +entry: + %this.addr = alloca %struct.A*, align 8 + store %struct.A* %this, %struct.A** %this.addr, align 8 + call void @llvm.dbg.declare(metadata !{%struct.A** %this.addr}, metadata !26), !dbg !28 + %this1 = load %struct.A** %this.addr + ret void, !dbg !29 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +; Function Attrs: nounwind ssp uwtable +define void @_ZN1AD1Ev(%struct.A* %this) unnamed_addr #0 align 2 { +entry: + %this.addr = alloca %struct.A*, align 8 + store %struct.A* %this, %struct.A** %this.addr, align 8 + call void @llvm.dbg.declare(metadata !{%struct.A** %this.addr}, metadata !30), !dbg !31 + %this1 = load %struct.A** %this.addr + call void @_ZN1AD2Ev(%struct.A* %this1), !dbg !32 + ret void, !dbg !33 +} + +; Function Attrs: ssp uwtable +define void @_Z3foov() #2 { +entry: + %a = alloca %struct.A, align 1 + call void @llvm.dbg.declare(metadata !{%struct.A* %a}, metadata !34), !dbg !35 + call void @_ZN1AC1Ei(%struct.A* %a, i32 1), !dbg !35 + call void @_ZN1AD1Ev(%struct.A* %a), !dbg !36 + ret void, !dbg !36 +} + +declare void @_ZN1AC1Ei(%struct.A*, i32) + +attributes #0 = { nounwind ssp uwtable } +attributes #1 = { nounwind readnone } +attributes #2 = { ssp uwtable } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!23, !24} +!llvm.ident = !{!25} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !16, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [linkage-name.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"linkage-name.cpp", metadata !""} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786451, metadata !1, null, metadata !"A", i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !5, i32 0, null, null, metadata !"_ZTS1A"} ; [ DW_TAG_structure_type ] [A] [line 1, size 8, align 8, offset 0] [def] [from ] +!5 = metadata !{metadata !6, metadata !12} +!6 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1A", metadata !"A", metadata !"A", metadata !"", i32 2, metadata !7, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !11, i32 2} ; [ DW_TAG_subprogram ] [line 2] [A] +!7 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{null, metadata !9, metadata !10} +!9 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !"_ZTS1A"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from _ZTS1A] +!10 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!11 = metadata !{i32 786468} +!12 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1A", metadata !"~A", metadata !"~A", metadata !"", i32 3, metadata !13, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !15, i32 3} ; [ DW_TAG_subprogram ] [line 3] [~A] +!13 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !14, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!14 = metadata !{null, metadata !9} +!15 = metadata !{i32 786468} +!16 = metadata !{metadata !17, metadata !18, metadata !19} +!17 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1A", metadata !"~A", metadata !"~A", metadata !"_ZN1AD2Ev", i32 6, metadata !13, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.A*)* @_ZN1AD2Ev, null, metadata !12, metadata !2, i32 6} ; [ DW_TAG_subprogram ] [line 6] [def] [~A] +!18 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1A", metadata !"~A", metadata !"~A", metadata !"_ZN1AD1Ev", i32 6, metadata !13, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.A*)* @_ZN1AD1Ev, null, metadata !12, metadata !2, i32 6} ; [ DW_TAG_subprogram ] [line 6] [def] [~A] +!19 = metadata !{i32 786478, metadata !1, metadata !20, metadata !"foo", metadata !"foo", metadata !"_Z3foov", i32 10, metadata !21, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_Z3foov, null, null, metadata !2, i32 10} ; [ DW_TAG_subprogram ] [line 10] [def] [foo] +!20 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [linkage-name.cpp] +!21 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !22, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!22 = metadata !{null} +!23 = metadata !{i32 2, metadata !"Dwarf Version", i32 2} +!24 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!25 = metadata !{metadata !"clang version 3.5.0 "} +!26 = metadata !{i32 786689, metadata !17, metadata !"this", null, i32 16777216, metadata !27, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!27 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !"_ZTS1A"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from _ZTS1A] +!28 = metadata !{i32 0, i32 0, metadata !17, null} +!29 = metadata !{i32 8, i32 0, metadata !17, null} ; [ DW_TAG_imported_declaration ] +!30 = metadata !{i32 786689, metadata !18, metadata !"this", null, i32 16777216, metadata !27, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!31 = metadata !{i32 0, i32 0, metadata !18, null} +!32 = metadata !{i32 6, i32 0, metadata !18, null} +!33 = metadata !{i32 8, i32 0, metadata !18, null} ; [ DW_TAG_imported_declaration ] +!34 = metadata !{i32 786688, metadata !19, metadata !"a", metadata !20, i32 11, metadata !"_ZTS1A", i32 0, i32 0} ; [ DW_TAG_auto_variable ] [a] [line 11] +!35 = metadata !{i32 11, i32 0, metadata !19, null} +!36 = metadata !{i32 12, i32 0, metadata !19, null} diff --git a/test/DebugInfo/X86/DW_AT_location-reference.ll b/test/DebugInfo/X86/DW_AT_location-reference.ll index bdd0e044bf13..f31b0ad3259a 100644 --- a/test/DebugInfo/X86/DW_AT_location-reference.ll +++ b/test/DebugInfo/X86/DW_AT_location-reference.ll @@ -1,5 +1,10 @@ -; RUN: llc -O1 -mtriple=x86_64-apple-darwin < %s | FileCheck -check-prefix=DARWIN %s -; RUN: llc -O1 -mtriple=x86_64-pc-linux-gnu < %s | FileCheck -check-prefix=LINUX %s +; RUN: llc -O1 -filetype=obj -mtriple=x86_64-apple-darwin < %s > %t +; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-objdump -r %t | FileCheck -check-prefix=DARWIN %s +; RUN: llc -O1 -filetype=obj -mtriple=x86_64-pc-linux-gnu < %s > %t +; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-objdump -r %t | FileCheck -check-prefix=LINUX %s + ; PR9493 ; Adapted from the original test case in r127757. ; We use 'llc -O1' to induce variable 'x' to live in different locations. @@ -24,22 +29,31 @@ ; } ; // The 'x' variable and its symbol reference location -; DARWIN: DW_TAG_variable -; DARWIN-NEXT: ## DW_AT_name -; DARWIN-NEXT: .long Lset{{[0-9]+}} -; DARWIN-NEXT: ## DW_AT_decl_file -; DARWIN-NEXT: ## DW_AT_decl_line -; DARWIN-NEXT: ## DW_AT_type -; DARWIN-NEXT: Lset{{[0-9]+}} = Ldebug_loc{{[0-9]+}}-Lsection_debug_loc ## DW_AT_location -; DARWIN-NEXT: .long Lset{{[0-9]+}} +; CHECK: .debug_info contents: +; CHECK: DW_TAG_variable +; CHECK-NEXT: DW_AT_location [DW_FORM_sec_offset] (0x00000000) +; CHECK-NEXT: DW_AT_name {{.*}} "x" +; CHECK-NEXT: DW_AT_decl_file +; CHECK-NEXT: DW_AT_decl_line +; CHECK-NEXT: DW_AT_type + +; Check that the location contains only 4 ranges - this verifies that the 4th +; and 5th ranges were successfully merged into a single range. +; CHECK: .debug_loc contents: +; CHECK: 0x00000000: +; CHECK: Beginning address offset: +; CHECK: Beginning address offset: +; CHECK: Beginning address offset: +; CHECK: Beginning address offset: +; CHECK-NOT: Beginning address offset: -; LINUX: DW_TAG_variable -; LINUX-NEXT: # DW_AT_name -; LINUX-NEXT: # DW_AT_decl_file -; LINUX-NEXT: # DW_AT_decl_line -; LINUX-NEXT: # DW_AT_type -; LINUX-NEXT: .long .Ldebug_loc{{[0-9]+}} # DW_AT_location +; Check that we have no relocations in Darwin's output. +; DARWIN-NOT: X86_64_RELOC{{.*}} __debug_loc +; Check we have a relocation for the debug_loc entry in Linux output. +; LINUX: RELOCATION RECORDS FOR [.rela.debug_info] +; LINUX-NOT: RELOCATION RECORDS +; LINUX: R_X86_64{{.*}} .debug_loc+0 ; ModuleID = 'simple.c' target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n32" diff --git a/test/DebugInfo/X86/DW_AT_object_pointer.ll b/test/DebugInfo/X86/DW_AT_object_pointer.ll index 6e6c3a177ab3..4b9fae8e5af8 100644 --- a/test/DebugInfo/X86/DW_AT_object_pointer.ll +++ b/test/DebugInfo/X86/DW_AT_object_pointer.ll @@ -7,7 +7,8 @@ ; CHECK: DW_TAG_class_type ; CHECK: DW_AT_object_pointer [DW_FORM_ref4] (cu + 0x{{[0-9a-f]*}} => {[[PARAM:0x[0-9a-f]*]]}) ; CHECK: [[PARAM]]: DW_TAG_formal_parameter -; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "this") +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "this") %class.A = type { i32 } @@ -51,7 +52,7 @@ entry: !llvm.module.flags = !{!38} !0 = metadata !{i32 786449, metadata !37, i32 4, metadata !"clang version 3.2 (trunk 163586) (llvm/trunk 163570)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/Users/echristo/debug-tests/bar.cpp] [DW_LANG_C_plus_plus] -!1 = metadata !{i32 0} +!1 = metadata !{} !3 = metadata !{metadata !5, metadata !10, metadata !20} !5 = metadata !{i32 786478, metadata !6, metadata !6, metadata !"foo", metadata !"foo", metadata !"_Z3fooi", i32 7, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @_Z3fooi, null, null, metadata !1, i32 7} ; [ DW_TAG_subprogram ] [line 7] [def] [foo] !6 = metadata !{i32 786473, metadata !37} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/DW_AT_specification.ll b/test/DebugInfo/X86/DW_AT_specification.ll index 4d7ef4fd36f6..4f45f367448f 100644 --- a/test/DebugInfo/X86/DW_AT_specification.ll +++ b/test/DebugInfo/X86/DW_AT_specification.ll @@ -3,10 +3,11 @@ ; test that the DW_AT_specification is a back edge in the file. -; CHECK: DW_TAG_subprogram [{{[0-9]+}}] * -; CHECK: DW_AT_specification [DW_FORM_ref4] (cu + 0x[[OFFSET:[0-9a-f]*]] => {0x0000[[OFFSET]]}) -; CHECK: 0x0000[[OFFSET]]: DW_TAG_subprogram [{{[0-9]+}}] * -; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "bar") +; CHECK: [[BAR_DECL:0x[0-9a-f]*]]: DW_TAG_subprogram +; CHECK-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN3foo3barEv" +; CHECK: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_specification {{.*}} {[[BAR_DECL]]} @_ZZN3foo3barEvE1x = constant i32 0, align 4 @@ -19,27 +20,23 @@ entry: !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!28} -!0 = metadata !{i32 786449, metadata !27, i32 4, metadata !"clang version 3.0 ()", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !18, metadata !18, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !27, i32 4, metadata !"clang version 3.0 ()", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !18, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{} !3 = metadata !{metadata !5} -!5 = metadata !{i32 720942, metadata !6, null, metadata !"bar", metadata !"bar", metadata !"_ZN3foo3barEv", i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_ZN3foo3barEv, null, metadata !11, metadata !16, i32 4} ; [ DW_TAG_subprogram ] [line 4] [def] [bar] +!5 = metadata !{i32 720942, metadata !6, null, metadata !"bar", metadata !"bar", metadata !"_ZN3foo3barEv", i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_ZN3foo3barEv, null, metadata !11, null, i32 4} ; [ DW_TAG_subprogram ] [line 4] [def] [bar] !6 = metadata !{i32 720937, metadata !27} ; [ DW_TAG_file_type ] !7 = metadata !{i32 720917, i32 0, null, i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !8 = metadata !{null, metadata !9} !9 = metadata !{i32 786447, i32 0, null, i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !10} ; [ DW_TAG_pointer_type ] !10 = metadata !{i32 786451, metadata !27, null, metadata !"foo", i32 1, i64 0, i64 0, i32 0, i32 4, null, null, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [foo] [line 1, size 0, align 0, offset 0] [decl] [from ] -!11 = metadata !{i32 720942, metadata !6, metadata !12, metadata !"bar", metadata !"bar", metadata !"_ZN3foo3barEv", i32 2, metadata !7, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !14, i32 2} ; [ DW_TAG_subprogram ] +!11 = metadata !{i32 720942, metadata !6, metadata !12, metadata !"bar", metadata !"bar", metadata !"_ZN3foo3barEv", i32 2, metadata !7, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, null, i32 2} ; [ DW_TAG_subprogram ] !12 = metadata !{i32 720898, metadata !27, null, metadata !"foo", i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !13, i32 0, null, null} ; [ DW_TAG_class_type ] !13 = metadata !{metadata !11} -!14 = metadata !{metadata !15} -!15 = metadata !{i32 720932} ; [ DW_TAG_base_type ] -!16 = metadata !{metadata !17} -!17 = metadata !{i32 720932} ; [ DW_TAG_base_type ] !18 = metadata !{metadata !20} !20 = metadata !{i32 720948, i32 0, metadata !5, metadata !"x", metadata !"x", metadata !"", metadata !6, i32 5, metadata !21, i32 1, i32 1, i32* @_ZZN3foo3barEvE1x, null} ; [ DW_TAG_variable ] !21 = metadata !{i32 720934, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !22} ; [ DW_TAG_const_type ] !22 = metadata !{i32 720932, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !25 = metadata !{i32 6, i32 1, metadata !26, null} -!26 = metadata !{i32 786443, metadata !5, i32 4, i32 17, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!26 = metadata !{i32 786443, metadata !6, metadata !5, i32 4, i32 17, i32 0} ; [ DW_TAG_lexical_block ] !27 = metadata !{metadata !"nsNativeAppSupportBase.ii", metadata !"/Users/espindola/mozilla-central/obj-x86_64-apple-darwin11.2.0/toolkit/library"} !28 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/DebugInfo/X86/DW_AT_stmt_list_sec_offset.ll b/test/DebugInfo/X86/DW_AT_stmt_list_sec_offset.ll index 0c08f23e87ad..f16cbb061bf3 100644 --- a/test/DebugInfo/X86/DW_AT_stmt_list_sec_offset.ll +++ b/test/DebugInfo/X86/DW_AT_stmt_list_sec_offset.ll @@ -1,13 +1,16 @@ ; RUN: llc -mtriple=i686-w64-mingw32 -o %t -filetype=obj %s ; RUN: llvm-dwarfdump -debug-dump=all %t | FileCheck %s +; RUN: llc -mtriple=i686-w64-mingw32 -o %t -filetype=obj -dwarf-version=3 %s +; RUN: llvm-dwarfdump -debug-dump=all %t | FileCheck %s -check-prefix=DWARF3 -; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset] +; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset] +; DWARF3: DW_AT_stmt_list [DW_FORM_data4] ; ; generated from: ; clang -g -S -emit-llvm test.c -o test.ll ; int main() ; { -; return 0; +; return 0; ; } ; ModuleID = 'test.c' @@ -29,13 +32,13 @@ attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"= !0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [C:\Projects/test.c] [DW_LANG_C99] !1 = metadata !{metadata !"test.c", metadata !"C:\5CProjects"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4} !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"main", metadata !"main", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main, null, null, metadata !2, i32 2} ; [ DW_TAG_subprogram ] [line 1] [def] [scope 2] [main] !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [C:\Projects/test.c] !6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !7 = metadata !{metadata !8} !8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] -!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 3} +!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} !10 = metadata !{i32 3, i32 0, metadata !4, null} !11 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/DebugInfo/X86/DW_TAG_friend.ll b/test/DebugInfo/X86/DW_TAG_friend.ll index 2da962752a63..2facc409e8d1 100644 --- a/test/DebugInfo/X86/DW_TAG_friend.ll +++ b/test/DebugInfo/X86/DW_TAG_friend.ll @@ -18,8 +18,8 @@ !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!29} -!0 = metadata !{i32 786449, metadata !28, i32 4, metadata !"clang version 3.1 (trunk 153413) (llvm/trunk 153428)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !28, i32 4, metadata !"clang version 3.1 (trunk 153413) (llvm/trunk 153428)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{} !3 = metadata !{metadata !5, metadata !17} !5 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !6, i32 10, metadata !7, i32 0, i32 1, %class.A* @a, null} ; [ DW_TAG_variable ] !6 = metadata !{i32 786473, metadata !28} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/aligned_stack_var.ll b/test/DebugInfo/X86/aligned_stack_var.ll index d733dfda9465..54484acc785c 100644 --- a/test/DebugInfo/X86/aligned_stack_var.ll +++ b/test/DebugInfo/X86/aligned_stack_var.ll @@ -28,7 +28,7 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone !llvm.module.flags = !{!15} !0 = metadata !{i32 786449, metadata !14, i32 4, metadata !"clang version 3.2 (trunk 155696:155697) (llvm/trunk 155696)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!1 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 786478, metadata !14, metadata !6, metadata !"run", metadata !"run", metadata !"_Z3runv", i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_Z3runv, null, null, metadata !1, i32 1} ; [ DW_TAG_subprogram ] !6 = metadata !{i32 786473, metadata !14} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/arange.ll b/test/DebugInfo/X86/arange.ll new file mode 100644 index 000000000000..4eea646968b4 --- /dev/null +++ b/test/DebugInfo/X86/arange.ll @@ -0,0 +1,46 @@ +; REQUIRES: object-emission + +; RUN: llc -mtriple=x86_64-linux -O0 -filetype=obj -generate-arange-section < %s | llvm-dwarfdump -debug-dump=aranges - | FileCheck %s +; RUN: llc -mtriple=x86_64-linux -O0 -filetype=obj -generate-arange-section < %s | llvm-readobj --relocations - | FileCheck --check-prefix=OBJ %s + +; extern int i; +; template<int *x> +; struct foo { +; }; +; +; foo<&i> f; + +; Check that we only have one arange in this compilation unit (it will be for 'f'), and not an extra one (for 'i' - since it isn't actually defined in this CU) + +; CHECK: Address Range Header +; CHECK-NEXT: [0x +; CHECK-NOT: [0x + +; Check that we have a relocation back to the debug_info section from the debug_aranges section +; OBJ: debug_aranges +; OBJ-NEXT: R_X86_64_32 .debug_info 0x0 + +%struct.foo = type { i8 } + +@f = global %struct.foo zeroinitializer, align 1 +@i = external global i32 + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!12, !13} +!llvm.ident = !{!14} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5 ", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !2, metadata !9, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/simple.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"simple.cpp", metadata !"/tmp/dbginfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786451, metadata !1, null, metadata !"foo<&i>", i32 3, i64 8, i64 8, i32 0, i32 0, null, metadata !2, i32 0, null, metadata !5, metadata !"_ZTS3fooIXadL_Z1iEEE"} ; [ DW_TAG_structure_type ] [foo<&i>] [line 3, size 8, align 8, offset 0] [def] [from ] +!5 = metadata !{metadata !6} +!6 = metadata !{i32 786480, null, metadata !"x", metadata !7, i32* @i, null, i32 0, i32 0} ; [ DW_TAG_template_value_parameter ] +!7 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !8} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int] +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{metadata !10} +!10 = metadata !{i32 786484, i32 0, null, metadata !"f", metadata !"f", metadata !"", metadata !11, i32 6, metadata !4, i32 0, i32 1, %struct.foo* @f, null} ; [ DW_TAG_variable ] [f] [line 6] [def] +!11 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/simple.cpp] +!12 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!13 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!14 = metadata !{metadata !"clang version 3.5 "} diff --git a/test/DebugInfo/X86/arguments.ll b/test/DebugInfo/X86/arguments.ll index 1d51049a5f6b..989e4fff484a 100644 --- a/test/DebugInfo/X86/arguments.ll +++ b/test/DebugInfo/X86/arguments.ll @@ -15,13 +15,16 @@ ; CHECK: debug_info contents ; CHECK: DW_TAG_subprogram -; CHECK-NEXT: DW_AT_MIPS_linkage_name{{.*}}"_Z4func3fooS_" +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_MIPS_linkage_name{{.*}}"_Z4func3fooS_" ; CHECK-NOT: NULL ; CHECK: DW_TAG_formal_parameter -; CHECK-NEXT: DW_AT_name{{.*}}"f" +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name{{.*}}"f" ; CHECK-NOT: NULL ; CHECK: DW_TAG_formal_parameter -; CHECK-NEXT: DW_AT_name{{.*}}"g" +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name{{.*}}"g" %struct.foo = type { i32 } @@ -48,7 +51,7 @@ attributes #1 = { nounwind readnone } !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/blaikie/dev/scratch/scratch.cpp] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !"scratch.cpp", metadata !"/usr/local/google/home/blaikie/dev/scratch"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4} !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"func", metadata !"func", metadata !"_Z4func3fooS_", i32 6, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.foo*, %struct.foo*)* @_Z4func3fooS_, null, null, metadata !2, i32 6} ; [ DW_TAG_subprogram ] [line 6] [def] [func] !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/usr/local/google/home/blaikie/dev/scratch/scratch.cpp] diff --git a/test/DebugInfo/X86/array.ll b/test/DebugInfo/X86/array.ll new file mode 100644 index 000000000000..dc6c7a406507 --- /dev/null +++ b/test/DebugInfo/X86/array.ll @@ -0,0 +1,101 @@ +; ModuleID = 'array.c' +; +; From (clang -g -c -O1): +; +; void f(int* p) { +; p[0] = 42; +; } +; +; int main(int argc, char** argv) { +; int array[4] = { 0, 1, 2, 3 }; +; f(array); +; return array[0]; +; } +; +; RUN: llc -filetype=asm %s -o - | FileCheck %s +; Test that we only emit register-indirect locations for the array array. +; rdar://problem/14874886 +; +; CHECK: ##DEBUG_VALUE: main:array <- [R{{.*}}+0] +; CHECK-NOT: ##DEBUG_VALUE: main:array <- R{{.*}} +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.9.0" + +@main.array = private unnamed_addr constant [4 x i32] [i32 0, i32 1, i32 2, i32 3], align 16 + +; Function Attrs: nounwind ssp uwtable +define void @f(i32* nocapture %p) #0 { + tail call void @llvm.dbg.value(metadata !{i32* %p}, i64 0, metadata !11), !dbg !28 + store i32 42, i32* %p, align 4, !dbg !29, !tbaa !30 + ret void, !dbg !34 +} + +; Function Attrs: nounwind ssp uwtable +define i32 @main(i32 %argc, i8** nocapture readnone %argv) #0 { + %array = alloca [4 x i32], align 16 + tail call void @llvm.dbg.value(metadata !{i32 %argc}, i64 0, metadata !19), !dbg !35 + tail call void @llvm.dbg.value(metadata !{i8** %argv}, i64 0, metadata !20), !dbg !35 + tail call void @llvm.dbg.value(metadata !{[4 x i32]* %array}, i64 0, metadata !21), !dbg !36 + %1 = bitcast [4 x i32]* %array to i8*, !dbg !36 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* bitcast ([4 x i32]* @main.array to i8*), i64 16, i32 16, i1 false), !dbg !36 + tail call void @llvm.dbg.value(metadata !{[4 x i32]* %array}, i64 0, metadata !21), !dbg !36 + %2 = getelementptr inbounds [4 x i32]* %array, i64 0, i64 0, !dbg !37 + call void @f(i32* %2), !dbg !37 + tail call void @llvm.dbg.value(metadata !{[4 x i32]* %array}, i64 0, metadata !21), !dbg !36 + %3 = load i32* %2, align 16, !dbg !38, !tbaa !30 + ret i32 %3, !dbg !38 +} + +; Function Attrs: nounwind +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) #1 + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.value(metadata, i64, metadata) #2 + +attributes #0 = { nounwind ssp uwtable } +attributes #1 = { nounwind } +attributes #2 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!25, !26} +!llvm.ident = !{!27} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5.0 ", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/array.c] [DW_LANG_C99] +!1 = metadata !{metadata !"array.c", metadata !""} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !12} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"f", metadata !"f", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void (i32*)* @f, null, null, metadata !10, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [f] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/array.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{null, metadata !8} +!8 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !9} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int] +!9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = metadata !{metadata !11} +!11 = metadata !{i32 786689, metadata !4, metadata !"p", metadata !5, i32 16777217, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [p] [line 1] +!12 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"main", metadata !"main", metadata !"", i32 5, metadata !13, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 (i32, i8**)* @main, null, null, metadata !18, i32 5} ; [ DW_TAG_subprogram ] [line 5] [def] [main] +!13 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !14, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!14 = metadata !{metadata !9, metadata !9, metadata !15} +!15 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !16} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ] +!16 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !17} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from char] +!17 = metadata !{i32 786468, null, null, metadata !"char", i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] [char] [line 0, size 8, align 8, offset 0, enc DW_ATE_signed_char] +!18 = metadata !{metadata !19, metadata !20, metadata !21} +!19 = metadata !{i32 786689, metadata !12, metadata !"argc", metadata !5, i32 16777221, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [argc] [line 5] +!20 = metadata !{i32 786689, metadata !12, metadata !"argv", metadata !5, i32 33554437, metadata !15, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [argv] [line 5] +!21 = metadata !{i32 786688, metadata !12, metadata !"array", metadata !5, i32 6, metadata !22, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [array] [line 6] +!22 = metadata !{i32 786433, null, null, metadata !"", i32 0, i64 128, i64 32, i32 0, i32 0, metadata !9, metadata !23, i32 0, null, null, null} ; [ DW_TAG_array_type ] [line 0, size 128, align 32, offset 0] [from int] +!23 = metadata !{metadata !24} +!24 = metadata !{i32 786465, i64 0, i64 4} ; [ DW_TAG_subrange_type ] [0, 3] +!25 = metadata !{i32 2, metadata !"Dwarf Version", i32 2} +!26 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!27 = metadata !{metadata !"clang version 3.5.0 "} +!28 = metadata !{i32 1, i32 0, metadata !4, null} +!29 = metadata !{i32 2, i32 0, metadata !4, null} +!30 = metadata !{metadata !31, metadata !31, i64 0} +!31 = metadata !{metadata !"int", metadata !32, i64 0} +!32 = metadata !{metadata !"omnipotent char", metadata !33, i64 0} +!33 = metadata !{metadata !"Simple C/C++ TBAA"} +!34 = metadata !{i32 3, i32 0, metadata !4, null} +!35 = metadata !{i32 5, i32 0, metadata !12, null} +!36 = metadata !{i32 6, i32 0, metadata !12, null} +!37 = metadata !{i32 7, i32 0, metadata !12, null} +!38 = metadata !{i32 8, i32 0, metadata !12, null} ; [ DW_TAG_imported_declaration ] diff --git a/test/DebugInfo/X86/array2.ll b/test/DebugInfo/X86/array2.ll new file mode 100644 index 000000000000..2dc2af325b51 --- /dev/null +++ b/test/DebugInfo/X86/array2.ll @@ -0,0 +1,107 @@ +; ModuleID = 'array.c' +; +; From (clang -g -c -O0): +; +; void f(int* p) { +; p[0] = 42; +; } +; +; int main(int argc, char** argv) { +; int array[4] = { 0, 1, 2, 3 }; +; f(array); +; return array[0]; +; } +; +; RUN: opt %s -O2 -S -o - | FileCheck %s +; Test that we do not lower dbg.declares for arrays. +; +; CHECK: define i32 @main +; CHECK: call void @llvm.dbg.value +; CHECK: call void @llvm.dbg.value +; CHECK: call void @llvm.dbg.declare +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.9.0" + +@main.array = private unnamed_addr constant [4 x i32] [i32 0, i32 1, i32 2, i32 3], align 16 + +; Function Attrs: nounwind ssp uwtable +define void @f(i32* %p) #0 { +entry: + %p.addr = alloca i32*, align 8 + store i32* %p, i32** %p.addr, align 8 + call void @llvm.dbg.declare(metadata !{i32** %p.addr}, metadata !19), !dbg !20 + %0 = load i32** %p.addr, align 8, !dbg !21 + %arrayidx = getelementptr inbounds i32* %0, i64 0, !dbg !21 + store i32 42, i32* %arrayidx, align 4, !dbg !21 + ret void, !dbg !22 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +; Function Attrs: nounwind ssp uwtable +define i32 @main(i32 %argc, i8** %argv) #0 { +entry: + %retval = alloca i32, align 4 + %argc.addr = alloca i32, align 4 + %argv.addr = alloca i8**, align 8 + %array = alloca [4 x i32], align 16 + store i32 0, i32* %retval + store i32 %argc, i32* %argc.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %argc.addr}, metadata !23), !dbg !24 + store i8** %argv, i8*** %argv.addr, align 8 + call void @llvm.dbg.declare(metadata !{i8*** %argv.addr}, metadata !25), !dbg !24 + call void @llvm.dbg.declare(metadata !{[4 x i32]* %array}, metadata !26), !dbg !30 + %0 = bitcast [4 x i32]* %array to i8*, !dbg !30 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* bitcast ([4 x i32]* @main.array to i8*), i64 16, i32 16, i1 false), !dbg !30 + %arraydecay = getelementptr inbounds [4 x i32]* %array, i32 0, i32 0, !dbg !31 + call void @f(i32* %arraydecay), !dbg !31 + %arrayidx = getelementptr inbounds [4 x i32]* %array, i32 0, i64 0, !dbg !32 + %1 = load i32* %arrayidx, align 4, !dbg !32 + ret i32 %1, !dbg !32 +} + +; Function Attrs: nounwind +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) #2 + +attributes #0 = { nounwind ssp uwtable } +attributes #1 = { nounwind readnone } +attributes #2 = { nounwind } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!16, !17} +!llvm.ident = !{!18} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [array.c] [DW_LANG_C99] +!1 = metadata !{metadata !"array.c", metadata !""} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !10} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"f", metadata !"f", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i32*)* @f, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [f] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [array.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{null, metadata !8} +!8 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !9} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int] +!9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"main", metadata !"main", metadata !"", i32 5, metadata !11, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32, i8**)* @main, null, null, metadata !2, i32 5} ; [ DW_TAG_subprogram ] [line 5] [def] [main] +!11 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!12 = metadata !{metadata !9, metadata !9, metadata !13} +!13 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !14} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ] +!14 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !15} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from char] +!15 = metadata !{i32 786468, null, null, metadata !"char", i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] [char] [line 0, size 8, align 8, offset 0, enc DW_ATE_signed_char] +!16 = metadata !{i32 2, metadata !"Dwarf Version", i32 2} +!17 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!18 = metadata !{metadata !"clang version 3.5.0 "} +!19 = metadata !{i32 786689, metadata !4, metadata !"p", metadata !5, i32 16777217, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [p] [line 1] +!20 = metadata !{i32 1, i32 0, metadata !4, null} +!21 = metadata !{i32 2, i32 0, metadata !4, null} +!22 = metadata !{i32 3, i32 0, metadata !4, null} +!23 = metadata !{i32 786689, metadata !10, metadata !"argc", metadata !5, i32 16777221, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [argc] [line 5] +!24 = metadata !{i32 5, i32 0, metadata !10, null} +!25 = metadata !{i32 786689, metadata !10, metadata !"argv", metadata !5, i32 33554437, metadata !13, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [argv] [line 5] +!26 = metadata !{i32 786688, metadata !10, metadata !"array", metadata !5, i32 6, metadata !27, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [array] [line 6] +!27 = metadata !{i32 786433, null, null, metadata !"", i32 0, i64 128, i64 32, i32 0, i32 0, metadata !9, metadata !28, i32 0, null, null, null} ; [ DW_TAG_array_type ] [line 0, size 128, align 32, offset 0] [from int] +!28 = metadata !{metadata !29} +!29 = metadata !{i32 786465, i64 0, i64 4} ; [ DW_TAG_subrange_type ] [0, 3] +!30 = metadata !{i32 6, i32 0, metadata !10, null} +!31 = metadata !{i32 7, i32 0, metadata !10, null} +!32 = metadata !{i32 8, i32 0, metadata !10, null} ; [ DW_TAG_imported_declaration ] diff --git a/test/DebugInfo/X86/block-capture.ll b/test/DebugInfo/X86/block-capture.ll index 2f966a71d717..e842afe9446a 100644 --- a/test/DebugInfo/X86/block-capture.ll +++ b/test/DebugInfo/X86/block-capture.ll @@ -1,11 +1,18 @@ ; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s +; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -dwarf-version=3 +; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DWARF3 ; Checks that we emit debug info for the block variable declare. -; CHECK: DW_TAG_subprogram [3] -; CHECK: DW_TAG_variable [5] -; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[{{.*}}] = "block") -; CHECK: DW_AT_location [DW_FORM_sec_offset] ({{.*}}) +; CHECK: DW_TAG_subprogram +; CHECK: DW_TAG_variable +; CHECK: DW_AT_location [DW_FORM_sec_offset] +; CHECK: DW_AT_name {{.*}} "block" + +; DWARF3: DW_TAG_subprogram +; DWARF3: DW_TAG_variable +; DWARF3: DW_AT_location [DW_FORM_data4] +; DWARF3: DW_AT_name {{.*}} "block" %struct.__block_descriptor = type { i64, i64 } %struct.__block_literal_generic = type { i8*, i32, i32, i8*, %struct.__block_descriptor* } @@ -63,9 +70,9 @@ declare i32 @__objc_personality_v0(...) !llvm.module.flags = !{!35, !36, !37, !38, !64} !0 = metadata !{i32 786449, metadata !63, i32 16, metadata !"clang version 3.1 (trunk 151227)", i1 false, metadata !"", i32 2, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!1 = metadata !{} !3 = metadata !{metadata !5, metadata !28, metadata !31, metadata !34} -!5 = metadata !{i32 786478, metadata !6, metadata !6, metadata !"foo", metadata !"foo", metadata !"", i32 5, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, null, null, null, metadata !26, i32 5} ; [ DW_TAG_subprogram ] +!5 = metadata !{i32 786478, metadata !6, metadata !6, metadata !"foo", metadata !"foo", metadata !"", i32 5, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, null, null, null, null, i32 5} ; [ DW_TAG_subprogram ] !6 = metadata !{i32 786473, metadata !63} ; [ DW_TAG_file_type ] !7 = metadata !{i32 786453, i32 0, null, i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !8 = metadata !{null, metadata !9} @@ -86,15 +93,13 @@ declare i32 @__objc_personality_v0(...) !23 = metadata !{i32 786445, metadata !63, metadata !6, metadata !"reserved", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !24} ; [ DW_TAG_member ] !24 = metadata !{i32 786468, null, null, metadata !"long unsigned int", i32 0, i64 64, i64 64, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] !25 = metadata !{i32 786445, metadata !63, metadata !6, metadata !"Size", i32 0, i64 64, i64 64, i64 64, i32 0, metadata !24} ; [ DW_TAG_member ] -!26 = metadata !{metadata !27} -!27 = metadata !{i32 786468} ; [ DW_TAG_base_type ] -!28 = metadata !{i32 786478, metadata !6, metadata !6, metadata !"__foo_block_invoke_0", metadata !"__foo_block_invoke_0", metadata !"", i32 7, metadata !29, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i8*)* @__foo_block_invoke_0, null, null, metadata !26, i32 7} ; [ DW_TAG_subprogram ] +!28 = metadata !{i32 786478, metadata !6, metadata !6, metadata !"__foo_block_invoke_0", metadata !"__foo_block_invoke_0", metadata !"", i32 7, metadata !29, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i8*)* @__foo_block_invoke_0, null, null, null, i32 7} ; [ DW_TAG_subprogram ] !29 = metadata !{i32 786453, i32 0, null, i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !30, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !30 = metadata !{null, metadata !14} -!31 = metadata !{i32 786478, metadata !6, metadata !6, metadata !"__copy_helper_block_", metadata !"__copy_helper_block_", metadata !"", i32 10, metadata !32, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, null, null, null, metadata !26, i32 10} ; [ DW_TAG_subprogram ] +!31 = metadata !{i32 786478, metadata !6, metadata !6, metadata !"__copy_helper_block_", metadata !"__copy_helper_block_", metadata !"", i32 10, metadata !32, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, null, null, null, null, i32 10} ; [ DW_TAG_subprogram ] !32 = metadata !{i32 786453, i32 0, null, i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !33, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !33 = metadata !{null, metadata !14, metadata !14} -!34 = metadata !{i32 786478, metadata !6, metadata !6, metadata !"__destroy_helper_block_", metadata !"__destroy_helper_block_", metadata !"", i32 10, metadata !29, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, null, null, null, metadata !26, i32 10} ; [ DW_TAG_subprogram ] +!34 = metadata !{i32 786478, metadata !6, metadata !6, metadata !"__destroy_helper_block_", metadata !"__destroy_helper_block_", metadata !"", i32 10, metadata !29, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, null, null, null, null, i32 10} ; [ DW_TAG_subprogram ] !35 = metadata !{i32 1, metadata !"Objective-C Version", i32 2} !36 = metadata !{i32 1, metadata !"Objective-C Image Info Version", i32 0} !37 = metadata !{i32 1, metadata !"Objective-C Image Info Section", metadata !"__DATA, __objc_imageinfo, regular, no_dead_strip"} @@ -113,15 +118,16 @@ declare i32 @__objc_personality_v0(...) !50 = metadata !{i32 786445, metadata !63, metadata !6, metadata !"block", i32 7, i64 64, i64 64, i64 256, i32 0, metadata !9} ; [ DW_TAG_member ] !51 = metadata !{i32 7, i32 18, metadata !28, null} !52 = metadata !{i32 7, i32 19, metadata !28, null} -!53 = metadata !{i32 786688, metadata !28, metadata !"block", metadata !6, i32 5, metadata !9, i32 0, i32 0, i64 1, i64 32} ; [ DW_TAG_auto_variable ] +!53 = metadata !{i32 786688, metadata !28, metadata !"block", metadata !6, i32 5, metadata !9, i32 0, i32 0, metadata !65} ; [ DW_TAG_auto_variable ] !54 = metadata !{i32 5, i32 27, metadata !28, null} !55 = metadata !{i32 8, i32 22, metadata !56, null} -!56 = metadata !{i32 786443, metadata !57, i32 7, i32 26, metadata !6, i32 2} ; [ DW_TAG_lexical_block ] -!57 = metadata !{i32 786443, metadata !28, i32 7, i32 19, metadata !6, i32 1} ; [ DW_TAG_lexical_block ] +!56 = metadata !{i32 786443, metadata !6, metadata !57, i32 7, i32 26, i32 2} ; [ DW_TAG_lexical_block ] +!57 = metadata !{i32 786443, metadata !6, metadata !28, i32 7, i32 19, i32 1} ; [ DW_TAG_lexical_block ] !58 = metadata !{i32 10, i32 20, metadata !59, null} -!59 = metadata !{i32 786443, metadata !60, i32 9, i32 35, metadata !6, i32 4} ; [ DW_TAG_lexical_block ] -!60 = metadata !{i32 786443, metadata !57, i32 9, i32 35, metadata !6, i32 3} ; [ DW_TAG_lexical_block ] +!59 = metadata !{i32 786443, metadata !6, metadata !60, i32 9, i32 35, i32 4} ; [ DW_TAG_lexical_block ] +!60 = metadata !{i32 786443, metadata !6, metadata !57, i32 9, i32 35, i32 3} ; [ DW_TAG_lexical_block ] !61 = metadata !{i32 10, i32 21, metadata !28, null} !62 = metadata !{i32 9, i32 20, metadata !56, null} !63 = metadata !{metadata !"foo.m", metadata !"/Users/echristo"} !64 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!65 = metadata !{i64 1, i64 32} diff --git a/test/DebugInfo/X86/byvalstruct.ll b/test/DebugInfo/X86/byvalstruct.ll index 3dea8632a702..d787ef39c36c 100644 --- a/test/DebugInfo/X86/byvalstruct.ll +++ b/test/DebugInfo/X86/byvalstruct.ll @@ -6,7 +6,8 @@ ; CHECK: DW_TAG_formal_parameter ; CHECK: DW_TAG_formal_parameter ; CHECK: DW_TAG_formal_parameter -; CHECK-NEXT: DW_AT_name {{.*}} "info" +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "info" ; ; generated from ; @@ -88,7 +89,7 @@ attributes #1 = { nounwind readnone } !0 = metadata !{i32 786449, metadata !1, i32 17, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 2, metadata !2, metadata !3, metadata !6, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/t.mm] [DW_LANG_ObjC_plus_plus] !1 = metadata !{metadata !"t.mm", metadata !""} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4} !4 = metadata !{i32 786451, metadata !1, metadata !5, metadata !"Bitmap", i32 8, i64 8, i64 8, i32 0, i32 512, null, metadata !2, i32 17, null, null, null} ; [ DW_TAG_structure_type ] [Bitmap] [line 8, size 8, align 8, offset 0] [def] [from ] !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/t.mm] diff --git a/test/DebugInfo/X86/c-type-units.ll b/test/DebugInfo/X86/c-type-units.ll new file mode 100644 index 000000000000..431b0295148e --- /dev/null +++ b/test/DebugInfo/X86/c-type-units.ll @@ -0,0 +1,29 @@ +; REQUIRES: object-emission + +; RUN: llc -o - %s -filetype=obj -O0 -generate-dwarf-pub-sections=Disable -generate-type-units -mtriple=x86_64-unknown-linux-gnu | llvm-dwarfdump -debug-dump=types - | FileCheck %s + +; struct foo { +; } f; + +; no known LLVM frontends produce appropriate unique identifiers for C types, +; so we don't produce type units for them +; CHECK-NOT: DW_TAG_type_unit + +%struct.foo = type {} + +@f = common global %struct.foo zeroinitializer, align 1 + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!7, !8} +!llvm.ident = !{!9} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !2, metadata !3, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/simple.c] [DW_LANG_C99] +!1 = metadata !{metadata !"simple.c", metadata !"/tmp/dbginfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786484, i32 0, null, metadata !"f", metadata !"f", metadata !"", metadata !5, i32 2, metadata !6, i32 0, i32 1, %struct.foo* @f, null} ; [ DW_TAG_variable ] [f] [line 2] [def] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/simple.c] +!6 = metadata !{i32 786451, metadata !1, null, metadata !"foo", i32 1, i64 0, i64 8, i32 0, i32 0, null, metadata !2, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [foo] [line 1, size 0, align 8, offset 0] [def] [from ] +!7 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!8 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!9 = metadata !{metadata !"clang version 3.5 "} diff --git a/test/DebugInfo/X86/coff_debug_info_type.ll b/test/DebugInfo/X86/coff_debug_info_type.ll new file mode 100644 index 000000000000..a1051c39bffd --- /dev/null +++ b/test/DebugInfo/X86/coff_debug_info_type.ll @@ -0,0 +1,41 @@ +; RUN: llc -mtriple=i686-pc-mingw32 -filetype=asm -O0 < %s | FileCheck %s +; RUN: llc -mtriple=i686-pc-cygwin -filetype=asm -O0 < %s | FileCheck %s +; RUN: llc -mtriple=i686-w64-mingw32 -filetype=asm -O0 < %s | FileCheck %s +; CHECK: .section .debug_info + +; RUN: llc -mtriple=i686-pc-win32 -filetype=asm -O0 < %s | FileCheck -check-prefix=WIN32 %s +; WIN32: .section .debug$S,"rnd" + +; RUN: llc -mtriple=i686-pc-win32 -filetype=null -O0 < %s + +; generated from: +; clang -g -S -emit-llvm test.c -o test.ll +; int main() +; { +; return 0; +; } + +define i32 @main() #0 { +entry: + %retval = alloca i32, align 4 + store i32 0, i32* %retval + ret i32 0, !dbg !10 +} + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!9, !11} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [C:\Projects/test.c] [DW_LANG_C99] +!1 = metadata !{metadata !"test.c", metadata !"C:\5CProjects"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"main", metadata !"main", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main, null, null, metadata !2, i32 2} ; [ DW_TAG_subprogram ] [line 1] [def] [scope 2] [main] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [C:\Projects/test.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{metadata !8} +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 3} +!10 = metadata !{i32 3, i32 0, metadata !4, null} +!11 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/DebugInfo/X86/coff_relative_names.ll b/test/DebugInfo/X86/coff_relative_names.ll index 4cc38a63bebf..3b4854e733df 100644 --- a/test/DebugInfo/X86/coff_relative_names.ll +++ b/test/DebugInfo/X86/coff_relative_names.ll @@ -10,10 +10,6 @@ ; return 0; ; } -; ModuleID = 'test.c' -target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32" -target triple = "i686-pc-win32" - ; Function Attrs: nounwind define i32 @main() #0 { entry: @@ -29,7 +25,7 @@ attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"= !0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [C:\Projects/test.c] [DW_LANG_C99] !1 = metadata !{metadata !"test.c", metadata !"C:\5CProjects"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4} !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"main", metadata !"main", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main, null, null, metadata !2, i32 2} ; [ DW_TAG_subprogram ] [line 1] [def] [scope 2] [main] !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [C:\Projects/test.c] diff --git a/test/DebugInfo/X86/concrete_out_of_line.ll b/test/DebugInfo/X86/concrete_out_of_line.ll index 4a152963a144..40300de793d5 100644 --- a/test/DebugInfo/X86/concrete_out_of_line.ll +++ b/test/DebugInfo/X86/concrete_out_of_line.ll @@ -1,5 +1,4 @@ -; RUN: llc -mtriple=x86_64-linux %s -o %t -filetype=obj -; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s +; RUN: llc -mtriple=x86_64-linux < %s -filetype=obj | llvm-dwarfdump -debug-dump=info - | FileCheck %s ; test that we add DW_AT_inline even when we only have concrete out of line ; instances. @@ -7,15 +6,57 @@ ; first check that we have a TAG_subprogram at a given offset and it has ; AT_inline. -; CHECK: 0x0000011c: DW_TAG_subprogram [17] -; CHECK-NEXT: DW_AT_specification +; CHECK: DW_TAG_class_type +; CHECK: DW_TAG_subprogram +; CHECK: [[ASSIGN_DECL:0x........]]: DW_TAG_subprogram + +; CHECK: DW_TAG_class_type +; CHECK: [[RELEASE_DECL:0x........]]: DW_TAG_subprogram +; CHECK: [[DTOR_DECL:0x........]]: DW_TAG_subprogram + +; CHECK: [[D2_ABS:.*]]: DW_TAG_subprogram +; CHECK-NEXT: DW_AT_{{.*}}linkage_name {{.*}}D2 +; CHECK-NEXT: DW_AT_specification {{.*}} {[[DTOR_DECL]]} ; CHECK-NEXT: DW_AT_inline +; CHECK-NOT: DW_AT +; CHECK: DW_TAG +; CHECK: [[D1_ABS:.*]]: DW_TAG_subprogram +; CHECK-NEXT: DW_AT_{{.*}}linkage_name {{.*}}D1 +; CHECK-NEXT: DW_AT_specification {{.*}} {[[DTOR_DECL]]} +; CHECK-NEXT: DW_AT_inline +; CHECK-NOT: DW_AT +; CHECK: [[D1_THIS_ABS:.*]]: DW_TAG_formal_parameter +; CHECK: [[RELEASE:0x........]]: DW_TAG_subprogram +; CHECK: DW_AT_specification {{.*}} {[[RELEASE_DECL]]} +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: NULL +; CHECK-NOT: DW_TAG +; CHECK: DW_TAG_lexical_block +; CHECK-NOT: NULL +; CHECK-NOT: DW_TAG +; CHECK: DW_TAG_inlined_subroutine +; CHECK-NEXT: DW_AT_abstract_origin {{.*}} {[[ASSIGN:0x........]]} +; CHECK-NOT: NULL +; CHECK-NOT: DW_TAG +; CHECK: DW_TAG_inlined_subroutine +; CHECK-NEXT: DW_AT_abstract_origin {{.*}} {[[D1_ABS]]} +; CHECK-NOT: NULL +; CHECK-NOT: DW_TAG +; CHECK: DW_TAG_inlined_subroutine +; CHECK-NEXT: DW_AT_abstract_origin {{.*}} {[[D2_ABS]]} ; and then that a TAG_subprogram refers to it with AT_abstract_origin. -; CHECK: 0x0000015d: DW_TAG_subprogram [19] -; CHECK-NEXT: DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x011c => {0x0000011c}) +; CHECK: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_abstract_origin {{.*}} {[[D1_ABS]]} +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_abstract_origin {{.*}} {[[D1_THIS_ABS]]} +; CHECK: DW_TAG_inlined_subroutine +; CHECK-NEXT: DW_AT_abstract_origin {{.*}} {[[D2_ABS]]} + define i32 @_ZN17nsAutoRefCnt7ReleaseEv() { entry: @@ -35,8 +76,8 @@ declare void @_Z8moz_freePv(i8*) !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!60} -!0 = metadata !{i32 786449, metadata !59, i32 4, metadata !"clang version 3.1 ()", i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !47, metadata !47, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !59, i32 4, metadata !"clang version 3.1 ()", i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !47, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{} !3 = metadata !{metadata !5, metadata !23, metadata !27, metadata !31} !5 = metadata !{i32 720942, metadata !6, null, metadata !"Release", metadata !"Release", metadata !"_ZN17nsAutoRefCnt7ReleaseEv", i32 14, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32* null, null, metadata !12, metadata !20, i32 14} ; [ DW_TAG_subprogram ] [line 14] [def] [Release] !6 = metadata !{i32 720937, metadata !59} ; [ DW_TAG_file_type ] @@ -51,7 +92,7 @@ declare void @_Z8moz_freePv(i8*) !15 = metadata !{i32 720942, metadata !6, metadata !13, metadata !"~nsAutoRefCnt", metadata !"~nsAutoRefCnt", metadata !"", i32 12, metadata !16, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 true, null, null, i32 0, metadata !18, i32 12} ; [ DW_TAG_subprogram ] !16 = metadata !{i32 720917, i32 0, null, i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, null, metadata !17, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !17 = metadata !{null, metadata !10} -!18 = metadata !{i32 720932} ; [ DW_TAG_base_type ] +!18 = metadata !{} !20 = metadata !{metadata !22} !22 = metadata !{i32 786689, metadata !5, metadata !"this", metadata !6, i32 16777230, metadata !10, i32 64, i32 0} ; [ DW_TAG_arg_variable ] !23 = metadata !{i32 720942, metadata !6, null, metadata !"~nsAutoRefCnt", metadata !"~nsAutoRefCnt", metadata !"_ZN17nsAutoRefCntD1Ev", i32 18, metadata !16, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32* null, null, metadata !15, metadata !24, i32 18} ; [ DW_TAG_subprogram ] [line 18] [def] [~nsAutoRefCnt] diff --git a/test/DebugInfo/X86/cu-ranges-odr.ll b/test/DebugInfo/X86/cu-ranges-odr.ll new file mode 100644 index 000000000000..c42a9085da56 --- /dev/null +++ b/test/DebugInfo/X86/cu-ranges-odr.ll @@ -0,0 +1,96 @@ +; RUN: llc -split-dwarf=Enable -O0 %s -mtriple=x86_64-unknown-linux-gnu -filetype=obj -o %t +; RUN: llvm-dwarfdump -debug-dump=all %t | FileCheck %s +; RUN: llvm-readobj --relocations %t | FileCheck --check-prefix=CHECK-RELOCS %s + +; From: +; class A { +; public: +; A(int i = 0) : a(i) {} +; private: +; int a; +; }; +; +; A a; + +; With function sections enabled make sure that we have a DW_AT_ranges attribute. +; CHECK: DW_AT_ranges + +; Check that we have a relocation against the .debug_ranges section. +; CHECK-RELOCS: R_X86_64_32 .debug_ranges 0x0 + +%class.A = type { i32 } + +@a = global %class.A zeroinitializer, align 4 +@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }] + +define internal void @__cxx_global_var_init() section ".text.startup" { +entry: + call void @_ZN1AC2Ei(%class.A* @a, i32 0), !dbg !26 + ret void, !dbg !26 +} + +; Function Attrs: nounwind uwtable +define linkonce_odr void @_ZN1AC2Ei(%class.A* %this, i32 %i) unnamed_addr #0 align 2 { +entry: + %this.addr = alloca %class.A*, align 8 + %i.addr = alloca i32, align 4 + store %class.A* %this, %class.A** %this.addr, align 8 + call void @llvm.dbg.declare(metadata !{%class.A** %this.addr}, metadata !27), !dbg !29 + store i32 %i, i32* %i.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %i.addr}, metadata !30), !dbg !31 + %this1 = load %class.A** %this.addr + %a = getelementptr inbounds %class.A* %this1, i32 0, i32 0, !dbg !31 + %0 = load i32* %i.addr, align 4, !dbg !31 + store i32 %0, i32* %a, align 4, !dbg !31 + ret void, !dbg !31 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +define internal void @_GLOBAL__I_a() section ".text.startup" { +entry: + call void @__cxx_global_var_init(), !dbg !32 + ret void, !dbg !32 +} + +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!23, !24} +!llvm.ident = !{!25} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5 (trunk 199923) (llvm/trunk 199940)", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !13, metadata !21, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/baz.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"baz.cpp", metadata !"/usr/local/google/home/echristo/tmp"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786434, metadata !1, null, metadata !"A", i32 1, i64 32, i64 32, i32 0, i32 0, null, metadata !5, i32 0, null, null, metadata !"_ZTS1A"} ; [ DW_TAG_class_type ] [A] [line 1, size 32, align 32, offset 0] [def] [from ] +!5 = metadata !{metadata !6, metadata !8} +!6 = metadata !{i32 786445, metadata !1, metadata !"_ZTS1A", metadata !"a", i32 5, i64 32, i64 32, i64 0, i32 1, metadata !7} ; [ DW_TAG_member ] [a] [line 5, size 32, align 32, offset 0] [private] [from int] +!7 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!8 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1A", metadata !"A", metadata !"A", metadata !"", i32 3, metadata !9, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !12, i32 3} ; [ DW_TAG_subprogram ] [line 3] [A] +!9 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !10, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!10 = metadata !{null, metadata !11, metadata !7} +!11 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !"_ZTS1A"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from _ZTS1A] +!12 = metadata !{i32 786468} +!13 = metadata !{metadata !14, metadata !18, metadata !19} +!14 = metadata !{i32 786478, metadata !1, metadata !15, metadata !"__cxx_global_var_init", metadata !"__cxx_global_var_init", metadata !"", i32 8, metadata !16, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @__cxx_global_var_init, null, null, metadata !2, i32 8} ; [ DW_TAG_subprogram ] [line 8] [local] [def] [__cxx_global_var_init] +!15 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/usr/local/google/home/echristo/tmp/baz.cpp] +!16 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !17, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!17 = metadata !{null} +!18 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1A", metadata !"A", metadata !"A", metadata !"_ZN1AC2Ei", i32 3, metadata !9, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.A*, i32)* @_ZN1AC2Ei, null, metadata !8, metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [A] +!19 = metadata !{i32 786478, metadata !1, metadata !15, metadata !"", metadata !"", metadata !"_GLOBAL__I_a", i32 3, metadata !20, i1 true, i1 true, i32 0, i32 0, null, i32 64, i1 false, void ()* @_GLOBAL__I_a, null, null, metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [local] [def] +!20 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !2, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!21 = metadata !{metadata !22} +!22 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !15, i32 8, metadata !4, i32 0, i32 1, %class.A* @a, null} ; [ DW_TAG_variable ] [a] [line 8] [def] +!23 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!24 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!25 = metadata !{metadata !"clang version 3.5 (trunk 199923) (llvm/trunk 199940)"} +!26 = metadata !{i32 8, i32 0, metadata !14, null} ; [ DW_TAG_imported_declaration ] +!27 = metadata !{i32 786689, metadata !18, metadata !"this", null, i32 16777216, metadata !28, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!28 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !"_ZTS1A"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from _ZTS1A] +!29 = metadata !{i32 0, i32 0, metadata !18, null} +!30 = metadata !{i32 786689, metadata !18, metadata !"i", metadata !15, i32 33554435, metadata !7, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [i] [line 3] +!31 = metadata !{i32 3, i32 0, metadata !18, null} +!32 = metadata !{i32 3, i32 0, metadata !19, null} diff --git a/test/DebugInfo/X86/cu-ranges.ll b/test/DebugInfo/X86/cu-ranges.ll new file mode 100644 index 000000000000..405a498155f5 --- /dev/null +++ b/test/DebugInfo/X86/cu-ranges.ll @@ -0,0 +1,73 @@ +; RUN: llc -split-dwarf=Enable -O0 %s -function-sections -mtriple=x86_64-unknown-linux-gnu -filetype=obj -o %t +; RUN: llvm-dwarfdump -debug-dump=all %t | FileCheck --check-prefix=FUNCTION-SECTIONS %s +; RUN: llvm-readobj --relocations %t | FileCheck --check-prefix=FUNCTION-SECTIONS-RELOCS %s + +; RUN: llc -split-dwarf=Enable -O0 %s -mtriple=x86_64-unknown-linux-gnu -filetype=obj -o %t +; RUN: llvm-dwarfdump -debug-dump=all %t | FileCheck --check-prefix=NO-FUNCTION-SECTIONS %s + +; From: +; int foo (int a) { +; return a+1; +; } +; int bar (int b) { +; return b+2; +; } + +; With function sections enabled make sure that we have a DW_AT_ranges attribute. +; FUNCTION-SECTIONS: DW_AT_ranges + +; Check that we have a relocation against the .debug_ranges section. +; FUNCTION-SECTIONS-RELOCS: R_X86_64_32 .debug_ranges 0x0 + +; Without function sections enabled make sure that we have no DW_AT_ranges attribute. +; NO-FUNCTION-SECTIONS-NOT: DW_AT_ranges + +; Function Attrs: nounwind uwtable +define i32 @foo(i32 %a) #0 { +entry: + %a.addr = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %a.addr}, metadata !13), !dbg !14 + %0 = load i32* %a.addr, align 4, !dbg !14 + %add = add nsw i32 %0, 1, !dbg !14 + ret i32 %add, !dbg !14 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +; Function Attrs: nounwind uwtable +define i32 @bar(i32 %b) #0 { +entry: + %b.addr = alloca i32, align 4 + store i32 %b, i32* %b.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %b.addr}, metadata !15), !dbg !16 + %0 = load i32* %b.addr, align 4, !dbg !16 + %add = add nsw i32 %0, 2, !dbg !16 + ret i32 %add, !dbg !16 +} + +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!10, !11} +!llvm.ident = !{!12} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5.0 (trunk 204164) (llvm/trunk 204183)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/z.c] [DW_LANG_C99] +!1 = metadata !{metadata !"z.c", metadata !"/usr/local/google/home/echristo"} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !9} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"foo", metadata !"foo", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @foo, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [foo] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/usr/local/google/home/echristo/z.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{metadata !8, metadata !8} +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"bar", metadata !"bar", metadata !"", i32 2, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @bar, null, null, metadata !2, i32 2} ; [ DW_TAG_subprogram ] [line 2] [def] [bar] +!10 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!11 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!12 = metadata !{metadata !"clang version 3.5.0 (trunk 204164) (llvm/trunk 204183)"} +!13 = metadata !{i32 786689, metadata !4, metadata !"a", metadata !5, i32 16777217, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [a] [line 1] +!14 = metadata !{i32 1, i32 0, metadata !4, null} +!15 = metadata !{i32 786689, metadata !9, metadata !"b", metadata !5, i32 16777218, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [b] [line 2] +!16 = metadata !{i32 2, i32 0, metadata !9, null} diff --git a/test/DebugInfo/X86/data_member_location.ll b/test/DebugInfo/X86/data_member_location.ll index 1adddb97be25..1c76258ec205 100644 --- a/test/DebugInfo/X86/data_member_location.ll +++ b/test/DebugInfo/X86/data_member_location.ll @@ -1,4 +1,5 @@ ; RUN: llc -mtriple=x86_64-linux -O0 -o - -filetype=obj < %s | llvm-dwarfdump -debug-dump=info -| FileCheck %s +; RUN: llc -mtriple=x86_64-linux -dwarf-version=2 -O0 -o - -filetype=obj < %s | llvm-dwarfdump -debug-dump=info -| FileCheck -check-prefix=DWARF2 %s ; Generated from Clang with the following source: ; @@ -17,6 +18,14 @@ ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_data_member_location {{.*}} (0x04) +; DWARF2: DW_AT_name {{.*}} "c" +; DWARF2-NOT: DW_TAG +; DWARF2: DW_AT_data_member_location {{.*}} (<0x02> 23 00 ) + +; DWARF2: DW_AT_name {{.*}} "i" +; DWARF2-NOT: DW_TAG +; DWARF2: DW_AT_data_member_location {{.*}} (<0x02> 23 04 ) + %struct.foo = type { i8, i32 } @f = global %struct.foo zeroinitializer, align 4 @@ -27,7 +36,7 @@ !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !2, metadata !10, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/data_member_location.cpp] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !"data_member_location.cpp", metadata !"/tmp/dbginfo"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4} !4 = metadata !{i32 786451, metadata !1, null, metadata !"foo", i32 1, i64 64, i64 32, i32 0, i32 0, null, metadata !5, i32 0, null, null, metadata !"_ZTS3foo"} ; [ DW_TAG_structure_type ] [foo] [line 1, size 64, align 32, offset 0] [def] [from ] !5 = metadata !{metadata !6, metadata !8} diff --git a/test/DebugInfo/X86/dbg-asm.s b/test/DebugInfo/X86/dbg-asm.s new file mode 100644 index 000000000000..66a0292461dd --- /dev/null +++ b/test/DebugInfo/X86/dbg-asm.s @@ -0,0 +1,22 @@ +# RUN: llvm-mc -triple i686-windows-gnu -g %s -filetype obj -o - \ +# RUN: | llvm-readobj -r - | FileCheck -check-prefix CHECK-COFF %s +# RUN: llvm-mc -triple i686-windows-itanium -g %s -filetype obj -o - \ +# RUN: | llvm-readobj -r - | FileCheck -check-prefix CHECK-COFF %s +# RUN: llvm-mc -triple i686-linux-gnu -g %s -filetype obj -o - \ +# RUN: | llvm-readobj -r - | FileCheck -check-prefix CHECK-ELF %s + +_a: + movl $65, %eax + ret + +# CHECK-COFF: Relocations [ +# CHECK-COFF: Section {{.*}} .debug_info { +# CHECK-COFF: 0x6 IMAGE_REL_I386_SECREL .debug_abbrev +# CHECK-COFF: } +# CHECK-COFF: ] + +# CHECK-ELF: Relocations [ +# CHECK-ELF: Section {{.*}} .rel.debug_info { +# CHECK-ELF: 0x6 R_386_32 .debug_abbrev +# CHECK-ELF: } +# CHECK-ELF: ] diff --git a/test/DebugInfo/X86/dbg-at-specficiation.ll b/test/DebugInfo/X86/dbg-at-specficiation.ll index 8003a0fc15b7..c76536719f4f 100644 --- a/test/DebugInfo/X86/dbg-at-specficiation.ll +++ b/test/DebugInfo/X86/dbg-at-specficiation.ll @@ -9,7 +9,7 @@ !llvm.module.flags = !{!12} !0 = metadata !{i32 720913, metadata !11, i32 12, metadata !"clang version 3.0 (trunk 140253)", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !2, metadata !3, null, i32 0} ; [ DW_TAG_compile_unit ] -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 720948, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !6, i32 1, metadata !7, i32 0, i32 1, [10 x i32]* @a, null} ; [ DW_TAG_variable ] !6 = metadata !{i32 720937, metadata !11} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/dbg-byval-parameter.ll b/test/DebugInfo/X86/dbg-byval-parameter.ll index d66486d14ae5..c658b5050269 100644 --- a/test/DebugInfo/X86/dbg-byval-parameter.ll +++ b/test/DebugInfo/X86/dbg-byval-parameter.ll @@ -1,4 +1,4 @@ -; RUN: llc -march=x86 -asm-verbose < %s | grep DW_TAG_formal_parameter +; RUN: %llc_dwarf -march=x86 -asm-verbose < %s | grep DW_TAG_formal_parameter %struct.Pt = type { double, double } diff --git a/test/DebugInfo/X86/dbg-const-int.ll b/test/DebugInfo/X86/dbg-const-int.ll index f2f51c9b0f3d..bf7ee08c665f 100644 --- a/test/DebugInfo/X86/dbg-const-int.ll +++ b/test/DebugInfo/X86/dbg-const-int.ll @@ -1,12 +1,14 @@ -; RUN: llc -mtriple=x86_64-apple-darwin12 -filetype=obj %s -o %t -; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llc -mtriple=x86_64-apple-darwin12 -filetype=obj < %s \ +; RUN: | llvm-dwarfdump -debug-dump=info - | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-macosx10.6.7" ; Radar 9511391 ; CHECK: DW_TAG_variable -; CHECK: "i" -; CHECK: DW_AT_const_value [DW_FORM_sdata] (42) +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_const_value [DW_FORM_sdata] (42) +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "i" define i32 @foo() nounwind uwtable readnone optsize ssp { entry: diff --git a/test/DebugInfo/X86/dbg-const.ll b/test/DebugInfo/X86/dbg-const.ll index 12dc154c051b..300c1eeb977b 100644 --- a/test/DebugInfo/X86/dbg-const.ll +++ b/test/DebugInfo/X86/dbg-const.ll @@ -13,7 +13,7 @@ target triple = "x86_64-apple-darwin10.0.0" -;CHECK: ## DW_OP_constu +;CHECK: ## DW_OP_consts ;CHECK-NEXT: .byte 42 define i32 @foobar() nounwind readonly noinline ssp { entry: diff --git a/test/DebugInfo/X86/dbg-declare-arg.ll b/test/DebugInfo/X86/dbg-declare-arg.ll index 7bf6f4fa5dfd..b5372658cf37 100644 --- a/test/DebugInfo/X86/dbg-declare-arg.ll +++ b/test/DebugInfo/X86/dbg-declare-arg.ll @@ -122,6 +122,6 @@ entry: !47 = metadata !{i32 2, i32 47, metadata !25, null} !48 = metadata !{i32 2, i32 54, metadata !49, null} !49 = metadata !{i32 786443, metadata !51, metadata !25, i32 2, i32 52, i32 2} ; [ DW_TAG_lexical_block ] -!50 = metadata !{metadata !0, metadata !10, metadata !14, metadata !19, metadata !22, metadata !25} +!50 = metadata !{metadata !19, metadata !22, metadata !25} !51 = metadata !{metadata !"a.cc", metadata !"/private/tmp"} !52 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/DebugInfo/X86/dbg-declare.ll b/test/DebugInfo/X86/dbg-declare.ll index 988d0bcb7713..241a5a1b5f11 100644 --- a/test/DebugInfo/X86/dbg-declare.ll +++ b/test/DebugInfo/X86/dbg-declare.ll @@ -31,17 +31,15 @@ declare void @llvm.stackrestore(i8*) nounwind !llvm.module.flags = !{!27} !0 = metadata !{i32 786449, metadata !26, i32 12, metadata !"clang version 3.1 (trunk 153698)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, null, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!1 = metadata !{} !3 = metadata !{metadata !5} -!5 = metadata !{i32 786478, metadata !26, metadata !0, metadata !"foo", metadata !"foo", metadata !"", i32 6, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32*)* @foo, null, null, metadata !12, i32 0} ; [ DW_TAG_subprogram ] +!5 = metadata !{i32 786478, metadata !26, metadata !0, metadata !"foo", metadata !"foo", metadata !"", i32 6, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32*)* @foo, null, null, null, i32 0} ; [ DW_TAG_subprogram ] !6 = metadata !{i32 786473, metadata !26} ; [ DW_TAG_file_type ] !7 = metadata !{i32 786453, i32 0, null, i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !8 = metadata !{metadata !9, metadata !10} !9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !10 = metadata !{i32 786447, null, null, null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !11} ; [ DW_TAG_pointer_type ] !11 = metadata !{i32 786470, null, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !9} ; [ DW_TAG_const_type ] -!12 = metadata !{metadata !13} -!13 = metadata !{i32 786468} ; [ DW_TAG_base_type ] !14 = metadata !{i32 786689, metadata !5, metadata !"x", metadata !6, i32 16777221, metadata !10, i32 0, i32 0} ; [ DW_TAG_arg_variable ] !15 = metadata !{i32 5, i32 21, metadata !5, null} !16 = metadata !{i32 7, i32 13, metadata !17, null} diff --git a/test/DebugInfo/X86/dbg-large-unsigned-const.ll b/test/DebugInfo/X86/dbg-large-unsigned-const.ll deleted file mode 100644 index a037f3c269ee..000000000000 --- a/test/DebugInfo/X86/dbg-large-unsigned-const.ll +++ /dev/null @@ -1,62 +0,0 @@ -; RUN: llc -filetype=obj %s -o /dev/null -; Hanle large unsigned constant values. -target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32" -target triple = "i386-apple-macosx10.7.0" - -define zeroext i1 @_Z3iseRKxS0_(i64* nocapture %LHS, i64* nocapture %RHS) nounwind readonly optsize ssp { -entry: - tail call void @llvm.dbg.value(metadata !{i64* %LHS}, i64 0, metadata !7), !dbg !13 - tail call void @llvm.dbg.value(metadata !{i64* %RHS}, i64 0, metadata !11), !dbg !14 - %tmp1 = load i64* %LHS, align 4, !dbg !15 - %tmp3 = load i64* %RHS, align 4, !dbg !15 - %cmp = icmp eq i64 %tmp1, %tmp3, !dbg !15 - ret i1 %cmp, !dbg !15 -} - -define zeroext i1 @_Z2fnx(i64 %a) nounwind readnone optsize ssp { -entry: - tail call void @llvm.dbg.value(metadata !{i64 %a}, i64 0, metadata !12), !dbg !20 - tail call void @llvm.dbg.value(metadata !{i64 %a}, i64 0, metadata !12), !dbg !20 - tail call void @llvm.dbg.value(metadata !{i64 %a}, i64 0, metadata !21), !dbg !24 - tail call void @llvm.dbg.value(metadata !25, i64 0, metadata !26), !dbg !27 - %cmp.i = icmp eq i64 %a, 9223372036854775807, !dbg !28 - ret i1 %cmp.i, !dbg !22 -} - -declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone - -!llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!34} -!29 = metadata !{metadata !1, metadata !6} -!30 = metadata !{metadata !7, metadata !11} -!31 = metadata !{metadata !12} - -!0 = metadata !{i32 786449, metadata !32, i32 4, metadata !"clang version 3.0 (trunk 135593)", i1 true, metadata !"", i32 0, metadata !33, metadata !33, metadata !29, null, null, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 786478, metadata !32, null, metadata !"ise", metadata !"ise", metadata !"_Z3iseRKxS0_", i32 2, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i1 (i64*, i64*)* @_Z3iseRKxS0_, null, null, metadata !30, i32 2} ; [ DW_TAG_subprogram ] -!2 = metadata !{i32 786473, metadata !32} ; [ DW_TAG_file_type ] -!3 = metadata !{i32 786453, metadata !32, metadata !2, metadata !"", i32 0, i64 0, i64 0, i32 0, i32 0, null, metadata !4, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!4 = metadata !{metadata !5} -!5 = metadata !{i32 786468, null, metadata !0, metadata !"bool", i32 0, i64 8, i64 8, i64 0, i32 0, i32 2} ; [ DW_TAG_base_type ] -!6 = metadata !{i32 786478, metadata !32, null, metadata !"fn", metadata !"fn", metadata !"_Z2fnx", i32 6, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i1 (i64)* @_Z2fnx, null, null, metadata !31, i32 6} ; [ DW_TAG_subprogram ] [line 6] [def] [fn] -!7 = metadata !{i32 786689, metadata !1, metadata !"LHS", metadata !2, i32 16777218, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] -!8 = metadata !{i32 786448, metadata !0, null, null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !9} ; [ DW_TAG_reference_type ] -!9 = metadata !{i32 786470, metadata !0, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !10} ; [ DW_TAG_const_type ] -!10 = metadata !{i32 786468, null, metadata !0, metadata !"long long int", i32 0, i64 64, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!11 = metadata !{i32 786689, metadata !1, metadata !"RHS", metadata !2, i32 33554434, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] -!12 = metadata !{i32 786689, metadata !6, metadata !"a", metadata !2, i32 16777222, metadata !10, i32 0, i32 0} ; [ DW_TAG_arg_variable ] -!13 = metadata !{i32 2, i32 27, metadata !1, null} -!14 = metadata !{i32 2, i32 49, metadata !1, null} -!15 = metadata !{i32 3, i32 3, metadata !16, null} -!16 = metadata !{i32 786443, metadata !32, metadata !1, i32 2, i32 54, i32 0} ; [ DW_TAG_lexical_block ] -!20 = metadata !{i32 6, i32 19, metadata !6, null} -!21 = metadata !{i32 786689, metadata !1, metadata !"LHS", metadata !2, i32 16777218, metadata !8, i32 0, metadata !22} ; [ DW_TAG_arg_variable ] -!22 = metadata !{i32 7, i32 10, metadata !23, null} -!23 = metadata !{i32 786443, metadata !32, metadata !6, i32 6, i32 22, i32 1} ; [ DW_TAG_lexical_block ] -!24 = metadata !{i32 2, i32 27, metadata !1, metadata !22} -!25 = metadata !{i64 9223372036854775807} -!26 = metadata !{i32 786689, metadata !1, metadata !"RHS", metadata !2, i32 33554434, metadata !8, i32 0, metadata !22} ; [ DW_TAG_arg_variable ] -!27 = metadata !{i32 2, i32 49, metadata !1, metadata !22} -!28 = metadata !{i32 3, i32 3, metadata !16, metadata !22} -!32 = metadata !{metadata !"lli.cc", metadata !"/private/tmp"} -!33 = metadata !{i32 0} -!34 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/DebugInfo/X86/dbg-merge-loc-entry.ll b/test/DebugInfo/X86/dbg-merge-loc-entry.ll index 8b619ea8607d..016d0a1e9f74 100644 --- a/test/DebugInfo/X86/dbg-merge-loc-entry.ll +++ b/test/DebugInfo/X86/dbg-merge-loc-entry.ll @@ -6,7 +6,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin8" -;CHECK: DW_AT_location{{.*}}(<0x01> 55 ) +;CHECK: DW_AT_location{{.*}}(<0x1> 55 ) %0 = type { i64, i1 } diff --git a/test/DebugInfo/X86/dbg-subrange.ll b/test/DebugInfo/X86/dbg-subrange.ll index 5bf330c9b9d7..f8761d012e86 100644 --- a/test/DebugInfo/X86/dbg-subrange.ll +++ b/test/DebugInfo/X86/dbg-subrange.ll @@ -15,15 +15,13 @@ entry: !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!22} -!0 = metadata !{i32 786449, metadata !21, i32 12, metadata !"clang version 3.1 (trunk 144833)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !11, metadata !11, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !21, i32 12, metadata !"clang version 3.1 (trunk 144833)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !11, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{} !3 = metadata !{metadata !5} -!5 = metadata !{i32 720942, metadata !21, metadata !6, metadata !"bar", metadata !"bar", metadata !"", i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @bar, null, null, metadata !9, i32 0} ; [ DW_TAG_subprogram ] [line 4] [def] [scope 0] [bar] +!5 = metadata !{i32 720942, metadata !21, metadata !6, metadata !"bar", metadata !"bar", metadata !"", i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @bar, null, null, null, i32 0} ; [ DW_TAG_subprogram ] [line 4] [def] [scope 0] [bar] !6 = metadata !{i32 720937, metadata !21} ; [ DW_TAG_file_type ] !7 = metadata !{i32 720917, i32 0, null, i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !8 = metadata !{null} -!9 = metadata !{metadata !10} -!10 = metadata !{i32 720932} ; [ DW_TAG_base_type ] !11 = metadata !{metadata !13} !13 = metadata !{i32 720948, i32 0, null, metadata !"s", metadata !"s", metadata !"", metadata !6, i32 2, metadata !14, i32 0, i32 1, [4294967296 x i8]* @s, null} ; [ DW_TAG_variable ] !14 = metadata !{i32 720897, null, null, null, i32 0, i64 34359738368, i64 8, i32 0, i32 0, metadata !15, metadata !16, i32 0, null, null, null} ; [ DW_TAG_array_type ] [line 0, size 34359738368, align 8, offset 0] [from char] diff --git a/test/DebugInfo/X86/dbg-value-const-byref.ll b/test/DebugInfo/X86/dbg-value-const-byref.ll new file mode 100644 index 000000000000..23fa3520a7d1 --- /dev/null +++ b/test/DebugInfo/X86/dbg-value-const-byref.ll @@ -0,0 +1,106 @@ +; RUN: llc -O1 -filetype=obj -o - %s | llvm-dwarfdump -debug-dump=all - | FileCheck %s +; Generated with -O1 from: +; int f1(); +; void f2(int*); +; int f3(int); +; +; int foo() { +; int i = 3; +; f3(i); +; i = 7; +; i = f1(); +; f2(&i); +; return 0; +; } +; +; Test that we generate valid debug info for optimized code, +; particularly variables that are described as constants and passed +; by reference. +; rdar://problem/14874886 +; +; CHECK: .debug_info contents: +; CHECK: DW_TAG_variable +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_location [DW_FORM_data4] ([[LOC:.*]]) +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name{{.*}}"i" +; CHECK: .debug_loc contents: +; CHECK: [[LOC]]: +; consts 0x00000003 +; CHECK: Beginning address offset: 0x0000000000000{{.*}} +; CHECK: Ending address offset: [[C1:.*]] +; CHECK: Location description: 11 03 +; consts 0x00000007 +; CHECK: Beginning address offset: [[C1]] +; CHECK: Ending address offset: [[C2:.*]] +; CHECK: Location description: 11 07 +; rax, piece 0x00000004 +; CHECK: Beginning address offset: [[C2]] +; CHECK: Ending address offset: [[R1:.*]] +; CHECK: Location description: 50 93 04 +; rdi+0 +; CHECK: Beginning address offset: [[R1]] +; CHECK: Ending address offset: [[R2:.*]] +; CHECK: Location description: 75 00 +; +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.9.0" + +; Function Attrs: nounwind ssp uwtable +define i32 @foo() #0 { +entry: + %i = alloca i32, align 4 + call void @llvm.dbg.value(metadata !14, i64 0, metadata !10), !dbg !15 + %call = call i32 @f3(i32 3) #3, !dbg !16 + call void @llvm.dbg.value(metadata !17, i64 0, metadata !10), !dbg !18 + %call1 = call i32 (...)* @f1() #3, !dbg !19 + call void @llvm.dbg.value(metadata !{i32 %call1}, i64 0, metadata !10), !dbg !19 + store i32 %call1, i32* %i, align 4, !dbg !19, !tbaa !20 + call void @llvm.dbg.value(metadata !{i32* %i}, i64 0, metadata !10), !dbg !24 + call void @f2(i32* %i) #3, !dbg !24 + ret i32 0, !dbg !25 +} + +declare i32 @f3(i32) + +declare i32 @f1(...) + +declare void @f2(i32*) + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.value(metadata, i64, metadata) #2 + +attributes #0 = { nounwind ssp uwtable } +attributes #2 = { nounwind readnone } +attributes #3 = { nounwind } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!11, !12} +!llvm.ident = !{!13} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5.0 ", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [dbg-value-const-byref.c] [DW_LANG_C99] +!1 = metadata !{metadata !"dbg-value-const-byref.c", metadata !""} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"foo", metadata !"foo", metadata !"", i32 5, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 true, i32 ()* @foo, null, null, metadata !9, i32 5} ; [ DW_TAG_subprogram ] [line 5] [def] [foo] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [dbg-value-const-byref.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{metadata !8} +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{metadata !10} +!10 = metadata !{i32 786688, metadata !4, metadata !"i", metadata !5, i32 6, metadata !8, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [i] [line 6] +!11 = metadata !{i32 2, metadata !"Dwarf Version", i32 2} +!12 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!13 = metadata !{metadata !"clang version 3.5.0 "} +!14 = metadata !{i32 3} +!15 = metadata !{i32 6, i32 0, metadata !4, null} +!16 = metadata !{i32 7, i32 0, metadata !4, null} +!17 = metadata !{i32 7} +!18 = metadata !{i32 8, i32 0, metadata !4, null} ; [ DW_TAG_imported_declaration ] +!19 = metadata !{i32 9, i32 0, metadata !4, null} +!20 = metadata !{metadata !21, metadata !21, i64 0} +!21 = metadata !{metadata !"int", metadata !22, i64 0} +!22 = metadata !{metadata !"omnipotent char", metadata !23, i64 0} +!23 = metadata !{metadata !"Simple C/C++ TBAA"} +!24 = metadata !{i32 10, i32 0, metadata !4, null} +!25 = metadata !{i32 11, i32 0, metadata !4, null} diff --git a/test/DebugInfo/X86/dbg-value-inlined-parameter.ll b/test/DebugInfo/X86/dbg-value-inlined-parameter.ll index 1a78772e2e32..4d18f7dc3063 100644 --- a/test/DebugInfo/X86/dbg-value-inlined-parameter.ll +++ b/test/DebugInfo/X86/dbg-value-inlined-parameter.ll @@ -1,18 +1,43 @@ -; RUN: llc -mtriple=x86_64-apple-darwin %s -filetype=obj -o %t -; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -; RUN: llc -mtriple=x86_64-apple-darwin -regalloc=basic %s -filetype=obj -o %t -; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s +; RUN: llc -mtriple=x86_64-apple-darwin < %s -filetype=obj \ +; RUN: | llvm-dwarfdump -debug-dump=info - | FileCheck --check-prefix=CHECK --check-prefix=DARWIN %s +; RUN: llc -mtriple=x86_64-linux-gnu < %s -filetype=obj \ +; RUN: | llvm-dwarfdump -debug-dump=info - | FileCheck --check-prefix=CHECK --check-prefix=LINUX %s +; RUN: llc -mtriple=x86_64-apple-darwin < %s -filetype=obj -regalloc=basic \ +; RUN: | llvm-dwarfdump -debug-dump=info - | FileCheck --check-prefix=CHECK --check-prefix=DARWIN %s + +; CHECK: DW_TAG_subprogram +; CHECK: DW_AT_abstract_origin {{.*}}{[[ABS:.*]]} +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_abstract_origin {{.*}}{[[ABS_SP:.*]]} +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_abstract_origin {{.*}}{[[ABS_NUMS:.*]]} + +; CHECK: [[ABS]]: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "foo" +; CHECK: [[ABS_SP]]: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "sp" +; CHECK: [[ABS_NUMS]]: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "nums" ;CHECK: DW_TAG_inlined_subroutine -;CHECK-NEXT: DW_AT_abstract_origin -;CHECK-NEXT: DW_AT_low_pc -;CHECK-NEXT: DW_AT_high_pc +;CHECK-NEXT: DW_AT_abstract_origin {{.*}}{[[ABS]]} +;CHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] +;CHECK-NEXT: DW_AT_high_pc [DW_FORM_data4] ;CHECK-NEXT: DW_AT_call_file ;CHECK-NEXT: DW_AT_call_line ;CHECK: DW_TAG_formal_parameter -;CHECK: DW_TAG_formal_parameter -;CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000055] = "sp") +;FIXME: Linux shouldn't drop this parameter either... +;CHECK-NOT: DW_TAG +;DARWIN: DW_AT_abstract_origin {{.*}}{[[ABS_SP]]} +;DARWIN: DW_TAG_formal_parameter +;CHECK: DW_AT_abstract_origin {{.*}}{[[ABS_NUMS]]} +;CHECK-NOT: DW_TAG_formal_parameter %struct.S1 = type { float*, i32 } @@ -51,14 +76,14 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !0 = metadata !{i32 786478, metadata !1, metadata !1, metadata !"foo", metadata !"foo", metadata !"", i32 8, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 (%struct.S1*, i32)* @foo, null, null, metadata !41, i32 8} ; [ DW_TAG_subprogram ] [line 8] [def] [foo] !1 = metadata !{i32 786473, metadata !42} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 786449, metadata !42, i32 12, metadata !"clang version 2.9 (trunk 125693)", i1 true, metadata !"", i32 0, metadata !8, metadata !8, metadata !39, metadata !40, metadata !40, null} ; [ DW_TAG_compile_unit ] +!2 = metadata !{i32 786449, metadata !42, i32 12, metadata !"clang version 2.9 (trunk 125693)", i1 true, metadata !"", i32 0, metadata !8, metadata !8, metadata !39, metadata !40, metadata !44, null} ; [ DW_TAG_compile_unit ] !3 = metadata !{i32 786453, metadata !42, metadata !1, metadata !"", i32 0, i64 0, i64 0, i32 0, i32 0, null, metadata !4, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !4 = metadata !{metadata !5} !5 = metadata !{i32 786468, null, metadata !2, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !6 = metadata !{i32 786478, metadata !1, metadata !1, metadata !"foobar", metadata !"foobar", metadata !"", i32 15, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 true, void ()* @foobar, null, null, null, i32 0} ; [ DW_TAG_subprogram ] [line 15] [def] [scope 0] [foobar] !7 = metadata !{i32 786453, metadata !42, metadata !1, metadata !"", i32 0, i64 0, i64 0, i32 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !8 = metadata !{null} -!9 = metadata !{i32 786689, metadata !0, metadata !"sp", metadata !1, i32 7, metadata !10, i32 0, metadata !32} ; [ DW_TAG_arg_variable ] +!9 = metadata !{i32 786689, metadata !0, metadata !"sp", metadata !1, i32 16777223, metadata !10, i32 0, metadata !32} ; [ DW_TAG_arg_variable ] !10 = metadata !{i32 786447, null, metadata !2, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !11} ; [ DW_TAG_pointer_type ] !11 = metadata !{i32 786454, metadata !42, metadata !2, metadata !"S1", i32 4, i64 0, i64 0, i64 0, i32 0, metadata !12} ; [ DW_TAG_typedef ] !12 = metadata !{i32 786451, metadata !42, metadata !2, metadata !"S1", i32 1, i64 128, i64 64, i32 0, i32 0, null, metadata !13, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [S1] [line 1, size 128, align 64, offset 0] [def] [from ] @@ -67,7 +92,7 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !15 = metadata !{i32 786447, null, metadata !2, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !16} ; [ DW_TAG_pointer_type ] !16 = metadata !{i32 786468, null, metadata !2, metadata !"float", i32 0, i64 32, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] !17 = metadata !{i32 786445, metadata !42, metadata !1, metadata !"nums", i32 3, i64 32, i64 32, i64 64, i32 0, metadata !5} ; [ DW_TAG_member ] -!18 = metadata !{i32 786689, metadata !0, metadata !"nums", metadata !1, i32 7, metadata !5, i32 0, metadata !32} ; [ DW_TAG_arg_variable ] +!18 = metadata !{i32 786689, metadata !0, metadata !"nums", metadata !1, i32 33554439, metadata !5, i32 0, metadata !32} ; [ DW_TAG_arg_variable ] !19 = metadata !{i32 786484, i32 0, metadata !2, metadata !"p", metadata !"p", metadata !"", metadata !1, i32 14, metadata !11, i32 0, i32 1, %struct.S1* @p, null} ; [ DW_TAG_variable ] !20 = metadata !{i32 7, i32 13, metadata !0, null} !21 = metadata !{i32 7, i32 21, metadata !0, null} @@ -89,3 +114,4 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !41 = metadata !{metadata !9, metadata !18} !42 = metadata !{metadata !"nm2.c", metadata !"/private/tmp"} !43 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!44 = metadata !{} diff --git a/test/DebugInfo/X86/dbg-value-isel.ll b/test/DebugInfo/X86/dbg-value-isel.ll index f899f48b1fdf..155f76f7ab5f 100644 --- a/test/DebugInfo/X86/dbg-value-isel.ll +++ b/test/DebugInfo/X86/dbg-value-isel.ll @@ -92,7 +92,7 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !8 = metadata !{i32 786689, metadata !0, metadata !"ip", metadata !1, i32 1, metadata !5, i32 0, null} ; [ DW_TAG_arg_variable ] !9 = metadata !{i32 1, i32 32, metadata !0, null} !10 = metadata !{i32 786688, metadata !11, metadata !"tid", metadata !1, i32 3, metadata !6, i32 0, null} ; [ DW_TAG_auto_variable ] -!11 = metadata !{i32 786443, metadata !0, i32 2, i32 1, metadata !1, i32 1} ; [ DW_TAG_lexical_block ] +!11 = metadata !{i32 786443, metadata !1, metadata !0, i32 2, i32 1, i32 1} ; [ DW_TAG_lexical_block ] !12 = metadata !{i32 5, i32 24, metadata !11, null} !13 = metadata !{i32 786688, metadata !11, metadata !"gid", metadata !1, i32 3, metadata !6, i32 0, null} ; [ DW_TAG_auto_variable ] !14 = metadata !{i32 6, i32 25, metadata !11, null} diff --git a/test/DebugInfo/X86/dbg-value-location.ll b/test/DebugInfo/X86/dbg-value-location.ll index 1e21c6a00ae4..55d1ae6a9f69 100644 --- a/test/DebugInfo/X86/dbg-value-location.ll +++ b/test/DebugInfo/X86/dbg-value-location.ll @@ -1,14 +1,16 @@ -; RUN: llc < %s | FileCheck %s -; RUN: llc < %s -regalloc=basic | FileCheck %s +; RUN: llc -filetype=obj %s -o - | llvm-dwarfdump -debug-dump=info - | FileCheck %s +; RUN: llc -filetype=obj %s -regalloc=basic -o - | llvm-dwarfdump -debug-dump=info - | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin10.0.0" -;Radar 8950491 +; Test that the type for the formal parameter "var" makes it into the debug info. +; rdar://8950491 -;CHECK: .long Lset5 -;CHECK-NEXT: ## DW_AT_decl_file -;CHECK-NEXT: ## DW_AT_decl_line -;CHECK-NEXT: ## DW_AT_type -;CHECK-NEXT: ## DW_AT_location +;CHECK: DW_TAG_formal_parameter +;CHECK-NEXT: DW_AT_location +;CHECK-NEXT: DW_AT_name {{.*}} "var" +;CHECK-NEXT: DW_AT_decl_file +;CHECK-NEXT: DW_AT_decl_line +;CHECK-NEXT: DW_AT_type @dfm = external global i32, align 4 @@ -69,7 +71,7 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !18 = metadata !{i32 786443, metadata !26, metadata !0, i32 19510, i32 1, i32 99} ; [ DW_TAG_lexical_block ] !22 = metadata !{i32 18094, i32 2, metadata !15, metadata !17} !23 = metadata !{i32 19524, i32 1, metadata !18, null} -!24 = metadata !{metadata !0, metadata !6, metadata !7, metadata !8} +!24 = metadata !{metadata !0, metadata !6, metadata !7, metadata !8, metadata !16} !25 = metadata !{i32 786473, metadata !27} ; [ DW_TAG_file_type ] !26 = metadata !{metadata !"/tmp/f.c", metadata !"/tmp"} !27 = metadata !{metadata !"f.i", metadata !"/tmp"} diff --git a/test/DebugInfo/X86/dbg-value-terminator.ll b/test/DebugInfo/X86/dbg-value-terminator.ll index f08f281f4f3f..974e0ad6d837 100644 --- a/test/DebugInfo/X86/dbg-value-terminator.ll +++ b/test/DebugInfo/X86/dbg-value-terminator.ll @@ -11,84 +11,84 @@ define hidden fastcc %a* @test() #1 { entry: - %0 = icmp eq %a* undef, null, !dbg !1 - br i1 %0, label %"14", label %return, !dbg !1 + %0 = icmp eq %a* undef, null, !dbg !12 + br i1 %0, label %"14", label %return, !dbg !12 "14": ; preds = %"8" - br i1 undef, label %"25", label %"21", !dbg !1 + br i1 undef, label %"25", label %"21", !dbg !12 "21": ; preds = %"14" - br i1 undef, label %may_unswitch_on.exit, label %"6.i", !dbg !1 + br i1 undef, label %may_unswitch_on.exit, label %"6.i", !dbg !12 "6.i": ; preds = %"21" - br i1 undef, label %"10.i", label %may_unswitch_on.exit, !dbg !1 + br i1 undef, label %"10.i", label %may_unswitch_on.exit, !dbg !12 "10.i": ; preds = %"6.i" - br i1 undef, label %may_unswitch_on.exit, label %"12.i", !dbg !1 + br i1 undef, label %may_unswitch_on.exit, label %"12.i", !dbg !12 "12.i": ; preds = %"10.i" - br i1 undef, label %"4.i.i", label %"3.i.i", !dbg !1 + br i1 undef, label %"4.i.i", label %"3.i.i", !dbg !12 "3.i.i": ; preds = %"12.i" - br i1 undef, label %"4.i.i", label %VEC_edge_base_index.exit.i, !dbg !1 + br i1 undef, label %"4.i.i", label %VEC_edge_base_index.exit.i, !dbg !12 "4.i.i": ; preds = %"3.i.i", %"12.i" - unreachable, !dbg !1 + unreachable, !dbg !12 VEC_edge_base_index.exit.i: ; preds = %"3.i.i" - br i1 undef, label %may_unswitch_on.exit, label %"16.i", !dbg !1 + br i1 undef, label %may_unswitch_on.exit, label %"16.i", !dbg !12 "16.i": ; preds = %VEC_edge_base_index.exit.i - br i1 undef, label %"4.i6.i", label %"3.i5.i", !dbg !1 + br i1 undef, label %"4.i6.i", label %"3.i5.i", !dbg !12 "3.i5.i": ; preds = %"16.i" - br i1 undef, label %VEC_edge_base_index.exit7.i, label %"4.i6.i", !dbg !1 + br i1 undef, label %VEC_edge_base_index.exit7.i, label %"4.i6.i", !dbg !12 "4.i6.i": ; preds = %"3.i5.i", %"16.i" - unreachable, !dbg !1 + unreachable, !dbg !12 VEC_edge_base_index.exit7.i: ; preds = %"3.i5.i" - br i1 undef, label %may_unswitch_on.exit, label %"21.i", !dbg !1 + br i1 undef, label %may_unswitch_on.exit, label %"21.i", !dbg !12 "21.i": ; preds = %VEC_edge_base_index.exit7.i - br i1 undef, label %may_unswitch_on.exit, label %"23.i", !dbg !1 + br i1 undef, label %may_unswitch_on.exit, label %"23.i", !dbg !12 "23.i": ; preds = %"21.i" - br i1 undef, label %may_unswitch_on.exit, label %"26.i", !dbg !1 + br i1 undef, label %may_unswitch_on.exit, label %"26.i", !dbg !12 "26.i": ; preds = %"34.i", %"23.i" - %1 = icmp eq i32 undef, 9, !dbg !1 - br i1 %1, label %"34.i", label %"28.i", !dbg !1 + %1 = icmp eq i32 undef, 9, !dbg !12 + br i1 %1, label %"34.i", label %"28.i", !dbg !12 "28.i": ; preds = %"26.i" unreachable "34.i": ; preds = %"26.i" - br i1 undef, label %"26.i", label %"36.i", !dbg !1 + br i1 undef, label %"26.i", label %"36.i", !dbg !12 "36.i": ; preds = %"34.i" - br i1 undef, label %"37.i", label %"38.i", !dbg !1 + br i1 undef, label %"37.i", label %"38.i", !dbg !12 "37.i": ; preds = %"36.i" - br label %"38.i", !dbg !1 + br label %"38.i", !dbg !12 "38.i": ; preds = %"37.i", %"36.i" - br i1 undef, label %"39.i", label %"45.i", !dbg !1 + br i1 undef, label %"39.i", label %"45.i", !dbg !12 "39.i": ; preds = %"38.i" - br i1 undef, label %"41.i", label %may_unswitch_on.exit, !dbg !1 + br i1 undef, label %"41.i", label %may_unswitch_on.exit, !dbg !12 "41.i": ; preds = %"39.i" - br i1 undef, label %may_unswitch_on.exit, label %"42.i", !dbg !1 + br i1 undef, label %may_unswitch_on.exit, label %"42.i", !dbg !12 "42.i": ; preds = %"41.i" - br i1 undef, label %may_unswitch_on.exit, label %"44.i", !dbg !1 + br i1 undef, label %may_unswitch_on.exit, label %"44.i", !dbg !12 "44.i": ; preds = %"42.i" - %2 = load %a** undef, align 8, !dbg !1 - %3 = bitcast %a* %2 to %a*, !dbg !1 + %2 = load %a** undef, align 8, !dbg !12 + %3 = bitcast %a* %2 to %a*, !dbg !12 call void @llvm.dbg.value(metadata !{%a* %3}, i64 0, metadata !6), !dbg !12 - br label %may_unswitch_on.exit, !dbg !1 + br label %may_unswitch_on.exit, !dbg !12 "45.i": ; preds = %"38.i" unreachable @@ -102,7 +102,7 @@ may_unswitch_on.exit: ; preds = %"44.i", %"42.i", %" "return": %result = phi %a* [ null, %entry ], [ %4, %may_unswitch_on.exit ] - ret %a* %result, !dbg !1 + ret %a* %result, !dbg !12 } attributes #0 = { nounwind readnone } diff --git a/test/DebugInfo/X86/dbg_value_direct.ll b/test/DebugInfo/X86/dbg_value_direct.ll index 8a22cd7cca03..db947ac94799 100644 --- a/test/DebugInfo/X86/dbg_value_direct.ll +++ b/test/DebugInfo/X86/dbg_value_direct.ll @@ -149,7 +149,7 @@ attributes #2 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "n !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/tmp/crash.cpp] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !"crash.cpp", metadata !"/tmp"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4} !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"func", metadata !"func", metadata !"_Z4funci", i32 6, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.A*, i32)* @_Z4funci, null, null, metadata !2, i32 6} ; [ DW_TAG_subprogram ] [line 6] [def] [func] !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/crash.cpp] @@ -170,8 +170,9 @@ attributes #2 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "n !20 = metadata !{i32 786468} !21 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] !22 = metadata !{i32 2, metadata !"Dwarf Version", i32 3} -!23 = metadata !{i32 786689, metadata !4, metadata !"", metadata !5, i32 16777222, metadata !21, i32 0, i32 0, i64 2} ; [ DW_TAG_arg_variable ] [line 6] +!23 = metadata !{i32 786689, metadata !4, metadata !"", metadata !5, i32 16777222, metadata !21, i32 0, i32 0, metadata !28} ; [ DW_TAG_arg_variable ] [line 6] !24 = metadata !{i32 786688, metadata !4, metadata !"a", metadata !5, i32 7, metadata !8, i32 8192, i32 0} ; [ DW_TAG_auto_variable ] [a] [line 7] !25 = metadata !{i32 7, i32 0, metadata !4, null} !26 = metadata !{i32 8, i32 0, metadata !4, null} ; [ DW_TAG_imported_declaration ] !27 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!28 = metadata !{i64 2} diff --git a/test/DebugInfo/X86/debug-dead-local-var.ll b/test/DebugInfo/X86/debug-dead-local-var.ll new file mode 100644 index 000000000000..64f0b2a9e40f --- /dev/null +++ b/test/DebugInfo/X86/debug-dead-local-var.ll @@ -0,0 +1,51 @@ +; RUN: llc -mtriple=x86_64-linux-gnu %s -filetype=obj -o %t +; RUN: llvm-dwarfdump %t | FileCheck %s + +; Reconstruct this via clang and -O2. +; static void foo() { +; struct X { int a; int b; } xyz; +; } + +; int bar() { +; foo(); +; return 1; +; } + +; Check that we still have the structure type for X even though we're not +; going to emit a low/high_pc for foo. +; CHECK: DW_TAG_structure_type + +; Function Attrs: nounwind readnone uwtable +define i32 @bar() #0 { +entry: + ret i32 1, !dbg !21 +} + +attributes #0 = { nounwind readnone uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!18, !19} +!llvm.ident = !{!20} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5.0 (trunk 209255) (llvm/trunk 209253)", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/debug-dead-local-var.c] [DW_LANG_C99] +!1 = metadata !{metadata !"debug-dead-local-var.c", metadata !"/usr/local/google/home/echristo"} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !9} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"bar", metadata !"bar", metadata !"", i32 11, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 true, i32 ()* @bar, null, null, metadata !2, i32 11} ; [ DW_TAG_subprogram ] [line 11] [def] [bar] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/usr/local/google/home/echristo/debug-dead-local-var.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{metadata !8} +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"foo", metadata !"foo", metadata !"", i32 6, metadata !10, i1 true, i1 true, i32 0, i32 0, null, i32 0, i1 true, null, null, null, metadata !12, i32 6} ; [ DW_TAG_subprogram ] [line 6] [local] [def] [foo] +!10 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !11, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!11 = metadata !{null} +!12 = metadata !{metadata !13} +!13 = metadata !{i32 786688, metadata !9, metadata !"xyz", metadata !5, i32 8, metadata !14, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [xyz] [line 8] +!14 = metadata !{i32 786451, metadata !1, metadata !9, metadata !"X", i32 8, i64 64, i64 32, i32 0, i32 0, null, metadata !15, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [X] [line 8, size 64, align 32, offset 0] [def] [from ] +!15 = metadata !{metadata !16, metadata !17} +!16 = metadata !{i32 786445, metadata !1, metadata !14, metadata !"a", i32 8, i64 32, i64 32, i64 0, i32 0, metadata !8} ; [ DW_TAG_member ] [a] [line 8, size 32, align 32, offset 0] [from int] +!17 = metadata !{i32 786445, metadata !1, metadata !14, metadata !"b", i32 8, i64 32, i64 32, i64 32, i32 0, metadata !8} ; [ DW_TAG_member ] [b] [line 8, size 32, align 32, offset 32] [from int] +!18 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!19 = metadata !{i32 2, metadata !"Debug Info Version", i32 1} +!20 = metadata !{metadata !"clang version 3.5.0 (trunk 209255) (llvm/trunk 209253)"} +!21 = metadata !{i32 13, i32 0, metadata !4, null} diff --git a/test/DebugInfo/X86/debug-info-block-captured-self.ll b/test/DebugInfo/X86/debug-info-block-captured-self.ll index 6e4d2007a976..95eda60c5cca 100644 --- a/test/DebugInfo/X86/debug-info-block-captured-self.ll +++ b/test/DebugInfo/X86/debug-info-block-captured-self.ll @@ -7,17 +7,19 @@ ; This test is split into two parts, the frontend part can be found at ; llvm/tools/clang/test/CodeGenObjC/debug-info-block-captured-self.m ; -; CHECK: {{.*}}DW_AT_name{{.*}}_block_invoke{{.*}} -; CHECK: DW_TAG_variable -; CHECK: {{.*}}DW_AT_name{{.*}}"self"{{.*}} +; CHECK: {{.*}}DW_AT_name{{.*}}_block_invoke{{.*}} +; CHECK: DW_TAG_variable ; CHECK-NOT: DW_TAG -; CHECK: DW_AT_location +; CHECK: DW_AT_location +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name{{.*}}"self"{{.*}} ; -; CHECK: {{.*}}DW_AT_name{{.*}}_block_invoke{{.*}} -; CHECK: DW_TAG_variable -; CHECK: {{.*}}DW_AT_name{{.*}}"self"{{.*}} +; CHECK: {{.*}}DW_AT_name{{.*}}_block_invoke{{.*}} +; CHECK: DW_TAG_variable ; CHECK-NOT: DW_TAG -; CHECK: DW_AT_location +; CHECK: DW_AT_location +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name{{.*}}"self"{{.*}} ; ; Generated (and then reduced) from ; ---------------------------------------------------------------------- @@ -83,7 +85,7 @@ define internal void @"__24-[Main initWithContext:]_block_invoke_2"(i8* %.block_ !2 = metadata !{metadata !3} !3 = metadata !{i32 786436, metadata !107, null, metadata !"", i32 20, i64 32, i64 32, i32 0, i32 0, null, metadata !4, i32 0, null, null, null} ; [ DW_TAG_enumeration_type ] [line 20, size 32, align 32, offset 0] [def] [from ] !4 = metadata !{} -!15 = metadata !{i32 0} +!15 = metadata !{} !23 = metadata !{metadata !38, metadata !42} !27 = metadata !{i32 786454, metadata !107, null, metadata !"id", i32 31, i64 0, i64 0, i64 0, i32 0, metadata !28} ; [ DW_TAG_typedef ] [id] [line 31, size 0, align 0, offset 0] [from ] !28 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !29} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from objc_object] @@ -99,10 +101,12 @@ define internal void @"__24-[Main initWithContext:]_block_invoke_2"(i8* %.block_ !41 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ] !42 = metadata !{i32 786478, metadata !1, metadata !1, metadata !"__24-[Main initWithContext:]_block_invoke_2", metadata !"__24-[Main initWithContext:]_block_invoke_2", metadata !"", i32 35, metadata !39, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i8*, i8*)* @"__24-[Main initWithContext:]_block_invoke_2", null, null, metadata !15, i32 35} ; [ DW_TAG_subprogram ] [line 35] [local] [def] [__24-[Main initWithContext:]_block_invoke_2] !84 = metadata !{i32 33, i32 0, metadata !38, null} -!86 = metadata !{i32 786688, metadata !38, metadata !"self", metadata !1, i32 41, metadata !34, i32 0, i32 0, i64 1, i64 32} ; [ DW_TAG_auto_variable ] [self] [line 41] +!86 = metadata !{i32 786688, metadata !38, metadata !"self", metadata !1, i32 41, metadata !34, i32 0, i32 0, metadata !110} ; [ DW_TAG_auto_variable ] [self] [line 41] !87 = metadata !{i32 41, i32 0, metadata !38, null} !103 = metadata !{i32 35, i32 0, metadata !42, null} -!105 = metadata !{i32 786688, metadata !42, metadata !"self", metadata !1, i32 40, metadata !34, i32 0, i32 0, i64 1, i64 32} ; [ DW_TAG_auto_variable ] [self] [line 40] +!105 = metadata !{i32 786688, metadata !42, metadata !"self", metadata !1, i32 40, metadata !34, i32 0, i32 0, metadata !109} ; [ DW_TAG_auto_variable ] [self] [line 40] !106 = metadata !{i32 40, i32 0, metadata !42, null} !107 = metadata !{metadata !"llvm/tools/clang/test/CodeGenObjC/debug-info-block-captured-self.m", metadata !""} !108 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!109 = metadata !{i64 1, i64 32} +!110 = metadata !{i64 1, i64 32} diff --git a/test/DebugInfo/X86/debug-info-blocks.ll b/test/DebugInfo/X86/debug-info-blocks.ll index c3bedf2b2643..8a1a125ff804 100644 --- a/test/DebugInfo/X86/debug-info-blocks.ll +++ b/test/DebugInfo/X86/debug-info-blocks.ll @@ -5,32 +5,40 @@ ; rdar://problem/9279956 ; test that the DW_AT_location of self is at ( fbreg +{{[0-9]+}}, deref, +{{[0-9]+}} ) +; CHECK: [[A:.*]]: DW_TAG_structure_type +; CHECK-NEXT: DW_AT_APPLE_objc_complete_type +; CHECK-NEXT: DW_AT_name{{.*}}"A" + +; CHECK: DW_TAG_subprogram +; CHECK: DW_TAG_subprogram ; CHECK: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_object_pointer +; CHECK-NOT: DW_TAG ; CHECK: DW_AT_name{{.*}}_block_invoke -; CHECK-NOT: DW_TAG_subprogram +; CHECK-NOT: {{DW_TAG|NULL}} ; CHECK: DW_TAG_formal_parameter -; CHECK-NEXT: DW_AT_name{{.*}}.block_descriptor ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_location +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name{{.*}}.block_descriptor -; CHECK-NOT: DW_TAG_subprogram +; CHECK-NOT: {{DW_TAG|NULL}} ; CHECK: DW_TAG_variable -; CHECK-NEXT: DW_AT_name{{.*}}"self" -; CHECK-NOT: DW_TAG -; CHECK: DW_AT_type{{.*}}{[[APTR:.*]]} -; CHECK-NOT: DW_TAG -; CHECK: DW_AT_artificial ; CHECK-NOT: DW_TAG ; 0x06 = DW_OP_deref ; 0x23 = DW_OP_uconst ; 0x91 = DW_OP_fbreg ; CHECK: DW_AT_location{{.*}}91 {{[0-9]+}} 06 23 {{[0-9]+}} ) +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name{{.*}}"self" +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_type{{.*}}{[[APTR:.*]]} +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_artificial -; CHECK: [[A:.*]]: DW_TAG_structure_type -; CHECK-NEXT: DW_AT_APPLE_objc_complete_type -; CHECK-NEXT: DW_AT_name{{.*}}"A" -; CHECK: [[APTR]]: DW_TAG_pointer_type [5] +; CHECK: [[APTR]]: DW_TAG_pointer_type ; CHECK-NEXT: {[[A]]} @@ -264,7 +272,7 @@ attributes #3 = { nounwind } !0 = metadata !{i32 786449, metadata !1, i32 16, metadata !"clang version 3.3 ", i1 false, metadata !"", i32 2, metadata !2, metadata !3, metadata !12, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [llvm/tools/clang/test/CodeGenObjC/<unknown>] [DW_LANG_ObjC] !1 = metadata !{metadata !"llvm/tools/clang/test/CodeGenObjC/<unknown>", metadata !"llvm/_build.ninja.Debug"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4} !4 = metadata !{i32 786451, metadata !5, metadata !6, metadata !"A", i32 33, i64 32, i64 32, i32 0, i32 512, null, metadata !7, i32 16, null, null, null} ; [ DW_TAG_structure_type ] [A] [line 33, size 32, align 32, offset 0] [def] [from ] !5 = metadata !{metadata !"llvm/tools/clang/test/CodeGenObjC/debug-info-blocks.m", metadata !"llvm/_build.ninja.Debug"} @@ -351,7 +359,7 @@ attributes #3 = { nounwind } !86 = metadata !{i32 786451, metadata !1, null, metadata !"__block_descriptor_withcopydispose", i32 49, i64 0, i64 0, i32 0, i32 4, null, null, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [__block_descriptor_withcopydispose] [line 49, size 0, align 0, offset 0] [decl] [from ] !87 = metadata !{i32 786445, metadata !5, metadata !6, metadata !"self", i32 49, i64 64, i64 64, i64 256, i32 0, metadata !61} ; [ DW_TAG_member ] [self] [line 49, size 64, align 64, offset 256] [from ] !88 = metadata !{i32 49, i32 0, metadata !27, null} -!89 = metadata !{i32 786688, metadata !27, metadata !"self", metadata !32, i32 52, metadata !23, i32 0, i32 0, i64 2, i64 1, i64 32} ; [ DW_TAG_auto_variable ] [self] [line 52] +!89 = metadata !{i32 786688, metadata !27, metadata !"self", metadata !32, i32 52, metadata !23, i32 0, i32 0, metadata !111} ; [ DW_TAG_auto_variable ] [self] [line 52] !90 = metadata !{i32 52, i32 0, metadata !27, null} !91 = metadata !{i32 786688, metadata !92, metadata !"d", metadata !6, i32 50, metadata !93, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [d] [line 50] !92 = metadata !{i32 786443, metadata !5, metadata !27, i32 49, i32 0, i32 2} ; [ DW_TAG_lexical_block ] [llvm/tools/clang/test/CodeGenObjC/debug-info-blocks.m] @@ -373,3 +381,4 @@ attributes #3 = { nounwind } !108 = metadata !{i32 61, i32 0, metadata !36, null} !109 = metadata !{i32 62, i32 0, metadata !36, null} !110 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!111 = metadata !{i64 2, i64 1, i64 32} diff --git a/test/DebugInfo/X86/debug-info-static-member.ll b/test/DebugInfo/X86/debug-info-static-member.ll index 1792bb4783b5..7d258f9d8377 100644 --- a/test/DebugInfo/X86/debug-info-static-member.ll +++ b/test/DebugInfo/X86/debug-info-static-member.ll @@ -1,7 +1,7 @@ -; RUN: llc %s -o %t -filetype=obj -O0 -mtriple=x86_64-unknown-linux-gnu +; RUN: llc %s -o %t -filetype=obj -O0 -mtriple=x86_64-unknown-linux-gnu -dwarf-version=4 ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=PRESENT ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=ABSENT -; RUN: llc %s -o %t -filetype=obj -O0 -mtriple=x86_64-apple-darwin +; RUN: llc %s -o %t -filetype=obj -O0 -mtriple=x86_64-apple-darwin -dwarf-version=4 ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DARWINP ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DARWINA ; Verify that attributes we do want are PRESENT; @@ -59,8 +59,8 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!34} -!0 = metadata !{i32 786449, metadata !33, i32 4, metadata !"clang version 3.3 (trunk 171914)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !10, metadata !10, metadata !""} ; [ DW_TAG_compile_unit ] [/home/probinson/projects/upstream/static-member/test/debug-info-static-member.cpp] [DW_LANG_C_plus_plus] -!1 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !33, i32 4, metadata !"clang version 3.3 (trunk 171914)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !10, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/home/probinson/projects/upstream/static-member/test/debug-info-static-member.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 786478, metadata !33, metadata !6, metadata !"main", metadata !"main", metadata !"", i32 18, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, metadata !1, i32 23} ; [ DW_TAG_subprogram ] [line 18] [def] [scope 23] [main] !6 = metadata !{i32 786473, metadata !33} ; [ DW_TAG_file_type ] @@ -114,7 +114,7 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone ; PRESENT: DW_TAG_member ; PRESENT-NEXT: DW_AT_name {{.*}} "const_b" ; PRESENT: DW_AT_accessibility [DW_FORM_data1] (0x02) -; PRESENT: DW_AT_const_value {{.*}} (0x4048f5c3) +; PRESENT: DW_AT_const_value [DW_FORM_udata] (1078523331) ; PRESENT: 0x[[DECL_C:[0-9a-f]+]]: DW_TAG_member ; PRESENT-NEXT: DW_AT_name {{.*}} "c" ; PRESENT: DW_AT_accessibility [DW_FORM_data1] (0x01) @@ -133,15 +133,15 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone ; PRESENT: DW_TAG_variable ; PRESENT-NEXT: DW_AT_specification {{.*}} {0x[[DECL_A]]} ; PRESENT-NEXT: DW_AT_location -; PRESENT-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1aE" +; PRESENT-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1aE" ; PRESENT: DW_TAG_variable ; PRESENT-NEXT: DW_AT_specification {{.*}} {0x[[DECL_B]]} ; PRESENT-NEXT: DW_AT_location -; PRESENT-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1bE" +; PRESENT-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1bE" ; PRESENT: DW_TAG_variable ; PRESENT-NEXT: DW_AT_specification {{.*}} {0x[[DECL_C]]} ; PRESENT-NEXT: DW_AT_location -; PRESENT-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1cE" +; PRESENT-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1cE" ; For Darwin gdb: ; DARWINP: .debug_info contents: @@ -164,7 +164,7 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone ; DARWINP: DW_TAG_member ; DARWINP-NEXT: DW_AT_name {{.*}} "const_b" ; DARWINP: DW_AT_accessibility [DW_FORM_data1] (0x02) -; DARWINP: DW_AT_const_value {{.*}} (0x4048f5c3) +; DARWINP: DW_AT_const_value [DW_FORM_udata] (1078523331) ; DARWINP: 0x[[DECL_C:[0-9a-f]+]]: DW_TAG_member ; DARWINP-NEXT: DW_AT_name {{.*}} "c" ; DARWINP: DW_AT_accessibility [DW_FORM_data1] (0x01) @@ -183,19 +183,19 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone ; DARWINP: DW_TAG_variable ; DARWINP-NEXT: DW_AT_specification {{.*}} {0x[[DECL_A]]} ; DARWINP-NEXT: DW_AT_location -; DARWINP-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1aE" +; DARWINP-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1aE" ; DARWINP: DW_TAG_variable ; DARWINP-NEXT: DW_AT_specification {{.*}} {0x[[DECL_B]]} ; DARWINP-NEXT: DW_AT_location -; DARWINP-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1bE" +; DARWINP-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1bE" ; DARWINP: DW_TAG_variable ; DARWINP-NEXT: DW_AT_specification {{.*}} {0x[[DECL_C]]} ; DARWINP-NEXT: DW_AT_location -; DARWINP-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1cE" +; DARWINP-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1cE" ; ABSENT verifies that static member declarations do not have either ; DW_AT_location or DW_AT_data_member_location; also, variables do not -; have DW_AT_const_value and constants do not have DW_AT_MIPS_linkage_name. +; have DW_AT_const_value and constants do not have DW_AT_linkage_name. ; ; ABSENT: .debug_info contents: ; ABSENT: DW_TAG_member @@ -203,24 +203,24 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone ; ABSENT-NOT: DW_AT_const_value ; ABSENT-NOT: location ; ABSENT: DW_AT_name {{.*}} "const_a" -; ABSENT-NOT: DW_AT_MIPS_linkage_name +; ABSENT-NOT: DW_AT_linkage_name ; ABSENT-NOT: location ; ABSENT: DW_AT_name {{.*}} "b" ; ABSENT-NOT: DW_AT_const_value ; ABSENT-NOT: location ; ABSENT: DW_AT_name {{.*}} "const_b" -; ABSENT-NOT: DW_AT_MIPS_linkage_name +; ABSENT-NOT: DW_AT_linkage_name ; ABSENT-NOT: location ; ABSENT: DW_AT_name {{.*}} "c" ; ABSENT-NOT: DW_AT_const_value ; ABSENT-NOT: location ; ABSENT: DW_AT_name {{.*}} "const_c" -; ABSENT-NOT: DW_AT_MIPS_linkage_name +; ABSENT-NOT: DW_AT_linkage_name ; ABSENT-NOT: location ; While we're here, a normal member does not have a linkage name, constant ; value, or DW_AT_location. ; ABSENT: DW_AT_name {{.*}} "d" -; ABSENT-NOT: DW_AT_MIPS_linkage_name +; ABSENT-NOT: DW_AT_linkage_name ; ABSENT-NOT: DW_AT_const_value ; ABSENT-NOT: DW_AT_location ; ABSENT: NULL @@ -232,24 +232,24 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone ; DARWINA-NOT: DW_AT_const_value ; DARWINA-NOT: location ; DARWINA: DW_AT_name {{.*}} "const_a" -; DARWINA-NOT: DW_AT_MIPS_linkage_name +; DARWINA-NOT: DW_AT_linkage_name ; DARWINA-NOT: location ; DARWINA: DW_AT_name {{.*}} "b" ; DARWINA-NOT: DW_AT_const_value ; DARWINA-NOT: location ; DARWINA: DW_AT_name {{.*}} "const_b" -; DARWINA-NOT: DW_AT_MIPS_linkage_name +; DARWINA-NOT: DW_AT_linkage_name ; DARWINA-NOT: location ; DARWINA: DW_AT_name {{.*}} "c" ; DARWINA-NOT: DW_AT_const_value ; DARWINA-NOT: location ; DARWINA: DW_AT_name {{.*}} "const_c" -; DARWINA-NOT: DW_AT_MIPS_linkage_name +; DARWINA-NOT: DW_AT_linkage_name ; DARWINA-NOT: location ; While we're here, a normal member does not have a linkage name, constant ; value, or DW_AT_location. ; DARWINA: DW_AT_name {{.*}} "d" -; DARWINA-NOT: DW_AT_MIPS_linkage_name +; DARWINA-NOT: DW_AT_linkage_name ; DARWINA-NOT: DW_AT_const_value ; DARWINA-NOT: DW_AT_location ; DARWINA: NULL diff --git a/test/DebugInfo/X86/debug-loc-asan.ll b/test/DebugInfo/X86/debug-loc-asan.ll new file mode 100644 index 000000000000..b1980ecda2d8 --- /dev/null +++ b/test/DebugInfo/X86/debug-loc-asan.ll @@ -0,0 +1,186 @@ +; RUN: llc -O0 -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s + +; Verify that we have correct debug info for local variables in code +; instrumented with AddressSanitizer. + +; Generated from the source file test.cc: +; int bar(int y) { +; return y + 2; +; } +; with "clang++ -S -emit-llvm -fsanitize=address -O0 -g test.cc" + +; First, argument variable "y" resides in %rdi: +; CHECK: DEBUG_VALUE: bar:y <- RDI + +; Then its address is stored in a location on a stack: +; CHECK: movq %rdi, [[OFFSET:[0-9]+]](%rsp) +; CHECK-NEXT: [[START_LABEL:.Ltmp[0-9]+]] +; CHECK-NEXT: DEBUG_VALUE: bar:y <- [RSP+[[OFFSET]]] +; This location should be valid until the end of the function. + +; CHECK: .Ldebug_loc{{[0-9]+}}: +; We expect two location ranges for the variable. + +; First, it is stored in %rdx: +; CHECK: .Lset{{[0-9]+}} = .Lfunc_begin0-.Lfunc_begin0 +; CHECK-NEXT: .quad .Lset{{[0-9]+}} +; CHECK-NEXT: .Lset{{[0-9]+}} = [[START_LABEL]]-.Lfunc_begin0 +; CHECK-NEXT: .quad .Lset{{[0-9]+}} +; CHECK: DW_OP_reg5 + +; Then it's addressed via %rsp: +; CHECK: .Lset{{[0-9]+}} = [[START_LABEL]]-.Lfunc_begin0 +; CHECK-NEXT: .quad .Lset{{[0-9]+}} +; CHECK-NEXT: .Lset{{[0-9]+}} = .Lfunc_end0-.Lfunc_begin0 +; CHECK-NEXT: .quad .Lset{{[0-9]+}} +; CHECK: DW_OP_breg7 +; CHECK-NEXT: [[OFFSET]] +; CHECK: DW_OP_deref + +; ModuleID = 'test.cc' +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 1, void ()* @asan.module_ctor }] +@__asan_option_detect_stack_use_after_return = external global i32 +@__asan_gen_ = private unnamed_addr constant [16 x i8] c"1 32 4 6 y.addr\00", align 1 + +; Function Attrs: nounwind sanitize_address uwtable +define i32 @_Z3bari(i32 %y) #0 { +entry: + %MyAlloca = alloca [64 x i8], align 32 + %0 = ptrtoint [64 x i8]* %MyAlloca to i64 + %1 = load i32* @__asan_option_detect_stack_use_after_return + %2 = icmp ne i32 %1, 0 + br i1 %2, label %3, label %5 + +; <label>:3 ; preds = %entry + %4 = call i64 @__asan_stack_malloc_0(i64 64, i64 %0) + br label %5 + +; <label>:5 ; preds = %entry, %3 + %6 = phi i64 [ %0, %entry ], [ %4, %3 ] + %7 = add i64 %6, 32 + %8 = inttoptr i64 %7 to i32* + %9 = inttoptr i64 %6 to i64* + store i64 1102416563, i64* %9 + %10 = add i64 %6, 8 + %11 = inttoptr i64 %10 to i64* + store i64 ptrtoint ([16 x i8]* @__asan_gen_ to i64), i64* %11 + %12 = add i64 %6, 16 + %13 = inttoptr i64 %12 to i64* + store i64 ptrtoint (i32 (i32)* @_Z3bari to i64), i64* %13 + %14 = lshr i64 %6, 3 + %15 = add i64 %14, 2147450880 + %16 = add i64 %15, 0 + %17 = inttoptr i64 %16 to i64* + store i64 -868083100587789839, i64* %17 + %18 = ptrtoint i32* %8 to i64 + %19 = lshr i64 %18, 3 + %20 = add i64 %19, 2147450880 + %21 = inttoptr i64 %20 to i8* + %22 = load i8* %21 + %23 = icmp ne i8 %22, 0 + call void @llvm.dbg.declare(metadata !{i32* %8}, metadata !12) + br i1 %23, label %24, label %30 + +; <label>:24 ; preds = %5 + %25 = and i64 %18, 7 + %26 = add i64 %25, 3 + %27 = trunc i64 %26 to i8 + %28 = icmp sge i8 %27, %22 + br i1 %28, label %29, label %30 + +; <label>:29 ; preds = %24 + call void @__asan_report_store4(i64 %18) + call void asm sideeffect "", ""() + unreachable + +; <label>:30 ; preds = %24, %5 + store i32 %y, i32* %8, align 4 + %31 = ptrtoint i32* %8 to i64, !dbg !13 + %32 = lshr i64 %31, 3, !dbg !13 + %33 = add i64 %32, 2147450880, !dbg !13 + %34 = inttoptr i64 %33 to i8*, !dbg !13 + %35 = load i8* %34, !dbg !13 + %36 = icmp ne i8 %35, 0, !dbg !13 + br i1 %36, label %37, label %43, !dbg !13 + +; <label>:37 ; preds = %30 + %38 = and i64 %31, 7, !dbg !13 + %39 = add i64 %38, 3, !dbg !13 + %40 = trunc i64 %39 to i8, !dbg !13 + %41 = icmp sge i8 %40, %35, !dbg !13 + br i1 %41, label %42, label %43 + +; <label>:42 ; preds = %37 + call void @__asan_report_load4(i64 %31), !dbg !13 + call void asm sideeffect "", ""() + unreachable + +; <label>:43 ; preds = %37, %30 + %44 = load i32* %8, align 4, !dbg !13 + %add = add nsw i32 %44, 2, !dbg !13 + store i64 1172321806, i64* %9, !dbg !13 + %45 = icmp ne i64 %6, %0, !dbg !13 + br i1 %45, label %46, label %53, !dbg !13 + +; <label>:46 ; preds = %43 + %47 = add i64 %15, 0, !dbg !13 + %48 = inttoptr i64 %47 to i64*, !dbg !13 + store i64 -723401728380766731, i64* %48, !dbg !13 + %49 = add i64 %6, 56, !dbg !13 + %50 = inttoptr i64 %49 to i64*, !dbg !13 + %51 = load i64* %50, !dbg !13 + %52 = inttoptr i64 %51 to i8*, !dbg !13 + store i8 0, i8* %52, !dbg !13 + br label %56, !dbg !13 + +; <label>:53 ; preds = %43 + %54 = add i64 %15, 0, !dbg !13 + %55 = inttoptr i64 %54 to i64*, !dbg !13 + store i64 0, i64* %55, !dbg !13 + br label %56, !dbg !13 + +; <label>:56 ; preds = %53, %46 + ret i32 %add, !dbg !13 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +define internal void @asan.module_ctor() { + call void @__asan_init_v3() + ret void +} + +declare void @__asan_init_v3() + +declare void @__asan_report_load4(i64) + +declare void @__asan_report_store4(i64) + +declare i64 @__asan_stack_malloc_0(i64, i64) + +attributes #0 = { nounwind sanitize_address uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!9, !10} +!llvm.ident = !{!11} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 (209308)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/llvm_cmake_gcc/test.cc] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"test.cc", metadata !"/llvm_cmake_gcc"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"bar", metadata !"bar", metadata !"_Z3bari", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @_Z3bari, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [bar] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/llvm_cmake_gcc/test.cc] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{metadata !8, metadata !8} +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!10 = metadata !{i32 2, metadata !"Debug Info Version", i32 1} +!11 = metadata !{metadata !"clang version 3.5.0 (209308)"} +!12 = metadata !{i32 786689, metadata !4, metadata !"y", metadata !5, i32 16777217, metadata !8, i32 0, i32 0, metadata !14} ; [ DW_TAG_arg_variable ] [y] [line 1] +!13 = metadata !{i32 2, i32 0, metadata !4, null} +!14 = metadata !{i64 2} diff --git a/test/DebugInfo/X86/debug-loc-offset.ll b/test/DebugInfo/X86/debug-loc-offset.ll new file mode 100644 index 000000000000..7866d0eac5c9 --- /dev/null +++ b/test/DebugInfo/X86/debug-loc-offset.ll @@ -0,0 +1,153 @@ +; RUN: llc %s -filetype=obj -O0 -mtriple=i386-unknown-linux-gnu -dwarf-version=4 -o %t +; RUN: llvm-dwarfdump %t | FileCheck %s + +; From the code: + +; debug-loc-offset1.cc +; int bar (int b) { +; return b+4; +; } + +; debug-loc-offset2.cc +; struct A { +; int var; +; virtual char foo(); +; }; + +; void baz(struct A a) { +; int z = 2; +; if (a.var > 2) +; z++; +; if (a.foo() == 'a') +; z++; +; } + +; Compiled separately for i386-pc-linux-gnu and linked together. +; This ensures that we have multiple compile units so that we can verify that +; debug_loc entries are relative to the low_pc of the CU. The loc entry for +; the byval argument in foo.cpp is in the second CU and so should have +; an offset relative to that CU rather than from the beginning of the text +; section. + +; Checking that we have two compile units with two sets of high/lo_pc. +; CHECK: .debug_info contents +; CHECK: DW_TAG_compile_unit +; CHECK: DW_AT_low_pc +; CHECK: DW_AT_high_pc + +; CHECK: DW_TAG_compile_unit +; CHECK: DW_AT_low_pc +; CHECK: DW_AT_high_pc + +; CHECK: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_MIPS_linkage_name [DW_FORM_strp]{{.*}}"_Z3baz1A" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_location [DW_FORM_sec_offset] (0x00000000) +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name [DW_FORM_strp]{{.*}}"a" + +; CHECK: DW_TAG_variable +; CHECK: DW_AT_location [DW_FORM_exprloc] +; CHECK-NOT: DW_AT_location + +; CHECK: .debug_loc contents: +; CHECK: 0x00000000: Beginning address offset: 0x0000000000000000 +; CHECK: Ending address offset: 0x000000000000001a + +%struct.A = type { i32 (...)**, i32 } + +; Function Attrs: nounwind +define i32 @_Z3bari(i32 %b) #0 { +entry: + %b.addr = alloca i32, align 4 + store i32 %b, i32* %b.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %b.addr}, metadata !21), !dbg !22 + %0 = load i32* %b.addr, align 4, !dbg !23 + %add = add nsw i32 %0, 4, !dbg !23 + ret i32 %add, !dbg !23 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +define void @_Z3baz1A(%struct.A* %a) #2 { +entry: + %z = alloca i32, align 4 + call void @llvm.dbg.declare(metadata !{%struct.A* %a}, metadata !24), !dbg !25 + call void @llvm.dbg.declare(metadata !{i32* %z}, metadata !26), !dbg !27 + store i32 2, i32* %z, align 4, !dbg !27 + %var = getelementptr inbounds %struct.A* %a, i32 0, i32 1, !dbg !28 + %0 = load i32* %var, align 4, !dbg !28 + %cmp = icmp sgt i32 %0, 2, !dbg !28 + br i1 %cmp, label %if.then, label %if.end, !dbg !28 + +if.then: ; preds = %entry + %1 = load i32* %z, align 4, !dbg !30 + %inc = add nsw i32 %1, 1, !dbg !30 + store i32 %inc, i32* %z, align 4, !dbg !30 + br label %if.end, !dbg !30 + +if.end: ; preds = %if.then, %entry + %call = call signext i8 @_ZN1A3fooEv(%struct.A* %a), !dbg !31 + %conv = sext i8 %call to i32, !dbg !31 + %cmp1 = icmp eq i32 %conv, 97, !dbg !31 + br i1 %cmp1, label %if.then2, label %if.end4, !dbg !31 + +if.then2: ; preds = %if.end + %2 = load i32* %z, align 4, !dbg !33 + %inc3 = add nsw i32 %2, 1, !dbg !33 + store i32 %inc3, i32* %z, align 4, !dbg !33 + br label %if.end4, !dbg !33 + +if.end4: ; preds = %if.then2, %if.end + ret void, !dbg !34 +} + +declare signext i8 @_ZN1A3fooEv(%struct.A*) #2 + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } +attributes #2 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0, !9} +!llvm.module.flags = !{!18, !19} +!llvm.ident = !{!20, !20} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 (210479)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/llvm_cmake_gcc/debug-loc-offset1.cc] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"debug-loc-offset1.cc", metadata !"/llvm_cmake_gcc"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"bar", metadata !"bar", metadata !"_Z3bari", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @_Z3bari, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [bar] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/llvm_cmake_gcc/debug-loc-offset1.cc] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{metadata !8, metadata !8} +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{i32 786449, metadata !10, i32 4, metadata !"clang version 3.5.0 (210479)", i1 false, metadata !"", i32 0, metadata !2, metadata !11, metadata !13, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/llvm_cmake_gcc/debug-loc-offset2.cc] [DW_LANG_C_plus_plus] +!10 = metadata !{metadata !"debug-loc-offset2.cc", metadata !"/llvm_cmake_gcc"} +!11 = metadata !{metadata !12} +!12 = metadata !{i32 786451, metadata !10, null, metadata !"A", i32 1, i64 0, i64 0, i32 0, i32 4, null, null, i32 0, null, null, metadata !"_ZTS1A"} ; [ DW_TAG_structure_type ] [A] [line 1, size 0, align 0, offset 0] [decl] [from ] +!13 = metadata !{metadata !14} +!14 = metadata !{i32 786478, metadata !10, metadata !15, metadata !"baz", metadata !"baz", metadata !"_Z3baz1A", i32 6, metadata !16, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.A*)* @_Z3baz1A, null, null, metadata !2, i32 6} ; [ DW_TAG_subprogram ] [line 6] [def] [baz] +!15 = metadata !{i32 786473, metadata !10} ; [ DW_TAG_file_type ] [/llvm_cmake_gcc/debug-loc-offset2.cc] +!16 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !17, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!17 = metadata !{null, metadata !12} +!18 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!19 = metadata !{i32 2, metadata !"Debug Info Version", i32 1} +!20 = metadata !{metadata !"clang version 3.5.0 (210479)"} +!21 = metadata !{i32 786689, metadata !4, metadata !"b", metadata !5, i32 16777217, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [b] [line 1] +!22 = metadata !{i32 1, i32 0, metadata !4, null} +!23 = metadata !{i32 2, i32 0, metadata !4, null} +!24 = metadata !{i32 786689, metadata !14, metadata !"a", metadata !15, i32 16777222, metadata !"_ZTS1A", i32 8192, i32 0} ; [ DW_TAG_arg_variable ] [a] [line 6] +!25 = metadata !{i32 6, i32 0, metadata !14, null} +!26 = metadata !{i32 786688, metadata !14, metadata !"z", metadata !15, i32 7, metadata !8, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [z] [line 7] +!27 = metadata !{i32 7, i32 0, metadata !14, null} +!28 = metadata !{i32 8, i32 0, metadata !29, null} ; [ DW_TAG_imported_declaration ] +!29 = metadata !{i32 786443, metadata !10, metadata !14, i32 8, i32 0, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [/llvm_cmake_gcc/debug-loc-offset2.cc] +!30 = metadata !{i32 9, i32 0, metadata !29, null} +!31 = metadata !{i32 10, i32 0, metadata !32, null} +!32 = metadata !{i32 786443, metadata !10, metadata !14, i32 10, i32 0, i32 0, i32 1} ; [ DW_TAG_lexical_block ] [/llvm_cmake_gcc/debug-loc-offset2.cc] +!33 = metadata !{i32 11, i32 0, metadata !32, null} +!34 = metadata !{i32 12, i32 0, metadata !14, null} diff --git a/test/DebugInfo/X86/debug-ranges-offset.ll b/test/DebugInfo/X86/debug-ranges-offset.ll new file mode 100644 index 000000000000..365ba171a0d9 --- /dev/null +++ b/test/DebugInfo/X86/debug-ranges-offset.ll @@ -0,0 +1,241 @@ +; RUN: llc -filetype=obj -mtriple=x86_64-pc-linux-gnu %s -o %t +; RUN: llvm-readobj --relocations %t | FileCheck %s + +; Check that we don't have any relocations in the ranges section - +; to show that we're producing this as a relative offset to the +; low_pc for the compile unit. +; CHECK-NOT: .rela.debug_ranges + +@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 0, void ()* @__msan_init }] +@str = private unnamed_addr constant [4 x i8] c"zzz\00" +@__msan_retval_tls = external thread_local(initialexec) global [8 x i64] +@__msan_retval_origin_tls = external thread_local(initialexec) global i32 +@__msan_param_tls = external thread_local(initialexec) global [1000 x i64] +@__msan_param_origin_tls = external thread_local(initialexec) global [1000 x i32] +@__msan_va_arg_tls = external thread_local(initialexec) global [1000 x i64] +@__msan_va_arg_overflow_size_tls = external thread_local(initialexec) global i64 +@__msan_origin_tls = external thread_local(initialexec) global i32 +@__executable_start = external hidden global i32 +@_end = external hidden global i32 + +; Function Attrs: sanitize_memory uwtable +define void @_Z1fv() #0 { +entry: + %p = alloca i32*, align 8 + %0 = ptrtoint i32** %p to i64, !dbg !19 + %1 = and i64 %0, -70368744177672, !dbg !19 + %2 = inttoptr i64 %1 to i64*, !dbg !19 + store i64 -1, i64* %2, align 8, !dbg !19 + store i64 0, i64* getelementptr inbounds ([1000 x i64]* @__msan_param_tls, i64 0, i64 0), align 8, !dbg !19 + store i64 0, i64* getelementptr inbounds ([8 x i64]* @__msan_retval_tls, i64 0, i64 0), align 8, !dbg !19 + %call = call i8* @_Znwm(i64 4) #4, !dbg !19 + %_msret = load i64* getelementptr inbounds ([8 x i64]* @__msan_retval_tls, i64 0, i64 0), align 8, !dbg !19 + %3 = bitcast i8* %call to i32*, !dbg !19 + tail call void @llvm.dbg.value(metadata !{i32* %3}, i64 0, metadata !9), !dbg !19 + %4 = inttoptr i64 %1 to i64*, !dbg !19 + store i64 %_msret, i64* %4, align 8, !dbg !19 + store volatile i32* %3, i32** %p, align 8, !dbg !19 + tail call void @llvm.dbg.value(metadata !{i32** %p}, i64 0, metadata !9), !dbg !19 + %p.0.p.0. = load volatile i32** %p, align 8, !dbg !20 + %_msld = load i64* %4, align 8, !dbg !20 + %_mscmp = icmp eq i64 %_msld, 0, !dbg !20 + br i1 %_mscmp, label %6, label %5, !dbg !20, !prof !22 + +; <label>:5 ; preds = %entry + call void @__msan_warning_noreturn(), !dbg !20 + call void asm sideeffect "", ""() #3, !dbg !20 + unreachable, !dbg !20 + +; <label>:6 ; preds = %entry + %7 = load i32* %p.0.p.0., align 4, !dbg !20, !tbaa !23 + %8 = ptrtoint i32* %p.0.p.0. to i64, !dbg !20 + %9 = and i64 %8, -70368744177665, !dbg !20 + %10 = inttoptr i64 %9 to i32*, !dbg !20 + %_msld2 = load i32* %10, align 4, !dbg !20 + %11 = icmp ne i32 %_msld2, 0, !dbg !20 + %12 = xor i32 %_msld2, -1, !dbg !20 + %13 = and i32 %7, %12, !dbg !20 + %14 = icmp eq i32 %13, 0, !dbg !20 + %_msprop_icmp = and i1 %11, %14, !dbg !20 + br i1 %_msprop_icmp, label %15, label %16, !dbg !20, !prof !27 + +; <label>:15 ; preds = %6 + call void @__msan_warning_noreturn(), !dbg !20 + call void asm sideeffect "", ""() #3, !dbg !20 + unreachable, !dbg !20 + +; <label>:16 ; preds = %6 + %tobool = icmp eq i32 %7, 0, !dbg !20 + br i1 %tobool, label %if.end, label %if.then, !dbg !20 + +if.then: ; preds = %16 + store i64 0, i64* getelementptr inbounds ([1000 x i64]* @__msan_param_tls, i64 0, i64 0), align 8, !dbg !28 + store i32 0, i32* bitcast ([8 x i64]* @__msan_retval_tls to i32*), align 8, !dbg !28 + %puts = call i32 @puts(i8* getelementptr inbounds ([4 x i8]* @str, i64 0, i64 0)), !dbg !28 + br label %if.end, !dbg !28 + +if.end: ; preds = %16, %if.then + ret void, !dbg !29 +} + +; Function Attrs: nobuiltin +declare i8* @_Znwm(i64) #1 + +; Function Attrs: sanitize_memory uwtable +define i32 @main() #0 { +entry: + %p.i = alloca i32*, align 8 + %0 = ptrtoint i32** %p.i to i64, !dbg !30 + %1 = and i64 %0, -70368744177672, !dbg !30 + %2 = inttoptr i64 %1 to i64*, !dbg !30 + store i64 -1, i64* %2, align 8, !dbg !30 + %p.i.0..sroa_cast = bitcast i32** %p.i to i8*, !dbg !30 + call void @llvm.lifetime.start(i64 8, i8* %p.i.0..sroa_cast), !dbg !30 + store i64 0, i64* getelementptr inbounds ([1000 x i64]* @__msan_param_tls, i64 0, i64 0), align 8, !dbg !30 + store i64 0, i64* getelementptr inbounds ([8 x i64]* @__msan_retval_tls, i64 0, i64 0), align 8, !dbg !30 + %call.i = call i8* @_Znwm(i64 4) #4, !dbg !30 + %_msret = load i64* getelementptr inbounds ([8 x i64]* @__msan_retval_tls, i64 0, i64 0), align 8, !dbg !30 + %3 = bitcast i8* %call.i to i32*, !dbg !30 + tail call void @llvm.dbg.value(metadata !{i32* %3}, i64 0, metadata !32), !dbg !30 + %4 = inttoptr i64 %1 to i64*, !dbg !30 + store i64 %_msret, i64* %4, align 8, !dbg !30 + store volatile i32* %3, i32** %p.i, align 8, !dbg !30 + tail call void @llvm.dbg.value(metadata !{i32** %p.i}, i64 0, metadata !32), !dbg !30 + %p.i.0.p.0.p.0..i = load volatile i32** %p.i, align 8, !dbg !33 + %_msld = load i64* %4, align 8, !dbg !33 + %_mscmp = icmp eq i64 %_msld, 0, !dbg !33 + br i1 %_mscmp, label %6, label %5, !dbg !33, !prof !22 + +; <label>:5 ; preds = %entry + call void @__msan_warning_noreturn(), !dbg !33 + call void asm sideeffect "", ""() #3, !dbg !33 + unreachable, !dbg !33 + +; <label>:6 ; preds = %entry + %7 = load i32* %p.i.0.p.0.p.0..i, align 4, !dbg !33, !tbaa !23 + %8 = ptrtoint i32* %p.i.0.p.0.p.0..i to i64, !dbg !33 + %9 = and i64 %8, -70368744177665, !dbg !33 + %10 = inttoptr i64 %9 to i32*, !dbg !33 + %_msld2 = load i32* %10, align 4, !dbg !33 + %11 = icmp ne i32 %_msld2, 0, !dbg !33 + %12 = xor i32 %_msld2, -1, !dbg !33 + %13 = and i32 %7, %12, !dbg !33 + %14 = icmp eq i32 %13, 0, !dbg !33 + %_msprop_icmp = and i1 %11, %14, !dbg !33 + br i1 %_msprop_icmp, label %15, label %16, !dbg !33, !prof !27 + +; <label>:15 ; preds = %6 + call void @__msan_warning_noreturn(), !dbg !33 + call void asm sideeffect "", ""() #3, !dbg !33 + unreachable, !dbg !33 + +; <label>:16 ; preds = %6 + %tobool.i = icmp eq i32 %7, 0, !dbg !33 + br i1 %tobool.i, label %_Z1fv.exit, label %if.then.i, !dbg !33 + +if.then.i: ; preds = %16 + store i64 0, i64* getelementptr inbounds ([1000 x i64]* @__msan_param_tls, i64 0, i64 0), align 8, !dbg !34 + store i32 0, i32* bitcast ([8 x i64]* @__msan_retval_tls to i32*), align 8, !dbg !34 + %puts.i = call i32 @puts(i8* getelementptr inbounds ([4 x i8]* @str, i64 0, i64 0)), !dbg !34 + br label %_Z1fv.exit, !dbg !34 + +_Z1fv.exit: ; preds = %16, %if.then.i + call void @llvm.lifetime.end(i64 8, i8* %p.i.0..sroa_cast), !dbg !35 + store i32 0, i32* bitcast ([8 x i64]* @__msan_retval_tls to i32*), align 8, !dbg !36 + ret i32 0, !dbg !36 +} + +declare void @__msan_init() + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.value(metadata, i64, metadata) #2 + +; Function Attrs: nounwind +declare i32 @puts(i8* nocapture readonly) #3 + +; Function Attrs: nounwind +declare void @llvm.lifetime.start(i64, i8* nocapture) #3 + +; Function Attrs: nounwind +declare void @llvm.lifetime.end(i64, i8* nocapture) #3 + +declare void @__msan_warning_noreturn() + +declare void @__msan_maybe_warning_1(i8, i32) + +declare void @__msan_maybe_store_origin_1(i8, i8*, i32) + +declare void @__msan_maybe_warning_2(i16, i32) + +declare void @__msan_maybe_store_origin_2(i16, i8*, i32) + +declare void @__msan_maybe_warning_4(i32, i32) + +declare void @__msan_maybe_store_origin_4(i32, i8*, i32) + +declare void @__msan_maybe_warning_8(i64, i32) + +declare void @__msan_maybe_store_origin_8(i64, i8*, i32) + +declare void @__msan_set_alloca_origin4(i8*, i64, i8*, i64) + +declare void @__msan_poison_stack(i8*, i64) + +declare i32 @__msan_chain_origin(i32) + +declare i8* @__msan_memmove(i8*, i8*, i64) + +declare i8* @__msan_memcpy(i8*, i8*, i64) + +declare i8* @__msan_memset(i8*, i32, i64) + +; Function Attrs: nounwind +declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) #3 + +attributes #0 = { sanitize_memory uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nobuiltin "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #2 = { nounwind readnone } +attributes #3 = { nounwind } +attributes #4 = { builtin } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!16, !17} +!llvm.ident = !{!18} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 (trunk 207243) (llvm/trunk 207259)", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/foo.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"foo.cpp", metadata !"/usr/local/google/home/echristo/tmp"} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !13} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"f", metadata !"f", metadata !"_Z1fv", i32 3, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void ()* @_Z1fv, null, null, metadata !8, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [f] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/usr/local/google/home/echristo/tmp/foo.cpp] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{null} +!8 = metadata !{metadata !9} +!9 = metadata !{i32 786688, metadata !4, metadata !"p", metadata !5, i32 4, metadata !10, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [p] [line 4] +!10 = metadata !{i32 786485, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !11} ; [ DW_TAG_volatile_type ] [line 0, size 0, align 0, offset 0] [from ] +!11 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !12} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int] +!12 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!13 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"main", metadata !"main", metadata !"", i32 9, metadata !14, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 ()* @main, null, null, metadata !2, i32 9} ; [ DW_TAG_subprogram ] [line 9] [def] [main] +!14 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !15, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!15 = metadata !{metadata !12} +!16 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!17 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!18 = metadata !{metadata !"clang version 3.5.0 (trunk 207243) (llvm/trunk 207259)"} +!19 = metadata !{i32 4, i32 0, metadata !4, null} +!20 = metadata !{i32 5, i32 0, metadata !21, null} +!21 = metadata !{i32 786443, metadata !1, metadata !4, i32 5, i32 0, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/tmp/foo.cpp] +!22 = metadata !{metadata !"branch_weights", i32 1000, i32 1} +!23 = metadata !{metadata !24, metadata !24, i64 0} +!24 = metadata !{metadata !"int", metadata !25, i64 0} +!25 = metadata !{metadata !"omnipotent char", metadata !26, i64 0} +!26 = metadata !{metadata !"Simple C/C++ TBAA"} +!27 = metadata !{metadata !"branch_weights", i32 1, i32 1000} +!28 = metadata !{i32 6, i32 0, metadata !21, null} +!29 = metadata !{i32 7, i32 0, metadata !4, null} +!30 = metadata !{i32 4, i32 0, metadata !4, metadata !31} +!31 = metadata !{i32 10, i32 0, metadata !13, null} +!32 = metadata !{i32 786688, metadata !4, metadata !"p", metadata !5, i32 4, metadata !10, i32 0, metadata !31} ; [ DW_TAG_auto_variable ] [p] [line 4] +!33 = metadata !{i32 5, i32 0, metadata !21, metadata !31} +!34 = metadata !{i32 6, i32 0, metadata !21, metadata !31} +!35 = metadata !{i32 7, i32 0, metadata !4, metadata !31} +!36 = metadata !{i32 11, i32 0, metadata !13, null} diff --git a/test/DebugInfo/X86/decl-derived-member.ll b/test/DebugInfo/X86/decl-derived-member.ll new file mode 100644 index 000000000000..4035602fb25f --- /dev/null +++ b/test/DebugInfo/X86/decl-derived-member.ll @@ -0,0 +1,144 @@ +; REQUIRES: object-emission + +; RUN: llc -mtriple x86_64-pc-linux -O0 -filetype=obj %s -o %t +; RUN: llvm-dwarfdump %t | FileCheck %s + +; Testcase from: +; struct base { +; virtual ~base(); +; }; +; struct foo { +; base b; +; }; +; foo f; + +; Where member b should be seen as a field at an offset and not a bitfield. + +; CHECK: DW_TAG_member +; CHECK: DW_AT_name{{.*}}"b" +; CHECK-NOT: DW_AT_bit_offset + +%struct.foo = type { %struct.base } +%struct.base = type { i32 (...)** } +@f = global %struct.foo zeroinitializer, align 8 +@__dso_handle = external global i8 +@_ZTV4base = external unnamed_addr constant [4 x i8*] +@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }] + +define internal void @__cxx_global_var_init() section ".text.startup" { +entry: + call void @_ZN3fooC2Ev(%struct.foo* @f) #2, !dbg !35 + %0 = call i32 @__cxa_atexit(void (i8*)* bitcast (void (%struct.foo*)* @_ZN3fooD2Ev to void (i8*)*), i8* bitcast (%struct.foo* @f to i8*), i8* @__dso_handle) #2, !dbg !35 + ret void, !dbg !35 +} + +; Function Attrs: inlinehint nounwind uwtable +define linkonce_odr void @_ZN3fooC2Ev(%struct.foo* %this) unnamed_addr #0 align 2 { +entry: + %this.addr = alloca %struct.foo*, align 8 + store %struct.foo* %this, %struct.foo** %this.addr, align 8 + call void @llvm.dbg.declare(metadata !{%struct.foo** %this.addr}, metadata !36), !dbg !38 + %this1 = load %struct.foo** %this.addr + %b = getelementptr inbounds %struct.foo* %this1, i32 0, i32 0, !dbg !39 + call void @_ZN4baseC2Ev(%struct.base* %b) #2, !dbg !39 + ret void, !dbg !39 +} + +; Function Attrs: inlinehint uwtable +define linkonce_odr void @_ZN3fooD2Ev(%struct.foo* %this) unnamed_addr #1 align 2 { +entry: + %this.addr = alloca %struct.foo*, align 8 + store %struct.foo* %this, %struct.foo** %this.addr, align 8 + call void @llvm.dbg.declare(metadata !{%struct.foo** %this.addr}, metadata !40), !dbg !41 + %this1 = load %struct.foo** %this.addr + %b = getelementptr inbounds %struct.foo* %this1, i32 0, i32 0, !dbg !42 + call void @_ZN4baseD1Ev(%struct.base* %b), !dbg !42 + ret void, !dbg !44 +} + +; Function Attrs: nounwind +declare i32 @__cxa_atexit(void (i8*)*, i8*, i8*) #2 + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #3 + +declare void @_ZN4baseD1Ev(%struct.base*) #4 + +; Function Attrs: inlinehint nounwind uwtable +define linkonce_odr void @_ZN4baseC2Ev(%struct.base* %this) unnamed_addr #0 align 2 { +entry: + %this.addr = alloca %struct.base*, align 8 + store %struct.base* %this, %struct.base** %this.addr, align 8 + call void @llvm.dbg.declare(metadata !{%struct.base** %this.addr}, metadata !45), !dbg !47 + %this1 = load %struct.base** %this.addr + %0 = bitcast %struct.base* %this1 to i8***, !dbg !48 + store i8** getelementptr inbounds ([4 x i8*]* @_ZTV4base, i64 0, i64 2), i8*** %0, !dbg !48 + ret void, !dbg !48 +} + +define internal void @_GLOBAL__I_a() section ".text.startup" { +entry: + call void @__cxx_global_var_init(), !dbg !49 + ret void, !dbg !49 +} + +attributes #0 = { inlinehint nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { inlinehint uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #2 = { nounwind } +attributes #3 = { nounwind readnone } +attributes #4 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!32, !33} +!llvm.ident = !{!34} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 (trunk 203673) (llvm/trunk 203681)", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !8, metadata !30, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/foo.cc] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"foo.cc", metadata !"/usr/local/google/home/echristo"} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !7} +!4 = metadata !{i32 786451, metadata !1, null, metadata !"foo", i32 5, i64 64, i64 64, i32 0, i32 0, null, metadata !5, i32 0, null, null, metadata !"_ZTS3foo"} ; [ DW_TAG_structure_type ] [foo] [line 5, size 64, align 64, offset 0] [def] [from ] +!5 = metadata !{metadata !6} +!6 = metadata !{i32 786445, metadata !1, metadata !"_ZTS3foo", metadata !"b", i32 6, i64 64, i64 64, i64 0, i32 0, metadata !"_ZTS4base"} ; [ DW_TAG_member ] [b] [line 6, size 64, align 64, offset 0] [from _ZTS4base] +!7 = metadata !{i32 786451, metadata !1, null, metadata !"base", i32 1, i64 0, i64 0, i32 0, i32 4, null, null, i32 0, null, null, metadata !"_ZTS4base"} ; [ DW_TAG_structure_type ] [base] [line 1, size 0, align 0, offset 0] [decl] [from ] +!8 = metadata !{metadata !9, metadata !13, metadata !19, metadata !22, metadata !28} +!9 = metadata !{i32 786478, metadata !1, metadata !10, metadata !"__cxx_global_var_init", metadata !"__cxx_global_var_init", metadata !"", i32 9, metadata !11, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @__cxx_global_var_init, null, null, metadata !2, i32 9} ; [ DW_TAG_subprogram ] [line 9] [local] [def] [__cxx_global_var_init] +!10 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/usr/local/google/home/echristo/foo.cc] +!11 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!12 = metadata !{null} +!13 = metadata !{i32 786478, metadata !1, metadata !"_ZTS3foo", metadata !"~foo", metadata !"~foo", metadata !"_ZN3fooD2Ev", i32 5, metadata !14, i1 false, i1 true, i32 0, i32 0, null, i32 320, i1 false, void (%struct.foo*)* @_ZN3fooD2Ev, null, metadata !17, metadata !2, i32 5} ; [ DW_TAG_subprogram ] [line 5] [def] [~foo] +!14 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !15, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!15 = metadata !{null, metadata !16} +!16 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !"_ZTS3foo"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from _ZTS3foo] +!17 = metadata !{i32 786478, null, metadata !"_ZTS3foo", metadata !"~foo", metadata !"~foo", metadata !"", i32 0, metadata !14, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !18, i32 0} ; [ DW_TAG_subprogram ] [line 0] [~foo] +!18 = metadata !{i32 786468} +!19 = metadata !{i32 786478, metadata !1, metadata !"_ZTS3foo", metadata !"foo", metadata !"foo", metadata !"_ZN3fooC2Ev", i32 5, metadata !14, i1 false, i1 true, i32 0, i32 0, null, i32 320, i1 false, void (%struct.foo*)* @_ZN3fooC2Ev, null, metadata !20, metadata !2, i32 5} ; [ DW_TAG_subprogram ] [line 5] [def] [foo] +!20 = metadata !{i32 786478, null, metadata !"_ZTS3foo", metadata !"foo", metadata !"foo", metadata !"", i32 0, metadata !14, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !21, i32 0} ; [ DW_TAG_subprogram ] [line 0] [foo] +!21 = metadata !{i32 786468} +!22 = metadata !{i32 786478, metadata !1, metadata !"_ZTS4base", metadata !"base", metadata !"base", metadata !"_ZN4baseC2Ev", i32 1, metadata !23, i1 false, i1 true, i32 0, i32 0, null, i32 320, i1 false, void (%struct.base*)* @_ZN4baseC2Ev, null, metadata !26, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [base] +!23 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !24, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!24 = metadata !{null, metadata !25} +!25 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !"_ZTS4base"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from _ZTS4base] +!26 = metadata !{i32 786478, null, metadata !"_ZTS4base", metadata !"base", metadata !"base", metadata !"", i32 0, metadata !23, i1 false, i1 false, i32 0, i32 0, null, i32 320, i1 false, null, null, i32 0, metadata !27, i32 0} ; [ DW_TAG_subprogram ] [line 0] [base] +!27 = metadata !{i32 786468} +!28 = metadata !{i32 786478, metadata !1, metadata !10, metadata !"", metadata !"", metadata !"_GLOBAL__I_a", i32 1, metadata !29, i1 true, i1 true, i32 0, i32 0, null, i32 64, i1 false, void ()* @_GLOBAL__I_a, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [local] [def] +!29 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !2, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!30 = metadata !{metadata !31} +!31 = metadata !{i32 786484, i32 0, null, metadata !"f", metadata !"f", metadata !"", metadata !10, i32 9, metadata !4, i32 0, i32 1, %struct.foo* @f, null} ; [ DW_TAG_variable ] [f] [line 9] [def] +!32 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!33 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!34 = metadata !{metadata !"clang version 3.5.0 (trunk 203673) (llvm/trunk 203681)"} +!35 = metadata !{i32 9, i32 0, metadata !9, null} +!36 = metadata !{i32 786689, metadata !19, metadata !"this", null, i32 16777216, metadata !37, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!37 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !"_ZTS3foo"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from _ZTS3foo] +!38 = metadata !{i32 0, i32 0, metadata !19, null} +!39 = metadata !{i32 5, i32 0, metadata !19, null} +!40 = metadata !{i32 786689, metadata !13, metadata !"this", null, i32 16777216, metadata !37, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!41 = metadata !{i32 0, i32 0, metadata !13, null} +!42 = metadata !{i32 5, i32 0, metadata !43, null} +!43 = metadata !{i32 786443, metadata !1, metadata !13, i32 5, i32 0, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/foo.cc] +!44 = metadata !{i32 5, i32 0, metadata !13, null} +!45 = metadata !{i32 786689, metadata !22, metadata !"this", null, i32 16777216, metadata !46, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!46 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !"_ZTS4base"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from _ZTS4base] +!47 = metadata !{i32 0, i32 0, metadata !22, null} +!48 = metadata !{i32 1, i32 0, metadata !22, null} +!49 = metadata !{i32 1, i32 0, metadata !28, null} diff --git a/test/DebugInfo/X86/discriminator.ll b/test/DebugInfo/X86/discriminator.ll new file mode 100644 index 000000000000..aafdae1626d5 --- /dev/null +++ b/test/DebugInfo/X86/discriminator.ll @@ -0,0 +1,63 @@ +; RUN: llc -mtriple=i386-unknown-unknown -mcpu=core2 %s -o %t -filetype=obj +; RUN: llvm-dwarfdump -debug-dump=line %t | FileCheck %s +; +; Generated from: +; +; int foo(int i) { +; if (i < 10) return i - 1; +; return 0; +; } +; +; Manually generated debug nodes !14 and !15 to incorporate an +; arbitrary discriminator with value 42. + +define i32 @foo(i32 %i) #0 { +entry: + %retval = alloca i32, align 4 + %i.addr = alloca i32, align 4 + store i32 %i, i32* %i.addr, align 4 + %0 = load i32* %i.addr, align 4, !dbg !10 + %cmp = icmp slt i32 %0, 10, !dbg !10 + br i1 %cmp, label %if.then, label %if.end, !dbg !10 + +if.then: ; preds = %entry + %1 = load i32* %i.addr, align 4, !dbg !14 + %sub = sub nsw i32 %1, 1, !dbg !14 + store i32 %sub, i32* %retval, !dbg !14 + br label %return, !dbg !14 + +if.end: ; preds = %entry + store i32 0, i32* %retval, !dbg !12 + br label %return, !dbg !12 + +return: ; preds = %if.end, %if.then + %2 = load i32* %retval, !dbg !13 + ret i32 %2, !dbg !13 +} + +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!7, !8} +!llvm.ident = !{!9} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [./discriminator.c] [DW_LANG_C99] +!1 = metadata !{metadata !"discriminator.c", metadata !"."} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"foo", metadata !"foo", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @foo, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [foo] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [./discriminator.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !2, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!8 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!9 = metadata !{metadata !"clang version 3.5 "} +!10 = metadata !{i32 2, i32 0, metadata !11, null} +!11 = metadata !{i32 786443, metadata !1, metadata !4, i32 2, i32 0, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [./discriminator.c] +!12 = metadata !{i32 3, i32 0, metadata !4, null} +!13 = metadata !{i32 4, i32 0, metadata !4, null} +!14 = metadata !{i32 2, i32 0, metadata !15, null} +!15 = metadata !{i32 786443, metadata !1, metadata !4, i32 2, i32 0, i32 42, i32 1} ; [ DW_TAG_lexical_block ] [./discriminator.c] + +; CHECK: Address Line Column File ISA Discriminator Flags +; CHECK: ------------------ ------ ------ ------ --- ------------- ------------- +; CHECK: 0x0000000000000011 2 0 1 0 42 is_stmt diff --git a/test/DebugInfo/X86/dwarf-aranges-no-dwarf-labels.ll b/test/DebugInfo/X86/dwarf-aranges-no-dwarf-labels.ll index 42a57bfed725..021b89e1e1ca 100644 --- a/test/DebugInfo/X86/dwarf-aranges-no-dwarf-labels.ll +++ b/test/DebugInfo/X86/dwarf-aranges-no-dwarf-labels.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s | FileCheck %s +; RUN: llc -generate-arange-section < %s | FileCheck %s ; CHECK: .short 2 # DWARF Arange version number ; CHECK: # Segment Size @@ -62,7 +62,7 @@ attributes #2 = { nounwind readnone } !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 (191881)", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !17, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/tmp/debug_ranges/a.cc] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !"tmp/debug_ranges/a.cc", metadata !"/"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4, metadata !11, metadata !14} !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"foo", metadata !"foo", metadata !"_Z3fooi", i32 2, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 (i32)* @_Z3fooi, null, null, metadata !9, i32 2} ; [ DW_TAG_subprogram ] [line 2] [def] [foo] !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/debug_ranges/a.cc] diff --git a/test/DebugInfo/X86/dwarf-aranges.ll b/test/DebugInfo/X86/dwarf-aranges.ll index 203afc71d830..9ad618507a25 100644 --- a/test/DebugInfo/X86/dwarf-aranges.ll +++ b/test/DebugInfo/X86/dwarf-aranges.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s | FileCheck %s +; RUN: llc -generate-arange-section < %s | FileCheck %s ; -- header -- @@ -7,10 +7,7 @@ ; CHECK-NEXT: .byte 8 # Address Size (in bytes) ; CHECK-NEXT: .byte 0 # Segment Size (in bytes) ; -- alignment -- -; CHECK-NEXT: .byte -; CHECK-NEXT: .byte -; CHECK-NEXT: .byte -; CHECK-NEXT: .byte +; CHECK-NEXT: .zero 4,255 ; <common symbols> - it should have made one span for each symbol. ; CHECK-NEXT: .quad some_bss @@ -18,18 +15,18 @@ ; <data section> - it should have made one span covering all vars in this CU. ; CHECK-NEXT: .quad some_data -; CHECK-NEXT: .Lset0 = .Ldebug_end1-some_data -; CHECK-NEXT: .quad .Lset0 +; CHECK-NEXT: [[R1:\.[A-Za-z0-9]*]] = .Ldebug_end1-some_data +; CHECK-NEXT: .quad [[R1]] ; <text section> - it should have made one span covering all functions in this CU. ; CHECK-NEXT: .quad .Lfunc_begin0 -; CHECK-NEXT: .Lset1 = .Ldebug_end2-.Lfunc_begin0 -; CHECK-NEXT: .quad .Lset1 +; CHECK-NEXT: [[R2:\.[A-Za-z0-9]*]] = .Ldebug_end2-.Lfunc_begin0 +; CHECK-NEXT: .quad [[R2]] ; <other sections> - it should have made one span covering all vars in this CU. ; CHECK-NEXT: .quad some_other -; CHECK-NEXT: .Lset2 = .Ldebug_end3-some_other -; CHECK-NEXT: .quad .Lset2 +; CHECK-NEXT: [[R3:\.[A-Za-z0-9]*]] = .Ldebug_end3-some_other +; CHECK-NEXT: .quad [[R3]] ; -- finish -- ; CHECK-NEXT: # ARange terminator @@ -70,7 +67,7 @@ entry: !0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !8, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/home/kayamon/test.c] [DW_LANG_C99] !1 = metadata !{metadata !"test.c", metadata !"/home/kayamon"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4} !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"some_code", metadata !"some_code", metadata !"", i32 5, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, void ()* @some_code, null, null, metadata !2, i32 6} ; [ DW_TAG_subprogram ] [line 5] [def] [scope 6] [some_code] !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/home/kayamon/test.c] diff --git a/test/DebugInfo/X86/dwarf-public-names.ll b/test/DebugInfo/X86/dwarf-public-names.ll index d66e5a0c1cec..793971a5f89f 100644 --- a/test/DebugInfo/X86/dwarf-public-names.ll +++ b/test/DebugInfo/X86/dwarf-public-names.ll @@ -37,18 +37,20 @@ ; Darwin shouldn't be generating the section by default ; DARWIN: debug_pubnames -; DARWIN: unit_size = 0x00000000 +; DARWIN: {{^$}} ; Skip the output to the header of the pubnames section. ; LINUX: debug_pubnames ; Check for each name in the output. -; LINUX: global_namespace_variable -; LINUX: global_namespace_function -; LINUX: static_member_function -; LINUX: global_variable -; LINUX: global_function -; LINUX: member_function +; LINUX-DAG: "ns" +; LINUX-DAG: "C::static_member_function" +; LINUX-DAG: "global_variable" +; LINUX-DAG: "ns::global_namespace_variable" +; LINUX-DAG: "ns::global_namespace_function" +; LINUX-DAG: "global_function" +; LINUX-DAG: "C::static_member_variable" +; LINUX-DAG: "C::member_function" %struct.C = type { i8 } @@ -91,8 +93,8 @@ attributes #1 = { nounwind readnone } !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!38} -!0 = metadata !{i32 786449, metadata !37, i32 4, metadata !"clang version 3.3 (http://llvm.org/git/clang.git a09cd8103a6a719cb2628cdf0c91682250a17bd2) (http://llvm.org/git/llvm.git 47d03cec0afca0c01ae42b82916d1d731716cd20)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !2, metadata !24, metadata !24, metadata !""} ; [ DW_TAG_compile_unit ] [/usr2/kparzysz/s.hex/t/dwarf-public-names.cpp] [DW_LANG_C_plus_plus] -!1 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !37, i32 4, metadata !"clang version 3.3 (http://llvm.org/git/clang.git a09cd8103a6a719cb2628cdf0c91682250a17bd2) (http://llvm.org/git/llvm.git 47d03cec0afca0c01ae42b82916d1d731716cd20)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !2, metadata !24, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/usr2/kparzysz/s.hex/t/dwarf-public-names.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{} !2 = metadata !{metadata !3, metadata !18, metadata !19, metadata !20} !3 = metadata !{i32 786478, metadata !4, null, metadata !"member_function", metadata !"member_function", metadata !"_ZN1C15member_functionEv", i32 9, metadata !5, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.C*)* @_ZN1C15member_functionEv, null, metadata !12, metadata !1, i32 9} ; [ DW_TAG_subprogram ] [line 9] [def] [member_function] !4 = metadata !{i32 786473, metadata !37} ; [ DW_TAG_file_type ] @@ -112,7 +114,7 @@ attributes #1 = { nounwind readnone } !18 = metadata !{i32 786478, metadata !4, null, metadata !"static_member_function", metadata !"static_member_function", metadata !"_ZN1C22static_member_functionEv", i32 13, metadata !15, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @_ZN1C22static_member_functionEv, null, metadata !14, metadata !1, i32 13} ; [ DW_TAG_subprogram ] [line 13] [def] [static_member_function] !19 = metadata !{i32 786478, metadata !4, metadata !4, metadata !"global_function", metadata !"global_function", metadata !"_Z15global_functionv", i32 19, metadata !15, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @_Z15global_functionv, null, null, metadata !1, i32 19} ; [ DW_TAG_subprogram ] [line 19] [def] [global_function] !20 = metadata !{i32 786478, metadata !4, metadata !21, metadata !"global_namespace_function", metadata !"global_namespace_function", metadata !"_ZN2ns25global_namespace_functionEv", i32 24, metadata !22, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_ZN2ns25global_namespace_functionEv, null, null, metadata !1, i32 24} ; [ DW_TAG_subprogram ] [line 24] [def] [global_namespace_function] -!21 = metadata !{i32 786489, null, metadata !"ns", metadata !4, i32 23} ; [ DW_TAG_namespace ] [/usr2/kparzysz/s.hex/t/dwarf-public-names.cpp] +!21 = metadata !{i32 786489, metadata !4, null, metadata !"ns", i32 23} ; [ DW_TAG_namespace ] [/usr2/kparzysz/s.hex/t/dwarf-public-names.cpp] !22 = metadata !{i32 786453, i32 0, null, i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !23, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !23 = metadata !{null} !24 = metadata !{metadata !25, metadata !26, metadata !27} diff --git a/test/DebugInfo/X86/dwarf-pubnames-split.ll b/test/DebugInfo/X86/dwarf-pubnames-split.ll index 131e5aae51fa..65c46d368d1b 100644 --- a/test/DebugInfo/X86/dwarf-pubnames-split.ll +++ b/test/DebugInfo/X86/dwarf-pubnames-split.ll @@ -7,7 +7,7 @@ ; Check that we get a symbol off of the debug_info section when using split dwarf and pubnames. -; CHECK: .Lpubtypes_begin0: +; CHECK: .LpubTypes_begin0: ; CHECK-NEXT: .short 2 # DWARF Version ; CHECK-NEXT: .long .L.debug_info_begin0 # Offset of Compilation Unit Info @@ -26,7 +26,7 @@ attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointe !0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.4 (trunk 189287) (llvm/trunk 189296)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/foo.c] [DW_LANG_C99] !1 = metadata !{metadata !"foo.c", metadata !"/usr/local/google/home/echristo/tmp"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4} !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"main", metadata !"main", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [main] !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/usr/local/google/home/echristo/tmp/foo.c] diff --git a/test/DebugInfo/X86/eh_symbol.ll b/test/DebugInfo/X86/eh_symbol.ll deleted file mode 100644 index 172ca922302a..000000000000 --- a/test/DebugInfo/X86/eh_symbol.ll +++ /dev/null @@ -1,24 +0,0 @@ -; RUN: llc -mtriple=i386-apple-macosx -disable-cfi %s -o - | FileCheck %s - -; test that we don't produce foo.eh symbols is a debug_frame section. -; CHECK-NOT: .globl _f.eh - -define i32 @f() nounwind readnone optsize { -entry: - ret i32 42 -} - -!llvm.dbg.cu = !{!2} -!llvm.module.flags = !{!9} -!llvm.dbg.sp = !{!0} - -!0 = metadata !{i32 589870, metadata !6, metadata !1, metadata !"f", metadata !"f", metadata !"", i32 1, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 ()* @f, null, null, null, i32 0} ; [ DW_TAG_subprogram ] [line 1] [def] [scope 0] [f] -!1 = metadata !{i32 589865, metadata !6} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 589841, metadata !6, i32 12, metadata !"clang version 3.0 ()", i1 true, metadata !"", i32 0, metadata !7, metadata !7, metadata !8, null, null, metadata !""} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 589845, metadata !6, metadata !1, metadata !"", i32 0, i64 0, i64 0, i32 0, i32 0, null, metadata !4, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!4 = metadata !{metadata !5} -!5 = metadata !{i32 589860, null, metadata !2, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!6 = metadata !{metadata !"/home/espindola/llvm/test.c", metadata !"/home/espindola/tmpfs/build"} -!7 = metadata !{i32 0} -!8 = metadata !{metadata !0} -!9 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/DebugInfo/X86/elf-names.ll b/test/DebugInfo/X86/elf-names.ll index 7b38fde5d34e..36fd232a9045 100644 --- a/test/DebugInfo/X86/elf-names.ll +++ b/test/DebugInfo/X86/elf-names.ll @@ -63,7 +63,7 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !llvm.module.flags = !{!54} !0 = metadata !{i32 786449, metadata !53, i32 4, metadata !"clang version 3.2 (trunk 167506) (llvm/trunk 167505)", i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/foo.cpp] [DW_LANG_C_plus_plus] -!1 = metadata !{i32 0} +!1 = metadata !{} !3 = metadata !{metadata !5, metadata !31} !5 = metadata !{i32 786478, metadata !6, null, metadata !"D", metadata !"D", metadata !"_ZN1DC2Ev", i32 12, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void (%class.D*)* @_ZN1DC2Ev, null, metadata !17, metadata !27, i32 12} ; [ DW_TAG_subprogram ] [line 12] [def] [D] !6 = metadata !{i32 786473, metadata !53} ; [ DW_TAG_file_type ] @@ -87,25 +87,23 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !24 = metadata !{i32 786470, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !10} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from D] !25 = metadata !{metadata !26} !26 = metadata !{i32 786468} ; [ DW_TAG_base_type ] [line 0, size 0, align 0, offset 0] -!27 = metadata !{metadata !28} -!28 = metadata !{metadata !29} +!27 = metadata !{metadata !29} !29 = metadata !{i32 786689, metadata !5, metadata !"this", metadata !6, i32 16777228, metadata !30, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 12] !30 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !10} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from D] !31 = metadata !{i32 786478, metadata !6, null, metadata !"D", metadata !"D", metadata !"_ZN1DC2ERKS_", i32 19, metadata !21, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void (%class.D*, %class.D*)* @_ZN1DC2ERKS_, null, metadata !20, metadata !32, i32 19} ; [ DW_TAG_subprogram ] [line 19] [def] [D] -!32 = metadata !{metadata !33} -!33 = metadata !{metadata !34, metadata !35} +!32 = metadata !{metadata !34, metadata !35} !34 = metadata !{i32 786689, metadata !31, metadata !"this", metadata !6, i32 16777235, metadata !30, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 19] !35 = metadata !{i32 786689, metadata !31, metadata !"d", metadata !6, i32 33554451, metadata !23, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [d] [line 19] !36 = metadata !{i32 12, i32 0, metadata !5, null} !37 = metadata !{i32 13, i32 0, metadata !38, null} -!38 = metadata !{i32 786443, metadata !5, i32 12, i32 0, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/foo.cpp] +!38 = metadata !{i32 786443, metadata !6, metadata !5, i32 12, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/foo.cpp] !42 = metadata !{i32 14, i32 0, metadata !38, null} !43 = metadata !{i32 15, i32 0, metadata !38, null} !44 = metadata !{i32 16, i32 0, metadata !38, null} !45 = metadata !{i32 17, i32 0, metadata !38, null} !46 = metadata !{i32 19, i32 0, metadata !31, null} !47 = metadata !{i32 20, i32 0, metadata !48, null} -!48 = metadata !{i32 786443, metadata !31, i32 19, i32 0, metadata !6, i32 1} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/foo.cpp] +!48 = metadata !{i32 786443, metadata !6, metadata !31, i32 19, i32 0, i32 1} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/foo.cpp] !49 = metadata !{i32 21, i32 0, metadata !48, null} !50 = metadata !{i32 22, i32 0, metadata !48, null} !51 = metadata !{i32 23, i32 0, metadata !48, null} diff --git a/test/DebugInfo/X86/empty-and-one-elem-array.ll b/test/DebugInfo/X86/empty-and-one-elem-array.ll index a3a08f0e3b91..f5c37df1e5e8 100644 --- a/test/DebugInfo/X86/empty-and-one-elem-array.ll +++ b/test/DebugInfo/X86/empty-and-one-elem-array.ll @@ -67,7 +67,7 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone !llvm.module.flags = !{!33} !0 = metadata !{i32 786449, metadata !32, i32 12, metadata !"clang version 3.3 (trunk 169136)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/Volumes/Sandbox/llvm/test.c] [DW_LANG_C99] -!1 = metadata !{i32 0} +!1 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 786478, metadata !6, metadata !6, metadata !"func", metadata !"func", metadata !"", i32 11, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @func, null, null, metadata !1, i32 11} ; [ DW_TAG_subprogram ] [line 11] [def] [func] !6 = metadata !{i32 786473, metadata !32} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/empty-array.ll b/test/DebugInfo/X86/empty-array.ll index 24364676f8ad..3fab313fe0ef 100644 --- a/test/DebugInfo/X86/empty-array.ll +++ b/test/DebugInfo/X86/empty-array.ll @@ -21,14 +21,14 @@ ; CHECK: [[BASETYPE]]: DW_TAG_base_type ; CHECK: [[BASE2]]: DW_TAG_base_type ; CHECK-NEXT: DW_AT_name -; CHECK-NEXT: DW_AT_byte_size [DW_FORM_data1] (0x04) -; CHECK-NEXT: DW_AT_encoding [DW_FORM_data1] (0x05) +; CHECK-NEXT: DW_AT_byte_size [DW_FORM_data1] (0x08) +; CHECK-NEXT: DW_AT_encoding [DW_FORM_data1] (0x07) !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!21} -!0 = metadata !{i32 786449, metadata !20, i32 4, metadata !"clang version 3.3 (trunk 169136)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] [/Volumes/Sandbox/llvm/t.cpp] [DW_LANG_C_plus_plus] -!1 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !20, i32 4, metadata !"clang version 3.3 (trunk 169136)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/Volumes/Sandbox/llvm/t.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !6, i32 1, metadata !7, i32 0, i32 1, %class.A* @a, null} ; [ DW_TAG_variable ] [a] [line 1] [def] !6 = metadata !{i32 786473, metadata !20} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/ending-run.ll b/test/DebugInfo/X86/ending-run.ll index ae17fd0c0ae8..165074e3002c 100644 --- a/test/DebugInfo/X86/ending-run.ll +++ b/test/DebugInfo/X86/ending-run.ll @@ -1,12 +1,12 @@ -; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj +; RUN: llc -mtriple=x86_64-apple-darwin -filetype=obj %s -o %t ; RUN: llvm-dwarfdump -debug-dump=line %t | FileCheck %s ; Check that the line table starts at 7, not 4, but that the first ; statement isn't until line 8. -; CHECK-NOT: 0x0000000000000000 7 0 1 0 is_stmt +; CHECK-NOT: 0x0000000000000000 7 0 1 0 0 is_stmt ; CHECK: 0x0000000000000000 7 0 1 0 -; CHECK: 0x0000000000000004 8 18 1 0 is_stmt prologue_end +; CHECK: 0x0000000000000004 8 18 1 0 0 is_stmt prologue_end define i32 @callee(i32 %x) nounwind uwtable ssp { entry: @@ -30,15 +30,13 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone !llvm.module.flags = !{!20} !0 = metadata !{i32 786449, metadata !19, i32 12, metadata !"clang version 3.1 (trunk 153921) (llvm/trunk 153916)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!1 = metadata !{} !3 = metadata !{metadata !5} -!5 = metadata !{i32 786478, metadata !19, metadata !6, metadata !"callee", metadata !"callee", metadata !"", i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 (i32)* @callee, null, null, metadata !10, i32 7} ; [ DW_TAG_subprogram ] +!5 = metadata !{i32 786478, metadata !19, metadata !6, metadata !"callee", metadata !"callee", metadata !"", i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 (i32)* @callee, null, null, null, i32 7} ; [ DW_TAG_subprogram ] !6 = metadata !{i32 786473, metadata !19} ; [ DW_TAG_file_type ] !7 = metadata !{i32 786453, i32 0, null, i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !8 = metadata !{metadata !9, metadata !9} !9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!10 = metadata !{metadata !11} -!11 = metadata !{i32 786468} ; [ DW_TAG_base_type ] !12 = metadata !{i32 786689, metadata !5, metadata !"x", metadata !6, i32 16777221, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] !13 = metadata !{i32 5, i32 5, metadata !5, null} !14 = metadata !{i32 786688, metadata !15, metadata !"y", metadata !6, i32 8, metadata !9, i32 0, i32 0} ; [ DW_TAG_auto_variable ] diff --git a/test/DebugInfo/X86/enum-class.ll b/test/DebugInfo/X86/enum-class.ll index a31e254c24c8..23ffbcc8f782 100644 --- a/test/DebugInfo/X86/enum-class.ll +++ b/test/DebugInfo/X86/enum-class.ll @@ -8,7 +8,7 @@ !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!23} -!0 = metadata !{i32 786449, metadata !22, i32 4, metadata !"clang version 3.2 (trunk 157269) (llvm/trunk 157264)", i1 false, metadata !"", i32 0, metadata !1, metadata !15, metadata !15, metadata !17, metadata !17, metadata !""} ; [ DW_TAG_compile_unit ] +!0 = metadata !{i32 786449, metadata !22, i32 4, metadata !"clang version 3.2 (trunk 157269) (llvm/trunk 157264)", i1 false, metadata !"", i32 0, metadata !1, metadata !15, metadata !15, metadata !17, metadata !15, metadata !""} ; [ DW_TAG_compile_unit ] !1 = metadata !{metadata !3, metadata !8, metadata !12} !3 = metadata !{i32 786436, metadata !4, null, metadata !"A", i32 1, i64 32, i64 32, i32 0, i32 0, metadata !5, metadata !6, i32 0, null, null, null} ; [ DW_TAG_enumeration_type ] [A] [line 1, size 32, align 32, offset 0] [def] [from int] !4 = metadata !{i32 786473, metadata !22} ; [ DW_TAG_file_type ] @@ -22,7 +22,7 @@ !12 = metadata !{i32 786436, metadata !4, null, metadata !"C", i32 3, i64 32, i64 32, i32 0, i32 0, null, metadata !13, i32 0, null, null, null} ; [ DW_TAG_enumeration_type ] [C] [line 3, size 32, align 32, offset 0] [def] [from ] !13 = metadata !{metadata !14} !14 = metadata !{i32 786472, metadata !"C1", i64 1} ; [ DW_TAG_enumerator ] -!15 = metadata !{i32 0} +!15 = metadata !{} !17 = metadata !{metadata !19, metadata !20, metadata !21} !19 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !4, i32 4, metadata !3, i32 0, i32 1, i32* @a, null} ; [ DW_TAG_variable ] !20 = metadata !{i32 786484, i32 0, null, metadata !"b", metadata !"b", metadata !"", metadata !4, i32 5, metadata !8, i32 0, i32 1, i64* @b, null} ; [ DW_TAG_variable ] diff --git a/test/DebugInfo/X86/enum-fwd-decl.ll b/test/DebugInfo/X86/enum-fwd-decl.ll index 6bfb930cb6e7..adb962ea527e 100644 --- a/test/DebugInfo/X86/enum-fwd-decl.ll +++ b/test/DebugInfo/X86/enum-fwd-decl.ll @@ -6,8 +6,8 @@ !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!9} -!0 = metadata !{i32 786449, metadata !8, i32 4, metadata !"clang version 3.2 (trunk 165274) (llvm/trunk 165272)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] [/tmp/foo.cpp] [DW_LANG_C_plus_plus] -!1 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !8, i32 4, metadata !"clang version 3.2 (trunk 165274) (llvm/trunk 165272)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/tmp/foo.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 786484, i32 0, null, metadata !"e", metadata !"e", metadata !"", metadata !6, i32 2, metadata !7, i32 0, i32 1, i16* @e, null} ; [ DW_TAG_variable ] [e] [line 2] [def] !6 = metadata !{i32 786473, metadata !8} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/fission-cu.ll b/test/DebugInfo/X86/fission-cu.ll index 06408d708150..7f176986394c 100644 --- a/test/DebugInfo/X86/fission-cu.ll +++ b/test/DebugInfo/X86/fission-cu.ll @@ -1,14 +1,15 @@ ; RUN: llc -split-dwarf=Enable -O0 %s -mtriple=x86_64-unknown-linux-gnu -filetype=obj -o %t ; RUN: llvm-dwarfdump -debug-dump=all %t | FileCheck %s ; RUN: llvm-readobj --relocations %t | FileCheck --check-prefix=OBJ %s +; RUN: llvm-objdump -h %t | FileCheck --check-prefix=HDR %s @a = common global i32 0, align 4 !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!9} -!0 = metadata !{i32 786449, metadata !8, i32 12, metadata !"clang version 3.3 (trunk 169021) (llvm/trunk 169020)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !3, metadata !"baz.dwo"} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/baz.c] [DW_LANG_C99] -!1 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !8, i32 12, metadata !"clang version 3.3 (trunk 169021) (llvm/trunk 169020)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !1, metadata !"baz.dwo"} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/baz.c] [DW_LANG_C99] +!1 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !6, i32 1, metadata !7, i32 0, i32 1, i32* @a, null} ; [ DW_TAG_variable ] [a] [line 1] [def] !6 = metadata !{i32 786473, metadata !8} ; [ DW_TAG_file_type ] @@ -23,26 +24,11 @@ ; CHECK: .debug_abbrev contents: ; CHECK: Abbrev table for offset: 0x00000000 ; CHECK: [1] DW_TAG_compile_unit DW_CHILDREN_no -; CHECK: DW_AT_GNU_dwo_name DW_FORM_strp -; CHECK: DW_AT_GNU_addr_base DW_FORM_sec_offset -; CHECK: DW_AT_low_pc DW_FORM_addr ; CHECK: DW_AT_stmt_list DW_FORM_sec_offset +; CHECK: DW_AT_GNU_dwo_name DW_FORM_strp ; CHECK: DW_AT_comp_dir DW_FORM_strp ; CHECK: DW_AT_GNU_dwo_id DW_FORM_data8 -; CHECK: .debug_info contents: -; CHECK: DW_TAG_compile_unit -; CHECK: DW_AT_GNU_dwo_name [DW_FORM_strp] ( .debug_str[0x00000000] = "baz.dwo") -; CHECK: DW_AT_GNU_addr_base [DW_FORM_sec_offset] (0x00000000) -; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) -; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000) -; CHECK: DW_AT_comp_dir [DW_FORM_strp] ( .debug_str[0x00000008] = "/usr/local/google/home/echristo/tmp") -; CHECK: DW_AT_GNU_dwo_id [DW_FORM_data8] (0x0000000000000000) - -; CHECK: .debug_str contents: -; CHECK: 0x00000000: "baz.dwo" -; CHECK: 0x00000008: "/usr/local/google/home/echristo/tmp" - ; Check that we're using the right forms. ; CHECK: .debug_abbrev.dwo contents: ; CHECK: Abbrev table for offset: 0x00000000 @@ -61,13 +47,20 @@ ; CHECK: DW_AT_external DW_FORM_flag_present ; CHECK: DW_AT_decl_file DW_FORM_data1 ; CHECK: DW_AT_decl_line DW_FORM_data1 -; CHECK: DW_AT_location DW_FORM_block1 +; CHECK: DW_AT_location DW_FORM_exprloc ; CHECK: [3] DW_TAG_base_type DW_CHILDREN_no ; CHECK: DW_AT_name DW_FORM_GNU_str_index ; CHECK: DW_AT_encoding DW_FORM_data1 ; CHECK: DW_AT_byte_size DW_FORM_data1 +; CHECK: .debug_info contents: +; CHECK: DW_TAG_compile_unit +; CHECK-NEXT: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000) +; CHECK-NEXT: DW_AT_GNU_dwo_name [DW_FORM_strp] ( .debug_str[0x00000000] = "baz.dwo") +; CHECK-NEXT: DW_AT_comp_dir [DW_FORM_strp] ( .debug_str[0x00000008] = "/usr/local/google/home/echristo/tmp") +; CHECK-NEXT: DW_AT_GNU_dwo_id [DW_FORM_data8] (0x1f1f859683d49324) + ; Check that the rest of the compile units have information. ; CHECK: .debug_info.dwo contents: ; CHECK: DW_TAG_compile_unit @@ -77,17 +70,20 @@ ; CHECK-NOT: DW_AT_low_pc ; CHECK-NOT: DW_AT_stmt_list ; CHECK-NOT: DW_AT_comp_dir -; CHECK: DW_AT_GNU_dwo_id [DW_FORM_data8] (0x0000000000000000) +; CHECK: DW_AT_GNU_dwo_id [DW_FORM_data8] (0x1f1f859683d49324) ; CHECK: DW_TAG_variable ; CHECK: DW_AT_name [DW_FORM_GNU_str_index] ( indexed (00000002) string = "a") ; CHECK: DW_AT_type [DW_FORM_ref4] (cu + 0x{{[0-9a-f]*}} => {[[TYPE:0x[0-9a-f]*]]}) ; CHECK: DW_AT_external [DW_FORM_flag_present] (true) ; CHECK: DW_AT_decl_file [DW_FORM_data1] (0x01) ; CHECK: DW_AT_decl_line [DW_FORM_data1] (0x01) -; CHECK: DW_AT_location [DW_FORM_block1] (<0x02> fb 00 ) +; CHECK: DW_AT_location [DW_FORM_exprloc] (<0x2> fb 00 ) ; CHECK: [[TYPE]]: DW_TAG_base_type ; CHECK: DW_AT_name [DW_FORM_GNU_str_index] ( indexed (00000003) string = "int") +; CHECK: .debug_str contents: +; CHECK: 0x00000000: "baz.dwo" +; CHECK: 0x00000008: "/usr/local/google/home/echristo/tmp" ; CHECK: .debug_str.dwo contents: ; CHECK: 0x00000000: "clang version 3.3 (trunk 169021) (llvm/trunk 169020)" @@ -106,9 +102,13 @@ ; ; OBJ: .debug_info ; OBJ-NEXT: R_X86_64_32 .debug_abbrev -; OBJ-NEXT: R_X86_64_32 .debug_str -; OBJ-NEXT: R_X86_64_32 .debug_addr ; OBJ-NEXT: R_X86_64_32 .debug_line ; OBJ-NEXT: R_X86_64_32 .debug_str +; OBJ-NEXT: R_X86_64_32 .debug_str +; OBJ-NEXT: R_X86_64_32 .debug_addr ; OBJ-NEXT: } + +; HDR-NOT: .debug_aranges +; HDR-NOT: .rela.{{.*}}.dwo + !9 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/DebugInfo/X86/fission-hash.ll b/test/DebugInfo/X86/fission-hash.ll index d3e46a9c4ff1..3987faaf9716 100644 --- a/test/DebugInfo/X86/fission-hash.ll +++ b/test/DebugInfo/X86/fission-hash.ll @@ -1,4 +1,4 @@ -; RUN: llc -split-dwarf=Enable -generate-cu-hash -O0 %s -mtriple=x86_64-unknown-linux-gnu -filetype=obj -o %t +; RUN: llc -split-dwarf=Enable -O0 %s -mtriple=x86_64-unknown-linux-gnu -filetype=obj -o %t ; RUN: llvm-dwarfdump -debug-dump=all %t | FileCheck %s ; The source is an empty file. @@ -11,6 +11,6 @@ !0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.4 (trunk 188230) (llvm/trunk 188234)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !2, metadata !2, metadata !2, metadata !"foo.dwo"} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/foo.c] [DW_LANG_C99] !1 = metadata !{metadata !"foo.c", metadata !"/usr/local/google/home/echristo/tmp"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{i32 2, metadata !"Dwarf Version", i32 3} !4 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/DebugInfo/X86/fission-ranges.ll b/test/DebugInfo/X86/fission-ranges.ll index 0a100799bed1..135837582fcc 100644 --- a/test/DebugInfo/X86/fission-ranges.ll +++ b/test/DebugInfo/X86/fission-ranges.ll @@ -1,5 +1,55 @@ ; RUN: llc -split-dwarf=Enable -O0 %s -mtriple=x86_64-unknown-linux-gnu -filetype=obj -o %t -; RUN: llvm-dwarfdump -debug-dump=all %t | FileCheck %s +; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llvm-objdump -h %t | FileCheck --check-prefix=HDR %s + +; CHECK: .debug_info contents: +; CHECK: DW_TAG_compile_unit +; CHECK-NEXT: DW_AT_stmt_list +; CHECK-NEXT: DW_AT_GNU_dwo_name +; CHECK-NEXT: DW_AT_comp_dir +; CHECK-NEXT: DW_AT_GNU_dwo_id +; CHECK-NEXT: DW_AT_GNU_addr_base [DW_FORM_sec_offset] (0x00000000) + + +; CHECK: .debug_info.dwo contents: +; CHECK: DW_AT_location [DW_FORM_sec_offset] ([[A:0x[0-9a-z]*]]) +; CHECK: DW_AT_location [DW_FORM_sec_offset] ([[E:0x[0-9a-z]*]]) +; CHECK: DW_AT_location [DW_FORM_sec_offset] ([[B:0x[0-9a-z]*]]) +; CHECK: DW_AT_location [DW_FORM_sec_offset] ([[D:0x[0-9a-z]*]]) +; CHECK: DW_AT_ranges [DW_FORM_sec_offset] (0x000000a0) +; CHECK: .debug_loc contents: +; CHECK-NOT: Beginning address offset +; CHECK: .debug_loc.dwo contents: + +; Don't assume these locations are entirely correct - feel free to update them +; if they've changed due to a bugfix, change in register allocation, etc. + +; CHECK: [[A]]: Beginning address index: 2 +; CHECK-NEXT: Length: 199 +; CHECK-NEXT: Location description: 11 00 +; CHECK-NEXT: {{^$}} +; CHECK-NEXT: Beginning address index: 3 +; CHECK-NEXT: Length: 23 +; CHECK-NEXT: Location description: 50 93 04 +; CHECK: [[E]]: Beginning address index: 4 +; CHECK-NEXT: Length: 21 +; CHECK-NEXT: Location description: 50 93 04 +; CHECK: [[B]]: Beginning address index: 5 +; CHECK-NEXT: Length: 19 +; CHECK-NEXT: Location description: 50 93 04 +; CHECK: [[D]]: Beginning address index: 6 +; CHECK-NEXT: Length: 23 +; CHECK-NEXT: Location description: 50 93 04 + +; Make sure we don't produce any relocations in any .dwo section (though in particular, debug_info.dwo) +; HDR-NOT: .rela.{{.*}}.dwo + +; Make sure we have enough stuff in the debug_addr to cover the address indexes +; (6 is the last index in debug_loc.dwo, making 7 entries of 8 bytes each, 7 * 8 +; == 56 base 10 == 38 base 16) + +; HDR: .debug_addr 00000038 +; HDR-NOT: .rela.{{.*}}.dwo ; From the code: @@ -29,8 +79,6 @@ ; clang -g -S -gsplit-dwarf -O1 small.c -; CHECK: DW_AT_GNU_ranges_base - @c = external global i32 ; Function Attrs: nounwind uwtable @@ -44,7 +92,7 @@ entry: define internal fastcc void @foo() #0 { entry: tail call void @llvm.dbg.value(metadata !29, i64 0, metadata !13), !dbg !30 - tail call void @llvm.dbg.value(metadata !2, i64 0, metadata !14), !dbg !31 + tail call void @llvm.dbg.value(metadata !44, i64 0, metadata !14), !dbg !31 %c.promoted9 = load i32* @c, align 4, !dbg !32, !tbaa !33 br label %for.cond1.preheader, !dbg !31 @@ -107,7 +155,7 @@ attributes #1 = { nounwind readnone } !0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.4 (trunk 191700) (llvm/trunk 191710)", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"small.dwo"} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/small.c] [DW_LANG_C99] !1 = metadata !{metadata !"small.c", metadata !"/usr/local/google/home/echristo/tmp"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4, metadata !8} !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"bar", metadata !"bar", metadata !"", i32 18, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 true, void ()* @bar, null, null, metadata !2, i32 19} ; [ DW_TAG_subprogram ] [line 18] [def] [scope 19] [bar] !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/usr/local/google/home/echristo/tmp/small.c] @@ -149,3 +197,4 @@ attributes #1 = { nounwind readnone } !41 = metadata !{i32* @c} !42 = metadata !{i32 15, i32 0, metadata !8, null} !43 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!44 = metadata !{i32 0} diff --git a/test/DebugInfo/X86/formal_parameter.ll b/test/DebugInfo/X86/formal_parameter.ll new file mode 100644 index 000000000000..2fdab7a07f54 --- /dev/null +++ b/test/DebugInfo/X86/formal_parameter.ll @@ -0,0 +1,84 @@ +; ModuleID = 'formal_parameter.c' +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.9.0" +; +; From (clang -g -c -O1): +; +; int lookup(int* map); +; int verify(int val); +; void foo(int map) +; { +; lookup(&map); +; if (!verify(map)) { } +; } +; +; RUN: opt %s -O2 -S -o %t +; RUN: cat %t | FileCheck --check-prefix=LOWERING %s +; RUN: llc -filetype=obj %t -o - | llvm-dwarfdump -debug-dump=info - | FileCheck %s +; Test that we only emit only one DW_AT_formal_parameter "map" for this function. +; rdar://problem/14874886 +; +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}}map +; CHECK-NOT: DW_AT_name {{.*}}map + +; Function Attrs: nounwind ssp uwtable +define void @foo(i32 %map) #0 { +entry: + %map.addr = alloca i32, align 4 + store i32 %map, i32* %map.addr, align 4, !tbaa !15 + call void @llvm.dbg.declare(metadata !{i32* %map.addr}, metadata !10), !dbg !14 + %call = call i32 (i32*, ...)* bitcast (i32 (...)* @lookup to i32 (i32*, ...)*)(i32* %map.addr) #3, !dbg !19 + ; Ensure that all dbg intrinsics have the same scope after + ; LowerDbgDeclare is finished with them. + ; + ; LOWERING: call void @llvm.dbg.value{{.*}}, !dbg ![[LOC:.*]] + ; LOWERING: call void @llvm.dbg.value{{.*}}, !dbg ![[LOC]] + ; LOWERING: call void @llvm.dbg.value{{.*}}, !dbg ![[LOC]] +%0 = load i32* %map.addr, align 4, !dbg !20, !tbaa !15 + %call1 = call i32 (i32, ...)* bitcast (i32 (...)* @verify to i32 (i32, ...)*)(i32 %0) #3, !dbg !20 + ret void, !dbg !22 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +declare i32 @lookup(...) + +declare i32 @verify(...) + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.value(metadata, i64, metadata) #1 + +attributes #0 = { nounwind ssp uwtable } +attributes #1 = { nounwind readnone } +attributes #3 = { nounwind } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!11, !12} +!llvm.ident = !{!13} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5.0 ", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [formal_parameter.c] [DW_LANG_C99] +!1 = metadata !{metadata !"formal_parameter.c", metadata !""} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"foo", metadata !"foo", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void (i32)* @foo, null, null, metadata !9, i32 2} ; [ DW_TAG_subprogram ] [line 1] [def] [scope 2] [foo] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [formal_parameter.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{null, metadata !8} +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{metadata !10} +!10 = metadata !{i32 786689, metadata !4, metadata !"map", metadata !5, i32 16777217, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [map] [line 1] +!11 = metadata !{i32 2, metadata !"Dwarf Version", i32 2} +!12 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!13 = metadata !{metadata !"clang version 3.5.0 "} +!14 = metadata !{i32 1, i32 0, metadata !4, null} +!15 = metadata !{metadata !16, metadata !16, i64 0} +!16 = metadata !{metadata !"int", metadata !17, i64 0} +!17 = metadata !{metadata !"omnipotent char", metadata !18, i64 0} +!18 = metadata !{metadata !"Simple C/C++ TBAA"} +!19 = metadata !{i32 3, i32 0, metadata !4, null} +!20 = metadata !{i32 4, i32 0, metadata !21, null} +!21 = metadata !{i32 786443, metadata !1, metadata !4, i32 4, i32 0, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [formal_parameter.c] +!22 = metadata !{i32 5, i32 0, metadata !4, null} diff --git a/test/DebugInfo/X86/generate-odr-hash.ll b/test/DebugInfo/X86/generate-odr-hash.ll index 4f9cc78fec9a..2256b3e212a7 100644 --- a/test/DebugInfo/X86/generate-odr-hash.ll +++ b/test/DebugInfo/X86/generate-odr-hash.ll @@ -1,10 +1,16 @@ ; REQUIRES: object-emission -; RUN: llc %s -o %t -filetype=obj -O0 -generate-odr-hash -mtriple=x86_64-unknown-linux-gnu -; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -; -; Generated from: +; RUN: llc %s -o %t -filetype=obj -O0 -generate-type-units -mtriple=x86_64-unknown-linux-gnu +; RUN: llvm-dwarfdump %t | FileCheck --check-prefix=CHECK --check-prefix=SINGLE %s + +; RUN: llc %s -split-dwarf=Enable -o %t -filetype=obj -O0 -generate-type-units -mtriple=x86_64-unknown-linux-gnu +; RUN: llvm-dwarfdump %t | FileCheck --check-prefix=CHECK --check-prefix=FISSION %s + +; Generated from bar.cpp: + +; #line 1 "bar.h" ; struct bar {}; +; #line 2 "bar.cpp" ; struct bar b; @@ -43,46 +49,117 @@ ; wombat wom; +; SINGLE-LABEL: .debug_info contents: +; FISSION-LABEL: .debug_info.dwo contents: +; CHECK: Compile Unit: length = [[CU_SIZE:[0-9a-f]+]] + +; CHECK: [[BAR:^0x........]]: DW_TAG_structure_type +; CHECK-NEXT: DW_AT_declaration +; CHECK-NEXT: DW_AT_signature {{.*}} (0x1d02f3be30cc5688) +; CHECK: [[FLUFFY:^0x........]]: DW_TAG_class_type +; CHECK-NEXT: DW_AT_declaration +; CHECK-NEXT: DW_AT_signature {{.*}} (0xb04af47397402e77) + +; Ensure the CU-local type 'walrus' is not placed in a type unit. +; CHECK: [[WALRUS:^0x........]]: DW_TAG_structure_type +; CHECK-NEXT: DW_AT_name{{.*}}"walrus" +; CHECK-NEXT: DW_AT_byte_size +; CHECK-NEXT: DW_AT_decl_file +; CHECK-NEXT: DW_AT_decl_line + + +; CHECK: [[WOMBAT:^0x........]]: DW_TAG_structure_type +; CHECK-NEXT: DW_AT_declaration +; CHECK-NEXT: DW_AT_signature {{.*}} (0xfd756cee88f8a118) + +; FISSION-LABEL: .debug_types contents: +; FISSION-NOT: type_signature +; FISSION-LABEL: type_signature = 0x1d02f3be30cc5688 +; FISSION: DW_TAG_type_unit +; FISSION-NEXT: DW_AT_GNU_dwo_name{{.*}}"bar.dwo" +; FISSION-NEXT: DW_AT_comp_dir{{.*}}"/tmp/dbginfo" +; FISSION-NOT: type_signature +; FISSION-LABEL: type_signature = 0xb04af47397402e77 +; FISSION-NOT: type_signature +; FISSION-LABEL: type_signature = 0xfd756cee88f8a118 +; FISSION-NOT: type_signature +; FISSION-LABEL: type_signature = 0xe94f6d3843e62d6b + +; SINGLE-LABEL: .debug_types contents: +; FISSION-LABEL: .debug_types.dwo contents: + ; Check that we generate a hash for bar and the value. +; CHECK-NOT: type_signature +; CHECK-LABEL: type_signature = 0x1d02f3be30cc5688 ; CHECK: DW_TAG_structure_type -; CHECK-NEXT: debug_str{{.*}}"bar" -; CHECK: DW_AT_GNU_odr_signature [DW_FORM_data8] (0x200520c0d5b90eff) +; CHECK-NEXT: DW_AT_name{{.*}}"bar" + + +; Check that we generate a hash for fluffy and the value. +; CHECK-NOT: type_signature +; CHECK-LABEL: type_signature = 0xb04af47397402e77 +; CHECK-NOT: DW_AT_GNU_odr_signature [DW_FORM_data8] (0x9a0124d5a0c21c52) ; CHECK: DW_TAG_namespace -; CHECK-NEXT: debug_str{{.*}}"echidna" +; CHECK-NEXT: DW_AT_name{{.*}}"echidna" ; CHECK: DW_TAG_namespace -; CHECK-NEXT: debug_str{{.*}}"capybara" +; CHECK-NEXT: DW_AT_name{{.*}}"capybara" ; CHECK: DW_TAG_namespace -; CHECK-NEXT: debug_str{{.*}}"mongoose" +; CHECK-NEXT: DW_AT_name{{.*}}"mongoose" ; CHECK: DW_TAG_class_type -; CHECK-NEXT: debug_str{{.*}}"fluffy" -; CHECK: DW_AT_GNU_odr_signature [DW_FORM_data8] (0x9a0124d5a0c21c52) - -; We emit no hash for walrus since the type is contained in an anonymous -; namespace and won't violate any ODR-ness. -; CHECK: DW_TAG_structure_type -; CHECK-NEXT: debug_str{{.*}}"walrus" -; CHECK-NEXT: DW_AT_byte_size -; CHECK-NEXT: DW_AT_decl_file -; CHECK-NEXT: DW_AT_decl_line -; CHECK-NOT: DW_AT_GNU_odr_signature -; CHECK: DW_TAG_subprogram +; CHECK-NEXT: DW_AT_name{{.*}}"fluffy" ; Check that we generate a hash for wombat and the value, but not for the ; anonymous type contained within. +; CHECK-NOT: type_signature +; CHECK-LABEL: type_signature = 0xfd756cee88f8a118 +; CHECK-NOT: DW_AT_GNU_odr_signature [DW_FORM_data8] (0x685bcc220141e9d7) ; CHECK: DW_TAG_structure_type -; CHECK-NEXT: debug_str{{.*}}wombat -; CHECK: DW_AT_GNU_odr_signature [DW_FORM_data8] (0x685bcc220141e9d7) -; CHECK: DW_TAG_structure_type -; CHECK-NEXT: DW_AT_byte_size -; CHECK-NEXT: DW_AT_decl_file -; CHECK-NEXT: DW_AT_decl_line -; CHECK: DW_TAG_member -; CHECK-NEXT: debug_str{{.*}}"a" +; CHECK-NEXT: DW_AT_name{{.*}}"wombat" -; Check that we don't generate a hash for baz. +; CHECK-NOT: type_signature +; CHECK-LABEL: type_signature = 0xe94f6d3843e62d6b +; CHECK: DW_TAG_type_unit +; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000) +; CHECK-NOT: NULL +; CHECK-NOT: DW_AT_GNU_odr_signature +; CHECK: DW_TAG_structure_type +; The signature for the outer 'wombat' type +; CHECK: DW_AT_signature [DW_FORM_ref_sig8] (0xfd756cee88f8a118) ; CHECK: DW_TAG_structure_type -; CHECK-NEXT: debug_str{{.*}}"baz" +; CHECK-NOT: DW_AT_name ; CHECK-NOT: DW_AT_GNU_odr_signature +; CHECK: DW_TAG_member +; CHECK-NEXT: DW_AT_name{{.*}}"a" + +; CHECK-LABEL: .debug_line contents: +; CHECK: Line table prologue +; CHECK-NOT: file_names[ +; SINGLE: file_names{{.*}} bar.h +; CHECK: file_names{{.*}} bar.cpp +; CHECK-NOT: file_names[ + +; CHECK-LABEL: .debug_line.dwo contents: +; FISSION: Line table prologue +; FISSION: opcode_base: 1 +; FISSION-NOT: standard_opcode_lengths +; FISSION-NOT: include_directories +; FISSION-NOT: file_names[ +; FISSION: file_names{{.*}} bar.h +; FISSION: file_names{{.*}} bar.cpp +; FISSION-NOT: file_names[ + +; CHECK-LABEL: .debug_str contents: + +; Use the unit size as a rough hash/identifier for the unit we're dealing with +; it happens to be unambiguous at the moment, but it's hardly ideal. +; CHECK-LABEL: .debug_pubtypes contents: +; Don't emit pubtype entries for type DIEs in the compile unit that just indirect to a type unit. +; CHECK-NEXT: unit_size = [[CU_SIZE]] +; CHECK-NEXT: Offset Name +; CHECK-DAG: [[BAR]] "bar" +; CHECK-DAG: [[WALRUS]] "(anonymous namespace)::walrus" +; CHECK-DAG: [[WOMBAT]] "wombat" +; CHECK-DAG: [[FLUFFY]] "echidna::capybara::mongoose::fluffy" %struct.bar = type { i8 } %"class.echidna::capybara::mongoose::fluffy" = type { i32, i32 } @@ -97,14 +174,12 @@ @wom = global %struct.wombat zeroinitializer, align 4 @llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }] -@_ZN12_GLOBAL__N_16walrusC1Ev = alias internal void (%"struct.<anonymous namespace>::walrus"*)* @_ZN12_GLOBAL__N_16walrusC2Ev - ; Function Attrs: nounwind uwtable define void @_Z3foov() #0 { entry: %b = alloca %struct.baz, align 1 - call void @llvm.dbg.declare(metadata !{%struct.baz* %b}, metadata !44), !dbg !46 - ret void, !dbg !47 + call void @llvm.dbg.declare(metadata !{%struct.baz* %b}, metadata !46), !dbg !48 + ret void, !dbg !49 } ; Function Attrs: nounwind readnone @@ -112,8 +187,8 @@ declare void @llvm.dbg.declare(metadata, metadata) #1 define internal void @__cxx_global_var_init() section ".text.startup" { entry: - call void @_ZN12_GLOBAL__N_16walrusC1Ev(%"struct.<anonymous namespace>::walrus"* @w), !dbg !48 - ret void, !dbg !48 + call void @_ZN12_GLOBAL__N_16walrusC2Ev(%"struct.<anonymous namespace>::walrus"* @w), !dbg !50 + ret void, !dbg !50 } ; Function Attrs: nounwind uwtable @@ -121,76 +196,77 @@ define internal void @_ZN12_GLOBAL__N_16walrusC2Ev(%"struct.<anonymous namespace entry: %this.addr = alloca %"struct.<anonymous namespace>::walrus"*, align 8 store %"struct.<anonymous namespace>::walrus"* %this, %"struct.<anonymous namespace>::walrus"** %this.addr, align 8 - call void @llvm.dbg.declare(metadata !{%"struct.<anonymous namespace>::walrus"** %this.addr}, metadata !49), !dbg !51 + call void @llvm.dbg.declare(metadata !{%"struct.<anonymous namespace>::walrus"** %this.addr}, metadata !51), !dbg !53 %this1 = load %"struct.<anonymous namespace>::walrus"** %this.addr - ret void, !dbg !52 + ret void, !dbg !54 } define internal void @_GLOBAL__I_a() section ".text.startup" { entry: - call void @__cxx_global_var_init(), !dbg !53 - ret void, !dbg !53 + call void @__cxx_global_var_init(), !dbg !55 + ret void, !dbg !55 } attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } attributes #1 = { nounwind readnone } !llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!42, !54} -!llvm.ident = !{!43} +!llvm.module.flags = !{!43, !44} +!llvm.ident = !{!45} -!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !20, metadata !37, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/bar.cpp] [DW_LANG_C_plus_plus] +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5 ", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !21, metadata !38, metadata !2, metadata !"bar.dwo"} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/bar.cpp] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !"bar.cpp", metadata !"/tmp/dbginfo"} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4, metadata !5, metadata !13, metadata !16} -!4 = metadata !{i32 786451, metadata !1, null, metadata !"bar", i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !2, i32 0, null, null, metadata !"_ZTS3bar"} ; [ DW_TAG_structure_type ] [bar] [line 1, size 8, align 8, offset 0] [def] [from ] -!5 = metadata !{i32 786434, metadata !1, metadata !6, metadata !"fluffy", i32 13, i64 64, i64 32, i32 0, i32 0, null, metadata !9, i32 0, null, null, metadata !"_ZTSN7echidna8capybara8mongoose6fluffyE"} ; [ DW_TAG_class_type ] [fluffy] [line 13, size 64, align 32, offset 0] [def] [from ] -!6 = metadata !{i32 786489, metadata !1, metadata !7, metadata !"mongoose", i32 12} ; [ DW_TAG_namespace ] [mongoose] [line 12] -!7 = metadata !{i32 786489, metadata !1, metadata !8, metadata !"capybara", i32 11} ; [ DW_TAG_namespace ] [capybara] [line 11] -!8 = metadata !{i32 786489, metadata !1, null, metadata !"echidna", i32 10} ; [ DW_TAG_namespace ] [echidna] [line 10] -!9 = metadata !{metadata !10, metadata !12} -!10 = metadata !{i32 786445, metadata !1, metadata !"_ZTSN7echidna8capybara8mongoose6fluffyE", metadata !"a", i32 14, i64 32, i64 32, i64 0, i32 1, metadata !11} ; [ DW_TAG_member ] [a] [line 14, size 32, align 32, offset 0] [private] [from int] -!11 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] -!12 = metadata !{i32 786445, metadata !1, metadata !"_ZTSN7echidna8capybara8mongoose6fluffyE", metadata !"b", i32 15, i64 32, i64 32, i64 32, i32 1, metadata !11} ; [ DW_TAG_member ] [b] [line 15, size 32, align 32, offset 32] [private] [from int] -!13 = metadata !{i32 786451, metadata !1, null, metadata !"wombat", i32 31, i64 64, i64 32, i32 0, i32 0, null, metadata !14, i32 0, null, null, metadata !"_ZTS6wombat"} ; [ DW_TAG_structure_type ] [wombat] [line 31, size 64, align 32, offset 0] [def] [from ] -!14 = metadata !{metadata !15} -!15 = metadata !{i32 786445, metadata !1, metadata !"_ZTS6wombat", metadata !"a_b", i32 35, i64 64, i64 32, i64 0, i32 0, metadata !"_ZTSN6wombatUt_E"} ; [ DW_TAG_member ] [a_b] [line 35, size 64, align 32, offset 0] [from _ZTSN6wombatUt_E] -!16 = metadata !{i32 786451, metadata !1, metadata !"_ZTS6wombat", metadata !"", i32 32, i64 64, i64 32, i32 0, i32 0, null, metadata !17, i32 0, null, null, metadata !"_ZTSN6wombatUt_E"} ; [ DW_TAG_structure_type ] [line 32, size 64, align 32, offset 0] [def] [from ] -!17 = metadata !{metadata !18, metadata !19} -!18 = metadata !{i32 786445, metadata !1, metadata !"_ZTSN6wombatUt_E", metadata !"a", i32 33, i64 32, i64 32, i64 0, i32 0, metadata !11} ; [ DW_TAG_member ] [a] [line 33, size 32, align 32, offset 0] [from int] -!19 = metadata !{i32 786445, metadata !1, metadata !"_ZTSN6wombatUt_E", metadata !"b", i32 34, i64 32, i64 32, i64 32, i32 0, metadata !11} ; [ DW_TAG_member ] [b] [line 34, size 32, align 32, offset 32] [from int] -!20 = metadata !{metadata !21, metadata !25, metadata !26, metadata !35} -!21 = metadata !{i32 786478, metadata !1, metadata !22, metadata !"foo", metadata !"foo", metadata !"_Z3foov", i32 5, metadata !23, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_Z3foov, null, null, metadata !2, i32 5} ; [ DW_TAG_subprogram ] [line 5] [def] [foo] -!22 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/bar.cpp] -!23 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !24, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!24 = metadata !{null} -!25 = metadata !{i32 786478, metadata !1, metadata !22, metadata !"__cxx_global_var_init", metadata !"__cxx_global_var_init", metadata !"", i32 29, metadata !23, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @__cxx_global_var_init, null, null, metadata !2, i32 29} ; [ DW_TAG_subprogram ] [line 29] [local] [def] [__cxx_global_var_init] -!26 = metadata !{i32 786478, metadata !1, metadata !27, metadata !"walrus", metadata !"walrus", metadata !"_ZN12_GLOBAL__N_16walrusC2Ev", i32 25, metadata !31, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%"struct.<anonymous namespace>::walrus"*)* @_ZN12_GLOBAL__N_16walrusC2Ev, null, metadata !30, metadata !2, i32 25} ; [ DW_TAG_subprogram ] [line 25] [local] [def] [walrus] -!27 = metadata !{i32 786451, metadata !1, metadata !28, metadata !"walrus", i32 24, i64 8, i64 8, i32 0, i32 0, null, metadata !29, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [walrus] [line 24, size 8, align 8, offset 0] [def] [from ] -!28 = metadata !{i32 786489, metadata !1, null, metadata !"", i32 23} ; [ DW_TAG_namespace ] [line 23] -!29 = metadata !{metadata !30} -!30 = metadata !{i32 786478, metadata !1, metadata !27, metadata !"walrus", metadata !"walrus", metadata !"", i32 25, metadata !31, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !34, i32 25} ; [ DW_TAG_subprogram ] [line 25] [walrus] -!31 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !32, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!32 = metadata !{null, metadata !33} -!33 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !27} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from walrus] -!34 = metadata !{i32 786468} -!35 = metadata !{i32 786478, metadata !1, metadata !22, metadata !"", metadata !"", metadata !"_GLOBAL__I_a", i32 25, metadata !36, i1 true, i1 true, i32 0, i32 0, null, i32 64, i1 false, void ()* @_GLOBAL__I_a, null, null, metadata !2, i32 25} ; [ DW_TAG_subprogram ] [line 25] [local] [def] -!36 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !2, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!37 = metadata !{metadata !38, metadata !39, metadata !40, metadata !41} -!38 = metadata !{i32 786484, i32 0, null, metadata !"b", metadata !"b", metadata !"", metadata !22, i32 3, metadata !4, i32 0, i32 1, %struct.bar* @b, null} ; [ DW_TAG_variable ] [b] [line 3] [def] -!39 = metadata !{i32 786484, i32 0, metadata !6, metadata !"animal", metadata !"animal", metadata !"_ZN7echidna8capybara8mongoose6animalE", metadata !22, i32 18, metadata !5, i32 0, i32 1, %"class.echidna::capybara::mongoose::fluffy"* @_ZN7echidna8capybara8mongoose6animalE, null} ; [ DW_TAG_variable ] [animal] [line 18] [def] -!40 = metadata !{i32 786484, i32 0, null, metadata !"w", metadata !"w", metadata !"", metadata !22, i32 29, metadata !27, i32 1, i32 1, %"struct.<anonymous namespace>::walrus"* @w, null} ; [ DW_TAG_variable ] [w] [line 29] [local] [def] -!41 = metadata !{i32 786484, i32 0, null, metadata !"wom", metadata !"wom", metadata !"", metadata !22, i32 38, metadata !13, i32 0, i32 1, %struct.wombat* @wom, null} ; [ DW_TAG_variable ] [wom] [line 38] [def] -!42 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} -!43 = metadata !{metadata !"clang version 3.4 "} -!44 = metadata !{i32 786688, metadata !21, metadata !"b", metadata !22, i32 7, metadata !45, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [b] [line 7] -!45 = metadata !{i32 786451, metadata !1, metadata !21, metadata !"baz", i32 6, i64 8, i64 8, i32 0, i32 0, null, metadata !2, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [baz] [line 6, size 8, align 8, offset 0] [def] [from ] -!46 = metadata !{i32 7, i32 0, metadata !21, null} -!47 = metadata !{i32 8, i32 0, metadata !21, null} ; [ DW_TAG_imported_declaration ] -!48 = metadata !{i32 29, i32 0, metadata !25, null} -!49 = metadata !{i32 786689, metadata !26, metadata !"this", null, i32 16777216, metadata !50, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] -!50 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !27} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from walrus] -!51 = metadata !{i32 0, i32 0, metadata !26, null} -!52 = metadata !{i32 25, i32 0, metadata !26, null} -!53 = metadata !{i32 25, i32 0, metadata !35, null} -!54 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !6, metadata !14, metadata !17} +!4 = metadata !{i32 786451, metadata !5, null, metadata !"bar", i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !2, i32 0, null, null, metadata !"_ZTS3bar"} ; [ DW_TAG_structure_type ] [bar] [line 1, size 8, align 8, offset 0] [def] [from ] +!5 = metadata !{metadata !"bar.h", metadata !"/tmp/dbginfo"} +!6 = metadata !{i32 786434, metadata !1, metadata !7, metadata !"fluffy", i32 13, i64 64, i64 32, i32 0, i32 0, null, metadata !10, i32 0, null, null, metadata !"_ZTSN7echidna8capybara8mongoose6fluffyE"} ; [ DW_TAG_class_type ] [fluffy] [line 13, size 64, align 32, offset 0] [def] [from ] +!7 = metadata !{i32 786489, metadata !1, metadata !8, metadata !"mongoose", i32 12} ; [ DW_TAG_namespace ] [mongoose] [line 12] +!8 = metadata !{i32 786489, metadata !1, metadata !9, metadata !"capybara", i32 11} ; [ DW_TAG_namespace ] [capybara] [line 11] +!9 = metadata !{i32 786489, metadata !1, null, metadata !"echidna", i32 10} ; [ DW_TAG_namespace ] [echidna] [line 10] +!10 = metadata !{metadata !11, metadata !13} +!11 = metadata !{i32 786445, metadata !1, metadata !"_ZTSN7echidna8capybara8mongoose6fluffyE", metadata !"a", i32 14, i64 32, i64 32, i64 0, i32 1, metadata !12} ; [ DW_TAG_member ] [a] [line 14, size 32, align 32, offset 0] [private] [from int] +!12 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!13 = metadata !{i32 786445, metadata !1, metadata !"_ZTSN7echidna8capybara8mongoose6fluffyE", metadata !"b", i32 15, i64 32, i64 32, i64 32, i32 1, metadata !12} ; [ DW_TAG_member ] [b] [line 15, size 32, align 32, offset 32] [private] [from int] +!14 = metadata !{i32 786451, metadata !1, null, metadata !"wombat", i32 31, i64 64, i64 32, i32 0, i32 0, null, metadata !15, i32 0, null, null, metadata !"_ZTS6wombat"} ; [ DW_TAG_structure_type ] [wombat] [line 31, size 64, align 32, offset 0] [def] [from ] +!15 = metadata !{metadata !16} +!16 = metadata !{i32 786445, metadata !1, metadata !"_ZTS6wombat", metadata !"a_b", i32 35, i64 64, i64 32, i64 0, i32 0, metadata !"_ZTSN6wombatUt_E"} ; [ DW_TAG_member ] [a_b] [line 35, size 64, align 32, offset 0] [from _ZTSN6wombatUt_E] +!17 = metadata !{i32 786451, metadata !1, metadata !"_ZTS6wombat", metadata !"", i32 32, i64 64, i64 32, i32 0, i32 0, null, metadata !18, i32 0, null, null, metadata !"_ZTSN6wombatUt_E"} ; [ DW_TAG_structure_type ] [line 32, size 64, align 32, offset 0] [def] [from ] +!18 = metadata !{metadata !19, metadata !20} +!19 = metadata !{i32 786445, metadata !1, metadata !"_ZTSN6wombatUt_E", metadata !"a", i32 33, i64 32, i64 32, i64 0, i32 0, metadata !12} ; [ DW_TAG_member ] [a] [line 33, size 32, align 32, offset 0] [from int] +!20 = metadata !{i32 786445, metadata !1, metadata !"_ZTSN6wombatUt_E", metadata !"b", i32 34, i64 32, i64 32, i64 32, i32 0, metadata !12} ; [ DW_TAG_member ] [b] [line 34, size 32, align 32, offset 32] [from int] +!21 = metadata !{metadata !22, metadata !26, metadata !27, metadata !36} +!22 = metadata !{i32 786478, metadata !1, metadata !23, metadata !"foo", metadata !"foo", metadata !"_Z3foov", i32 5, metadata !24, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_Z3foov, null, null, metadata !2, i32 5} ; [ DW_TAG_subprogram ] [line 5] [def] [foo] +!23 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/bar.cpp] +!24 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !25, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!25 = metadata !{null} +!26 = metadata !{i32 786478, metadata !1, metadata !23, metadata !"__cxx_global_var_init", metadata !"__cxx_global_var_init", metadata !"", i32 29, metadata !24, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @__cxx_global_var_init, null, null, metadata !2, i32 29} ; [ DW_TAG_subprogram ] [line 29] [local] [def] [__cxx_global_var_init] +!27 = metadata !{i32 786478, metadata !1, metadata !28, metadata !"walrus", metadata !"walrus", metadata !"_ZN12_GLOBAL__N_16walrusC2Ev", i32 25, metadata !32, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%"struct.<anonymous namespace>::walrus"*)* @_ZN12_GLOBAL__N_16walrusC2Ev, null, metadata !31, metadata !2, i32 25} ; [ DW_TAG_subprogram ] [line 25] [local] [def] [walrus] +!28 = metadata !{i32 786451, metadata !1, metadata !29, metadata !"walrus", i32 24, i64 8, i64 8, i32 0, i32 0, null, metadata !30, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [walrus] [line 24, size 8, align 8, offset 0] [def] [from ] +!29 = metadata !{i32 786489, metadata !1, null, metadata !"", i32 23} ; [ DW_TAG_namespace ] [line 23] +!30 = metadata !{metadata !31} +!31 = metadata !{i32 786478, metadata !1, metadata !28, metadata !"walrus", metadata !"walrus", metadata !"", i32 25, metadata !32, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !35, i32 25} ; [ DW_TAG_subprogram ] [line 25] [walrus] +!32 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !33, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!33 = metadata !{null, metadata !34} +!34 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !28} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from walrus] +!35 = metadata !{i32 786468} +!36 = metadata !{i32 786478, metadata !1, metadata !23, metadata !"", metadata !"", metadata !"_GLOBAL__I_a", i32 25, metadata !37, i1 true, i1 true, i32 0, i32 0, null, i32 64, i1 false, void ()* @_GLOBAL__I_a, null, null, metadata !2, i32 25} ; [ DW_TAG_subprogram ] [line 25] [local] [def] +!37 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !2, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!38 = metadata !{metadata !39, metadata !40, metadata !41, metadata !42} +!39 = metadata !{i32 786484, i32 0, null, metadata !"b", metadata !"b", metadata !"", metadata !23, i32 3, metadata !4, i32 0, i32 1, %struct.bar* @b, null} ; [ DW_TAG_variable ] [b] [line 3] [def] +!40 = metadata !{i32 786484, i32 0, metadata !7, metadata !"animal", metadata !"animal", metadata !"_ZN7echidna8capybara8mongoose6animalE", metadata !23, i32 18, metadata !6, i32 0, i32 1, %"class.echidna::capybara::mongoose::fluffy"* @_ZN7echidna8capybara8mongoose6animalE, null} ; [ DW_TAG_variable ] [animal] [line 18] [def] +!41 = metadata !{i32 786484, i32 0, null, metadata !"w", metadata !"w", metadata !"", metadata !23, i32 29, metadata !28, i32 1, i32 1, %"struct.<anonymous namespace>::walrus"* @w, null} ; [ DW_TAG_variable ] [w] [line 29] [local] [def] +!42 = metadata !{i32 786484, i32 0, null, metadata !"wom", metadata !"wom", metadata !"", metadata !23, i32 38, metadata !14, i32 0, i32 1, %struct.wombat* @wom, null} ; [ DW_TAG_variable ] [wom] [line 38] [def] +!43 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!44 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!45 = metadata !{metadata !"clang version 3.5 "} +!46 = metadata !{i32 786688, metadata !22, metadata !"b", metadata !23, i32 7, metadata !47, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [b] [line 7] +!47 = metadata !{i32 786451, metadata !1, metadata !22, metadata !"baz", i32 6, i64 8, i64 8, i32 0, i32 0, null, metadata !2, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [baz] [line 6, size 8, align 8, offset 0] [def] [from ] +!48 = metadata !{i32 7, i32 0, metadata !22, null} +!49 = metadata !{i32 8, i32 0, metadata !22, null} ; [ DW_TAG_imported_declaration ] +!50 = metadata !{i32 29, i32 0, metadata !26, null} +!51 = metadata !{i32 786689, metadata !27, metadata !"this", null, i32 16777216, metadata !52, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!52 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !28} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from walrus] +!53 = metadata !{i32 0, i32 0, metadata !27, null} +!54 = metadata !{i32 25, i32 0, metadata !27, null} +!55 = metadata !{i32 25, i32 0, metadata !36, null} diff --git a/test/DebugInfo/X86/gnu-public-names-empty.ll b/test/DebugInfo/X86/gnu-public-names-empty.ll index 8b0309cc65be..46ae65d00384 100644 --- a/test/DebugInfo/X86/gnu-public-names-empty.ll +++ b/test/DebugInfo/X86/gnu-public-names-empty.ll @@ -6,14 +6,14 @@ ; Check that the attributes in the compile unit both point to a correct ; location, even when nothing is exported. -; CHECK: DW_AT_GNU_pubnames [DW_FORM_sec_offset] (0x00000000) -; CHECK: DW_AT_GNU_pubtypes [DW_FORM_sec_offset] (0x00000000) +; CHECK: DW_AT_GNU_pubnames [DW_FORM_flag_present] (true) +; CHECK-NOT: DW_AT_GNU_pubtypes [ !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!3, !4} !0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.4 (trunk 191846) (llvm/trunk 191866)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !2, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/foo.c] [DW_LANG_C99] !1 = metadata !{metadata !"foo.c", metadata !"/usr/local/google/home/echristo/tmp"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} !4 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/DebugInfo/X86/gnu-public-names.ll b/test/DebugInfo/X86/gnu-public-names.ll index 7ad503253733..96fa52b92caf 100644 --- a/test/DebugInfo/X86/gnu-public-names.ll +++ b/test/DebugInfo/X86/gnu-public-names.ll @@ -45,66 +45,135 @@ ; ASM-NEXT: .asciz "C" # External Name ; CHECK: .debug_info contents: -; CHECK: DW_AT_GNU_pubnames [DW_FORM_sec_offset] (0x00000000) -; CHECK: DW_AT_GNU_pubtypes [DW_FORM_sec_offset] (0x00000000) +; CHECK: Compile Unit: +; CHECK: DW_AT_GNU_pubnames [DW_FORM_flag_present] (true) +; CHECK-NOT: DW_AT_GNU_pubtypes [ -; CHECK: [[C:[0-9a-f]+]]: DW_TAG_structure_type +; CHECK: [[C:0x[0-9a-f]+]]: DW_TAG_structure_type ; CHECK-NEXT: DW_AT_name {{.*}} "C" -; CHECK: [[STATIC_MEM_DECL:[0-9a-f]+]]: DW_TAG_member +; CHECK: [[STATIC_MEM_DECL:0x[0-9a-f]+]]: DW_TAG_member ; CHECK-NEXT: DW_AT_name {{.*}} "static_member_variable" -; CHECK: [[MEM_FUNC_DECL:[0-9a-f]+]]: DW_TAG_subprogram +; CHECK: [[MEM_FUNC_DECL:0x[0-9a-f]+]]: DW_TAG_subprogram ; CHECK-NEXT: DW_AT_MIPS_linkage_name ; CHECK-NEXT: DW_AT_name {{.*}} "member_function" -; CHECK: [[STATIC_MEM_FUNC_DECL:[0-9a-f]+]]: DW_TAG_subprogram +; CHECK: [[STATIC_MEM_FUNC_DECL:0x[0-9a-f]+]]: DW_TAG_subprogram ; CHECK-NEXT: DW_AT_MIPS_linkage_name ; CHECK-NEXT: DW_AT_name {{.*}} "static_member_function" -; CHECK: [[INT:[0-9a-f]+]]: DW_TAG_base_type +; CHECK: [[INT:0x[0-9a-f]+]]: DW_TAG_base_type ; CHECK-NEXT: DW_AT_name {{.*}} "int" -; CHECK: [[STATIC_MEM_VAR:[0-9a-f]+]]: DW_TAG_variable -; CHECK-NEXT: DW_AT_specification {{.*}}[[STATIC_MEM_DECL]] +; CHECK: [[STATIC_MEM_VAR:0x[0-9a-f]+]]: DW_TAG_variable +; CHECK-NEXT: DW_AT_specification {{.*}} {[[STATIC_MEM_DECL]]} -; CHECK: [[GLOB_VAR:[0-9a-f]+]]: DW_TAG_variable +; CHECK: [[GLOB_VAR:0x[0-9a-f]+]]: DW_TAG_variable ; CHECK-NEXT: DW_AT_name {{.*}} "global_variable" -; CHECK: [[NS:[0-9a-f]+]]: DW_TAG_namespace +; CHECK: [[NS:0x[0-9a-f]+]]: DW_TAG_namespace ; CHECK-NEXT: DW_AT_name {{.*}} "ns" -; CHECK: [[GLOB_NS_VAR_DECL:[0-9a-f]+]]: DW_TAG_variable +; CHECK: [[GLOB_NS_VAR_DECL:0x[0-9a-f]+]]: DW_TAG_variable ; CHECK-NEXT: DW_AT_name {{.*}} "global_namespace_variable" -; CHECK: [[D_VAR_DECL:[0-9a-f]+]]: DW_TAG_variable +; CHECK: [[D_VAR_DECL:0x[0-9a-f]+]]: DW_TAG_variable ; CHECK-NEXT: DW_AT_name {{.*}} "d" -; CHECK: [[D:[0-9a-f]+]]: DW_TAG_structure_type +; CHECK: [[D:0x[0-9a-f]+]]: DW_TAG_structure_type ; CHECK-NEXT: DW_AT_name {{.*}} "D" -; CHECK: [[GLOB_NS_FUNC:[0-9a-f]+]]: DW_TAG_subprogram -; CHECK-NEXT: DW_AT_MIPS_linkage_name -; CHECK-NEXT: DW_AT_name {{.*}} "global_namespace_function" +; CHECK: [[GLOB_NS_FUNC:0x[0-9a-f]+]]: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_MIPS_linkage_name +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "global_namespace_function" -; CHECK: [[GLOB_NS_VAR:[0-9a-f]+]]: DW_TAG_variable -; CHECK-NEXT: DW_AT_specification {{.*}}[[GLOB_NS_VAR_DECL]] +; CHECK: [[GLOB_NS_VAR:0x[0-9a-f]+]]: DW_TAG_variable +; CHECK-NEXT: DW_AT_specification {{.*}} {[[GLOB_NS_VAR_DECL]]} -; CHECK: [[D_VAR:[0-9a-f]+]]: DW_TAG_variable -; CHECK-NEXT: DW_AT_specification {{.*}}[[D_VAR_DECL]] +; CHECK: [[D_VAR:0x[0-9a-f]+]]: DW_TAG_variable +; CHECK-NEXT: DW_AT_specification {{.*}} {[[D_VAR_DECL]]} -; CHECK: [[MEM_FUNC:[0-9a-f]+]]: DW_TAG_subprogram -; CHECK-NEXT: DW_AT_specification {{.*}}[[MEM_FUNC_DECL]] +; CHECK: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "f3" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: [[F3_Z:.*]]: DW_TAG_variable +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "z" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_AT_location +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: NULL +; CHECK-NOT: {{DW_TAG|NULL}} -; CHECK: [[STATIC_MEM_FUNC:[0-9a-f]+]]: DW_TAG_subprogram -; CHECK-NEXT: DW_AT_specification {{.*}}[[STATIC_MEM_FUNC_DECL]] +; CHECK: [[OUTER:.*]]: DW_TAG_namespace +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "outer" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: [[OUTER_ANON:.*]]: DW_TAG_namespace +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK-NOT: DW_AT_name +; CHECK: [[OUTER_ANON_C_DECL:.*]]: DW_TAG_variable +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "c" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: NULL +; CHECK-NOT: {{DW_TAG|NULL}} +; FIXME: We probably shouldn't bother describing the implicit +; import of the preceding anonymous namespace. This should be fixed +; in clang. +; CHECK: DW_TAG_imported_module +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: NULL +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: [[OUTER_ANON_C:.*]]: DW_TAG_variable +; CHECK-NOT: DW_TAG +; CHECK-NEXT: DW_AT_specification {{.*}} {[[OUTER_ANON_C_DECL]]} -; CHECK: [[GLOBAL_FUNC:[0-9a-f]+]]: DW_TAG_subprogram -; CHECK-NEXT: DW_AT_MIPS_linkage_name -; CHECK-NEXT: DW_AT_name {{.*}} "global_function" +; CHECK: [[ANON:.*]]: DW_TAG_namespace +; CHECK-NOT: DW_AT_name +; CHECK: [[ANON_INNER:.*]]: DW_TAG_namespace +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "inner" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: [[ANON_INNER_B_DECL:.*]]: DW_TAG_variable +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "b" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: NULL +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: [[ANON_I_DECL:.*]]: DW_TAG_variable +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "i" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: NULL +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: [[ANON_INNER_B:.*]]: DW_TAG_variable +; CHECK-NOT: DW_TAG +; CHECK-NEXT: DW_AT_specification {{.*}} {[[ANON_INNER_B_DECL]]} +; CHECK: [[ANON_I:.*]]: DW_TAG_variable +; CHECK-NOT: DW_TAG +; CHECK-NEXT: DW_AT_specification {{.*}} {[[ANON_I_DECL]]} + +; CHECK: [[MEM_FUNC:0x[0-9a-f]+]]: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_specification {{.*}} {[[MEM_FUNC_DECL]]} + +; CHECK: [[STATIC_MEM_FUNC:0x[0-9a-f]+]]: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_specification {{.*}} {[[STATIC_MEM_FUNC_DECL]]} + +; CHECK: [[GLOBAL_FUNC:0x[0-9a-f]+]]: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_MIPS_linkage_name +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "global_function" ; CHECK-LABEL: .debug_gnu_pubnames contents: -; CHECK-NEXT: length = 0x000000e7 version = 0x0002 unit_offset = 0x00000000 unit_size = 0x0000017b +; CHECK-NEXT: length = {{.*}} version = 0x0002 unit_offset = 0x00000000 unit_size = {{.*}} ; CHECK-NEXT: Offset Linkage Kind Name ; CHECK-DAG: [[GLOBAL_FUNC]] EXTERNAL FUNCTION "global_function" ; CHECK-DAG: [[NS]] EXTERNAL TYPE "ns" @@ -115,6 +184,20 @@ ; CHECK-DAG: [[D_VAR]] EXTERNAL VARIABLE "ns::d" ; CHECK-DAG: [[STATIC_MEM_VAR]] EXTERNAL VARIABLE "C::static_member_variable" ; CHECK-DAG: [[STATIC_MEM_FUNC]] EXTERNAL FUNCTION "C::static_member_function" +; CHECK-DAG: [[ANON]] EXTERNAL TYPE "(anonymous namespace)" +; CHECK-DAG: [[ANON_INNER]] EXTERNAL TYPE "(anonymous namespace)::inner" +; CHECK-DAG: [[OUTER]] EXTERNAL TYPE "outer" +; CHECK-DAG: [[OUTER_ANON]] EXTERNAL TYPE "outer::(anonymous namespace)" +; CHECK-DAG: [[ANON_I]] STATIC VARIABLE "(anonymous namespace)::i" +; CHECK-DAG: [[ANON_INNER_B]] STATIC VARIABLE "(anonymous namespace)::inner::b" +; CHECK-DAG: [[OUTER_ANON_C]] STATIC VARIABLE "outer::(anonymous namespace)::c" + +; GCC Doesn't put local statics in pubnames, but it seems not unreasonable and +; comes out naturally from LLVM's implementation, so I'm OK with it for now. If +; it's demonstrated that this is a major size concern or degrades debug info +; consumer behavior, feel free to change it. + +; CHECK-DAG: [[F3_Z]] STATIC VARIABLE "f3::z" ; CHECK-LABEL: debug_gnu_pubtypes contents: @@ -130,16 +213,20 @@ @global_variable = global %struct.C zeroinitializer, align 1 @_ZN2ns25global_namespace_variableE = global i32 1, align 4 @_ZN2ns1dE = global %"struct.ns::D" zeroinitializer, align 4 +@_ZZ2f3vE1z = internal global i32 0, align 4 +@_ZN12_GLOBAL__N_11iE = internal global i32 0, align 4 +@_ZN12_GLOBAL__N_15inner1bE = internal global i32 0, align 4 +@_ZN5outer12_GLOBAL__N_11cE = internal global i32 0, align 4 ; Function Attrs: nounwind uwtable define void @_ZN1C15member_functionEv(%struct.C* %this) #0 align 2 { entry: %this.addr = alloca %struct.C*, align 8 store %struct.C* %this, %struct.C** %this.addr, align 8 - call void @llvm.dbg.declare(metadata !{%struct.C** %this.addr}, metadata !36), !dbg !38 + call void @llvm.dbg.declare(metadata !{%struct.C** %this.addr}, metadata !50), !dbg !52 %this1 = load %struct.C** %this.addr - store i32 0, i32* @_ZN1C22static_member_variableE, align 4, !dbg !39 - ret void, !dbg !39 + store i32 0, i32* @_ZN1C22static_member_variableE, align 4, !dbg !53 + ret void, !dbg !54 } ; Function Attrs: nounwind readnone @@ -148,72 +235,108 @@ declare void @llvm.dbg.declare(metadata, metadata) #1 ; Function Attrs: nounwind uwtable define i32 @_ZN1C22static_member_functionEv() #0 align 2 { entry: - %0 = load i32* @_ZN1C22static_member_variableE, align 4, !dbg !40 - ret i32 %0, !dbg !40 + %0 = load i32* @_ZN1C22static_member_variableE, align 4, !dbg !55 + ret i32 %0, !dbg !55 } ; Function Attrs: nounwind uwtable define i32 @_Z15global_functionv() #0 { entry: - ret i32 -1, !dbg !41 + ret i32 -1, !dbg !56 } ; Function Attrs: nounwind uwtable define void @_ZN2ns25global_namespace_functionEv() #0 { entry: - call void @_ZN1C15member_functionEv(%struct.C* @global_variable), !dbg !42 - ret void, !dbg !42 + call void @_ZN1C15member_functionEv(%struct.C* @global_variable), !dbg !57 + ret void, !dbg !58 +} + +; Function Attrs: nounwind uwtable +define i32* @_Z2f3v() #0 { +entry: + ret i32* @_ZZ2f3vE1z, !dbg !59 +} + +; Function Attrs: nounwind uwtable +define i32 @_Z2f7v() #0 { +entry: + %0 = load i32* @_ZN12_GLOBAL__N_11iE, align 4, !dbg !60 + %call = call i32* @_Z2f3v(), !dbg !60 + %1 = load i32* %call, align 4, !dbg !60 + %add = add nsw i32 %0, %1, !dbg !60 + %2 = load i32* @_ZN12_GLOBAL__N_15inner1bE, align 4, !dbg !60 + %add1 = add nsw i32 %add, %2, !dbg !60 + %3 = load i32* @_ZN5outer12_GLOBAL__N_11cE, align 4, !dbg !60 + %add2 = add nsw i32 %add1, %3, !dbg !60 + ret i32 %add2, !dbg !60 } attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } attributes #1 = { nounwind readnone } !llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!34, !43} -!llvm.ident = !{!35} +!llvm.module.flags = !{!47, !48} +!llvm.ident = !{!49} -!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 (trunk 192862) (llvm/trunk 192861)", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !21, metadata !29, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/pubnames.cpp] [DW_LANG_C_plus_plus] -!1 = metadata !{metadata !"pubnames.cpp", metadata !"/usr/local/google/home/echristo/tmp"} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4, metadata !17} +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !19, metadata !32, metadata !45, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/pubnames.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"pubnames.cpp", metadata !"/tmp/dbginfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !15} !4 = metadata !{i32 786451, metadata !1, null, metadata !"C", i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !5, i32 0, null, null, metadata !"_ZTS1C"} ; [ DW_TAG_structure_type ] [C] [line 1, size 8, align 8, offset 0] [def] [from ] -!5 = metadata !{metadata !6, metadata !8, metadata !13} +!5 = metadata !{metadata !6, metadata !8, metadata !12} !6 = metadata !{i32 786445, metadata !1, metadata !"_ZTS1C", metadata !"static_member_variable", i32 4, i64 0, i64 0, i64 0, i32 4096, metadata !7, null} ; [ DW_TAG_member ] [static_member_variable] [line 4, size 0, align 0, offset 0] [static] [from int] !7 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] -!8 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1C", metadata !"member_function", metadata !"member_function", metadata !"_ZN1C15member_functionEv", i32 2, metadata !9, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !12, i32 2} ; [ DW_TAG_subprogram ] [line 2] [member_function] +!8 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1C", metadata !"member_function", metadata !"member_function", metadata !"_ZN1C15member_functionEv", i32 2, metadata !9, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, null, i32 2} ; [ DW_TAG_subprogram ] [line 2] [member_function] !9 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !10, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !10 = metadata !{null, metadata !11} !11 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !"_ZTS1C"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from _ZTS1C] -!12 = metadata !{i32 786468} -!13 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1C", metadata !"static_member_function", metadata !"static_member_function", metadata !"_ZN1C22static_member_functionEv", i32 3, metadata !14, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !16, i32 3} ; [ DW_TAG_subprogram ] [line 3] [static_member_function] -!14 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !15, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!15 = metadata !{metadata !7} -!16 = metadata !{i32 786468} -!17 = metadata !{i32 786451, metadata !1, metadata !18, metadata !"D", i32 21, i64 32, i64 32, i32 0, i32 0, null, metadata !19, i32 0, null, null, metadata !"_ZTSN2ns1DE"} ; [ DW_TAG_structure_type ] [D] [line 21, size 32, align 32, offset 0] [def] [from ] -!18 = metadata !{i32 786489, metadata !1, null, metadata !"ns", i32 17} ; [ DW_TAG_namespace ] [ns] [line 17] -!19 = metadata !{metadata !20} -!20 = metadata !{i32 786445, metadata !1, metadata !"_ZTSN2ns1DE", metadata !"A", i32 22, i64 32, i64 32, i64 0, i32 0, metadata !7} ; [ DW_TAG_member ] [A] [line 22, size 32, align 32, offset 0] [from int] -!21 = metadata !{metadata !22, metadata !23, metadata !24, metadata !26} -!22 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1C", metadata !"member_function", metadata !"member_function", metadata !"_ZN1C15member_functionEv", i32 9, metadata !9, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.C*)* @_ZN1C15member_functionEv, null, metadata !8, metadata !2, i32 9} ; [ DW_TAG_subprogram ] [line 9] [def] [member_function] -!23 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1C", metadata !"static_member_function", metadata !"static_member_function", metadata !"_ZN1C22static_member_functionEv", i32 11, metadata !14, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @_ZN1C22static_member_functionEv, null, metadata !13, metadata !2, i32 11} ; [ DW_TAG_subprogram ] [line 11] [def] [static_member_function] -!24 = metadata !{i32 786478, metadata !1, metadata !25, metadata !"global_function", metadata !"global_function", metadata !"_Z15global_functionv", i32 15, metadata !14, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @_Z15global_functionv, null, null, metadata !2, i32 15} ; [ DW_TAG_subprogram ] [line 15] [def] [global_function] -!25 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/usr/local/google/home/echristo/tmp/pubnames.cpp] -!26 = metadata !{i32 786478, metadata !1, metadata !18, metadata !"global_namespace_function", metadata !"global_namespace_function", metadata !"_ZN2ns25global_namespace_functionEv", i32 18, metadata !27, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_ZN2ns25global_namespace_functionEv, null, null, metadata !2, i32 18} ; [ DW_TAG_subprogram ] [line 18] [def] [global_namespace_function] -!27 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !28, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!28 = metadata !{null} -!29 = metadata !{metadata !30, metadata !31, metadata !32, metadata !33} -!30 = metadata !{i32 786484, i32 0, metadata !4, metadata !"static_member_variable", metadata !"static_member_variable", metadata !"_ZN1C22static_member_variableE", metadata !25, i32 7, metadata !7, i32 0, i32 1, i32* @_ZN1C22static_member_variableE, metadata !6} ; [ DW_TAG_variable ] [static_member_variable] [line 7] [def] -!31 = metadata !{i32 786484, i32 0, null, metadata !"global_variable", metadata !"global_variable", metadata !"", metadata !25, i32 13, metadata !4, i32 0, i32 1, %struct.C* @global_variable, null} ; [ DW_TAG_variable ] [global_variable] [line 13] [def] -!32 = metadata !{i32 786484, i32 0, metadata !18, metadata !"global_namespace_variable", metadata !"global_namespace_variable", metadata !"_ZN2ns25global_namespace_variableE", metadata !25, i32 19, metadata !7, i32 0, i32 1, i32* @_ZN2ns25global_namespace_variableE, null} ; [ DW_TAG_variable ] [global_namespace_variable] [line 19] [def] -!33 = metadata !{i32 786484, i32 0, metadata !18, metadata !"d", metadata !"d", metadata !"_ZN2ns1dE", metadata !25, i32 23, metadata !17, i32 0, i32 1, %"struct.ns::D"* @_ZN2ns1dE, null} ; [ DW_TAG_variable ] [d] [line 23] [def] -!34 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} -!35 = metadata !{metadata !"clang version 3.4 (trunk 192862) (llvm/trunk 192861)"} -!36 = metadata !{i32 786689, metadata !22, metadata !"this", null, i32 16777216, metadata !37, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] -!37 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !"_ZTS1C"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from _ZTS1C] -!38 = metadata !{i32 0, i32 0, metadata !22, null} -!39 = metadata !{i32 9, i32 0, metadata !22, null} -!40 = metadata !{i32 11, i32 0, metadata !23, null} -!41 = metadata !{i32 15, i32 0, metadata !24, null} -!42 = metadata !{i32 18, i32 0, metadata !26, null} - -!43 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!12 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1C", metadata !"static_member_function", metadata !"static_member_function", metadata !"_ZN1C22static_member_functionEv", i32 3, metadata !13, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, null, i32 3} ; [ DW_TAG_subprogram ] [line 3] [static_member_function] +!13 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !14, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!14 = metadata !{metadata !7} +!15 = metadata !{i32 786451, metadata !1, metadata !16, metadata !"D", i32 28, i64 32, i64 32, i32 0, i32 0, null, metadata !17, i32 0, null, null, metadata !"_ZTSN2ns1DE"} ; [ DW_TAG_structure_type ] [D] [line 28, size 32, align 32, offset 0] [def] [from ] +!16 = metadata !{i32 786489, metadata !1, null, metadata !"ns", i32 23} ; [ DW_TAG_namespace ] [ns] [line 23] +!17 = metadata !{metadata !18} +!18 = metadata !{i32 786445, metadata !1, metadata !"_ZTSN2ns1DE", metadata !"A", i32 29, i64 32, i64 32, i64 0, i32 0, metadata !7} ; [ DW_TAG_member ] [A] [line 29, size 32, align 32, offset 0] [from int] +!19 = metadata !{metadata !20, metadata !21, metadata !22, metadata !24, metadata !27, metadata !31} +!20 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1C", metadata !"member_function", metadata !"member_function", metadata !"_ZN1C15member_functionEv", i32 9, metadata !9, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.C*)* @_ZN1C15member_functionEv, null, metadata !8, metadata !2, i32 9} ; [ DW_TAG_subprogram ] [line 9] [def] [member_function] +!21 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1C", metadata !"static_member_function", metadata !"static_member_function", metadata !"_ZN1C22static_member_functionEv", i32 13, metadata !13, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @_ZN1C22static_member_functionEv, null, metadata !12, metadata !2, i32 13} ; [ DW_TAG_subprogram ] [line 13] [def] [static_member_function] +!22 = metadata !{i32 786478, metadata !1, metadata !23, metadata !"global_function", metadata !"global_function", metadata !"_Z15global_functionv", i32 19, metadata !13, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @_Z15global_functionv, null, null, metadata !2, i32 19} ; [ DW_TAG_subprogram ] [line 19] [def] [global_function] +!23 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/pubnames.cpp] +!24 = metadata !{i32 786478, metadata !1, metadata !16, metadata !"global_namespace_function", metadata !"global_namespace_function", metadata !"_ZN2ns25global_namespace_functionEv", i32 24, metadata !25, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_ZN2ns25global_namespace_functionEv, null, null, metadata !2, i32 24} ; [ DW_TAG_subprogram ] [line 24] [def] [global_namespace_function] +!25 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !26, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!26 = metadata !{null} +!27 = metadata !{i32 786478, metadata !1, metadata !23, metadata !"f3", metadata !"f3", metadata !"_Z2f3v", i32 37, metadata !28, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32* ()* @_Z2f3v, null, null, metadata !2, i32 37} ; [ DW_TAG_subprogram ] [line 37] [def] [f3] +!28 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !29, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!29 = metadata !{metadata !30} +!30 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !7} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int] +!31 = metadata !{i32 786478, metadata !1, metadata !23, metadata !"f7", metadata !"f7", metadata !"_Z2f7v", i32 54, metadata !13, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @_Z2f7v, null, null, metadata !2, i32 54} ; [ DW_TAG_subprogram ] [line 54] [def] [f7] +!32 = metadata !{metadata !33, metadata !34, metadata !35, metadata !36, metadata !37, metadata !38, metadata !41, metadata !44} +!33 = metadata !{i32 786484, i32 0, metadata !4, metadata !"static_member_variable", metadata !"static_member_variable", metadata !"_ZN1C22static_member_variableE", metadata !23, i32 7, metadata !7, i32 0, i32 1, i32* @_ZN1C22static_member_variableE, metadata !6} ; [ DW_TAG_variable ] [static_member_variable] [line 7] [def] +!34 = metadata !{i32 786484, i32 0, null, metadata !"global_variable", metadata !"global_variable", metadata !"", metadata !23, i32 17, metadata !"_ZTS1C", i32 0, i32 1, %struct.C* @global_variable, null} ; [ DW_TAG_variable ] [global_variable] [line 17] [def] +!35 = metadata !{i32 786484, i32 0, metadata !16, metadata !"global_namespace_variable", metadata !"global_namespace_variable", metadata !"_ZN2ns25global_namespace_variableE", metadata !23, i32 27, metadata !7, i32 0, i32 1, i32* @_ZN2ns25global_namespace_variableE, null} ; [ DW_TAG_variable ] [global_namespace_variable] [line 27] [def] +!36 = metadata !{i32 786484, i32 0, metadata !16, metadata !"d", metadata !"d", metadata !"_ZN2ns1dE", metadata !23, i32 30, metadata !"_ZTSN2ns1DE", i32 0, i32 1, %"struct.ns::D"* @_ZN2ns1dE, null} ; [ DW_TAG_variable ] [d] [line 30] [def] +!37 = metadata !{i32 786484, i32 0, metadata !27, metadata !"z", metadata !"z", metadata !"", metadata !23, i32 38, metadata !7, i32 1, i32 1, i32* @_ZZ2f3vE1z, null} ; [ DW_TAG_variable ] [z] [line 38] [local] [def] +!38 = metadata !{i32 786484, i32 0, metadata !39, metadata !"c", metadata !"c", metadata !"_ZN5outer12_GLOBAL__N_11cE", metadata !23, i32 50, metadata !7, i32 1, i32 1, i32* @_ZN5outer12_GLOBAL__N_11cE, null} ; [ DW_TAG_variable ] [c] [line 50] [local] [def] +!39 = metadata !{i32 786489, metadata !1, metadata !40, metadata !"", i32 49} ; [ DW_TAG_namespace ] [line 49] +!40 = metadata !{i32 786489, metadata !1, null, metadata !"outer", i32 48} ; [ DW_TAG_namespace ] [outer] [line 48] +!41 = metadata !{i32 786484, i32 0, metadata !42, metadata !"b", metadata !"b", metadata !"_ZN12_GLOBAL__N_15inner1bE", metadata !23, i32 44, metadata !7, i32 1, i32 1, i32* @_ZN12_GLOBAL__N_15inner1bE, null} ; [ DW_TAG_variable ] [b] [line 44] [local] [def] +!42 = metadata !{i32 786489, metadata !1, metadata !43, metadata !"inner", i32 43} ; [ DW_TAG_namespace ] [inner] [line 43] +!43 = metadata !{i32 786489, metadata !1, null, metadata !"", i32 33} ; [ DW_TAG_namespace ] [line 33] +!44 = metadata !{i32 786484, i32 0, metadata !43, metadata !"i", metadata !"i", metadata !"_ZN12_GLOBAL__N_11iE", metadata !23, i32 34, metadata !7, i32 1, i32 1, i32* @_ZN12_GLOBAL__N_11iE, null} ; [ DW_TAG_variable ] [i] [line 34] [local] [def] +!45 = metadata !{metadata !46} +!46 = metadata !{i32 786490, metadata !40, metadata !39, i32 40} ; [ DW_TAG_imported_module ] +!47 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!48 = metadata !{i32 2, metadata !"Debug Info Version", i32 1} +!49 = metadata !{metadata !"clang version 3.5.0 "} +!50 = metadata !{i32 786689, metadata !20, metadata !"this", null, i32 16777216, metadata !51, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!51 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !"_ZTS1C"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from _ZTS1C] +!52 = metadata !{i32 0, i32 0, metadata !20, null} +!53 = metadata !{i32 10, i32 0, metadata !20, null} +!54 = metadata !{i32 11, i32 0, metadata !20, null} +!55 = metadata !{i32 14, i32 0, metadata !21, null} +!56 = metadata !{i32 20, i32 0, metadata !22, null} +!57 = metadata !{i32 25, i32 0, metadata !24, null} +!58 = metadata !{i32 26, i32 0, metadata !24, null} +!59 = metadata !{i32 39, i32 0, metadata !27, null} +!60 = metadata !{i32 55, i32 0, metadata !31, null} diff --git a/test/DebugInfo/X86/inline-member-function.ll b/test/DebugInfo/X86/inline-member-function.ll new file mode 100644 index 000000000000..3dc6043bf36c --- /dev/null +++ b/test/DebugInfo/X86/inline-member-function.ll @@ -0,0 +1,95 @@ +; REQUIRES: object-emission + +; RUN: llc -mtriple=x86_64-linux -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s + +; From source: +; struct foo { +; int __attribute__((always_inline)) func(int x) { return x + 2; } +; }; + +; int i; + +; int main() { +; return foo().func(i); +; } + +; CHECK: DW_TAG_structure_type +; CHECK: DW_TAG_subprogram + +; But make sure we emit DW_AT_object_pointer on the abstract definition. +; CHECK: [[ABSTRACT_ORIGIN:.*]]: DW_TAG_subprogram +; CHECK-NOT: NULL +; CHECK-NOT: TAG +; CHECK: DW_AT_object_pointer + +; Ensure we omit DW_AT_object_pointer on inlined subroutines. +; CHECK: DW_TAG_inlined_subroutine +; CHECK-NEXT: DW_AT_abstract_origin {{.*}}{[[ABSTRACT_ORIGIN]]} +; CHECK-NOT: NULL +; CHECK-NOT: DW_AT_object_pointer +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_AT_artificial +; CHECK: DW_TAG + +%struct.foo = type { i8 } + +@i = global i32 0, align 4 + +; Function Attrs: uwtable +define i32 @main() #0 { +entry: + %this.addr.i = alloca %struct.foo*, align 8 + %x.addr.i = alloca i32, align 4 + %retval = alloca i32, align 4 + %tmp = alloca %struct.foo, align 1 + store i32 0, i32* %retval + %0 = load i32* @i, align 4, !dbg !23 + store %struct.foo* %tmp, %struct.foo** %this.addr.i, align 8 + call void @llvm.dbg.declare(metadata !{%struct.foo** %this.addr.i}, metadata !24), !dbg !26 + store i32 %0, i32* %x.addr.i, align 4 + call void @llvm.dbg.declare(metadata !{i32* %x.addr.i}, metadata !27), !dbg !28 + %this1.i = load %struct.foo** %this.addr.i + %1 = load i32* %x.addr.i, align 4, !dbg !28 + %add.i = add nsw i32 %1, 2, !dbg !28 + ret i32 %add.i, !dbg !23 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +attributes #0 = { uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!20, !21} +!llvm.ident = !{!22} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !12, metadata !18, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/inline.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"inline.cpp", metadata !"/tmp/dbginfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786451, metadata !1, null, metadata !"foo", i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !5, i32 0, null, null, metadata !"_ZTS3foo"} ; [ DW_TAG_structure_type ] [foo] [line 1, size 8, align 8, offset 0] [def] [from ] +!5 = metadata !{metadata !6} +!6 = metadata !{i32 786478, metadata !1, metadata !"_ZTS3foo", metadata !"func", metadata !"func", metadata !"_ZN3foo4funcEi", i32 2, metadata !7, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !11, i32 2} ; [ DW_TAG_subprogram ] [line 2] [func] +!7 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{metadata !9, metadata !10, metadata !9} +!9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !"_ZTS3foo"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from _ZTS3foo] +!11 = metadata !{i32 786468} +!12 = metadata !{metadata !13, metadata !17} +!13 = metadata !{i32 786478, metadata !1, metadata !14, metadata !"main", metadata !"main", metadata !"", i32 7, metadata !15, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, metadata !2, i32 7} ; [ DW_TAG_subprogram ] [line 7] [def] [main] +!14 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/inline.cpp] +!15 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !16, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!16 = metadata !{metadata !9} +!17 = metadata !{i32 786478, metadata !1, metadata !"_ZTS3foo", metadata !"func", metadata !"func", metadata !"_ZN3foo4funcEi", i32 2, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, null, null, metadata !6, metadata !2, i32 2} ; [ DW_TAG_subprogram ] [line 2] [def] [func] +!18 = metadata !{metadata !19} +!19 = metadata !{i32 786484, i32 0, null, metadata !"i", metadata !"i", metadata !"", metadata !14, i32 5, metadata !9, i32 0, i32 1, i32* @i, null} ; [ DW_TAG_variable ] [i] [line 5] [def] +!20 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!21 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!22 = metadata !{metadata !"clang version 3.5.0 "} +!23 = metadata !{i32 8, i32 0, metadata !13, null} ; [ DW_TAG_imported_declaration ] +!24 = metadata !{i32 786689, metadata !17, metadata !"this", null, i32 16777216, metadata !25, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!25 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !"_ZTS3foo"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from _ZTS3foo] +!26 = metadata !{i32 0, i32 0, metadata !17, metadata !23} +!27 = metadata !{i32 786689, metadata !17, metadata !"x", metadata !14, i32 33554434, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [x] [line 2] +!28 = metadata !{i32 2, i32 0, metadata !17, metadata !23} diff --git a/test/DebugInfo/X86/inline-seldag-test.ll b/test/DebugInfo/X86/inline-seldag-test.ll new file mode 100644 index 000000000000..615f03a2ad28 --- /dev/null +++ b/test/DebugInfo/X86/inline-seldag-test.ll @@ -0,0 +1,77 @@ +; RUN: llc -mtriple=x86_64-linux-gnu -fast-isel=false -filetype=obj < %s -o - | llvm-dwarfdump -debug-dump=info - | FileCheck %s +; RUN: llc -mtriple=x86_64-linux-gnu -fast-isel=false -filetype=asm < %s -o - | FileCheck --check-prefix=ASM %s + +; Generated from: +; clang-tot -c -S -emit-llvm -g inline-seldag-test.c +; inline int __attribute__((always_inline)) f(int y) { +; return y ? 4 : 7; +; } +; void func() { +; volatile int x; +; x = f(x); +; } + +; CHECK: [[F:.*]]: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "f" + +; CHECK: DW_TAG_inlined_subroutine +; CHECK-NEXT: DW_AT_abstract_origin {{.*}} {[[F]]} + + +; Make sure the condition test is attributed to the inline function, not the +; location of the test's operands within the caller. + +; ASM: # inline-seldag-test.c:2:0 +; ASM-NOT: .loc +; ASM: testl + +; Function Attrs: nounwind uwtable +define void @func() #0 { +entry: + %y.addr.i = alloca i32, align 4 + %x = alloca i32, align 4 + call void @llvm.dbg.declare(metadata !{i32* %x}, metadata !15), !dbg !17 + %0 = load volatile i32* %x, align 4, !dbg !18 + store i32 %0, i32* %y.addr.i, align 4 + call void @llvm.dbg.declare(metadata !{i32* %y.addr.i}, metadata !19), !dbg !20 + %1 = load i32* %y.addr.i, align 4, !dbg !21 + %tobool.i = icmp ne i32 %1, 0, !dbg !21 + %cond.i = select i1 %tobool.i, i32 4, i32 7, !dbg !21 + store volatile i32 %cond.i, i32* %x, align 4, !dbg !18 + ret void, !dbg !22 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!12, !13} +!llvm.ident = !{!14} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/inline-seldag-test.c] [DW_LANG_C99] +!1 = metadata !{metadata !"inline-seldag-test.c", metadata !"/tmp/dbginfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !8} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"func", metadata !"func", metadata !"", i32 4, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, void ()* @func, null, null, metadata !2, i32 4} ; [ DW_TAG_subprogram ] [line 4] [def] [func] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/inline-seldag-test.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{null} +!8 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"f", metadata !"f", metadata !"", i32 1, metadata !9, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, null, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [f] +!9 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !10, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!10 = metadata !{metadata !11, metadata !11} +!11 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!12 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!13 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!14 = metadata !{metadata !"clang version 3.5.0 "} +!15 = metadata !{i32 786688, metadata !4, metadata !"x", metadata !5, i32 5, metadata !16, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [x] [line 5] +!16 = metadata !{i32 786485, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !11} ; [ DW_TAG_volatile_type ] [line 0, size 0, align 0, offset 0] [from int] +!17 = metadata !{i32 5, i32 0, metadata !4, null} +!18 = metadata !{i32 6, i32 7, metadata !4, null} +!19 = metadata !{i32 786689, metadata !8, metadata !"y", metadata !5, i32 16777217, metadata !11, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [y] [line 1] +!20 = metadata !{i32 1, i32 0, metadata !8, metadata !18} +!21 = metadata !{i32 2, i32 0, metadata !8, metadata !18} +!22 = metadata !{i32 7, i32 0, metadata !4, null} diff --git a/test/DebugInfo/X86/instcombine-instrinsics.ll b/test/DebugInfo/X86/instcombine-instrinsics.ll index 41dd09f5a425..2fd7ee319c2e 100644 --- a/test/DebugInfo/X86/instcombine-instrinsics.ll +++ b/test/DebugInfo/X86/instcombine-instrinsics.ll @@ -1,102 +1,79 @@ -; RUN: opt < %s -O2 -S | FileCheck %s +; RUN: opt %s -O2 -S -o - | FileCheck %s ; Verify that we emit the same intrinsic at most once. -; CHECK: call void @llvm.dbg.value(metadata !{%struct.i14** %i14} -; CHECK-NOT: call void @llvm.dbg.value(metadata !{%struct.i14** %i14} +; rdar://problem/13056109 +; +; CHECK: call void @llvm.dbg.value(metadata !{%struct.i14** %p} +; CHECK-NOT: call void @llvm.dbg.value(metadata !{%struct.i14** %p} +; CHECK-NEXT: call i32 @foo ; CHECK: ret +; +; +; typedef struct { +; long i; +; } i14; +; +; int foo(i14**); +; +; void init() { +; i14* p = 0; +; foo(&p); +; p->i |= 4; +; foo(&p); +; } +; +; ModuleID = 'instcombine_intrinsics.c' +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.9.0" -;*** IR Dump After Dead Argument Elimination *** -target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" -target triple = "x86_64-apple-macosx10.8.0" +%struct.i14 = type { i64 } -%struct.i3 = type { i32 } -%struct.i14 = type { i32 } -%struct.i24 = type opaque - -define %struct.i3* @barz(i64 %i9) nounwind { -entry: - br label %while.cond - -while.cond: ; preds = %while.body, %entry - br label %while.body - -while.body: ; preds = %while.cond - br label %while.cond -} - -declare void @llvm.dbg.declare(metadata, metadata) - -define void @init() nounwind { -entry: - %i14 = alloca %struct.i14*, align 8 - call void @llvm.dbg.declare(metadata !{%struct.i14** %i14}, metadata !25) - store %struct.i14* null, %struct.i14** %i14, align 8 - %call = call i32 @foo(i8* bitcast (void ()* @bar to i8*), %struct.i14** %i14) - %0 = load %struct.i14** %i14, align 8 - %i16 = getelementptr inbounds %struct.i14* %0, i32 0, i32 0 - %1 = load i32* %i16, align 4 - %or = or i32 %1, 4 - store i32 %or, i32* %i16, align 4 - %call4 = call i32 @foo(i8* bitcast (void ()* @baz to i8*), %struct.i14** %i14) - ret void +; Function Attrs: nounwind ssp uwtable +define void @init() #0 { + %p = alloca %struct.i14*, align 8 + call void @llvm.dbg.declare(metadata !{%struct.i14** %p}, metadata !11), !dbg !18 + store %struct.i14* null, %struct.i14** %p, align 8, !dbg !18 + %1 = call i32 @foo(%struct.i14** %p), !dbg !19 + %2 = load %struct.i14** %p, align 8, !dbg !20 + %3 = getelementptr inbounds %struct.i14* %2, i32 0, i32 0, !dbg !20 + %4 = load i64* %3, align 8, !dbg !20 + %5 = or i64 %4, 4, !dbg !20 + store i64 %5, i64* %3, align 8, !dbg !20 + %6 = call i32 @foo(%struct.i14** %p), !dbg !21 + ret void, !dbg !22 } -declare i32 @foo(i8*, %struct.i14**) nounwind - -define internal void @bar() nounwind { -entry: - %i9 = alloca i64, align 8 - store i64 0, i64* %i9, align 8 - %call = call i32 @put(i64 0, i64* %i9, i64 0, %struct.i24* null) - ret void -} - -define internal void @baz() nounwind { -entry: - ret void -} +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 -declare i32 @put(i64, i64*, i64, %struct.i24*) nounwind readnone +declare i32 @foo(%struct.i14**) -declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone +attributes #0 = { nounwind ssp uwtable } +attributes #1 = { nounwind readnone } !llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!73} +!llvm.module.flags = !{!8, !9} +!llvm.ident = !{!10} -!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.3 ", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !48, null, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{metadata !"i1", metadata !""} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4, metadata !21, metadata !33, metadata !47} -!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"i2", metadata !"i2", metadata !"", i32 31, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, %struct.i3* (i64)* @barz, null, null, metadata !16, i32 32} ; [ DW_TAG_subprogram ] [line 31] [scope 32] -!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [instcombine_intrinsics.c] [DW_LANG_C99] +!1 = metadata !{metadata !"instcombine_intrinsics.c", metadata !""} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"init", metadata !"init", metadata !"", i32 7, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, void ()* @init, null, null, metadata !2, i32 7} ; [ DW_TAG_subprogram ] [line 7] [def] [init] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [instcombine_intrinsics.c] !6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!7 = metadata !{metadata !8, metadata !13} -!8 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !9} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from i3] -!9 = metadata !{i32 786451, metadata !1, null, metadata !"i3", i32 25, i64 32, i64 32, i32 0, i32 0, null, metadata !10, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [i3] [line 25, size 32, align 32, offset 0] [def] [from ] -!10 = metadata !{metadata !11} -!11 = metadata !{i32 786445, metadata !1, metadata !9, metadata !"i4", i32 26, i64 32, i64 32, i64 0, i32 0, metadata !12} ; [ DW_TAG_member ] [line 26, size 32, align 32, offset 0] [from i5] -!12 = metadata !{i32 786468, null, null, metadata !"i5", i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] [line 0, size 32, align 32, offset 0, enc DW_ATE_unsigned] -!13 = metadata !{i32 786454, metadata !1, null, metadata !"i6", i32 5, i64 0, i64 0, i64 0, i32 0, metadata !14} ; [ DW_TAG_typedef ] [line 5, size 0, align 0, offset 0] [from i7] -!14 = metadata !{i32 786454, metadata !1, null, metadata !"i7", i32 2, i64 0, i64 0, i64 0, i32 0, metadata !15} ; [ DW_TAG_typedef ] [line 2, size 0, align 0, offset 0] [from i8] -!15 = metadata !{i32 786468, null, null, metadata !"i8", i32 0, i64 64, i64 64, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] [line 0, size 64, align 64, offset 0, enc DW_ATE_unsigned] -!16 = metadata !{} -!21 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"i13", metadata !"i13", metadata !"", i32 42, metadata !22, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void ()* @init, null, null, metadata !24, i32 43} ; [ DW_TAG_subprogram ] [line 42] [scope 43] -!22 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !34, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!23 = metadata !{null} -!24 = metadata !{metadata !25} -!25 = metadata !{i32 786688, metadata !21, metadata !"i14", metadata !5, i32 45, metadata !27, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [line 45] -!27 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !28} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from i14] -!28 = metadata !{i32 786451, metadata !1, null, metadata !"i14", i32 16, i64 32, i64 32, i32 0, i32 0, null, metadata !29, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [i14] [line 16, size 32, align 32, offset 0] [def] [from ] -!29 = metadata !{metadata !30} -!30 = metadata !{i32 786445, metadata !1, metadata !28, metadata !"i16", i32 17, i64 32, i64 32, i64 0, i32 0, metadata !31} ; [ DW_TAG_member ] [line 17, size 32, align 32, offset 0] [from i17] -!31 = metadata !{i32 786454, metadata !1, null, metadata !"i17", i32 7, i64 0, i64 0, i64 0, i32 0, metadata !32} ; [ DW_TAG_typedef ] [line 7, size 0, align 0, offset 0] [from int] -!32 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] -!33 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"i18", metadata !"i18", metadata !"", i32 54, metadata !22, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 true, void ()* @bar, null, null, metadata !34, i32 55} ; [ DW_TAG_subprogram ] [line 54] [scope 55] -!34 = metadata !{null} -!47 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"i29", metadata !"i29", metadata !"", i32 53, metadata !22, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 true, void ()* @baz, null, null, metadata !2, i32 53} ; [ DW_TAG_subprogram ] [line 53] -!48 = metadata !{metadata !49} -!49 = metadata !{i32 786484, i32 0, metadata !21, metadata !"i30", metadata !"i30", metadata !"", metadata !5, i32 44, metadata !50, i32 1, i32 1, null, null} -!50 = metadata !{i32 786454, metadata !1, null, metadata !"i31", i32 6, i64 0, i64 0, i64 0, i32 0, metadata !32} ; [ DW_TAG_typedef ] [line 6, size 0, align 0, offset 0] [from int] -!52 = metadata !{i64 0} -!55 = metadata !{%struct.i3* null} -!72 = metadata !{%struct.i24* null} -!73 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!7 = metadata !{null} +!8 = metadata !{i32 2, metadata !"Dwarf Version", i32 2} +!9 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!10 = metadata !{metadata !"clang version 3.5.0 "} +!11 = metadata !{i32 786688, metadata !4, metadata !"p", metadata !5, i32 8, metadata !12, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [p] [line 8] +!12 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !13} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from i14] +!13 = metadata !{i32 786454, metadata !1, null, metadata !"i14", i32 3, i64 0, i64 0, i64 0, i32 0, metadata !14} ; [ DW_TAG_typedef ] [i14] [line 3, size 0, align 0, offset 0] [from ] +!14 = metadata !{i32 786451, metadata !1, null, metadata !"", i32 1, i64 64, i64 64, i32 0, i32 0, null, metadata !15, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [line 1, size 64, align 64, offset 0] [def] [from ] +!15 = metadata !{metadata !16} +!16 = metadata !{i32 786445, metadata !1, metadata !14, metadata !"i", i32 2, i64 64, i64 64, i64 0, i32 0, metadata !17} ; [ DW_TAG_member ] [i] [line 2, size 64, align 64, offset 0] [from long int] +!17 = metadata !{i32 786468, null, null, metadata !"long int", i32 0, i64 64, i64 64, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [long int] [line 0, size 64, align 64, offset 0, enc DW_ATE_signed] +!18 = metadata !{i32 8, i32 0, metadata !4, null} ; [ DW_TAG_imported_declaration ] +!19 = metadata !{i32 9, i32 0, metadata !4, null} +!20 = metadata !{i32 10, i32 0, metadata !4, null} +!21 = metadata !{i32 11, i32 0, metadata !4, null} +!22 = metadata !{i32 12, i32 0, metadata !4, null} diff --git a/test/DebugInfo/X86/lexical_block.ll b/test/DebugInfo/X86/lexical_block.ll new file mode 100644 index 000000000000..95b3921ab364 --- /dev/null +++ b/test/DebugInfo/X86/lexical_block.ll @@ -0,0 +1,59 @@ +; REQUIRES: object-emission + +; RUN: llc -mtriple=x86_64-linux -O0 -filetype=obj < %s \ +; RUN: | llvm-dwarfdump -debug-dump=info - | FileCheck %s + +; CHECK: DW_TAG_lexical_block +; CHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] +; CHECK-NEXT: DW_AT_high_pc [DW_FORM_data4] + +; Test case produced from: +; void b() { +; if (int i = 3) +; return; +; } + +; Function Attrs: nounwind uwtable +define void @_Z1bv() #0 { +entry: + %i = alloca i32, align 4 + call void @llvm.dbg.declare(metadata !{i32* %i}, metadata !11), !dbg !14 + store i32 3, i32* %i, align 4, !dbg !14 + %0 = load i32* %i, align 4, !dbg !14 + %tobool = icmp ne i32 %0, 0, !dbg !14 + br i1 %tobool, label %if.then, label %if.end, !dbg !14 + +if.then: ; preds = %entry + br label %if.end, !dbg !15 + +if.end: ; preds = %if.then, %entry + ret void, !dbg !16 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!8, !9} +!llvm.ident = !{!10} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/lexical_block.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"lexical_block.cpp", metadata !"/tmp/dbginfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"b", metadata !"b", metadata !"_Z1bv", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_Z1bv, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [b] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/lexical_block.cpp] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{null} +!8 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!9 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!10 = metadata !{metadata !"clang version 3.5.0 "} +!11 = metadata !{i32 786688, metadata !12, metadata !"i", metadata !5, i32 2, metadata !13, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [i] [line 2] +!12 = metadata !{i32 786443, metadata !1, metadata !4, i32 2, i32 0, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [/tmp/dbginfo/lexical_block.cpp] +!13 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!14 = metadata !{i32 2, i32 0, metadata !12, null} +!15 = metadata !{i32 3, i32 0, metadata !12, null} +!16 = metadata !{i32 4, i32 0, metadata !4, null} diff --git a/test/DebugInfo/X86/line-info.ll b/test/DebugInfo/X86/line-info.ll index 46daccfe841d..f6deee9ff165 100644 --- a/test/DebugInfo/X86/line-info.ll +++ b/test/DebugInfo/X86/line-info.ll @@ -2,7 +2,7 @@ ; RUN: llvm-dwarfdump %t | FileCheck %s ; CHECK: [[FILEID:[0-9]+]]]{{.*}}list0.h -; CHECK: [[FILEID]] 0 1 0 is_stmt{{$}} +; CHECK: [[FILEID]] 0 1 0 0 is_stmt{{$}} ; IR generated from clang -g -emit-llvm with the following source: ; list0.h: @@ -40,7 +40,7 @@ attributes #1 = { nounwind readnone } !0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.3 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/blaikie/dev/scratch/list0.c] [DW_LANG_C99] !1 = metadata !{metadata !"list0.c", metadata !"/usr/local/google/home/blaikie/dev/scratch"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4, metadata !10} !4 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"foo", metadata !"foo", metadata !"", i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @foo, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [foo] !5 = metadata !{metadata !"./list0.h", metadata !"/usr/local/google/home/blaikie/dev/scratch"} diff --git a/test/DebugInfo/X86/linkage-name.ll b/test/DebugInfo/X86/linkage-name.ll index 3d116675454c..2b1647b3d3d9 100644 --- a/test/DebugInfo/X86/linkage-name.ll +++ b/test/DebugInfo/X86/linkage-name.ll @@ -27,10 +27,10 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!29} -!0 = metadata !{i32 786449, metadata !28, i32 4, metadata !"clang version 3.1 (trunk 152691) (llvm/trunk 152692)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !18, metadata !18, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !28, i32 4, metadata !"clang version 3.1 (trunk 152691) (llvm/trunk 152692)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !18, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{} !3 = metadata !{metadata !5} -!5 = metadata !{i32 786478, metadata !6, null, metadata !"a", metadata !"a", metadata !"_ZN1A1aEi", i32 5, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (%class.A*, i32)* @_ZN1A1aEi, null, metadata !13, metadata !16, i32 5} ; [ DW_TAG_subprogram ] +!5 = metadata !{i32 786478, metadata !6, null, metadata !"a", metadata !"a", metadata !"_ZN1A1aEi", i32 5, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (%class.A*, i32)* @_ZN1A1aEi, null, metadata !13, null, i32 5} ; [ DW_TAG_subprogram ] !6 = metadata !{i32 786473, metadata !28} ; [ DW_TAG_file_type ] !7 = metadata !{i32 786453, i32 0, null, i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !8 = metadata !{metadata !9, metadata !10, metadata !9} @@ -38,11 +38,7 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone !10 = metadata !{i32 786447, i32 0, null, i32 0, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !11} ; [ DW_TAG_pointer_type ] !11 = metadata !{i32 786434, metadata !28, null, metadata !"A", i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !12, i32 0, null, null, null} ; [ DW_TAG_class_type ] [A] [line 1, size 8, align 8, offset 0] [def] [from ] !12 = metadata !{metadata !13} -!13 = metadata !{i32 786478, metadata !6, metadata !11, metadata !"a", metadata !"a", metadata !"_ZN1A1aEi", i32 2, metadata !7, i1 false, i1 false, i32 0, i32 0, null, i32 257, i1 false, null, null, i32 0, metadata !14, i32 0} ; [ DW_TAG_subprogram ] -!14 = metadata !{metadata !15} -!15 = metadata !{i32 786468} ; [ DW_TAG_base_type ] -!16 = metadata !{metadata !17} -!17 = metadata !{i32 786468} ; [ DW_TAG_base_type ] +!13 = metadata !{i32 786478, metadata !6, metadata !11, metadata !"a", metadata !"a", metadata !"_ZN1A1aEi", i32 2, metadata !7, i1 false, i1 false, i32 0, i32 0, null, i32 257, i1 false, null, null, i32 0, null, i32 0} ; [ DW_TAG_subprogram ] !18 = metadata !{metadata !20} !20 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !6, i32 9, metadata !11, i32 0, i32 1, %class.A* @a, null} ; [ DW_TAG_variable ] !21 = metadata !{i32 786689, metadata !5, metadata !"this", metadata !6, i32 16777221, metadata !22, i32 64, i32 0} ; [ DW_TAG_arg_variable ] diff --git a/test/DebugInfo/X86/lit.local.cfg b/test/DebugInfo/X86/lit.local.cfg index 19840aa7574c..c8625f4d9d24 100644 --- a/test/DebugInfo/X86/lit.local.cfg +++ b/test/DebugInfo/X86/lit.local.cfg @@ -1,3 +1,2 @@ -targets = set(config.root.targets_to_build.split()) -if not 'X86' in targets: +if not 'X86' in config.root.targets: config.unsupported = True diff --git a/test/DebugInfo/X86/low-pc-cu.ll b/test/DebugInfo/X86/low-pc-cu.ll index 922ae8dfed2f..979d4006b920 100644 --- a/test/DebugInfo/X86/low-pc-cu.ll +++ b/test/DebugInfo/X86/low-pc-cu.ll @@ -5,28 +5,32 @@ ; CHECK: DW_TAG_compile_unit [1] ; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) +; CHECK: DW_AT_high_pc [DW_FORM_data4] ; CHECK: DW_TAG_subprogram [2] +; CHECK: DW_AT_low_pc [DW_FORM_addr] +; CHECK: DW_AT_high_pc [DW_FORM_data4] -define i32 @_Z1qv() nounwind uwtable readnone ssp { +; Function Attrs: nounwind uwtable +define void @z() #0 { entry: - ret i32 undef, !dbg !13 + ret void, !dbg !11 } +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + !llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!16} +!llvm.module.flags = !{!8, !9} +!llvm.ident = !{!10} -!0 = metadata !{i32 786449, metadata !15, i32 4, metadata !"clang version 3.1 (trunk 153454) (llvm/trunk 153471)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} -!3 = metadata !{metadata !5, metadata !12} -!5 = metadata !{i32 786478, metadata !6, null, metadata !"q", metadata !"q", metadata !"_Z1qv", i32 5, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @_Z1qv, null, null, metadata !10, i32 0} ; [ DW_TAG_subprogram ] [line 5] [def] [scope 0] [q] -!6 = metadata !{i32 786473, metadata !15} ; [ DW_TAG_file_type ] -!7 = metadata !{i32 786453, i32 0, null, i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!8 = metadata !{metadata !9} -!9 = metadata !{i32 786468, metadata !15, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!10 = metadata !{metadata !11} -!11 = metadata !{i32 786468} ; [ DW_TAG_base_type ] -!12 = metadata !{i32 786478, metadata !15, metadata !6, metadata !"t", metadata !"t", metadata !"", i32 2, metadata !7, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, null, null, null, metadata !10, i32 0} ; [ DW_TAG_subprogram ] -!13 = metadata !{i32 7, i32 1, metadata !14, null} -!14 = metadata !{i32 786443, metadata !5, i32 5, i32 1, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] -!15 = metadata !{metadata !"foo.cpp", metadata !"/Users/echristo/tmp"} -!16 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5.0 (trunk 204164) (llvm/trunk 204183)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/z.c] [DW_LANG_C99] +!1 = metadata !{metadata !"z.c", metadata !"/usr/local/google/home/echristo"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"z", metadata !"z", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @z, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [z] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/usr/local/google/home/echristo/z.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{null} +!8 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!9 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!10 = metadata !{metadata !"clang version 3.5.0 (trunk 204164) (llvm/trunk 204183)"} +!11 = metadata !{i32 1, i32 0, metadata !4, null} diff --git a/test/DebugInfo/X86/misched-dbg-value.ll b/test/DebugInfo/X86/misched-dbg-value.ll index cfb06672d259..c713e65110e7 100644 --- a/test/DebugInfo/X86/misched-dbg-value.ll +++ b/test/DebugInfo/X86/misched-dbg-value.ll @@ -6,20 +6,33 @@ ; function parameters. ; CHECK: .debug_info contents: ; CHECK: DW_TAG_compile_unit -; CHECK: DW_TAG_subprogram -; CHECK: Proc8 -; CHECK: DW_TAG_formal_parameter -; CHECK: Array1Par -; CHECK: DW_AT_location -; CHECK: DW_TAG_formal_parameter -; CHECK: Array2Par -; CHECK: DW_AT_location -; CHECK: DW_TAG_formal_parameter -; CHECK: IntParI1 -; CHECK: DW_AT_location -; CHECK: DW_TAG_formal_parameter -; CHECK: IntParI2 -; CHECK: DW_AT_location +; CHECK: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "Proc8" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_location +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "Array1Par" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_location +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "Array2Par" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_location +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "IntParI1" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_location +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "IntParI2" %struct.Record = type { %struct.Record*, i32, i32, i32, [31 x i8] } @@ -90,7 +103,7 @@ attributes #1 = { nounwind readnone } !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!83} -!0 = metadata !{i32 786449, metadata !82, i32 12, metadata !"clang version 3.3 (trunk 175015)", i1 true, metadata !"", i32 0, metadata !1, metadata !10, metadata !11, metadata !29, metadata !29, metadata !""} ; [ DW_TAG_compile_unit ] [/Users/manmanren/test-Nov/rdar_13183203/test2/dry.c] [DW_LANG_C99] +!0 = metadata !{i32 786449, metadata !82, i32 12, metadata !"clang version 3.3 (trunk 175015)", i1 true, metadata !"", i32 0, metadata !1, metadata !10, metadata !11, metadata !29, metadata !10, metadata !""} ; [ DW_TAG_compile_unit ] [/Users/manmanren/test-Nov/rdar_13183203/test2/dry.c] [DW_LANG_C99] !1 = metadata !{metadata !2} !2 = metadata !{i32 786436, metadata !82, null, metadata !"", i32 128, i64 32, i64 32, i32 0, i32 0, null, metadata !4, i32 0, null, null, null} ; [ DW_TAG_enumeration_type ] [line 128, size 32, align 32, offset 0] [def] [from ] !3 = metadata !{i32 786473, metadata !82} ; [ DW_TAG_file_type ] @@ -100,7 +113,7 @@ attributes #1 = { nounwind readnone } !7 = metadata !{i32 786472, metadata !"Ident3", i64 10001} ; [ DW_TAG_enumerator ] [Ident3 :: 10001] !8 = metadata !{i32 786472, metadata !"Ident4", i64 10002} ; [ DW_TAG_enumerator ] [Ident4 :: 10002] !9 = metadata !{i32 786472, metadata !"Ident5", i64 10003} ; [ DW_TAG_enumerator ] [Ident5 :: 10003] -!10 = metadata !{i32 0} +!10 = metadata !{} !11 = metadata !{metadata !12} !12 = metadata !{i32 786478, metadata !82, metadata !3, metadata !"Proc8", metadata !"Proc8", metadata !"", i32 180, metadata !13, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 true, void (i32*, [51 x i32]*, i32, i32)* @Proc8, null, null, metadata !22, i32 185} ; [ DW_TAG_subprogram ] [line 180] [def] [scope 185] [Proc8] !13 = metadata !{i32 786453, i32 0, null, i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !14, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] diff --git a/test/DebugInfo/X86/multiple-aranges.ll b/test/DebugInfo/X86/multiple-aranges.ll index 4c205d8e1697..2da293874245 100644 --- a/test/DebugInfo/X86/multiple-aranges.ll +++ b/test/DebugInfo/X86/multiple-aranges.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s | FileCheck %s +; RUN: llc -generate-arange-section < %s | FileCheck %s ; First CU ; CHECK: .long 44 # Length of ARange Set @@ -6,10 +6,7 @@ ; CHECK-NEXT: .long .L.debug_info_begin0 # Offset Into Debug Info Section ; CHECK-NEXT: .byte 8 # Address Size (in bytes) ; CHECK-NEXT: .byte 0 # Segment Size (in bytes) -; CHECK-NEXT: .byte 255 -; CHECK-NEXT: .byte 255 -; CHECK-NEXT: .byte 255 -; CHECK-NEXT: .byte 255 +; CHECK-NEXT: .zero 4,255 ; CHECK-NEXT: .quad kittens ; CHECK-NEXT: .Lset0 = rainbows-kittens ; CHECK-NEXT: .quad .Lset0 @@ -22,10 +19,7 @@ ; CHECK-NEXT: .long .L.debug_info_begin1 # Offset Into Debug Info Section ; CHECK-NEXT: .byte 8 # Address Size (in bytes) ; CHECK-NEXT: .byte 0 # Segment Size (in bytes) -; CHECK-NEXT: .byte 255 -; CHECK-NEXT: .byte 255 -; CHECK-NEXT: .byte 255 -; CHECK-NEXT: .byte 255 +; CHECK-NEXT: .zero 4,255 ; CHECK-NEXT: .quad rainbows ; CHECK-NEXT: .Lset1 = .Ldebug_end0-rainbows ; CHECK-NEXT: .quad .Lset1 @@ -52,7 +46,7 @@ target triple = "x86_64-unknown-linux-gnu" !0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !2, metadata !3, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/home/kayamon/test1.c] [DW_LANG_C99] !1 = metadata !{metadata !"test1.c", metadata !"/home/kayamon"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4} !4 = metadata !{i32 786484, i32 0, null, metadata !"kittens", metadata !"kittens", metadata !"", metadata !5, i32 1, metadata !6, i32 0, i32 1, i32* @kittens, null} ; [ DW_TAG_variable ] [kittens] [line 1] [def] !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/home/kayamon/test1.c] diff --git a/test/DebugInfo/X86/multiple-at-const-val.ll b/test/DebugInfo/X86/multiple-at-const-val.ll index 9a660614827f..27a5510f1190 100644 --- a/test/DebugInfo/X86/multiple-at-const-val.ll +++ b/test/DebugInfo/X86/multiple-at-const-val.ll @@ -32,7 +32,7 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!1803} -!0 = metadata !{i32 786449, metadata !1802, i32 4, metadata !"clang version 3.3 (trunk 174207)", i1 true, metadata !"", i32 0, metadata !1, metadata !955, metadata !956, metadata !1786, metadata !1786, metadata !""} ; [ DW_TAG_compile_unit ] [/privite/tmp/student2.cpp] [DW_LANG_C_plus_plus] +!0 = metadata !{i32 786449, metadata !1802, i32 4, metadata !"clang version 3.3 (trunk 174207)", i1 true, metadata !"", i32 0, metadata !1, metadata !955, metadata !956, metadata !1786, metadata !955, metadata !""} ; [ DW_TAG_compile_unit ] [/privite/tmp/student2.cpp] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !26} !4 = metadata !{i32 786489, null, metadata !"std", metadata !5, i32 48} ; [ DW_TAG_namespace ] !5 = metadata !{i32 786473, metadata !1801} ; [ DW_TAG_file_type ] @@ -52,7 +52,7 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !77 = metadata !{i32 786445, metadata !1801, metadata !49, metadata !"badbit", i32 331, i64 0, i64 0, i64 0, i32 4096, metadata !78, i32 1} ; [ DW_TAG_member ] !78 = metadata !{i32 786470, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !79} ; [ DW_TAG_const_type ] !79 = metadata !{i32 786454, metadata !1801, metadata !49, metadata !"ostate", i32 327, i64 0, i64 0, i64 0, i32 0, metadata !26} ; [ DW_TAG_typedef ] -!955 = metadata !{i32 0} +!955 = metadata !{} !956 = metadata !{metadata !960} !960 = metadata !{i32 786478, metadata !1802, null, metadata !"main", metadata !"main", metadata !"", i32 73, metadata !54, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 ()* @main, null, null, metadata !955, i32 73} ; [ DW_TAG_subprogram ] !961 = metadata !{i32 786473, metadata !1802} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/nondefault-subrange-array.ll b/test/DebugInfo/X86/nondefault-subrange-array.ll index 91065a312b6b..4df1bd4847d0 100644 --- a/test/DebugInfo/X86/nondefault-subrange-array.ll +++ b/test/DebugInfo/X86/nondefault-subrange-array.ll @@ -23,15 +23,15 @@ ; CHECK: [[BASE]]: DW_TAG_base_type ; CHECK: [[BASE2]]: DW_TAG_base_type -; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "int") -; CHECK-NEXT: DW_AT_byte_size [DW_FORM_data1] (0x04) -; CHECK-NEXT: DW_AT_encoding [DW_FORM_data1] (0x05) +; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "sizetype") +; CHECK-NEXT: DW_AT_byte_size [DW_FORM_data1] (0x08) +; CHECK-NEXT: DW_AT_encoding [DW_FORM_data1] (0x07) !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!21} -!0 = metadata !{i32 786449, metadata !20, i32 4, metadata !"clang version 3.3 (trunk 169136)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] [/Volumes/Sandbox/llvm/t.cpp] [DW_LANG_C_plus_plus] -!1 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !20, i32 4, metadata !"clang version 3.3 (trunk 169136)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/Volumes/Sandbox/llvm/t.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !6, i32 1, metadata !7, i32 0, i32 1, %class.A* @a, null} ; [ DW_TAG_variable ] [a] [line 1] [def] !6 = metadata !{i32 786473, metadata !20} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/objc-fwd-decl.ll b/test/DebugInfo/X86/objc-fwd-decl.ll index a5e9632d1178..1ec56be81a46 100644 --- a/test/DebugInfo/X86/objc-fwd-decl.ll +++ b/test/DebugInfo/X86/objc-fwd-decl.ll @@ -12,8 +12,8 @@ !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!9, !10, !11, !12, !14} -!0 = metadata !{i32 786449, metadata !13, i32 16, metadata !"clang version 3.1 (trunk 152054 trunk 152094)", i1 false, metadata !"", i32 2, metadata !1, metadata !1, metadata !1, metadata !3, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !13, i32 16, metadata !"clang version 3.1 (trunk 152054 trunk 152094)", i1 false, metadata !"", i32 2, metadata !1, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !6, i32 3, metadata !7, i32 0, i32 1, %0** @a, null} ; [ DW_TAG_variable ] !6 = metadata !{i32 786473, metadata !13} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/objc-property-void.ll b/test/DebugInfo/X86/objc-property-void.ll new file mode 100644 index 000000000000..d366a7acf4e5 --- /dev/null +++ b/test/DebugInfo/X86/objc-property-void.ll @@ -0,0 +1,104 @@ +; RUN: llc -filetype=obj -o %t.o < %s >/dev/null 2>&1 +; RUN: llvm-dwarfdump -debug-dump=info %t.o | FileCheck %s + +; CHECK: DW_TAG_structure_type +; CHECK: DW_AT_APPLE_objc_complete_type +; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-fA-F]+}}] = "Foo") +; CHECK: DW_TAG_APPLE_property +; CHECK: DW_AT_APPLE_property_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-fA-F]+}}] = "foo") + +; generated from: +; @interface Foo +; @property (nonatomic,assign,readonly) void foo; +; @end +; @implementation Foo +; - (void)foo {} +; @end +; +; with: +; clang -S -emit-llvm -O0 -g + +; ModuleID = '-' +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.9.0" + +%0 = type opaque +%struct._objc_cache = type opaque +%struct._class_t = type { %struct._class_t*, %struct._class_t*, %struct._objc_cache*, i8* (i8*, i8*)**, %struct._class_ro_t* } +%struct._class_ro_t = type { i32, i32, i32, i8*, i8*, %struct.__method_list_t*, %struct._objc_protocol_list*, %struct._ivar_list_t*, i8*, %struct._prop_list_t* } +%struct.__method_list_t = type { i32, i32, [0 x %struct._objc_method] } +%struct._objc_method = type { i8*, i8*, i8* } +%struct._objc_protocol_list = type { i64, [0 x %struct._protocol_t*] } +%struct._protocol_t = type { i8*, i8*, %struct._objc_protocol_list*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct._prop_list_t*, i32, i32, i8** } +%struct._ivar_list_t = type { i32, i32, [0 x %struct._ivar_t] } +%struct._ivar_t = type { i64*, i8*, i8*, i32, i32 } +%struct._prop_list_t = type { i32, i32, [0 x %struct._prop_t] } +%struct._prop_t = type { i8*, i8* } + +@_objc_empty_cache = external global %struct._objc_cache +@"OBJC_CLASS_$_Foo" = global %struct._class_t { %struct._class_t* @"OBJC_METACLASS_$_Foo", %struct._class_t* null, %struct._objc_cache* @_objc_empty_cache, i8* (i8*, i8*)** null, %struct._class_ro_t* @"\01l_OBJC_CLASS_RO_$_Foo" }, section "__DATA, __objc_data", align 8 +@"OBJC_METACLASS_$_Foo" = global %struct._class_t { %struct._class_t* @"OBJC_METACLASS_$_Foo", %struct._class_t* @"OBJC_CLASS_$_Foo", %struct._objc_cache* @_objc_empty_cache, i8* (i8*, i8*)** null, %struct._class_ro_t* @"\01l_OBJC_METACLASS_RO_$_Foo" }, section "__DATA, __objc_data", align 8 +@"\01L_OBJC_CLASS_NAME_" = internal global [4 x i8] c"Foo\00", section "__TEXT,__objc_classname,cstring_literals", align 1 +@"\01l_OBJC_METACLASS_RO_$_Foo" = internal global %struct._class_ro_t { i32 3, i32 40, i32 40, i8* null, i8* getelementptr inbounds ([4 x i8]* @"\01L_OBJC_CLASS_NAME_", i32 0, i32 0), %struct.__method_list_t* null, %struct._objc_protocol_list* null, %struct._ivar_list_t* null, i8* null, %struct._prop_list_t* null }, section "__DATA, __objc_const", align 8 +@"\01L_OBJC_METH_VAR_NAME_" = internal global [4 x i8] c"foo\00", section "__TEXT,__objc_methname,cstring_literals", align 1 +@"\01L_OBJC_METH_VAR_TYPE_" = internal global [8 x i8] c"v16@0:8\00", section "__TEXT,__objc_methtype,cstring_literals", align 1 +@"\01l_OBJC_$_INSTANCE_METHODS_Foo" = internal global { i32, i32, [1 x %struct._objc_method] } { i32 24, i32 1, [1 x %struct._objc_method] [%struct._objc_method { i8* getelementptr inbounds ([4 x i8]* @"\01L_OBJC_METH_VAR_NAME_", i32 0, i32 0), i8* getelementptr inbounds ([8 x i8]* @"\01L_OBJC_METH_VAR_TYPE_", i32 0, i32 0), i8* bitcast (void (%0*, i8*)* @"\01-[Foo foo]" to i8*) }] }, section "__DATA, __objc_const", align 8 +@"\01L_OBJC_PROP_NAME_ATTR_" = internal global [4 x i8] c"foo\00", section "__TEXT,__cstring,cstring_literals", align 1 +@"\01L_OBJC_PROP_NAME_ATTR_1" = internal global [7 x i8] c"Tv,R,N\00", section "__TEXT,__cstring,cstring_literals", align 1 +@"\01l_OBJC_$_PROP_LIST_Foo" = internal global { i32, i32, [1 x %struct._prop_t] } { i32 16, i32 1, [1 x %struct._prop_t] [%struct._prop_t { i8* getelementptr inbounds ([4 x i8]* @"\01L_OBJC_PROP_NAME_ATTR_", i32 0, i32 0), i8* getelementptr inbounds ([7 x i8]* @"\01L_OBJC_PROP_NAME_ATTR_1", i32 0, i32 0) }] }, section "__DATA, __objc_const", align 8 +@"\01l_OBJC_CLASS_RO_$_Foo" = internal global %struct._class_ro_t { i32 2, i32 0, i32 0, i8* null, i8* getelementptr inbounds ([4 x i8]* @"\01L_OBJC_CLASS_NAME_", i32 0, i32 0), %struct.__method_list_t* bitcast ({ i32, i32, [1 x %struct._objc_method] }* @"\01l_OBJC_$_INSTANCE_METHODS_Foo" to %struct.__method_list_t*), %struct._objc_protocol_list* null, %struct._ivar_list_t* null, i8* null, %struct._prop_list_t* bitcast ({ i32, i32, [1 x %struct._prop_t] }* @"\01l_OBJC_$_PROP_LIST_Foo" to %struct._prop_list_t*) }, section "__DATA, __objc_const", align 8 +@"\01L_OBJC_LABEL_CLASS_$" = internal global [1 x i8*] [i8* bitcast (%struct._class_t* @"OBJC_CLASS_$_Foo" to i8*)], section "__DATA, __objc_classlist, regular, no_dead_strip", align 8 +@llvm.used = appending global [8 x i8*] [i8* getelementptr inbounds ([4 x i8]* @"\01L_OBJC_CLASS_NAME_", i32 0, i32 0), i8* getelementptr inbounds ([4 x i8]* @"\01L_OBJC_METH_VAR_NAME_", i32 0, i32 0), i8* getelementptr inbounds ([8 x i8]* @"\01L_OBJC_METH_VAR_TYPE_", i32 0, i32 0), i8* bitcast ({ i32, i32, [1 x %struct._objc_method] }* @"\01l_OBJC_$_INSTANCE_METHODS_Foo" to i8*), i8* getelementptr inbounds ([4 x i8]* @"\01L_OBJC_PROP_NAME_ATTR_", i32 0, i32 0), i8* getelementptr inbounds ([7 x i8]* @"\01L_OBJC_PROP_NAME_ATTR_1", i32 0, i32 0), i8* bitcast ({ i32, i32, [1 x %struct._prop_t] }* @"\01l_OBJC_$_PROP_LIST_Foo" to i8*), i8* bitcast ([1 x i8*]* @"\01L_OBJC_LABEL_CLASS_$" to i8*)], section "llvm.metadata" + +; Function Attrs: ssp uwtable +define internal void @"\01-[Foo foo]"(%0* %self, i8* %_cmd) #0 { +entry: + %self.addr = alloca %0*, align 8 + %_cmd.addr = alloca i8*, align 8 + store %0* %self, %0** %self.addr, align 8 + call void @llvm.dbg.declare(metadata !{%0** %self.addr}, metadata !24), !dbg !26 + store i8* %_cmd, i8** %_cmd.addr, align 8 + call void @llvm.dbg.declare(metadata !{i8** %_cmd.addr}, metadata !27), !dbg !26 + ret void, !dbg !29 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +attributes #0 = { ssp uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!17, !18, !19, !20, !21, !22} +!llvm.ident = !{!23} + +!0 = metadata !{i32 786449, metadata !1, i32 16, metadata !"", i1 false, metadata !"", i32 2, metadata !2, metadata !3, metadata !9, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [] [DW_LANG_ObjC] +!1 = metadata !{metadata !"-", metadata !""} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786451, metadata !5, metadata !6, metadata !"Foo", i32 1, i64 0, i64 8, i32 0, i32 512, null, metadata !7, i32 16, null, null, null} ; [ DW_TAG_structure_type ] [Foo] [line 1, size 0, align 8, offset 0] [def] [from ] +!5 = metadata !{metadata !"<stdin>", metadata !""} +!6 = metadata !{i32 786473, metadata !5} ; [ DW_TAG_file_type ] [] +!7 = metadata !{metadata !8} +!8 = metadata !{i32 803328, metadata !"foo", metadata !6, i32 2, metadata !"", metadata !"", i32 2117, null} ; [ DW_TAG_APPLE_property ] [foo] [line 2, properties 2117] +!9 = metadata !{metadata !10} +!10 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"-[Foo foo]", metadata !"-[Foo foo]", metadata !"", i32 5, metadata !11, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%0*, i8*)* @"\01-[Foo foo]", null, null, metadata !2, i32 5} ; [ DW_TAG_subprogram ] [line 5] [local] [def] [-[Foo foo]] +!11 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!12 = metadata !{null, metadata !13, metadata !14} +!13 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !4} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from Foo] +!14 = metadata !{i32 786454, metadata !5, null, metadata !"SEL", i32 5, i64 0, i64 0, i64 0, i32 64, metadata !15} ; [ DW_TAG_typedef ] [SEL] [line 5, size 0, align 0, offset 0] [artificial] [from ] +!15 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !16} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from objc_selector] +!16 = metadata !{i32 786451, metadata !1, null, metadata !"objc_selector", i32 0, i64 0, i64 0, i32 0, i32 4, null, null, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [objc_selector] [line 0, size 0, align 0, offset 0] [decl] [from ] +!17 = metadata !{i32 1, metadata !"Objective-C Version", i32 2} +!18 = metadata !{i32 1, metadata !"Objective-C Image Info Version", i32 0} +!19 = metadata !{i32 1, metadata !"Objective-C Image Info Section", metadata !"__DATA, __objc_imageinfo, regular, no_dead_strip"} +!20 = metadata !{i32 4, metadata !"Objective-C Garbage Collection", i32 0} +!21 = metadata !{i32 2, metadata !"Dwarf Version", i32 2} +!22 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!23 = metadata !{metadata !""} +!24 = metadata !{i32 786689, metadata !10, metadata !"self", null, i32 16777216, metadata !25, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [self] [line 0] +!25 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !4} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from Foo] +!26 = metadata !{i32 0, i32 0, metadata !10, null} +!27 = metadata !{i32 786689, metadata !10, metadata !"_cmd", null, i32 33554432, metadata !28, i32 64, i32 0} ; [ DW_TAG_arg_variable ] [_cmd] [line 0] +!28 = metadata !{i32 786454, metadata !5, null, metadata !"SEL", i32 5, i64 0, i64 0, i64 0, i32 0, metadata !15} ; [ DW_TAG_typedef ] [SEL] [line 5, size 0, align 0, offset 0] [from ] +!29 = metadata !{i32 5, i32 0, metadata !10, null} diff --git a/test/DebugInfo/X86/op_deref.ll b/test/DebugInfo/X86/op_deref.ll index 300f13dc5fb2..31003eee2a8c 100644 --- a/test/DebugInfo/X86/op_deref.ll +++ b/test/DebugInfo/X86/op_deref.ll @@ -1,10 +1,20 @@ -; RUN: llc -O0 -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DW-CHECK +; RUN: llc -O0 -mtriple=x86_64-apple-darwin < %s -filetype=obj \ +; RUN: | llvm-dwarfdump -debug-dump=info - \ +; RUN: | FileCheck %s -check-prefix=CHECK -check-prefix=DWARF4 +; RUN: llc -O0 -mtriple=x86_64-apple-darwin < %s -filetype=obj -dwarf-version=3 \ +; RUN: | llvm-dwarfdump -debug-dump=info - \ +; RUN: | FileCheck %s -check-prefix=CHECK -check-prefix=DWARF3 -; DW-CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000067] = "vla") ; FIXME: The location here needs to be fixed, but llvm-dwarfdump doesn't handle ; DW_AT_location lists yet. -; DW-CHECK: DW_AT_location [DW_FORM_sec_offset] (0x00000000) +; DWARF4: DW_AT_location [DW_FORM_sec_offset] (0x00000000) + +; FIXME: The location here needs to be fixed, but llvm-dwarfdump doesn't handle +; DW_AT_location lists yet. +; DWARF3: DW_AT_location [DW_FORM_data4] (0x00000000) + +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000067] = "vla") ; Unfortunately llvm-dwarfdump can't unparse a list of DW_AT_locations ; right now, so we check the asm output: @@ -68,7 +78,7 @@ declare void @llvm.stackrestore(i8*) nounwind !llvm.module.flags = !{!29} !0 = metadata !{i32 786449, metadata !28, i32 12, metadata !"clang version 3.2 (trunk 156005) (llvm/trunk 156000)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!1 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 786478, metadata !28, metadata !6, metadata !"testVLAwithSize", metadata !"testVLAwithSize", metadata !"", i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i32)* @testVLAwithSize, null, null, metadata !1, i32 2} ; [ DW_TAG_subprogram ] !6 = metadata !{i32 786473, metadata !28} ; [ DW_TAG_file_type ] @@ -79,7 +89,7 @@ declare void @llvm.stackrestore(i8*) nounwind !11 = metadata !{i32 1, i32 26, metadata !5, null} !12 = metadata !{i32 3, i32 13, metadata !13, null} !13 = metadata !{i32 786443, metadata !28, metadata !5, i32 2, i32 1, i32 0} ; [ DW_TAG_lexical_block ] -!14 = metadata !{i32 786688, metadata !13, metadata !"vla", metadata !6, i32 3, metadata !15, i32 8192, i32 0, i64 2} ; [ DW_TAG_auto_variable ] +!14 = metadata !{i32 786688, metadata !13, metadata !"vla", metadata !6, i32 3, metadata !15, i32 8192, i32 0, metadata !30} ; [ DW_TAG_auto_variable ] !15 = metadata !{i32 786433, null, null, metadata !"", i32 0, i64 0, i64 32, i32 0, i32 0, metadata !9, metadata !16, i32 0, null, null, null} ; [ DW_TAG_array_type ] [line 0, size 0, align 32, offset 0] [from int] !16 = metadata !{metadata !17} !17 = metadata !{i32 786465, i64 0, i64 -1} ; [ DW_TAG_subrange_type ] @@ -95,3 +105,4 @@ declare void @llvm.stackrestore(i8*) nounwind !27 = metadata !{i32 8, i32 1, metadata !13, null} !28 = metadata !{metadata !"bar.c", metadata !"/Users/echristo/tmp"} !29 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!30 = metadata !{i64 2} diff --git a/test/DebugInfo/X86/parameters.ll b/test/DebugInfo/X86/parameters.ll index fa91bd27ae28..4215c21721ef 100644 --- a/test/DebugInfo/X86/parameters.ll +++ b/test/DebugInfo/X86/parameters.ll @@ -23,13 +23,15 @@ ; } ; CHECK: debug_info contents -; CHECK: DW_AT_name{{.*}} = "f" ; 0x74 is DW_OP_breg4, showing that the parameter is accessed indirectly ; (with a zero offset) from the register parameter ; CHECK: DW_AT_location{{.*}}(<0x0{{.}}> 74 00 +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name{{.*}} = "f" -; CHECK: DW_AT_name{{.*}} = "g" ; CHECK: DW_AT_location{{.*}}([[G_LOC:0x[0-9]*]]) +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name{{.*}} = "g" ; CHECK: debug_loc contents ; CHECK-NEXT: [[G_LOC]]: Beginning ; CHECK-NEXT: Ending @@ -82,7 +84,7 @@ attributes #2 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "n !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/tmp/pass.cpp] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !"pass.cpp", metadata !"/tmp"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4, metadata !17} !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"func", metadata !"func", metadata !"_ZN7pr147634funcENS_3fooE", i32 6, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%"struct.pr14763::foo"*, %"struct.pr14763::foo"*)* @_ZN7pr147634funcENS_3fooE, null, null, metadata !2, i32 6} ; [ DW_TAG_subprogram ] [line 6] [def] [func] !5 = metadata !{i32 786489, metadata !1, null, metadata !"pr14763", i32 1} ; [ DW_TAG_namespace ] [pr14763] [line 1] diff --git a/test/DebugInfo/X86/pointer-type-size.ll b/test/DebugInfo/X86/pointer-type-size.ll index cf789b202343..40dc955ab52c 100644 --- a/test/DebugInfo/X86/pointer-type-size.ll +++ b/test/DebugInfo/X86/pointer-type-size.ll @@ -11,8 +11,8 @@ !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!14} -!0 = metadata !{i32 786449, metadata !13, i32 12, metadata !"clang version 3.1 (trunk 147882)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !13, i32 12, metadata !"clang version 3.1 (trunk 147882)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 720948, i32 0, null, metadata !"crass", metadata !"crass", metadata !"", metadata !6, i32 1, metadata !7, i32 0, i32 1, %struct.crass* @crass, null} ; [ DW_TAG_variable ] !6 = metadata !{i32 720937, metadata !13} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/pr11300.ll b/test/DebugInfo/X86/pr11300.ll index caa24eeb8f66..11c409c16042 100644 --- a/test/DebugInfo/X86/pr11300.ll +++ b/test/DebugInfo/X86/pr11300.ll @@ -3,11 +3,14 @@ ; test that the DW_AT_specification is a back edge in the file. +; Skip the definition of zed(foo*) ; CHECK: DW_TAG_subprogram -; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "zed") +; CHECK: DW_TAG_class_type +; CHECK: [[BAR_DECL:0x[0-9a-f]*]]: DW_TAG_subprogram +; CHECK: DW_AT_MIPS_linkage_name {{.*}} "_ZN3foo3barEv" ; CHECK: DW_TAG_subprogram -; CHECK-NEXT: DW_AT_specification [DW_FORM_ref4] (cu + {{.*}} => {[[BACK:0x[0-9a-f]*]]}) -; CHECK: [[BACK]]: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_specification {{.*}} {[[BAR_DECL]]} %struct.foo = type { i8 } @@ -36,9 +39,9 @@ entry: !llvm.module.flags = !{!33} !0 = metadata !{i32 786449, metadata !32, i32 4, metadata !"clang version 3.0 ()", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!1 = metadata !{} !3 = metadata !{metadata !5, metadata !20} -!5 = metadata !{i32 720942, metadata !6, metadata !6, metadata !"zed", metadata !"zed", metadata !"_Z3zedP3foo", i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.foo*)* @_Z3zedP3foo, null, null, metadata !21, i32 4} ; [ DW_TAG_subprogram ] [line 4] [def] [zed] +!5 = metadata !{i32 720942, metadata !6, metadata !6, metadata !"zed", metadata !"zed", metadata !"_Z3zedP3foo", i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.foo*)* @_Z3zedP3foo, null, null, null, i32 4} ; [ DW_TAG_subprogram ] [line 4] [def] [zed] !6 = metadata !{i32 720937, metadata !32} ; [ DW_TAG_file_type ] !7 = metadata !{i32 720917, i32 0, null, i32 0, i32 0, i64 0, i64 0, i32 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !8 = metadata !{null, metadata !9} @@ -53,9 +56,7 @@ entry: !17 = metadata !{i32 720932} ; [ DW_TAG_base_type ] !18 = metadata !{metadata !19} !19 = metadata !{i32 720932} ; [ DW_TAG_base_type ] -!20 = metadata !{i32 720942, metadata !6, null, metadata !"bar", metadata !"bar", metadata !"_ZN3foo3barEv", i32 2, metadata !13, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.foo*)* @_ZN3foo3barEv, null, metadata !12, metadata !21, i32 2} ; [ DW_TAG_subprogram ] [line 2] [def] [bar] -!21 = metadata !{metadata !22} -!22 = metadata !{i32 720932} ; [ DW_TAG_base_type ] +!20 = metadata !{i32 720942, metadata !6, null, metadata !"bar", metadata !"bar", metadata !"_ZN3foo3barEv", i32 2, metadata !13, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.foo*)* @_ZN3foo3barEv, null, metadata !12, null, i32 2} ; [ DW_TAG_subprogram ] [line 2] [def] [bar] !23 = metadata !{i32 786689, metadata !5, metadata !"x", metadata !6, i32 16777220, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] !24 = metadata !{i32 4, i32 15, metadata !5, null} !25 = metadata !{i32 4, i32 20, metadata !26, null} diff --git a/test/DebugInfo/X86/pr12831.ll b/test/DebugInfo/X86/pr12831.ll index 6dea4a0cd982..79d00eddba28 100644 --- a/test/DebugInfo/X86/pr12831.ll +++ b/test/DebugInfo/X86/pr12831.ll @@ -79,7 +79,7 @@ entry: !llvm.module.flags = !{!162} !0 = metadata !{i32 786449, metadata !161, i32 4, metadata !"clang version 3.2 ", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !128, null, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!1 = metadata !{} !3 = metadata !{metadata !5, metadata !106, metadata !107, metadata !126, metadata !127} !5 = metadata !{i32 786478, metadata !6, null, metadata !"writeExpr", metadata !"writeExpr", metadata !"_ZN17BPLFunctionWriter9writeExprEv", i32 19, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.BPLFunctionWriter*)* @_ZN17BPLFunctionWriter9writeExprEv, null, metadata !103, metadata !1, i32 19} ; [ DW_TAG_subprogram ] !6 = metadata !{i32 786473, metadata !160} ; [ DW_TAG_file_type ] @@ -212,7 +212,7 @@ entry: !134 = metadata !{i32 786447, null, null, null, i32 0, i64 64, i64 64, i64 0, i32 0, metadata !10} ; [ DW_TAG_pointer_type ] !135 = metadata !{i32 19, i32 39, metadata !5, null} !136 = metadata !{i32 20, i32 17, metadata !137, null} -!137 = metadata !{i32 786443, metadata !5, i32 19, i32 51, metadata !6, i32 0} ; [ DW_TAG_lexical_block ] +!137 = metadata !{i32 786443, metadata !6, metadata !5, i32 19, i32 51, i32 0} ; [ DW_TAG_lexical_block ] !138 = metadata !{i32 23, i32 17, metadata !137, null} !139 = metadata !{i32 26, i32 15, metadata !137, null} !140 = metadata !{i32 786689, metadata !106, metadata !"this", metadata !6, i32 16777224, metadata !141, i32 64, i32 0} ; [ DW_TAG_arg_variable ] @@ -221,19 +221,19 @@ entry: !143 = metadata !{i32 786689, metadata !106, metadata !"__f", metadata !6, i32 33554440, metadata !61, i32 0, i32 0} ; [ DW_TAG_arg_variable ] !144 = metadata !{i32 8, i32 63, metadata !106, null} !145 = metadata !{i32 9, i32 9, metadata !146, null} -!146 = metadata !{i32 786443, metadata !106, i32 8, i32 81, metadata !6, i32 1} ; [ DW_TAG_lexical_block ] +!146 = metadata !{i32 786443, metadata !6, metadata !106, i32 8, i32 81, i32 1} ; [ DW_TAG_lexical_block ] !147 = metadata !{i32 10, i32 13, metadata !146, null} !148 = metadata !{i32 4, i32 5, metadata !149, null} -!149 = metadata !{i32 786443, metadata !107, i32 3, i32 105, metadata !6, i32 2} ; [ DW_TAG_lexical_block ] +!149 = metadata !{i32 786443, metadata !6, metadata !107, i32 3, i32 105, i32 2} ; [ DW_TAG_lexical_block ] !150 = metadata !{i32 786689, metadata !126, metadata !"this", metadata !6, i32 16777224, metadata !141, i32 64, i32 0} ; [ DW_TAG_arg_variable ] !151 = metadata !{i32 8, i32 45, metadata !126, null} !152 = metadata !{i32 786689, metadata !126, metadata !"__f", metadata !6, i32 33554440, metadata !26, i32 0, i32 0} ; [ DW_TAG_arg_variable ] !153 = metadata !{i32 8, i32 63, metadata !126, null} !154 = metadata !{i32 9, i32 9, metadata !155, null} -!155 = metadata !{i32 786443, metadata !126, i32 8, i32 81, metadata !6, i32 3} ; [ DW_TAG_lexical_block ] +!155 = metadata !{i32 786443, metadata !6, metadata !126, i32 8, i32 81, i32 3} ; [ DW_TAG_lexical_block ] !156 = metadata !{i32 10, i32 13, metadata !155, null} !157 = metadata !{i32 4, i32 5, metadata !158, null} -!158 = metadata !{i32 786443, metadata !127, i32 3, i32 105, metadata !6, i32 4} ; [ DW_TAG_lexical_block ] +!158 = metadata !{i32 786443, metadata !6, metadata !127, i32 3, i32 105, i32 4} ; [ DW_TAG_lexical_block ] !159 = metadata !{i32 786473, metadata !161} ; [ DW_TAG_file_type ] !160 = metadata !{metadata !"BPLFunctionWriter2.ii", metadata !"/home/peter/crashdelta"} !161 = metadata !{metadata !"BPLFunctionWriter.cpp", metadata !"/home/peter/crashdelta"} diff --git a/test/DebugInfo/X86/pr13303.ll b/test/DebugInfo/X86/pr13303.ll index 473786216e29..16e5966f84db 100644 --- a/test/DebugInfo/X86/pr13303.ll +++ b/test/DebugInfo/X86/pr13303.ll @@ -16,7 +16,7 @@ entry: !llvm.module.flags = !{!13} !0 = metadata !{i32 786449, metadata !12, i32 12, metadata !"clang version 3.2 (trunk 160143)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/home/probinson/PR13303.c] [DW_LANG_C99] -!1 = metadata !{i32 0} +!1 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 786478, metadata !12, metadata !6, metadata !"main", metadata !"main", metadata !"", i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main, null, null, metadata !1, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [main] !6 = metadata !{i32 786473, metadata !12} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/pr19307.ll b/test/DebugInfo/X86/pr19307.ll new file mode 100644 index 000000000000..07e3a4255b08 --- /dev/null +++ b/test/DebugInfo/X86/pr19307.ll @@ -0,0 +1,147 @@ +; RUN: llc -O0 -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s + +; Generated from the source file pr19307.cc: +; #include <string> +; void parse_range(unsigned long long &offset, unsigned long long &limit, +; std::string range) { +; if (range.compare(0, 6, "items=") != 0 || range[6] == '-') +; offset = 1; +; range.erase(0, 6); +; limit = 2; +; } +; with "clang++ -S -emit-llvm -O0 -g pr19307.cc" + +; Location of "range" string is spilled from %rdx to stack and is +; addressed via %rbp. +; CHECK: movq %rdx, {{[-0-9]+}}(%rbp) +; CHECK-NEXT: [[START_LABEL:.Ltmp[0-9]+]] +; This location should be valid until the end of the function. + +; Verify that we have proper range in debug_loc section: +; CHECK: .Ldebug_loc{{[0-9]+}}: +; CHECK: DW_OP_breg1 +; CHECK: .Lset{{[0-9]+}} = [[START_LABEL]]-.Lfunc_begin0 +; CHECK-NEXT: .quad .Lset{{[0-9]+}} +; CHECK-NEXT: .Lset{{[0-9]+}} = .Lfunc_end0-.Lfunc_begin0 +; CHECK-NEXT: .quad .Lset{{[0-9]+}} +; CHECK: DW_OP_breg6 +; CHECK: DW_OP_deref + +; ModuleID = 'pr19307.cc' +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +%"class.std::basic_string" = type { %"struct.std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Alloc_hider" } +%"struct.std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Alloc_hider" = type { i8* } + +@.str = private unnamed_addr constant [7 x i8] c"items=\00", align 1 + +; Function Attrs: uwtable +define void @_Z11parse_rangeRyS_Ss(i64* %offset, i64* %limit, %"class.std::basic_string"* %range) #0 { +entry: + %offset.addr = alloca i64*, align 8 + %limit.addr = alloca i64*, align 8 + store i64* %offset, i64** %offset.addr, align 8 + call void @llvm.dbg.declare(metadata !{i64** %offset.addr}, metadata !45), !dbg !46 + store i64* %limit, i64** %limit.addr, align 8 + call void @llvm.dbg.declare(metadata !{i64** %limit.addr}, metadata !47), !dbg !46 + call void @llvm.dbg.declare(metadata !{%"class.std::basic_string"* %range}, metadata !48), !dbg !49 + %call = call i32 @_ZNKSs7compareEmmPKc(%"class.std::basic_string"* %range, i64 0, i64 6, i8* getelementptr inbounds ([7 x i8]* @.str, i32 0, i32 0)), !dbg !50 + %cmp = icmp ne i32 %call, 0, !dbg !50 + br i1 %cmp, label %if.then, label %lor.lhs.false, !dbg !50 + +lor.lhs.false: ; preds = %entry + %call1 = call i8* @_ZNSsixEm(%"class.std::basic_string"* %range, i64 6), !dbg !52 + %0 = load i8* %call1, !dbg !52 + %conv = sext i8 %0 to i32, !dbg !52 + %cmp2 = icmp eq i32 %conv, 45, !dbg !52 + br i1 %cmp2, label %if.then, label %if.end, !dbg !52 + +if.then: ; preds = %lor.lhs.false, %entry + %1 = load i64** %offset.addr, align 8, !dbg !54 + store i64 1, i64* %1, align 8, !dbg !54 + br label %if.end, !dbg !54 + +if.end: ; preds = %if.then, %lor.lhs.false + %call3 = call %"class.std::basic_string"* @_ZNSs5eraseEmm(%"class.std::basic_string"* %range, i64 0, i64 6), !dbg !55 + %2 = load i64** %limit.addr, align 8, !dbg !56 + store i64 2, i64* %2, align 8, !dbg !56 + ret void, !dbg !57 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +declare i32 @_ZNKSs7compareEmmPKc(%"class.std::basic_string"*, i64, i64, i8*) #2 + +declare i8* @_ZNSsixEm(%"class.std::basic_string"*, i64) #2 + +declare %"class.std::basic_string"* @_ZNSs5eraseEmm(%"class.std::basic_string"*, i64, i64) #2 + +attributes #0 = { uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } +attributes #2 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!42, !43} +!llvm.ident = !{!44} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 (209308)", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !12, metadata !2, metadata !21, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/llvm_cmake_gcc/pr19307.cc] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"pr19307.cc", metadata !"/llvm_cmake_gcc"} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !6, metadata !8} +!4 = metadata !{i32 786451, metadata !5, null, metadata !"", i32 83, i64 0, i64 0, i32 0, i32 4, null, null, i32 0, null, null, metadata !"_ZTS11__mbstate_t"} ; [ DW_TAG_structure_type ] [line 83, size 0, align 0, offset 0] [decl] [from ] +!5 = metadata !{metadata !"/usr/include/wchar.h", metadata !"/llvm_cmake_gcc"} +!6 = metadata !{i32 786451, metadata !7, null, metadata !"lconv", i32 54, i64 0, i64 0, i32 0, i32 4, null, null, i32 0, null, null, metadata !"_ZTS5lconv"} ; [ DW_TAG_structure_type ] [lconv] [line 54, size 0, align 0, offset 0] [decl] [from ] +!7 = metadata !{metadata !"/usr/include/locale.h", metadata !"/llvm_cmake_gcc"} +!8 = metadata !{i32 786434, metadata !9, metadata !10, metadata !"basic_string<char, std::char_traits<char>, std::allocator<char> >", i32 1134, i64 0, i64 0, i32 0, i32 4, null, null, i32 0, null, null, metadata !"_ZTSSs"} ; [ DW_TAG_class_type ] [basic_string<char, std::char_traits<char>, std::allocator<char> >] [line 1134, size 0, align 0, offset 0] [decl] [from ] +!9 = metadata !{metadata !"/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/basic_string.tcc", metadata !"/llvm_cmake_gcc"} +!10 = metadata !{i32 786489, metadata !11, null, metadata !"std", i32 153} ; [ DW_TAG_namespace ] [std] [line 153] +!11 = metadata !{metadata !"/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/x86_64-linux-gnu/bits/c++config.h", metadata !"/llvm_cmake_gcc"} +!12 = metadata !{metadata !13} +!13 = metadata !{i32 786478, metadata !1, metadata !14, metadata !"parse_range", metadata !"parse_range", metadata !"_Z11parse_rangeRyS_Ss", i32 3, metadata !15, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i64*, i64*, %"class.std::basic_string"*)* @_Z11parse_rangeRyS_Ss, null, null, metadata !2, i32 4} ; [ DW_TAG_subprogram ] [line 3] [def] [scope 4] [parse_range] +!14 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/llvm_cmake_gcc/pr19307.cc] +!15 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !16, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!16 = metadata !{null, metadata !17, metadata !17, metadata !19} +!17 = metadata !{i32 786448, null, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !18} ; [ DW_TAG_reference_type ] [line 0, size 0, align 0, offset 0] [from long long unsigned int] +!18 = metadata !{i32 786468, null, null, metadata !"long long unsigned int", i32 0, i64 64, i64 64, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] [long long unsigned int] [line 0, size 64, align 64, offset 0, enc DW_ATE_unsigned] +!19 = metadata !{i32 786454, metadata !20, metadata !10, metadata !"string", i32 65, i64 0, i64 0, i64 0, i32 0, metadata !"_ZTSSs"} ; [ DW_TAG_typedef ] [string] [line 65, size 0, align 0, offset 0] [from _ZTSSs] +!20 = metadata !{metadata !"/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/stringfwd.h", metadata !"/llvm_cmake_gcc"} +!21 = metadata !{metadata !22, metadata !26, metadata !29, metadata !33, metadata !38, metadata !41} +!22 = metadata !{i32 786490, metadata !23, metadata !25, i32 57} ; [ DW_TAG_imported_module ] +!23 = metadata !{i32 786489, metadata !24, null, metadata !"__gnu_debug", i32 55} ; [ DW_TAG_namespace ] [__gnu_debug] [line 55] +!24 = metadata !{metadata !"/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/debug/debug.h", metadata !"/llvm_cmake_gcc"} +!25 = metadata !{i32 786489, metadata !24, metadata !10, metadata !"__debug", i32 49} ; [ DW_TAG_namespace ] [__debug] [line 49] +!26 = metadata !{i32 786440, metadata !10, metadata !27, i32 66} ; [ DW_TAG_imported_declaration ] +!27 = metadata !{i32 786454, metadata !5, null, metadata !"mbstate_t", i32 106, i64 0, i64 0, i64 0, i32 0, metadata !28} ; [ DW_TAG_typedef ] [mbstate_t] [line 106, size 0, align 0, offset 0] [from __mbstate_t] +!28 = metadata !{i32 786454, metadata !5, null, metadata !"__mbstate_t", i32 95, i64 0, i64 0, i64 0, i32 0, metadata !"_ZTS11__mbstate_t"} ; [ DW_TAG_typedef ] [__mbstate_t] [line 95, size 0, align 0, offset 0] [from _ZTS11__mbstate_t] +!29 = metadata !{i32 786440, metadata !10, metadata !30, i32 141} ; [ DW_TAG_imported_declaration ] +!30 = metadata !{i32 786454, metadata !31, null, metadata !"wint_t", i32 141, i64 0, i64 0, i64 0, i32 0, metadata !32} ; [ DW_TAG_typedef ] [wint_t] [line 141, size 0, align 0, offset 0] [from unsigned int] +!31 = metadata !{metadata !"/llvm_cmake_gcc/bin/../lib/clang/3.5.0/include/stddef.h", metadata !"/llvm_cmake_gcc"} +!32 = metadata !{i32 786468, null, null, metadata !"unsigned int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] [unsigned int] [line 0, size 32, align 32, offset 0, enc DW_ATE_unsigned] +!33 = metadata !{i32 786440, metadata !34, metadata !36, i32 42} ; [ DW_TAG_imported_declaration ] +!34 = metadata !{i32 786489, metadata !35, null, metadata !"__gnu_cxx", i32 69} ; [ DW_TAG_namespace ] [__gnu_cxx] [line 69] +!35 = metadata !{metadata !"/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/cpp_type_traits.h", metadata !"/llvm_cmake_gcc"} +!36 = metadata !{i32 786454, metadata !11, metadata !10, metadata !"size_t", i32 155, i64 0, i64 0, i64 0, i32 0, metadata !37} ; [ DW_TAG_typedef ] [size_t] [line 155, size 0, align 0, offset 0] [from long unsigned int] +!37 = metadata !{i32 786468, null, null, metadata !"long unsigned int", i32 0, i64 64, i64 64, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] [long unsigned int] [line 0, size 64, align 64, offset 0, enc DW_ATE_unsigned] +!38 = metadata !{i32 786440, metadata !34, metadata !39, i32 43} ; [ DW_TAG_imported_declaration ] +!39 = metadata !{i32 786454, metadata !11, metadata !10, metadata !"ptrdiff_t", i32 156, i64 0, i64 0, i64 0, i32 0, metadata !40} ; [ DW_TAG_typedef ] [ptrdiff_t] [line 156, size 0, align 0, offset 0] [from long int] +!40 = metadata !{i32 786468, null, null, metadata !"long int", i32 0, i64 64, i64 64, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [long int] [line 0, size 64, align 64, offset 0, enc DW_ATE_signed] +!41 = metadata !{i32 786440, metadata !10, metadata !"_ZTS5lconv", i32 55} ; [ DW_TAG_imported_declaration ] +!42 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!43 = metadata !{i32 2, metadata !"Debug Info Version", i32 1} +!44 = metadata !{metadata !"clang version 3.5.0 (209308)"} +!45 = metadata !{i32 786689, metadata !13, metadata !"offset", metadata !14, i32 16777219, metadata !17, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [offset] [line 3] +!46 = metadata !{i32 3, i32 0, metadata !13, null} +!47 = metadata !{i32 786689, metadata !13, metadata !"limit", metadata !14, i32 33554435, metadata !17, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [limit] [line 3] +!48 = metadata !{i32 786689, metadata !13, metadata !"range", metadata !14, i32 50331652, metadata !19, i32 8192, i32 0} ; [ DW_TAG_arg_variable ] [range] [line 4] +!49 = metadata !{i32 4, i32 0, metadata !13, null} +!50 = metadata !{i32 5, i32 0, metadata !51, null} +!51 = metadata !{i32 786443, metadata !1, metadata !13, i32 5, i32 0, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [/llvm_cmake_gcc/pr19307.cc] +!52 = metadata !{i32 5, i32 0, metadata !53, null} +!53 = metadata !{i32 786443, metadata !1, metadata !51, i32 5, i32 0, i32 1, i32 1} ; [ DW_TAG_lexical_block ] [/llvm_cmake_gcc/pr19307.cc] +!54 = metadata !{i32 6, i32 0, metadata !51, null} +!55 = metadata !{i32 7, i32 0, metadata !13, null} +!56 = metadata !{i32 8, i32 0, metadata !13, null} ; [ DW_TAG_imported_declaration ] +!57 = metadata !{i32 9, i32 0, metadata !13, null} + diff --git a/test/DebugInfo/X86/pr9951.ll b/test/DebugInfo/X86/pr9951.ll deleted file mode 100644 index d933beb5536f..000000000000 --- a/test/DebugInfo/X86/pr9951.ll +++ /dev/null @@ -1,27 +0,0 @@ -; RUN: llc -mtriple x86_64-apple-darwin10.0.0 -disable-cfi %s -o - | FileCheck %s - -define i32 @f() nounwind { -entry: - ret i32 42 -} - -!llvm.dbg.cu = !{!2} -!llvm.module.flags = !{!9} -!6 = metadata !{metadata !0} - -!0 = metadata !{i32 786478, metadata !7, metadata !1, metadata !"f", metadata !"f", metadata !"", i32 1, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @f, null, null, null, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [f] -!1 = metadata !{i32 786473, metadata !7} ; [ DW_TAG_file_type ] -!2 = metadata !{i32 786449, metadata !7, i32 12, metadata !"clang version 3.0 ()", i1 true, metadata !"", i32 0, metadata !8, metadata !8, metadata !6, null, null, metadata !""} ; [ DW_TAG_compile_unit ] -!3 = metadata !{i32 786453, metadata !7, metadata !1, metadata !"", i32 0, i64 0, i64 0, i32 0, i32 0, null, metadata !4, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!4 = metadata !{metadata !5} -!5 = metadata !{i32 786468, null, metadata !2, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] -!7 = metadata !{metadata !"/home/espindola/llvm/test.c", metadata !"/home/espindola/llvm/build-rust2"} -!8 = metadata !{i32 0} - -; CHECK: _f: ## @f -; CHECK-NEXT: Ltmp0: - -; CHECK: Ltmp9 = (Ltmp3-Ltmp2)-0 -; CHECK-NEXT: .long Ltmp9 -; CHECK-NEXT: .quad Ltmp0 -!9 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/DebugInfo/X86/prologue-stack.ll b/test/DebugInfo/X86/prologue-stack.ll index b37e41ac8c9f..a5bae841fa3c 100644 --- a/test/DebugInfo/X86/prologue-stack.ll +++ b/test/DebugInfo/X86/prologue-stack.ll @@ -22,7 +22,7 @@ declare i32 @callme(i32) !llvm.module.flags = !{!14} !0 = metadata !{i32 786449, metadata !13, i32 12, metadata !"clang version 3.2 (trunk 164980) (llvm/trunk 164979)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/bar.c] [DW_LANG_C99] -!1 = metadata !{i32 0} +!1 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 786478, metadata !13, metadata !6, metadata !"isel_line_test2", metadata !"isel_line_test2", metadata !"", i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @isel_line_test2, null, null, metadata !1, i32 4} ; [ DW_TAG_subprogram ] [line 3] [def] [scope 4] [isel_line_test2] !6 = metadata !{i32 786473, metadata !13} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/ref_addr_relocation.ll b/test/DebugInfo/X86/ref_addr_relocation.ll index fc5197d78ebe..76e6aa6777ec 100644 --- a/test/DebugInfo/X86/ref_addr_relocation.ll +++ b/test/DebugInfo/X86/ref_addr_relocation.ll @@ -55,7 +55,7 @@ !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} +!2 = metadata !{} !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"} diff --git a/test/DebugInfo/X86/reference-argument.ll b/test/DebugInfo/X86/reference-argument.ll index be54386a4267..4a6bdca550fd 100644 --- a/test/DebugInfo/X86/reference-argument.ll +++ b/test/DebugInfo/X86/reference-argument.ll @@ -34,7 +34,7 @@ declare void @_ZN4SValD2Ev(%class.SVal* %this) !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [aggregate-indirect-arg.cpp] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !"aggregate-indirect-arg.cpp", metadata !""} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4, metadata !29, metadata !33, metadata !34, metadata !35} !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"bar", metadata !"bar", metadata !"_Z3barR4SVal", i32 19, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.SVal*)* @_Z3barR4SVal, null, null, metadata !2, i32 19} ; [ DW_TAG_subprogram ] [line 19] [def] [bar] !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [aggregate-indirect-arg.cpp] diff --git a/test/DebugInfo/X86/rvalue-ref.ll b/test/DebugInfo/X86/rvalue-ref.ll index e9ea42718c84..b8ed0218568f 100644 --- a/test/DebugInfo/X86/rvalue-ref.ll +++ b/test/DebugInfo/X86/rvalue-ref.ll @@ -24,7 +24,7 @@ declare i32 @printf(i8*, ...) !llvm.module.flags = !{!17} !0 = metadata !{i32 786449, metadata !16, i32 4, metadata !"clang version 3.2 (trunk 157054) (llvm/trunk 157060)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!1 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 786478, metadata !16, metadata !6, metadata !"foo", metadata !"foo", metadata !"_Z3fooOi", i32 4, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i32*)* @_Z3fooOi, null, null, metadata !1, i32 5} ; [ DW_TAG_subprogram ] !6 = metadata !{i32 786473, metadata !16} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/sret.ll b/test/DebugInfo/X86/sret.ll new file mode 100644 index 000000000000..faf51583848f --- /dev/null +++ b/test/DebugInfo/X86/sret.ll @@ -0,0 +1,393 @@ +; RUN: llc -split-dwarf=Enable -O0 %s -mtriple=x86_64-unknown-linux-gnu -filetype=obj -o %t +; RUN: llvm-dwarfdump -debug-dump=all %t | FileCheck %s + +; Based on the debuginfo-tests/sret.cpp code. + +; CHECK: DW_AT_GNU_dwo_id [DW_FORM_data8] (0x5b59949640ec1580) +; CHECK: DW_AT_GNU_dwo_id [DW_FORM_data8] (0x5b59949640ec1580) + +%class.A = type { i32 (...)**, i32 } +%class.B = type { i8 } + +@_ZTV1A = linkonce_odr unnamed_addr constant [4 x i8*] [i8* null, i8* bitcast ({ i8*, i8* }* @_ZTI1A to i8*), i8* bitcast (void (%class.A*)* @_ZN1AD2Ev to i8*), i8* bitcast (void (%class.A*)* @_ZN1AD0Ev to i8*)] +@_ZTVN10__cxxabiv117__class_type_infoE = external global i8* +@_ZTS1A = linkonce_odr constant [3 x i8] c"1A\00" +@_ZTI1A = linkonce_odr constant { i8*, i8* } { i8* bitcast (i8** getelementptr inbounds (i8** @_ZTVN10__cxxabiv117__class_type_infoE, i64 2) to i8*), i8* getelementptr inbounds ([3 x i8]* @_ZTS1A, i32 0, i32 0) } + +@_ZN1AC1Ei = alias void (%class.A*, i32)* @_ZN1AC2Ei +@_ZN1AC1ERKS_ = alias void (%class.A*, %class.A*)* @_ZN1AC2ERKS_ + +; Function Attrs: nounwind uwtable +define void @_ZN1AC2Ei(%class.A* %this, i32 %i) unnamed_addr #0 align 2 { +entry: + %this.addr = alloca %class.A*, align 8 + %i.addr = alloca i32, align 4 + store %class.A* %this, %class.A** %this.addr, align 8 + call void @llvm.dbg.declare(metadata !{%class.A** %this.addr}, metadata !67), !dbg !69 + store i32 %i, i32* %i.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %i.addr}, metadata !70), !dbg !71 + %this1 = load %class.A** %this.addr + %0 = bitcast %class.A* %this1 to i8***, !dbg !72 + store i8** getelementptr inbounds ([4 x i8*]* @_ZTV1A, i64 0, i64 2), i8*** %0, !dbg !72 + %m_int = getelementptr inbounds %class.A* %this1, i32 0, i32 1, !dbg !72 + %1 = load i32* %i.addr, align 4, !dbg !72 + store i32 %1, i32* %m_int, align 4, !dbg !72 + ret void, !dbg !73 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +; Function Attrs: nounwind uwtable +define void @_ZN1AC2ERKS_(%class.A* %this, %class.A* %rhs) unnamed_addr #0 align 2 { +entry: + %this.addr = alloca %class.A*, align 8 + %rhs.addr = alloca %class.A*, align 8 + store %class.A* %this, %class.A** %this.addr, align 8 + call void @llvm.dbg.declare(metadata !{%class.A** %this.addr}, metadata !74), !dbg !75 + store %class.A* %rhs, %class.A** %rhs.addr, align 8 + call void @llvm.dbg.declare(metadata !{%class.A** %rhs.addr}, metadata !76), !dbg !77 + %this1 = load %class.A** %this.addr + %0 = bitcast %class.A* %this1 to i8***, !dbg !78 + store i8** getelementptr inbounds ([4 x i8*]* @_ZTV1A, i64 0, i64 2), i8*** %0, !dbg !78 + %m_int = getelementptr inbounds %class.A* %this1, i32 0, i32 1, !dbg !78 + %1 = load %class.A** %rhs.addr, align 8, !dbg !78 + %m_int2 = getelementptr inbounds %class.A* %1, i32 0, i32 1, !dbg !78 + %2 = load i32* %m_int2, align 4, !dbg !78 + store i32 %2, i32* %m_int, align 4, !dbg !78 + ret void, !dbg !79 +} + +; Function Attrs: nounwind uwtable +define %class.A* @_ZN1AaSERKS_(%class.A* %this, %class.A* %rhs) #0 align 2 { +entry: + %this.addr = alloca %class.A*, align 8 + %rhs.addr = alloca %class.A*, align 8 + store %class.A* %this, %class.A** %this.addr, align 8 + call void @llvm.dbg.declare(metadata !{%class.A** %this.addr}, metadata !80), !dbg !81 + store %class.A* %rhs, %class.A** %rhs.addr, align 8 + call void @llvm.dbg.declare(metadata !{%class.A** %rhs.addr}, metadata !82), !dbg !83 + %this1 = load %class.A** %this.addr + %0 = load %class.A** %rhs.addr, align 8, !dbg !84 + %m_int = getelementptr inbounds %class.A* %0, i32 0, i32 1, !dbg !84 + %1 = load i32* %m_int, align 4, !dbg !84 + %m_int2 = getelementptr inbounds %class.A* %this1, i32 0, i32 1, !dbg !84 + store i32 %1, i32* %m_int2, align 4, !dbg !84 + ret %class.A* %this1, !dbg !85 +} + +; Function Attrs: nounwind uwtable +define i32 @_ZN1A7get_intEv(%class.A* %this) #0 align 2 { +entry: + %this.addr = alloca %class.A*, align 8 + store %class.A* %this, %class.A** %this.addr, align 8 + call void @llvm.dbg.declare(metadata !{%class.A** %this.addr}, metadata !86), !dbg !87 + %this1 = load %class.A** %this.addr + %m_int = getelementptr inbounds %class.A* %this1, i32 0, i32 1, !dbg !88 + %0 = load i32* %m_int, align 4, !dbg !88 + ret i32 %0, !dbg !88 +} + +; Function Attrs: uwtable +define void @_ZN1B9AInstanceEv(%class.A* noalias sret %agg.result, %class.B* %this) #2 align 2 { +entry: + %this.addr = alloca %class.B*, align 8 + %nrvo = alloca i1 + %cleanup.dest.slot = alloca i32 + store %class.B* %this, %class.B** %this.addr, align 8 + call void @llvm.dbg.declare(metadata !{%class.B** %this.addr}, metadata !89), !dbg !91 + %this1 = load %class.B** %this.addr + store i1 false, i1* %nrvo, !dbg !92 + call void @llvm.dbg.declare(metadata !{%class.A* %agg.result}, metadata !93), !dbg !92 + call void @_ZN1AC1Ei(%class.A* %agg.result, i32 12), !dbg !92 + store i1 true, i1* %nrvo, !dbg !94 + store i32 1, i32* %cleanup.dest.slot + %nrvo.val = load i1* %nrvo, !dbg !95 + br i1 %nrvo.val, label %nrvo.skipdtor, label %nrvo.unused, !dbg !95 + +nrvo.unused: ; preds = %entry + call void @_ZN1AD2Ev(%class.A* %agg.result), !dbg !96 + br label %nrvo.skipdtor, !dbg !96 + +nrvo.skipdtor: ; preds = %nrvo.unused, %entry + ret void, !dbg !98 +} + +; Function Attrs: nounwind uwtable +define linkonce_odr void @_ZN1AD2Ev(%class.A* %this) unnamed_addr #0 align 2 { +entry: + %this.addr = alloca %class.A*, align 8 + store %class.A* %this, %class.A** %this.addr, align 8 + call void @llvm.dbg.declare(metadata !{%class.A** %this.addr}, metadata !101), !dbg !102 + %this1 = load %class.A** %this.addr + ret void, !dbg !103 +} + +; Function Attrs: uwtable +define i32 @main(i32 %argc, i8** %argv) #2 { +entry: + %retval = alloca i32, align 4 + %argc.addr = alloca i32, align 4 + %argv.addr = alloca i8**, align 8 + %b = alloca %class.B, align 1 + %return_val = alloca i32, align 4 + %temp.lvalue = alloca %class.A, align 8 + %exn.slot = alloca i8* + %ehselector.slot = alloca i32 + %a = alloca %class.A, align 8 + %cleanup.dest.slot = alloca i32 + store i32 0, i32* %retval + store i32 %argc, i32* %argc.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %argc.addr}, metadata !104), !dbg !105 + store i8** %argv, i8*** %argv.addr, align 8 + call void @llvm.dbg.declare(metadata !{i8*** %argv.addr}, metadata !106), !dbg !105 + call void @llvm.dbg.declare(metadata !{%class.B* %b}, metadata !107), !dbg !108 + call void @_ZN1BC2Ev(%class.B* %b), !dbg !108 + call void @llvm.dbg.declare(metadata !{i32* %return_val}, metadata !109), !dbg !110 + call void @_ZN1B9AInstanceEv(%class.A* sret %temp.lvalue, %class.B* %b), !dbg !110 + %call = invoke i32 @_ZN1A7get_intEv(%class.A* %temp.lvalue) + to label %invoke.cont unwind label %lpad, !dbg !110 + +invoke.cont: ; preds = %entry + call void @_ZN1AD2Ev(%class.A* %temp.lvalue), !dbg !111 + store i32 %call, i32* %return_val, align 4, !dbg !111 + call void @llvm.dbg.declare(metadata !{%class.A* %a}, metadata !113), !dbg !114 + call void @_ZN1B9AInstanceEv(%class.A* sret %a, %class.B* %b), !dbg !114 + %0 = load i32* %return_val, align 4, !dbg !115 + store i32 %0, i32* %retval, !dbg !115 + store i32 1, i32* %cleanup.dest.slot + call void @_ZN1AD2Ev(%class.A* %a), !dbg !116 + %1 = load i32* %retval, !dbg !116 + ret i32 %1, !dbg !116 + +lpad: ; preds = %entry + %2 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + cleanup, !dbg !116 + %3 = extractvalue { i8*, i32 } %2, 0, !dbg !116 + store i8* %3, i8** %exn.slot, !dbg !116 + %4 = extractvalue { i8*, i32 } %2, 1, !dbg !116 + store i32 %4, i32* %ehselector.slot, !dbg !116 + invoke void @_ZN1AD2Ev(%class.A* %temp.lvalue) + to label %invoke.cont1 unwind label %terminate.lpad, !dbg !116 + +invoke.cont1: ; preds = %lpad + br label %eh.resume, !dbg !117 + +eh.resume: ; preds = %invoke.cont1 + %exn = load i8** %exn.slot, !dbg !119 + %sel = load i32* %ehselector.slot, !dbg !119 + %lpad.val = insertvalue { i8*, i32 } undef, i8* %exn, 0, !dbg !119 + %lpad.val2 = insertvalue { i8*, i32 } %lpad.val, i32 %sel, 1, !dbg !119 + resume { i8*, i32 } %lpad.val2, !dbg !119 + +terminate.lpad: ; preds = %lpad + %5 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + catch i8* null, !dbg !121 + %6 = extractvalue { i8*, i32 } %5, 0, !dbg !121 + call void @__clang_call_terminate(i8* %6) #5, !dbg !121 + unreachable, !dbg !121 +} + +; Function Attrs: nounwind uwtable +define linkonce_odr void @_ZN1BC2Ev(%class.B* %this) unnamed_addr #0 align 2 { +entry: + %this.addr = alloca %class.B*, align 8 + store %class.B* %this, %class.B** %this.addr, align 8 + call void @llvm.dbg.declare(metadata !{%class.B** %this.addr}, metadata !123), !dbg !124 + %this1 = load %class.B** %this.addr + ret void, !dbg !125 +} + +declare i32 @__gxx_personality_v0(...) + +; Function Attrs: noinline noreturn nounwind +define linkonce_odr hidden void @__clang_call_terminate(i8*) #3 { + %2 = call i8* @__cxa_begin_catch(i8* %0) #6 + call void @_ZSt9terminatev() #5 + unreachable +} + +declare i8* @__cxa_begin_catch(i8*) + +declare void @_ZSt9terminatev() + +; Function Attrs: uwtable +define linkonce_odr void @_ZN1AD0Ev(%class.A* %this) unnamed_addr #2 align 2 { +entry: + %this.addr = alloca %class.A*, align 8 + %exn.slot = alloca i8* + %ehselector.slot = alloca i32 + store %class.A* %this, %class.A** %this.addr, align 8 + call void @llvm.dbg.declare(metadata !{%class.A** %this.addr}, metadata !126), !dbg !127 + %this1 = load %class.A** %this.addr + invoke void @_ZN1AD2Ev(%class.A* %this1) + to label %invoke.cont unwind label %lpad, !dbg !128 + +invoke.cont: ; preds = %entry + %0 = bitcast %class.A* %this1 to i8*, !dbg !129 + call void @_ZdlPv(i8* %0) #7, !dbg !129 + ret void, !dbg !129 + +lpad: ; preds = %entry + %1 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) + cleanup, !dbg !131 + %2 = extractvalue { i8*, i32 } %1, 0, !dbg !131 + store i8* %2, i8** %exn.slot, !dbg !131 + %3 = extractvalue { i8*, i32 } %1, 1, !dbg !131 + store i32 %3, i32* %ehselector.slot, !dbg !131 + %4 = bitcast %class.A* %this1 to i8*, !dbg !131 + call void @_ZdlPv(i8* %4) #7, !dbg !131 + br label %eh.resume, !dbg !131 + +eh.resume: ; preds = %lpad + %exn = load i8** %exn.slot, !dbg !133 + %sel = load i32* %ehselector.slot, !dbg !133 + %lpad.val = insertvalue { i8*, i32 } undef, i8* %exn, 0, !dbg !133 + %lpad.val2 = insertvalue { i8*, i32 } %lpad.val, i32 %sel, 1, !dbg !133 + resume { i8*, i32 } %lpad.val2, !dbg !133 +} + +; Function Attrs: nobuiltin nounwind +declare void @_ZdlPv(i8*) #4 + +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } +attributes #2 = { uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #3 = { noinline noreturn nounwind } +attributes #4 = { nobuiltin nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #5 = { noreturn nounwind } +attributes #6 = { nounwind } +attributes #7 = { builtin nounwind } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!64, !65} +!llvm.ident = !{!66} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 (trunk 203283) (llvm/trunk 203307)", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !48, metadata !2, metadata !2, metadata !"sret.dwo", i32 1} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/sret.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"sret.cpp", metadata !"/usr/local/google/home/echristo/tmp"} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !37} +!4 = metadata !{i32 786434, metadata !1, null, metadata !"A", i32 1, i64 128, i64 64, i32 0, i32 0, null, metadata !5, i32 0, metadata !"_ZTS1A", null, metadata !"_ZTS1A"} ; [ DW_TAG_class_type ] [A] [line 1, size 128, align 64, offset 0] [def] [from ] +!5 = metadata !{metadata !6, metadata !13, metadata !14, metadata !19, metadata !25, metadata !29, metadata !33} +!6 = metadata !{i32 786445, metadata !1, metadata !7, metadata !"_vptr$A", i32 0, i64 64, i64 0, i64 0, i32 64, metadata !8} ; [ DW_TAG_member ] [_vptr$A] [line 0, size 64, align 0, offset 0] [artificial] [from ] +!7 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/usr/local/google/home/echristo/tmp/sret.cpp] +!8 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 0, i64 0, i32 0, metadata !9} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 0, offset 0] [from __vtbl_ptr_type] +!9 = metadata !{i32 786447, null, null, metadata !"__vtbl_ptr_type", i32 0, i64 64, i64 0, i64 0, i32 0, metadata !10} ; [ DW_TAG_pointer_type ] [__vtbl_ptr_type] [line 0, size 64, align 0, offset 0] [from ] +!10 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !11, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!11 = metadata !{metadata !12} +!12 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!13 = metadata !{i32 786445, metadata !1, metadata !"_ZTS1A", metadata !"m_int", i32 13, i64 32, i64 32, i64 64, i32 2, metadata !12} ; [ DW_TAG_member ] [m_int] [line 13, size 32, align 32, offset 64] [protected] [from int] +!14 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1A", metadata !"A", metadata !"A", metadata !"", i32 4, metadata !15, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, null, i32 4} ; [ DW_TAG_subprogram ] [line 4] [A] +!15 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !16, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!16 = metadata !{null, metadata !17, metadata !12} +!17 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !"_ZTS1A"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from _ZTS1A] +!19 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1A", metadata !"A", metadata !"A", metadata !"", i32 5, metadata !20, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, null, i32 5} ; [ DW_TAG_subprogram ] [line 5] [A] +!20 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !21, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!21 = metadata !{null, metadata !17, metadata !22} +!22 = metadata !{i32 786448, null, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !23} ; [ DW_TAG_reference_type ] [line 0, size 0, align 0, offset 0] [from ] +!23 = metadata !{i32 786470, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !"_ZTS1A"} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from _ZTS1A] +!25 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1A", metadata !"operator=", metadata !"operator=", metadata !"_ZN1AaSERKS_", i32 7, metadata !26, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, null, i32 7} ; [ DW_TAG_subprogram ] [line 7] [operator=] +!26 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !27, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!27 = metadata !{metadata !22, metadata !17, metadata !22} +!29 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1A", metadata !"~A", metadata !"~A", metadata !"", i32 8, metadata !30, i1 false, i1 false, i32 1, i32 0, metadata !"_ZTS1A", i32 256, i1 false, null, null, i32 0, null, i32 8} ; [ DW_TAG_subprogram ] [line 8] [~A] +!30 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !31, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!31 = metadata !{null, metadata !17} +!33 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1A", metadata !"get_int", metadata !"get_int", metadata !"_ZN1A7get_intEv", i32 10, metadata !34, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, null, i32 10} ; [ DW_TAG_subprogram ] [line 10] [get_int] +!34 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !35, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!35 = metadata !{metadata !12, metadata !17} +!37 = metadata !{i32 786434, metadata !1, null, metadata !"B", i32 38, i64 8, i64 8, i32 0, i32 0, null, metadata !38, i32 0, null, null, metadata !"_ZTS1B"} ; [ DW_TAG_class_type ] [B] [line 38, size 8, align 8, offset 0] [def] [from ] +!38 = metadata !{metadata !39, metadata !44} +!39 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1B", metadata !"B", metadata !"B", metadata !"", i32 41, metadata !40, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, null, i32 41} ; [ DW_TAG_subprogram ] [line 41] [B] +!40 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !41, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!41 = metadata !{null, metadata !42} +!42 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !"_ZTS1B"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from _ZTS1B] +!44 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1B", metadata !"AInstance", metadata !"AInstance", metadata !"_ZN1B9AInstanceEv", i32 43, metadata !45, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, null, i32 43} ; [ DW_TAG_subprogram ] [line 43] [AInstance] +!45 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !46, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!46 = metadata !{metadata !4, metadata !42} +!48 = metadata !{metadata !49, metadata !50, metadata !51, metadata !52, metadata !53, metadata !54, metadata !61, metadata !62, metadata !63} +!49 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1A", metadata !"A", metadata !"A", metadata !"_ZN1AC2Ei", i32 16, metadata !15, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.A*, i32)* @_ZN1AC2Ei, null, metadata !14, metadata !2, i32 18} ; [ DW_TAG_subprogram ] [line 16] [def] [scope 18] [A] +!50 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1A", metadata !"A", metadata !"A", metadata !"_ZN1AC2ERKS_", i32 21, metadata !20, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.A*, %class.A*)* @_ZN1AC2ERKS_, null, metadata !19, metadata !2, i32 23} ; [ DW_TAG_subprogram ] [line 21] [def] [scope 23] [A] +!51 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1A", metadata !"operator=", metadata !"operator=", metadata !"_ZN1AaSERKS_", i32 27, metadata !26, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, %class.A* (%class.A*, %class.A*)* @_ZN1AaSERKS_, null, metadata !25, metadata !2, i32 28} ; [ DW_TAG_subprogram ] [line 27] [def] [scope 28] [operator=] +!52 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1A", metadata !"get_int", metadata !"get_int", metadata !"_ZN1A7get_intEv", i32 33, metadata !34, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (%class.A*)* @_ZN1A7get_intEv, null, metadata !33, metadata !2, i32 34} ; [ DW_TAG_subprogram ] [line 33] [def] [scope 34] [get_int] +!53 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1B", metadata !"AInstance", metadata !"AInstance", metadata !"_ZN1B9AInstanceEv", i32 47, metadata !45, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.A*, %class.B*)* @_ZN1B9AInstanceEv, null, metadata !44, metadata !2, i32 48} ; [ DW_TAG_subprogram ] [line 47] [def] [scope 48] [AInstance] +!54 = metadata !{i32 786478, metadata !1, metadata !7, metadata !"main", metadata !"main", metadata !"", i32 53, metadata !55, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32, i8**)* @main, null, null, metadata !2, i32 54} ; [ DW_TAG_subprogram ] [line 53] [def] [scope 54] [main] +!55 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !56, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!56 = metadata !{metadata !12, metadata !12, metadata !57} +!57 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !58} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ] +!58 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !59} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ] +!59 = metadata !{i32 786470, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !60} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from char] +!60 = metadata !{i32 786468, null, null, metadata !"char", i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] [char] [line 0, size 8, align 8, offset 0, enc DW_ATE_signed_char] +!61 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1A", metadata !"~A", metadata !"~A", metadata !"_ZN1AD0Ev", i32 8, metadata !30, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.A*)* @_ZN1AD0Ev, null, metadata !29, metadata !2, i32 8} ; [ DW_TAG_subprogram ] [line 8] [def] [~A] +!62 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1B", metadata !"B", metadata !"B", metadata !"_ZN1BC2Ev", i32 41, metadata !40, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.B*)* @_ZN1BC2Ev, null, metadata !39, metadata !2, i32 41} ; [ DW_TAG_subprogram ] [line 41] [def] [B] +!63 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1A", metadata !"~A", metadata !"~A", metadata !"_ZN1AD2Ev", i32 8, metadata !30, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.A*)* @_ZN1AD2Ev, null, metadata !29, metadata !2, i32 8} ; [ DW_TAG_subprogram ] [line 8] [def] [~A] +!64 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!65 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!66 = metadata !{metadata !"clang version 3.5.0 (trunk 203283) (llvm/trunk 203307)"} +!67 = metadata !{i32 786689, metadata !49, metadata !"this", null, i32 16777216, metadata !68, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!68 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !"_ZTS1A"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from _ZTS1A] +!69 = metadata !{i32 0, i32 0, metadata !49, null} +!70 = metadata !{i32 786689, metadata !49, metadata !"i", metadata !7, i32 33554448, metadata !12, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [i] [line 16] +!71 = metadata !{i32 16, i32 0, metadata !49, null} +!72 = metadata !{i32 18, i32 0, metadata !49, null} +!73 = metadata !{i32 19, i32 0, metadata !49, null} +!74 = metadata !{i32 786689, metadata !50, metadata !"this", null, i32 16777216, metadata !68, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!75 = metadata !{i32 0, i32 0, metadata !50, null} +!76 = metadata !{i32 786689, metadata !50, metadata !"rhs", metadata !7, i32 33554453, metadata !22, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [rhs] [line 21] +!77 = metadata !{i32 21, i32 0, metadata !50, null} +!78 = metadata !{i32 23, i32 0, metadata !50, null} +!79 = metadata !{i32 24, i32 0, metadata !50, null} +!80 = metadata !{i32 786689, metadata !51, metadata !"this", null, i32 16777216, metadata !68, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!81 = metadata !{i32 0, i32 0, metadata !51, null} +!82 = metadata !{i32 786689, metadata !51, metadata !"rhs", metadata !7, i32 33554459, metadata !22, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [rhs] [line 27] +!83 = metadata !{i32 27, i32 0, metadata !51, null} +!84 = metadata !{i32 29, i32 0, metadata !51, null} +!85 = metadata !{i32 30, i32 0, metadata !51, null} +!86 = metadata !{i32 786689, metadata !52, metadata !"this", null, i32 16777216, metadata !68, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!87 = metadata !{i32 0, i32 0, metadata !52, null} +!88 = metadata !{i32 35, i32 0, metadata !52, null} +!89 = metadata !{i32 786689, metadata !53, metadata !"this", null, i32 16777216, metadata !90, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!90 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !"_ZTS1B"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from _ZTS1B] +!91 = metadata !{i32 0, i32 0, metadata !53, null} +!92 = metadata !{i32 49, i32 0, metadata !53, null} +!93 = metadata !{i32 786688, metadata !53, metadata !"a", metadata !7, i32 49, metadata !4, i32 8192, i32 0} ; [ DW_TAG_auto_variable ] [a] [line 49] +!94 = metadata !{i32 50, i32 0, metadata !53, null} +!95 = metadata !{i32 51, i32 0, metadata !53, null} +!96 = metadata !{i32 51, i32 0, metadata !97, null} +!97 = metadata !{i32 786443, metadata !1, metadata !53, i32 51, i32 0, i32 2, i32 5} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/tmp/sret.cpp] +!98 = metadata !{i32 51, i32 0, metadata !99, null} +!99 = metadata !{i32 786443, metadata !1, metadata !100, i32 51, i32 0, i32 3, i32 6} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/tmp/sret.cpp] +!100 = metadata !{i32 786443, metadata !1, metadata !53, i32 51, i32 0, i32 1, i32 4} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/tmp/sret.cpp] +!101 = metadata !{i32 786689, metadata !63, metadata !"this", null, i32 16777216, metadata !68, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!102 = metadata !{i32 0, i32 0, metadata !63, null} +!103 = metadata !{i32 8, i32 0, metadata !63, null} ; [ DW_TAG_imported_declaration ] +!104 = metadata !{i32 786689, metadata !54, metadata !"argc", metadata !7, i32 16777269, metadata !12, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [argc] [line 53] +!105 = metadata !{i32 53, i32 0, metadata !54, null} +!106 = metadata !{i32 786689, metadata !54, metadata !"argv", metadata !7, i32 33554485, metadata !57, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [argv] [line 53] +!107 = metadata !{i32 786688, metadata !54, metadata !"b", metadata !7, i32 55, metadata !37, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [b] [line 55] +!108 = metadata !{i32 55, i32 0, metadata !54, null} +!109 = metadata !{i32 786688, metadata !54, metadata !"return_val", metadata !7, i32 56, metadata !12, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [return_val] [line 56] +!110 = metadata !{i32 56, i32 0, metadata !54, null} +!111 = metadata !{i32 56, i32 0, metadata !112, null} +!112 = metadata !{i32 786443, metadata !1, metadata !54, i32 56, i32 0, i32 1, i32 7} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/tmp/sret.cpp] +!113 = metadata !{i32 786688, metadata !54, metadata !"a", metadata !7, i32 58, metadata !4, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [a] [line 58] +!114 = metadata !{i32 58, i32 0, metadata !54, null} ; [ DW_TAG_imported_module ] +!115 = metadata !{i32 59, i32 0, metadata !54, null} +!116 = metadata !{i32 60, i32 0, metadata !54, null} +!117 = metadata !{i32 60, i32 0, metadata !118, null} +!118 = metadata !{i32 786443, metadata !1, metadata !54, i32 60, i32 0, i32 1, i32 8} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/tmp/sret.cpp] +!119 = metadata !{i32 60, i32 0, metadata !120, null} +!120 = metadata !{i32 786443, metadata !1, metadata !54, i32 60, i32 0, i32 3, i32 10} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/tmp/sret.cpp] +!121 = metadata !{i32 60, i32 0, metadata !122, null} +!122 = metadata !{i32 786443, metadata !1, metadata !54, i32 60, i32 0, i32 2, i32 9} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/tmp/sret.cpp] +!123 = metadata !{i32 786689, metadata !62, metadata !"this", null, i32 16777216, metadata !90, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!124 = metadata !{i32 0, i32 0, metadata !62, null} +!125 = metadata !{i32 41, i32 0, metadata !62, null} +!126 = metadata !{i32 786689, metadata !61, metadata !"this", null, i32 16777216, metadata !68, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!127 = metadata !{i32 0, i32 0, metadata !61, null} +!128 = metadata !{i32 8, i32 0, metadata !61, null} ; [ DW_TAG_imported_declaration ] +!129 = metadata !{i32 8, i32 0, metadata !130, null} ; [ DW_TAG_imported_declaration ] +!130 = metadata !{i32 786443, metadata !1, metadata !61, i32 8, i32 0, i32 1, i32 11} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/tmp/sret.cpp] +!131 = metadata !{i32 8, i32 0, metadata !132, null} ; [ DW_TAG_imported_declaration ] +!132 = metadata !{i32 786443, metadata !1, metadata !61, i32 8, i32 0, i32 2, i32 12} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/tmp/sret.cpp] +!133 = metadata !{i32 8, i32 0, metadata !134, null} ; [ DW_TAG_imported_declaration ] +!134 = metadata !{i32 786443, metadata !1, metadata !61, i32 8, i32 0, i32 3, i32 13} ; [ DW_TAG_lexical_block ] [/usr/local/google/home/echristo/tmp/sret.cpp] diff --git a/test/DebugInfo/X86/stmt-list-multiple-compile-units.ll b/test/DebugInfo/X86/stmt-list-multiple-compile-units.ll index 72eb62f3b436..8816fe77cf01 100644 --- a/test/DebugInfo/X86/stmt-list-multiple-compile-units.ll +++ b/test/DebugInfo/X86/stmt-list-multiple-compile-units.ll @@ -1,16 +1,27 @@ ; RUN: llc -O0 %s -mtriple=x86_64-apple-darwin -filetype=obj -o %t ; RUN: llvm-dwarfdump %t | FileCheck %s +; RUN: llc -O0 %s -mtriple=x86_64-apple-darwin -filetype=obj -o %t -dwarf-version=3 +; RUN: llvm-dwarfdump %t | FileCheck %s -check-prefix=DWARF3 ; RUN: llc < %s -O0 -mtriple=x86_64-apple-macosx10.7 | FileCheck %s -check-prefix=ASM ; rdar://13067005 ; CHECK: .debug_info contents: ; CHECK: DW_TAG_compile_unit -; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) -; CHECK: DW_AT_stmt_list [DW_FORM_data4] (0x00000000) +; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000) +; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) +; CHECK: DW_AT_high_pc [DW_FORM_data4] (0x00000010) +; CHECK: DW_TAG_subprogram +; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) +; CHECK: DW_AT_high_pc [DW_FORM_data4] (0x00000010) ; CHECK: DW_TAG_compile_unit -; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) -; CHECK: DW_AT_stmt_list [DW_FORM_data4] (0x0000003c) +; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset] (0x0000003c) +; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000010) +; CHECK: DW_AT_high_pc [DW_FORM_data4] (0x00000009) +; CHECK: DW_TAG_subprogram +; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000010) +; CHECK: DW_AT_high_pc [DW_FORM_data4] (0x00000009) + ; CHECK: .debug_line contents: ; CHECK-NEXT: Line table prologue: @@ -21,11 +32,30 @@ ; CHECK: file_names[ 1] 0 0x00000000 0x00000000 simple2.c ; CHECK-NOT: file_names +; DWARF3: .debug_info contents: +; DWARF3: DW_TAG_compile_unit +; DWARF3: DW_AT_stmt_list [DW_FORM_data4] (0x00000000) + +; DWARF3: DW_TAG_compile_unit +; DWARF3: DW_AT_stmt_list [DW_FORM_data4] (0x0000003c) + + +; DWARF3: .debug_line contents: +; DWARF3-NEXT: Line table prologue: +; DWARF3-NEXT: total_length: 0x00000038 +; DWARF3: file_names[ 1] 0 0x00000000 0x00000000 simple.c +; DWARF3: Line table prologue: +; DWARF3-NEXT: total_length: 0x00000039 +; DWARF3: file_names[ 1] 0 0x00000000 0x00000000 simple2.c +; DWARF3-NOT: file_names + ; PR15408 ; ASM: L__DWARF__debug_info_begin0: -; ASM: .long 0 ## DW_AT_stmt_list +; ASM: Lset3 = Lline_table_start0-Lsection_line ## DW_AT_stmt_list +; ASM-NEXT: .long Lset3 ; ASM: L__DWARF__debug_info_begin1: -; ASM: .long 0 ## DW_AT_stmt_list +; ASM: Lset13 = Lline_table_start0-Lsection_line ## DW_AT_stmt_list +; ASM-NEXT: .long Lset13 define i32 @test(i32 %a) nounwind uwtable ssp { entry: %a.addr = alloca i32, align 4 @@ -49,15 +79,15 @@ entry: !llvm.dbg.cu = !{!0, !10} !llvm.module.flags = !{!25} -!0 = metadata !{i32 786449, metadata !23, i32 12, metadata !"clang version 3.3", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !23, i32 12, metadata !"clang version 3.3", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] +!1 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 786478, metadata !23, metadata !6, metadata !"test", metadata !"test", metadata !"", i32 2, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @test, null, null, metadata !1, i32 3} ; [ DW_TAG_subprogram ] [line 2] [def] [scope 3] [test] !6 = metadata !{i32 786473, metadata !23} ; [ DW_TAG_file_type ] !7 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !8 = metadata !{metadata !9, metadata !9} !9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] -!10 = metadata !{i32 786449, metadata !24, i32 12, metadata !"clang version 3.3 (trunk 172862)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !11, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!10 = metadata !{i32 786449, metadata !24, i32 12, metadata !"clang version 3.3 (trunk 172862)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !11, metadata !1, metadata !1, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] !11 = metadata !{metadata !13} !13 = metadata !{i32 786478, metadata !24, metadata !14, metadata !"fn", metadata !"fn", metadata !"", i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @fn, null, null, metadata !1, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [fn] !14 = metadata !{i32 786473, metadata !24} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/stmt-list.ll b/test/DebugInfo/X86/stmt-list.ll index 6f846c1589a3..99bd0fc1b580 100644 --- a/test/DebugInfo/X86/stmt-list.ll +++ b/test/DebugInfo/X86/stmt-list.ll @@ -3,7 +3,7 @@ ; CHECK: .section .debug_line,"",@progbits ; CHECK-NEXT: .Lsection_line: -; CHECK: .long .Lsection_line # DW_AT_stmt_list +; CHECK: .long .Lline_table_start0 # DW_AT_stmt_list define void @f() { entry: diff --git a/test/DebugInfo/X86/stringpool.ll b/test/DebugInfo/X86/stringpool.ll index fccac2618cfb..846d2101e590 100644 --- a/test/DebugInfo/X86/stringpool.ll +++ b/test/DebugInfo/X86/stringpool.ll @@ -6,8 +6,8 @@ !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!9} -!0 = metadata !{i32 786449, metadata !8, i32 12, metadata !"clang version 3.1 (trunk 143009)", i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !8, i32 12, metadata !"clang version 3.1 (trunk 143009)", i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 720948, i32 0, null, metadata !"yyyy", metadata !"yyyy", metadata !"", metadata !6, i32 1, metadata !7, i32 0, i32 1, i32* @yyyy, null} ; [ DW_TAG_variable ] !6 = metadata !{i32 720937, metadata !8} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/struct-loc.ll b/test/DebugInfo/X86/struct-loc.ll index 95bdd41fb063..390d8da5d0a5 100644 --- a/test/DebugInfo/X86/struct-loc.ll +++ b/test/DebugInfo/X86/struct-loc.ll @@ -14,8 +14,8 @@ !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!12} -!0 = metadata !{i32 786449, metadata !11, i32 12, metadata !"clang version 3.1 (trunk 152837) (llvm/trunk 152845)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !11, i32 12, metadata !"clang version 3.1 (trunk 152837) (llvm/trunk 152845)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!1 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 786484, i32 0, null, metadata !"f", metadata !"f", metadata !"", metadata !6, i32 5, metadata !7, i32 0, i32 1, %struct.foo* @f, null} ; [ DW_TAG_variable ] !6 = metadata !{i32 786473, metadata !11} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/subrange-type.ll b/test/DebugInfo/X86/subrange-type.ll index 05b147765b15..14dca46c64f3 100644 --- a/test/DebugInfo/X86/subrange-type.ll +++ b/test/DebugInfo/X86/subrange-type.ll @@ -22,7 +22,7 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone !llvm.module.flags = !{!18} !0 = metadata !{i32 786449, metadata !17, i32 12, metadata !"clang version 3.3 (trunk 171472) (llvm/trunk 171487)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/foo.c] [DW_LANG_C99] -!1 = metadata !{i32 0} +!1 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 786478, metadata !6, metadata !6, metadata !"main", metadata !"main", metadata !"", i32 2, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, metadata !1, i32 3} ; [ DW_TAG_subprogram ] [line 2] [def] [scope 3] [main] !6 = metadata !{i32 786473, metadata !17} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/subreg.ll b/test/DebugInfo/X86/subreg.ll index 162c2d166d72..22fd1a80e87b 100644 --- a/test/DebugInfo/X86/subreg.ll +++ b/test/DebugInfo/X86/subreg.ll @@ -2,9 +2,11 @@ ; We are testing that a value in a 16 bit register gets reported as ; being in its superregister. -; FIXME: There should be a DW_OP_bit_piece too. -; CHECK: .byte 80 # DW_OP_reg0 +; CHECK: .byte 80 # super-register +; CHECK-NEXT: # DW_OP_reg0 +; CHECK-NEXT: .byte 147 # DW_OP_piece +; CHECK-NEXT: .byte 2 # 2 define i16 @f(i16 signext %zzz) nounwind { entry: diff --git a/test/DebugInfo/X86/subregisters.ll b/test/DebugInfo/X86/subregisters.ll new file mode 100644 index 000000000000..d46a95f2c994 --- /dev/null +++ b/test/DebugInfo/X86/subregisters.ll @@ -0,0 +1,117 @@ +; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t.o -filetype=obj -O0 +; RUN: llvm-dwarfdump %t.o | FileCheck %s +; +; Test that on x86_64, the 32-bit subregister esi is emitted as +; DW_OP_piece 32 of the 64-bit rsi. +; +; rdar://problem/16015314 +; +; CHECK: DW_AT_location [DW_FORM_block1] (<0x03> 54 93 04 ) +; CHECK: DW_AT_name [DW_FORM_strp]{{.*}} "a" +; +; struct bar { +; int a; +; int b; +; }; +; +; void doSomething() __attribute__ ((noinline)); +; +; void doSomething(struct bar *b) +; { +; int a = b->a; +; printf("%d\n", a); // set breakpoint here +; } +; +; int main() +; { +; struct bar myBar = { 3, 4 }; +; doSomething(&myBar); +; return 0; +; } + +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.9.0" + +%struct.bar = type { i32, i32 } + +@.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 +@main.myBar = private unnamed_addr constant %struct.bar { i32 3, i32 4 }, align 4 + +; Function Attrs: noinline nounwind ssp uwtable +define void @doSomething(%struct.bar* nocapture readonly %b) #0 { +entry: + tail call void @llvm.dbg.value(metadata !{%struct.bar* %b}, i64 0, metadata !15), !dbg !25 + %a1 = getelementptr inbounds %struct.bar* %b, i64 0, i32 0, !dbg !26 + %0 = load i32* %a1, align 4, !dbg !26, !tbaa !27 + tail call void @llvm.dbg.value(metadata !{i32 %0}, i64 0, metadata !16), !dbg !26 + %call = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32 %0) #4, !dbg !32 + ret void, !dbg !33 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +; Function Attrs: nounwind +declare i32 @printf(i8* nocapture readonly, ...) #2 + +; Function Attrs: nounwind ssp uwtable +define i32 @main() #3 { +entry: + %myBar = alloca i64, align 8, !dbg !34 + %tmpcast = bitcast i64* %myBar to %struct.bar*, !dbg !34 + tail call void @llvm.dbg.declare(metadata !{%struct.bar* %tmpcast}, metadata !21), !dbg !34 + store i64 17179869187, i64* %myBar, align 8, !dbg !34 + call void @doSomething(%struct.bar* %tmpcast), !dbg !35 + ret i32 0, !dbg !36 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.value(metadata, i64, metadata) #1 + +attributes #0 = { noinline nounwind ssp uwtable } +attributes #1 = { nounwind readnone } +attributes #2 = { nounwind } +attributes #3 = { nounwind ssp uwtable } +attributes #4 = { nounwind } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!22, !23} +!llvm.ident = !{!24} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5 ", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [subregisters.c] [DW_LANG_C99] +!1 = metadata !{metadata !"subregisters.c", metadata !""} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !17} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"doSomething", metadata !"doSomething", metadata !"", i32 10, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void (%struct.bar*)* @doSomething, null, null, metadata !14, i32 11} ; [ DW_TAG_subprogram ] [line 10] [def] [scope 11] [doSomething] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [subregisters.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{null, metadata !8} +!8 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !9} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from bar] +!9 = metadata !{i32 786451, metadata !1, null, metadata !"bar", i32 3, i64 64, i64 32, i32 0, i32 0, null, metadata !10, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [bar] [line 3, size 64, align 32, offset 0] [def] [from ] +!10 = metadata !{metadata !11, metadata !13} +!11 = metadata !{i32 786445, metadata !1, metadata !9, metadata !"a", i32 4, i64 32, i64 32, i64 0, i32 0, metadata !12} ; [ DW_TAG_member ] [a] [line 4, size 32, align 32, offset 0] [from int] +!12 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!13 = metadata !{i32 786445, metadata !1, metadata !9, metadata !"b", i32 5, i64 32, i64 32, i64 32, i32 0, metadata !12} ; [ DW_TAG_member ] [b] [line 5, size 32, align 32, offset 32] [from int] +!14 = metadata !{metadata !15, metadata !16} +!15 = metadata !{i32 786689, metadata !4, metadata !"b", metadata !5, i32 16777226, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [b] [line 10] +!16 = metadata !{i32 786688, metadata !4, metadata !"a", metadata !5, i32 12, metadata !12, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [a] [line 12] +!17 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"main", metadata !"main", metadata !"", i32 16, metadata !18, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 true, i32 ()* @main, null, null, metadata !20, i32 17} ; [ DW_TAG_subprogram ] [line 16] [def] [scope 17] [main] +!18 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !19, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!19 = metadata !{metadata !12} +!20 = metadata !{metadata !21} +!21 = metadata !{i32 786688, metadata !17, metadata !"myBar", metadata !5, i32 18, metadata !9, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [myBar] [line 18] +!22 = metadata !{i32 2, metadata !"Dwarf Version", i32 2} +!23 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!24 = metadata !{metadata !"clang version 3.5 "} +!25 = metadata !{i32 10, i32 0, metadata !4, null} +!26 = metadata !{i32 12, i32 0, metadata !4, null} +!27 = metadata !{metadata !28, metadata !29, i64 0} +!28 = metadata !{metadata !"bar", metadata !29, i64 0, metadata !29, i64 4} +!29 = metadata !{metadata !"int", metadata !30, i64 0} +!30 = metadata !{metadata !"omnipotent char", metadata !31, i64 0} +!31 = metadata !{metadata !"Simple C/C++ TBAA"} +!32 = metadata !{i32 13, i32 0, metadata !4, null} +!33 = metadata !{i32 14, i32 0, metadata !4, null} +!34 = metadata !{i32 18, i32 0, metadata !17, null} +!35 = metadata !{i32 19, i32 0, metadata !17, null} +!36 = metadata !{i32 20, i32 0, metadata !17, null} diff --git a/test/DebugInfo/X86/template.ll b/test/DebugInfo/X86/template.ll index 64a8f7a87d15..54c351c7bfd3 100644 --- a/test/DebugInfo/X86/template.ll +++ b/test/DebugInfo/X86/template.ll @@ -35,7 +35,7 @@ ; The address of the global 'glbl', followed by DW_OP_stack_value (9f), to use ; the value immediately, rather than indirecting through the address. -; CHECK-NEXT: DW_AT_location [DW_FORM_block1]{{ *}}(<0x0a> 03 00 00 00 00 00 00 00 00 9f ) +; CHECK-NEXT: DW_AT_location [DW_FORM_exprloc]{{ *}}(<0xa> 03 00 00 00 00 00 00 00 00 9f ) ; CHECK-NOT: NULL ; CHECK: DW_TAG_GNU_template_template_param @@ -89,7 +89,7 @@ attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointe !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 (trunk 192849) (llvm/trunk 192850)", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !9, metadata !28, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/bar.cpp] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !"bar.cpp", metadata !"/usr/local/google/home/echristo/tmp"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4, metadata !8} !4 = metadata !{i32 786451, metadata !1, null, metadata !"y_impl<int>", i32 2, i64 8, i64 8, i32 0, i32 0, null, metadata !2, i32 0, null, metadata !5, metadata !"_ZTS6y_implIiE"} ; [ DW_TAG_structure_type ] [y_impl<int>] [line 2, size 8, align 8, offset 0] [def] [from ] !5 = metadata !{metadata !6} diff --git a/test/DebugInfo/X86/tls-fission.ll b/test/DebugInfo/X86/tls-fission.ll deleted file mode 100644 index 8a25aced8b7b..000000000000 --- a/test/DebugInfo/X86/tls-fission.ll +++ /dev/null @@ -1,32 +0,0 @@ -; RUN: llc -split-dwarf=Enable -mtriple=x86_64-linux -O0 -filetype=asm < %s | FileCheck %s - -; FIXME: add relocation and DWARF expression support to llvm-dwarfdump & use -; that here instead of raw assembly printing - -; CHECK: debug_info.dwo -; 3 bytes of data in this DW_FORM_block1 representation of the location of 'tls' -; CHECK: .byte 3{{ *}}# DW_AT_location -; DW_OP_const_index (0xfx == 252) to refer to the debug_addr table -; CHECK-NEXT: .byte 252 -; an index of zero into the debug_addr table -; CHECK-NEXT: .byte 0 -; DW_OP_lo_user based on GCC/GDB extension presumably (by experiment) to support TLS -; CHECK-NEXT: .byte 224 -; check that the expected TLS address description is the first thing in the debug_addr section -; CHECK: debug_addr -; CHECK-NEXT: .quad tls@DTPOFF - -@tls = thread_local global i32 0, align 4 - -!llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!7, !8} - -!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !2, metadata !3, metadata !2, metadata !"tls.dwo"} ; [ DW_TAG_compile_unit ] [/tmp/tls.cpp] [DW_LANG_C_plus_plus] -!1 = metadata !{metadata !"tls.cpp", metadata !"/tmp"} -!2 = metadata !{i32 0} -!3 = metadata !{metadata !4} -!4 = metadata !{i32 786484, i32 0, null, metadata !"tls", metadata !"tls", metadata !"", metadata !5, i32 1, metadata !6, i32 0, i32 1, i32* @tls, null} ; [ DW_TAG_variable ] [tls] [line 1] [def] -!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/tls.cpp] -!6 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] -!7 = metadata !{i32 2, metadata !"Dwarf Version", i32 3} -!8 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/DebugInfo/X86/tls.ll b/test/DebugInfo/X86/tls.ll index 745c2f40f67f..e49b12fbf54d 100644 --- a/test/DebugInfo/X86/tls.ll +++ b/test/DebugInfo/X86/tls.ll @@ -1,35 +1,102 @@ -; RUN: llc -mtriple=x86_64-linux -O0 -filetype=asm < %s | FileCheck %s -; RUN: llc -mtriple=i386-linux -O0 -filetype=asm < %s | FileCheck --check-prefix=CHECK-32 %s +; RUN: llc %s -o - -filetype=asm -O0 -mtriple=x86_64-unknown-linux-gnu \ +; RUN: | FileCheck --check-prefix=CHECK --check-prefix=SINGLE --check-prefix=SINGLE-64 %s + +; RUN: llc %s -o - -filetype=asm -O0 -mtriple=i386-linux-gnu \ +; RUN: | FileCheck --check-prefix=CHECK --check-prefix=SINGLE --check-prefix=SINGLE-32 %s + +; RUN: llc %s -o - -filetype=asm -O0 -mtriple=x86_64-unknown-linux-gnu -split-dwarf=Enable \ +; RUN: | FileCheck --check-prefix=CHECK --check-prefix=FISSION %s ; FIXME: add relocation and DWARF expression support to llvm-dwarfdump & use ; that here instead of raw assembly printing +; FISSION: .section .debug_info.dwo, +; 3 bytes of data in this DW_FORM_block1 representation of the location of 'tls' +; FISSION: .byte 3{{ *}}# DW_AT_location +; DW_OP_GNU_const_index (0xfx == 252) to refer to the debug_addr table +; FISSION-NEXT: .byte 252 +; an index of zero into the debug_addr table +; FISSION-NEXT: .byte 0 + +; SINGLE: .section .debug_info, ; 10 bytes of data in this DW_FORM_block1 representation of the location of 'tls' -; CHECK: .byte 10{{ *}}# DW_AT_location -; DW_OP_const8u (0x0e == 14) of adress -; CHECK: .byte 14 -; The debug relocation of the address of the tls variable -; CHECK: .quad tls@DTPOFF -; DW_OP_lo_user based on GCC/GDB extension presumably (by experiment) to support TLS -; CHECK: .byte 224 +; SINGLE-64: .byte 10 # DW_AT_location +; DW_OP_const8u (0x0e == 14) of address +; SINGLE-64-NEXT: .byte 14 +; SINGLE-64-NEXT: .quad tls@DTPOFF + +; SINGLE-32: .byte 6 # DW_AT_location +; DW_OP_const4u (0x0e == 12) of address +; SINGLE-32-NEXT: .byte 12 +; SINGLE-32-NEXT: .long tls@DTPOFF + +; DW_OP_GNU_push_tls_address +; CHECK-NEXT: .byte 224 + +; FISSION: DW_TAG_variable +; FISSION: .byte 2 # DW_AT_location +; DW_OP_GNU_addr_index +; FISSION-NEXT: .byte 251 +; FISSION-NEXT: .byte 1 + +; FISSION: DW_TAG_template_value_parameter +; FISSION: .byte 3 # DW_AT_location +; DW_OP_GNU_addr_index +; FISSION-NEXT: .byte 251 +; FISSION-NEXT: .byte 1 +; DW_OP_stack_value +; FISSION-NEXT: .byte 159 + +; check that the expected TLS address description is the first thing in the debug_addr section +; FISSION: .section .debug_addr +; FISSION-NEXT: .quad tls@DTPOFF +; FISSION-NEXT: .quad glbl +; FISSION-NOT: .quad glbl + +; Generated from: + +; __thread int tls; +; int glbl; +; +; template <int *I> +; int func() { +; return 0; +; } +; +; template int func<&glbl>(); // create a second reference to 'glbl' + + +@tls = thread_local global i32 0, align 4 +@glbl = global i32 0, align 4 -; same again, except with a 32 bit address -; CHECK-32: .byte 6{{ *}}# DW_AT_location -; CHECK-32: .byte 12 -; CHECK-32: .long tls@DTPOFF -; CHECK-32: .byte 224 +; Function Attrs: nounwind uwtable +define weak_odr i32 @_Z4funcIXadL_Z4glblEEEiv() #0 { +entry: + ret i32 0, !dbg !18 +} -@tls = thread_local global i32 7, align 4 +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } !llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!7, !8} +!llvm.module.flags = !{!15, !16} +!llvm.ident = !{!17} -!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !2, metadata !3, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/tmp/tls.cpp] [DW_LANG_C_plus_plus] -!1 = metadata !{metadata !"tls.cpp", metadata !"/tmp"} -!2 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !12, metadata !2, metadata !"-.dwo"} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/tls.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"tls.cpp", metadata !"/tmp/dbginfo"} +!2 = metadata !{} !3 = metadata !{metadata !4} -!4 = metadata !{i32 786484, i32 0, null, metadata !"tls", metadata !"tls", metadata !"", metadata !5, i32 1, metadata !6, i32 0, i32 1, i32* @tls, null} ; [ DW_TAG_variable ] [tls] [line 1] [def] -!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/tls.cpp] -!6 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] -!7 = metadata !{i32 2, metadata !"Dwarf Version", i32 3} -!8 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"func<&glbl>", metadata !"func<&glbl>", metadata !"_Z4funcIXadL_Z4glblEEEiv", i32 5, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @_Z4funcIXadL_Z4glblEEEiv, metadata !9, null, metadata !2, i32 5} ; [ DW_TAG_subprogram ] [line 5] [def] [func<&glbl>] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/tls.cpp] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{metadata !8} +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{metadata !10} +!10 = metadata !{i32 786480, null, metadata !"I", metadata !11, i32* @glbl, null, i32 0, i32 0} ; [ DW_TAG_template_value_parameter ] +!11 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !8} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int] +!12 = metadata !{metadata !13, metadata !14} +!13 = metadata !{i32 786484, i32 0, null, metadata !"tls", metadata !"tls", metadata !"", metadata !5, i32 1, metadata !8, i32 0, i32 1, i32* @tls, null} ; [ DW_TAG_variable ] [tls] [line 1] [def] +!14 = metadata !{i32 786484, i32 0, null, metadata !"glbl", metadata !"glbl", metadata !"", metadata !5, i32 2, metadata !8, i32 0, i32 1, i32* @glbl, null} ; [ DW_TAG_variable ] [glbl] [line 2] [def] +!15 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!16 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!17 = metadata !{metadata !"clang version 3.5 "} +!18 = metadata !{i32 6, i32 0, metadata !4, null} diff --git a/test/DebugInfo/X86/type_units_with_addresses.ll b/test/DebugInfo/X86/type_units_with_addresses.ll new file mode 100644 index 000000000000..ff278f664465 --- /dev/null +++ b/test/DebugInfo/X86/type_units_with_addresses.ll @@ -0,0 +1,151 @@ +; REQUIRES: object-emission + +; RUN: llc -split-dwarf=Enable -filetype=obj -O0 -generate-type-units -mtriple=x86_64-unknown-linux-gnu < %s \ +; RUN: | llvm-dwarfdump - | FileCheck %s + +; RUN: llc -split-dwarf=Disable -filetype=obj -O0 -generate-type-units -mtriple=x86_64-unknown-linux-gnu < %s \ +; RUN: | llvm-dwarfdump - | FileCheck --check-prefix=SINGLE %s + +; Test case built from: +;int i; +; +;template <int *I> +;struct S1 {}; +; +;S1<&i> s1; +; +;template <int *I> +;struct S2_1 {}; +; +;struct S2 { +; S2_1<&i> s2_1; +;}; +; +;S2 s2; +; +;template <int *I> +;struct S3_1 {}; +; +;struct S3_2 {}; +; +;struct S3 { +; S3_1<&i> s3_1; +; S3_2 s3_2; +;}; +; +;S3 s3; +; +;struct S4_1 {}; +; +;template <int *T> +;struct S4_2 {}; +; +;struct S4 { +; S4_1 s4_1; +; S4_2<&::i> s4_2; +;}; +; +;S4 s4; + + +; CHECK: .debug_info.dwo contents: + +; CHECK: DW_TAG_structure_type +; CHECK-NEXT: DW_AT_name {{.*}}"S1<&i>" + +; CHECK: DW_TAG_structure_type +; CHECK-NEXT: DW_AT_name {{.*}}"S2" +; CHECK: DW_TAG_structure_type +; CHECK-NEXT: DW_AT_name {{.*}}"S2_1<&i>" + +; CHECK: DW_TAG_structure_type +; CHECK-NEXT: DW_AT_name {{.*}}"S3" +; CHECK: DW_TAG_structure_type +; CHECK-NEXT: DW_AT_name {{.*}}"S3_1<&i>" +; CHECK: DW_TAG_structure_type +; CHECK-NEXT: DW_AT_declaration +; CHECK-NEXT: DW_AT_signature + +; CHECK: DW_TAG_structure_type +; CHECK-NEXT: DW_AT_name {{.*}}"S4" +; CHECK: DW_TAG_structure_type +; CHECK-NEXT: DW_AT_declaration +; CHECK-NEXT: DW_AT_signature +; CHECK: DW_TAG_structure_type +; CHECK-NEXT: DW_AT_name {{.*}}"S4_2<&i>" + +; SINGLE: .debug_info contents: + +; SINGLE: DW_TAG_structure_type +; SINGLE-NEXT: DW_AT_declaration +; SINGLE-NEXT: DW_AT_signature + +; SINGLE: DW_TAG_structure_type +; SINGLE-NEXT: DW_AT_declaration +; SINGLE-NEXT: DW_AT_signature + +; SINGLE: DW_TAG_structure_type +; SINGLE-NEXT: DW_AT_declaration +; SINGLE-NEXT: DW_AT_signature + +; SINGLE: DW_TAG_structure_type +; SINGLE-NEXT: DW_AT_declaration +; SINGLE-NEXT: DW_AT_signature + +%struct.S1 = type { i8 } +%struct.S2 = type { %struct.S2_1 } +%struct.S2_1 = type { i8 } +%struct.S3 = type { %struct.S3_1, %struct.S3_2 } +%struct.S3_1 = type { i8 } +%struct.S3_2 = type { i8 } +%struct.S4 = type { %struct.S4_1, %struct.S4_2 } +%struct.S4_1 = type { i8 } +%struct.S4_2 = type { i8 } + +@i = global i32 0, align 4 +@a = global %struct.S1 zeroinitializer, align 1 +@s2 = global %struct.S2 zeroinitializer, align 1 +@s3 = global %struct.S3 zeroinitializer, align 1 +@s4 = global %struct.S4 zeroinitializer, align 1 + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!34, !35} +!llvm.ident = !{!36} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !2, metadata !27, metadata !2, metadata !"tu.dwo", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/tu.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"tu.cpp", metadata !"/tmp/dbginfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !9, metadata !12, metadata !13, metadata !17, metadata !18, metadata !19, metadata !23, metadata !24} +!4 = metadata !{i32 786451, metadata !1, null, metadata !"S1<&i>", i32 4, i64 8, i64 8, i32 0, i32 0, null, metadata !2, i32 0, null, metadata !5, metadata !"_ZTS2S1IXadL_Z1iEEE"} ; [ DW_TAG_structure_type ] [S1<&i>] [line 4, size 8, align 8, offset 0] [def] [from ] +!5 = metadata !{metadata !6} +!6 = metadata !{i32 786480, null, metadata !"I", metadata !7, i32* @i, null, i32 0, i32 0} ; [ DW_TAG_template_value_parameter ] +!7 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !8} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int] +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{i32 786451, metadata !1, null, metadata !"S2", i32 11, i64 8, i64 8, i32 0, i32 0, null, metadata !10, i32 0, null, null, metadata !"_ZTS2S2"} ; [ DW_TAG_structure_type ] [S2] [line 11, size 8, align 8, offset 0] [def] [from ] +!10 = metadata !{metadata !11} +!11 = metadata !{i32 786445, metadata !1, metadata !"_ZTS2S2", metadata !"s2_1", i32 12, i64 8, i64 8, i64 0, i32 0, metadata !"_ZTS4S2_1IXadL_Z1iEEE"} ; [ DW_TAG_member ] [s2_1] [line 12, size 8, align 8, offset 0] [from _ZTS4S2_1IXadL_Z1iEEE] +!12 = metadata !{i32 786451, metadata !1, null, metadata !"S2_1<&i>", i32 9, i64 8, i64 8, i32 0, i32 0, null, metadata !2, i32 0, null, metadata !5, metadata !"_ZTS4S2_1IXadL_Z1iEEE"} ; [ DW_TAG_structure_type ] [S2_1<&i>] [line 9, size 8, align 8, offset 0] [def] [from ] +!13 = metadata !{i32 786451, metadata !1, null, metadata !"S3", i32 22, i64 16, i64 8, i32 0, i32 0, null, metadata !14, i32 0, null, null, metadata !"_ZTS2S3"} ; [ DW_TAG_structure_type ] [S3] [line 22, size 16, align 8, offset 0] [def] [from ] +!14 = metadata !{metadata !15, metadata !16} +!15 = metadata !{i32 786445, metadata !1, metadata !"_ZTS2S3", metadata !"s3_1", i32 23, i64 8, i64 8, i64 0, i32 0, metadata !"_ZTS4S3_1IXadL_Z1iEEE"} ; [ DW_TAG_member ] [s3_1] [line 23, size 8, align 8, offset 0] [from _ZTS4S3_1IXadL_Z1iEEE] +!16 = metadata !{i32 786445, metadata !1, metadata !"_ZTS2S3", metadata !"s3_2", i32 24, i64 8, i64 8, i64 8, i32 0, metadata !"_ZTS4S3_2"} ; [ DW_TAG_member ] [s3_2] [line 24, size 8, align 8, offset 8] [from _ZTS4S3_2] +!17 = metadata !{i32 786451, metadata !1, null, metadata !"S3_1<&i>", i32 18, i64 8, i64 8, i32 0, i32 0, null, metadata !2, i32 0, null, metadata !5, metadata !"_ZTS4S3_1IXadL_Z1iEEE"} ; [ DW_TAG_structure_type ] [S3_1<&i>] [line 18, size 8, align 8, offset 0] [def] [from ] +!18 = metadata !{i32 786451, metadata !1, null, metadata !"S3_2", i32 20, i64 8, i64 8, i32 0, i32 0, null, metadata !2, i32 0, null, null, metadata !"_ZTS4S3_2"} ; [ DW_TAG_structure_type ] [S3_2] [line 20, size 8, align 8, offset 0] [def] [from ] +!19 = metadata !{i32 786451, metadata !1, null, metadata !"S4", i32 34, i64 16, i64 8, i32 0, i32 0, null, metadata !20, i32 0, null, null, metadata !"_ZTS2S4"} ; [ DW_TAG_structure_type ] [S4] [line 34, size 16, align 8, offset 0] [def] [from ] +!20 = metadata !{metadata !21, metadata !22} +!21 = metadata !{i32 786445, metadata !1, metadata !"_ZTS2S4", metadata !"s4_1", i32 35, i64 8, i64 8, i64 0, i32 0, metadata !"_ZTS4S4_1"} ; [ DW_TAG_member ] [s4_1] [line 35, size 8, align 8, offset 0] [from _ZTS4S4_1] +!22 = metadata !{i32 786445, metadata !1, metadata !"_ZTS2S4", metadata !"s4_2", i32 36, i64 8, i64 8, i64 8, i32 0, metadata !"_ZTS4S4_2IXadL_Z1iEEE"} ; [ DW_TAG_member ] [s4_2] [line 36, size 8, align 8, offset 8] [from _ZTS4S4_2IXadL_Z1iEEE] +!23 = metadata !{i32 786451, metadata !1, null, metadata !"S4_1", i32 29, i64 8, i64 8, i32 0, i32 0, null, metadata !2, i32 0, null, null, metadata !"_ZTS4S4_1"} ; [ DW_TAG_structure_type ] [S4_1] [line 29, size 8, align 8, offset 0] [def] [from ] +!24 = metadata !{i32 786451, metadata !1, null, metadata !"S4_2<&i>", i32 32, i64 8, i64 8, i32 0, i32 0, null, metadata !2, i32 0, null, metadata !25, metadata !"_ZTS4S4_2IXadL_Z1iEEE"} ; [ DW_TAG_structure_type ] [S4_2<&i>] [line 32, size 8, align 8, offset 0] [def] [from ] +!25 = metadata !{metadata !26} +!26 = metadata !{i32 786480, null, metadata !"T", metadata !7, i32* @i, null, i32 0, i32 0} ; [ DW_TAG_template_value_parameter ] +!27 = metadata !{metadata !28, metadata !30, metadata !31, metadata !32, metadata !33} +!28 = metadata !{i32 786484, i32 0, null, metadata !"i", metadata !"i", metadata !"", metadata !29, i32 1, metadata !8, i32 0, i32 1, i32* @i, null} ; [ DW_TAG_variable ] [i] [line 1] [def] +!29 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/tu.cpp] +!30 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !29, i32 6, metadata !"_ZTS2S1IXadL_Z1iEEE", i32 0, i32 1, %struct.S1* @a, null} ; [ DW_TAG_variable ] [a] [line 6] [def] +!31 = metadata !{i32 786484, i32 0, null, metadata !"s2", metadata !"s2", metadata !"", metadata !29, i32 15, metadata !"_ZTS2S2", i32 0, i32 1, %struct.S2* @s2, null} ; [ DW_TAG_variable ] [s2] [line 15] [def] +!32 = metadata !{i32 786484, i32 0, null, metadata !"s3", metadata !"s3", metadata !"", metadata !29, i32 27, metadata !"_ZTS2S3", i32 0, i32 1, %struct.S3* @s3, null} ; [ DW_TAG_variable ] [s3] [line 27] [def] +!33 = metadata !{i32 786484, i32 0, null, metadata !"s4", metadata !"s4", metadata !"", metadata !29, i32 39, metadata !"_ZTS2S4", i32 0, i32 1, %struct.S4* @s4, null} ; [ DW_TAG_variable ] [s4] [line 39] [def] +!34 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!35 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!36 = metadata !{metadata !"clang version 3.5.0 "} diff --git a/test/DebugInfo/X86/union-template.ll b/test/DebugInfo/X86/union-template.ll index c70ae0798c71..5fdb3494cf9d 100644 --- a/test/DebugInfo/X86/union-template.ll +++ b/test/DebugInfo/X86/union-template.ll @@ -29,9 +29,9 @@ attributes #1 = { nounwind readnone } !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!28} -!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.3 (trunk 178499) (llvm/trunk 178472)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !9, metadata !9, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/foo.cc] [DW_LANG_C_plus_plus] +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.3 (trunk 178499) (llvm/trunk 178472)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !9, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/foo.cc] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !"foo.cc", metadata !"/usr/local/google/home/echristo/tmp"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4} !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"g", metadata !"g", metadata !"_ZN7PR156371gEf", i32 3, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (float)* @_ZN7PR156371gEf, null, null, metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [g] !5 = metadata !{i32 786489, metadata !1, null, metadata !"PR15637", i32 1} ; [ DW_TAG_namespace ] [PR15637] [line 1] diff --git a/test/DebugInfo/X86/vector.ll b/test/DebugInfo/X86/vector.ll index 6e14ed67fc30..a7a158539844 100644 --- a/test/DebugInfo/X86/vector.ll +++ b/test/DebugInfo/X86/vector.ll @@ -12,8 +12,8 @@ !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!13} -!0 = metadata !{i32 786449, metadata !12, i32 12, metadata !"clang version 3.3 (trunk 171825) (llvm/trunk 171822)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] [/Users/echristo/foo.c] [DW_LANG_C99] -!1 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !12, i32 12, metadata !"clang version 3.3 (trunk 171825) (llvm/trunk 171822)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/Users/echristo/foo.c] [DW_LANG_C99] +!1 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 786484, i32 0, null, metadata !"a", metadata !"a", metadata !"", metadata !6, i32 3, metadata !7, i32 0, i32 1, <4 x i32>* @a, null} ; [ DW_TAG_variable ] [a] [line 3] [def] !6 = metadata !{i32 786473, metadata !12} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/X86/vla.ll b/test/DebugInfo/X86/vla.ll index 512b22323c89..a1a2e66685c6 100644 --- a/test/DebugInfo/X86/vla.ll +++ b/test/DebugInfo/X86/vla.ll @@ -77,7 +77,7 @@ entry: !0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.3 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/vla.c] [DW_LANG_C99] !1 = metadata !{metadata !"vla.c", metadata !""} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4, metadata !9} !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"vla", metadata !"vla", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @vla, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [vla] !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/vla.c] diff --git a/test/DebugInfo/arm-relocs.test b/test/DebugInfo/arm-relocs.test new file mode 100644 index 000000000000..13e11f7043f3 --- /dev/null +++ b/test/DebugInfo/arm-relocs.test @@ -0,0 +1,5 @@ +RUN: llvm-dwarfdump %p/Inputs/arm-relocs.elf-arm | FileCheck %s + +; CHECK: debug_info contents +; CHECK: DW_TAG_enumeration_type +; CHECK-NEXT: DW_AT_name{{.*}} = "e1" diff --git a/test/DebugInfo/array.ll b/test/DebugInfo/array.ll index e5e07ffe9942..72b0b994c4de 100644 --- a/test/DebugInfo/array.ll +++ b/test/DebugInfo/array.ll @@ -1,4 +1,4 @@ -; RUN: llc -O0 < %s | FileCheck %s +; RUN: %llc_dwarf -O0 < %s | FileCheck %s ; Do not emit AT_upper_bound for an unbounded array. ; radar 9241695 define i32 @main() nounwind ssp { diff --git a/test/DebugInfo/constant-pointers.ll b/test/DebugInfo/constant-pointers.ll new file mode 100644 index 000000000000..fdde06d4a2b2 --- /dev/null +++ b/test/DebugInfo/constant-pointers.ll @@ -0,0 +1,51 @@ +; REQUIRES: object-emission + +; RUN: %llc_dwarf -O0 -filetype=obj %s -o - | llvm-dwarfdump -debug-dump=info - | FileCheck %s + +; Ensure that pointer constants are emitted as unsigned data. Alternatively, +; these could be signless data (dataN). + +; Built with Clang from: +; template <void *V, void (*F)(), int i> +; void func() {} +; template void func<nullptr, nullptr, 42>(); + +; CHECK: DW_TAG_subprogram +; CHECK: DW_TAG_template_value_parameter +; CHECK: DW_AT_name {{.*}} "V" +; CHECK: DW_AT_const_value [DW_FORM_udata] (0) +; CHECK: DW_TAG_template_value_parameter +; CHECK: DW_AT_name {{.*}} "F" +; CHECK: DW_AT_const_value [DW_FORM_udata] (0) + +; Function Attrs: nounwind uwtable +define weak_odr void @_Z4funcILPv0ELPFvvE0ELi42EEvv() #0 { +entry: + ret void, !dbg !18 +} + +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!15, !16} +!llvm.ident = !{!17} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/constant-pointers.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"constant-pointers.cpp", metadata !"/tmp/dbginfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"func<nullptr, nullptr, 42>", metadata !"func<nullptr, nullptr, 42>", metadata !"_Z4funcILPv0ELPFvvE0ELi42EEvv", i32 2, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_Z4funcILPv0ELPFvvE0ELi42EEvv, metadata !8, null, metadata !2, i32 2} ; [ DW_TAG_subprogram ] [line 2] [def] [func<nullptr, nullptr, 42>] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/constant-pointers.cpp] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{null} +!8 = metadata !{metadata !9, metadata !11, metadata !13} +!9 = metadata !{i32 786480, null, metadata !"V", metadata !10, i8 0, null, i32 0, i32 0} ; [ DW_TAG_template_value_parameter ] +!10 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ] +!11 = metadata !{i32 786480, null, metadata !"F", metadata !12, i8 0, null, i32 0, i32 0} ; [ DW_TAG_template_value_parameter ] +!12 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !6} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ] +!13 = metadata !{i32 786480, null, metadata !"i", metadata !14, i32 42, null, i32 0, i32 0} ; [ DW_TAG_template_value_parameter ] +!14 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!15 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!16 = metadata !{i32 2, metadata !"Debug Info Version", i32 1} +!17 = metadata !{metadata !"clang version 3.5.0 "} +!18 = metadata !{i32 3, i32 0, metadata !4, null} diff --git a/test/DebugInfo/cross-cu-inlining.ll b/test/DebugInfo/cross-cu-inlining.ll new file mode 100644 index 000000000000..8a0e3c568f1c --- /dev/null +++ b/test/DebugInfo/cross-cu-inlining.ll @@ -0,0 +1,130 @@ +; REQUIRES: object-emission + +; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck -implicit-check-not=DW_TAG %s + +; Build from source: +; $ clang++ a.cpp b.cpp -g -c -emit-llvm +; $ llvm-link a.bc b.bc -o ab.bc +; $ opt -inline ab.bc -o ab-opt.bc +; $ cat a.cpp +; extern int i; +; int func(int); +; int main() { +; return func(i); +; } +; $ cat b.cpp +; int __attribute__((always_inline)) func(int x) { +; return x * 2; +; } + +; Ensure that func inlined into main is described and references the abstract +; definition in b.cpp's CU. + +; CHECK: DW_TAG_compile_unit +; CHECK: DW_AT_name {{.*}} "a.cpp" +; CHECK: DW_TAG_subprogram +; CHECK: DW_AT_type [DW_FORM_ref_addr] (0x00000000[[INT:.*]]) +; CHECK: DW_TAG_inlined_subroutine +; CHECK: DW_AT_abstract_origin {{.*}}[[ABS_FUNC:........]]) +; CHECK: DW_TAG_formal_parameter +; CHECK: DW_AT_abstract_origin {{.*}}[[ABS_VAR:........]]) + +; Check the abstract definition is in the 'b.cpp' CU and doesn't contain any +; concrete information (address range or variable location) +; CHECK: DW_TAG_compile_unit +; CHECK: DW_AT_name {{.*}} "b.cpp" +; CHECK: 0x[[ABS_FUNC]]: DW_TAG_subprogram +; CHECK-NOT: DW_AT_low_pc +; CHECK: 0x[[ABS_VAR]]: DW_TAG_formal_parameter +; CHECK-NOT: DW_AT_location +; CHECK: DW_AT_type [DW_FORM_ref4] {{.*}} {0x[[INT]]} +; CHECK-NOT: DW_AT_location + +; CHECK: 0x[[INT]]: DW_TAG_base_type +; CHECK: DW_AT_name {{.*}} "int" + +; Check the concrete out of line definition references the abstract and +; provides the address range and variable location +; CHECK: DW_TAG_subprogram +; CHECK: DW_AT_low_pc +; CHECK: DW_AT_abstract_origin {{.*}} {0x[[ABS_FUNC]]} +; CHECK: DW_TAG_formal_parameter +; CHECK: DW_AT_location +; CHECK: DW_AT_abstract_origin {{.*}} {0x[[ABS_VAR]]} + + +@i = external global i32 + +; Function Attrs: uwtable +define i32 @main() #0 { +entry: + %x.addr.i = alloca i32, align 4 + %retval = alloca i32, align 4 + store i32 0, i32* %retval + %0 = load i32* @i, align 4, !dbg !19 + %1 = bitcast i32* %x.addr.i to i8* + call void @llvm.lifetime.start(i64 4, i8* %1) + store i32 %0, i32* %x.addr.i, align 4 + call void @llvm.dbg.declare(metadata !{i32* %x.addr.i}, metadata !20), !dbg !21 + %2 = load i32* %x.addr.i, align 4, !dbg !22 + %mul.i = mul nsw i32 %2, 2, !dbg !22 + %3 = bitcast i32* %x.addr.i to i8*, !dbg !22 + call void @llvm.lifetime.end(i64 4, i8* %3), !dbg !22 + ret i32 %mul.i, !dbg !19 +} + +; Function Attrs: alwaysinline nounwind uwtable +define i32 @_Z4funci(i32 %x) #1 { +entry: + %x.addr = alloca i32, align 4 + store i32 %x, i32* %x.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %x.addr}, metadata !20), !dbg !23 + %0 = load i32* %x.addr, align 4, !dbg !24 + %mul = mul nsw i32 %0, 2, !dbg !24 + ret i32 %mul, !dbg !24 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #2 + +; Function Attrs: nounwind +declare void @llvm.lifetime.start(i64, i8* nocapture) #3 + +; Function Attrs: nounwind +declare void @llvm.lifetime.end(i64, i8* nocapture) #3 + +attributes #0 = { uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { alwaysinline nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #2 = { nounwind readnone } +attributes #3 = { nounwind } + +!llvm.dbg.cu = !{!0, !9} +!llvm.module.flags = !{!16, !17} +!llvm.ident = !{!18, !18} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/a.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"a.cpp", metadata !"/tmp/dbginfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"main", metadata !"main", metadata !"", i32 3, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [main] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/a.cpp] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{metadata !8} +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{i32 786449, metadata !10, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !11, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/b.cpp] [DW_LANG_C_plus_plus] +!10 = metadata !{metadata !"b.cpp", metadata !"/tmp/dbginfo"} +!11 = metadata !{metadata !12} +!12 = metadata !{i32 786478, metadata !10, metadata !13, metadata !"func", metadata !"func", metadata !"_Z4funci", i32 1, metadata !14, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @_Z4funci, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [func] +!13 = metadata !{i32 786473, metadata !10} ; [ DW_TAG_file_type ] [/tmp/dbginfo/b.cpp] +!14 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !15, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!15 = metadata !{metadata !8, metadata !8} +!16 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!17 = metadata !{i32 2, metadata !"Debug Info Version", i32 1} +!18 = metadata !{metadata !"clang version 3.5.0 "} +!19 = metadata !{i32 4, i32 0, metadata !4, null} +!20 = metadata !{i32 786689, metadata !12, metadata !"x", metadata !13, i32 16777217, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [x] [line 1] +!21 = metadata !{i32 1, i32 0, metadata !12, metadata !19} +!22 = metadata !{i32 2, i32 0, metadata !12, metadata !19} +!23 = metadata !{i32 1, i32 0, metadata !12, null} +!24 = metadata !{i32 2, i32 0, metadata !12, null} + diff --git a/test/DebugInfo/cross-cu-linkonce.ll b/test/DebugInfo/cross-cu-linkonce.ll new file mode 100644 index 000000000000..660d5709c7a8 --- /dev/null +++ b/test/DebugInfo/cross-cu-linkonce.ll @@ -0,0 +1,73 @@ +; REQUIRES: object-emission + +; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s + +; Built from source: +; $ clang++ a.cpp b.cpp -g -c -emit-llvm +; $ llvm-link a.bc b.bc -o ab.bc +; $ cat a.cpp +; # 1 "func.h" +; inline int func(int i) { +; return i * 2; +; } +; int (*x)(int) = &func; +; $ cat b.cpp +; # 1 "func.h" +; inline int func(int i) { +; return i * 2; +; } +; int (*y)(int) = &func; + +; CHECK: DW_TAG_compile_unit +; CHECK: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "func" +; CHECK: DW_TAG_compile_unit +; CHECK-NOT: DW_TAG_subprogram + +@x = global i32 (i32)* @_Z4funci, align 8 +@y = global i32 (i32)* @_Z4funci, align 8 + +; Function Attrs: inlinehint nounwind uwtable +define linkonce_odr i32 @_Z4funci(i32 %i) #0 { + %1 = alloca i32, align 4 + store i32 %i, i32* %1, align 4 + call void @llvm.dbg.declare(metadata !{i32* %1}, metadata !20), !dbg !21 + %2 = load i32* %1, align 4, !dbg !22 + %3 = mul nsw i32 %2, 2, !dbg !22 + ret i32 %3, !dbg !22 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +attributes #0 = { inlinehint nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0, !13} +!llvm.module.flags = !{!17, !18} +!llvm.ident = !{!19, !19} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !10, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/a.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"a.cpp", metadata !"/tmp/dbginfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"func", metadata !"func", metadata !"_Z4funci", i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @_Z4funci, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [func] +!5 = metadata !{metadata !"func.h", metadata !"/tmp/dbginfo"} +!6 = metadata !{i32 786473, metadata !5} ; [ DW_TAG_file_type ] [/tmp/dbginfo/func.h] +!7 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{metadata !9, metadata !9} +!9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = metadata !{metadata !11} +!11 = metadata !{i32 786484, i32 0, null, metadata !"x", metadata !"x", metadata !"", metadata !6, i32 4, metadata !12, i32 0, i32 1, i32 (i32)** @x, null} ; [ DW_TAG_variable ] [x] [line 4] [def] +!12 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !7} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ] +!13 = metadata !{i32 786449, metadata !14, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !15, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/b.cpp] [DW_LANG_C_plus_plus] +!14 = metadata !{metadata !"b.cpp", metadata !"/tmp/dbginfo"} +!15 = metadata !{metadata !16} +!16 = metadata !{i32 786484, i32 0, null, metadata !"y", metadata !"y", metadata !"", metadata !6, i32 4, metadata !12, i32 0, i32 1, i32 (i32)** @y, null} ; [ DW_TAG_variable ] [y] [line 4] [def] +!17 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!18 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!19 = metadata !{metadata !"clang version 3.5.0 "} +!20 = metadata !{i32 786689, metadata !4, metadata !"i", metadata !6, i32 16777217, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [i] [line 1] +!21 = metadata !{i32 1, i32 0, metadata !4, null} +!22 = metadata !{i32 2, i32 0, metadata !4, null} diff --git a/test/DebugInfo/cu-line-tables.ll b/test/DebugInfo/cu-line-tables.ll new file mode 100644 index 000000000000..2496f3f3e87b --- /dev/null +++ b/test/DebugInfo/cu-line-tables.ll @@ -0,0 +1,51 @@ +; REQUIRES: object-emission +; RUN: %llc_dwarf -O0 -filetype=obj %s -o %t +; RUN: llvm-dwarfdump %t | FileCheck %s + +; Check that we don't emit ranges if we're emitting line tables only. + +; CHECK: DW_TAG_compile_unit +; CHECK-NOT: DW_AT_ranges +; CHECK: DW_TAG_subprogram + +; FIXME: We probably want to avoid printing out anything if the section isn't there. +; CHECK: .debug_ranges contents: +; CHECK-NOT: 00000000 <End of list> + +; CHECK: .debug_pubnames contents: +; CHECK-NOT: Offset + +; CHECK: .debug_pubtypes contents: +; CHECK-NOT: Offset + +; Function Attrs: nounwind uwtable +define i32 @f(i32 %a) #0 { +entry: + %a.addr = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + %0 = load i32* %a.addr, align 4, !dbg !14 + %add = add nsw i32 %0, 4, !dbg !14 + ret i32 %add, !dbg !14 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!9, !10} +!llvm.ident = !{!11} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5 (trunk 197756) (llvm/trunk 197768)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 2} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/foo.c] [DW_LANG_C99] +!1 = metadata !{metadata !"foo.c", metadata !"/usr/local/google/home/echristo/tmp"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"f", metadata !"f", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @f, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [f] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/usr/local/google/home/echristo/tmp/foo.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !2, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!10 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!11 = metadata !{metadata !"clang version 3.5 (trunk 197756) (llvm/trunk 197768)"} +!14 = metadata !{i32 2, i32 0, metadata !4, null} diff --git a/test/DebugInfo/cu-range-hole.ll b/test/DebugInfo/cu-range-hole.ll new file mode 100644 index 000000000000..65a4956a6fc2 --- /dev/null +++ b/test/DebugInfo/cu-range-hole.ll @@ -0,0 +1,74 @@ +; REQUIRES: object-emission +; RUN: %llc_dwarf -O0 -filetype=obj %s -o %t +; RUN: llvm-dwarfdump %t | FileCheck %s + +; Check that we emit ranges for this CU since we have a function with and +; without debug info. +; Note: This depends upon the order of output in the .o file. Currently it's +; in order of the output to make sure that the CU has multiple ranges since +; there's a function in the middle. If they were together then it would have +; a single range and no DW_AT_ranges. +; CHECK: DW_TAG_compile_unit +; CHECK: DW_AT_ranges +; CHECK: DW_TAG_subprogram +; CHECK: DW_TAG_subprogram + +; Function Attrs: nounwind uwtable +define i32 @b(i32 %c) #0 { +entry: + %c.addr = alloca i32, align 4 + store i32 %c, i32* %c.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %c.addr}, metadata !13), !dbg !14 + %0 = load i32* %c.addr, align 4, !dbg !14 + %add = add nsw i32 %0, 1, !dbg !14 + ret i32 %add, !dbg !14 +} + +; Function Attrs: nounwind uwtable +define i32 @a(i32 %b) #0 { +entry: + %b.addr = alloca i32, align 4 + store i32 %b, i32* %b.addr, align 4 + %0 = load i32* %b.addr, align 4 + %add = add nsw i32 %0, 1 + ret i32 %add +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +; Function Attrs: nounwind uwtable +define i32 @d(i32 %e) #0 { +entry: + %e.addr = alloca i32, align 4 + store i32 %e, i32* %e.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %e.addr}, metadata !15), !dbg !16 + %0 = load i32* %e.addr, align 4, !dbg !16 + %add = add nsw i32 %0, 1, !dbg !16 + ret i32 %add, !dbg !16 +} + +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } + +!llvm.ident = !{!0, !0} +!llvm.dbg.cu = !{!1} +!llvm.module.flags = !{!11, !12} + +!0 = metadata !{metadata !"clang version 3.5.0 (trunk 204164) (llvm/trunk 204183)"} +!1 = metadata !{i32 786449, metadata !2, i32 12, metadata !"clang version 3.5.0 (trunk 204164) (llvm/trunk 204183)", i1 false, metadata !"", i32 0, metadata !3, metadata !3, metadata !4, metadata !3, metadata !3, metadata !"", i32 1} +!2 = metadata !{metadata !"b.c", metadata !"/usr/local/google/home/echristo"} +!3 = metadata !{} +!4 = metadata !{metadata !5, metadata !10} +!5 = metadata !{i32 786478, metadata !2, metadata !6, metadata !"b", metadata !"b", metadata !"", i32 1, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @b, null, null, metadata !3, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [b] +!6 = metadata !{i32 786473, metadata !2} ; [ DW_TAG_file_type ] [/usr/local/google/home/echristo/b.c] +!7 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{metadata !9, metadata !9} +!9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = metadata !{i32 786478, metadata !2, metadata !6, metadata !"d", metadata !"d", metadata !"", i32 3, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @d, null, null, metadata !3, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [d] +!11 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!12 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!13 = metadata !{i32 786689, metadata !5, metadata !"c", metadata !6, i32 16777217, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [c] [line 1] +!14 = metadata !{i32 1, i32 0, metadata !5, null} +!15 = metadata !{i32 786689, metadata !10, metadata !"e", metadata !6, i32 16777219, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [e] [line 3] +!16 = metadata !{i32 3, i32 0, metadata !10, null} diff --git a/test/DebugInfo/cu-ranges.ll b/test/DebugInfo/cu-ranges.ll new file mode 100644 index 000000000000..9262a2239c7f --- /dev/null +++ b/test/DebugInfo/cu-ranges.ll @@ -0,0 +1,71 @@ +; REQUIRES: object-emission +; RUN: %llc_dwarf -O0 -filetype=obj %s -o %t +; RUN: llvm-dwarfdump %t | FileCheck %s + +; Check that we emit ranges for this which has a non-traditional section and a normal section. + +; CHECK: DW_TAG_compile_unit +; CHECK: DW_AT_ranges +; CHECK: DW_TAG_subprogram +; CHECK: DW_AT_low_pc +; CHECK: DW_AT_high_pc +; CHECK: DW_TAG_subprogram +; CHECK: DW_AT_low_pc +; CHECK: DW_AT_high_pc + +; CHECK: .debug_ranges contents: +; FIXME: When we get better dumping facilities we'll want to elaborate here. +; CHECK: 00000000 <End of list> + +; Function Attrs: nounwind uwtable +define i32 @foo(i32 %a) #0 section "__TEXT,__foo" { +entry: + %a.addr = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %a.addr}, metadata !13), !dbg !14 + %0 = load i32* %a.addr, align 4, !dbg !15 + %add = add nsw i32 %0, 5, !dbg !15 + ret i32 %add, !dbg !15 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +; Function Attrs: nounwind uwtable +define i32 @bar(i32 %a) #0 { +entry: + %a.addr = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %a.addr}, metadata !16), !dbg !17 + %0 = load i32* %a.addr, align 4, !dbg !18 + %add = add nsw i32 %0, 5, !dbg !18 + ret i32 %add, !dbg !18 +} + +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!10, !11} +!llvm.ident = !{!12} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5.0 (trunk 204164) (llvm/trunk 204183)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/foo.c] [DW_LANG_C99] +!1 = metadata !{metadata !"foo.c", metadata !"/usr/local/google/home/echristo"} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !9} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"foo", metadata !"foo", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @foo, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [foo] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/usr/local/google/home/echristo/foo.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{metadata !8, metadata !8} +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"bar", metadata !"bar", metadata !"", i32 5, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @bar, null, null, metadata !2, i32 5} ; [ DW_TAG_subprogram ] [line 5] [def] [bar] +!10 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!11 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!12 = metadata !{metadata !"clang version 3.5.0 (trunk 204164) (llvm/trunk 204183)"} +!13 = metadata !{i32 786689, metadata !4, metadata !"a", metadata !5, i32 16777217, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [a] [line 1] +!14 = metadata !{i32 1, i32 0, metadata !4, null} +!15 = metadata !{i32 2, i32 0, metadata !4, null} +!16 = metadata !{i32 786689, metadata !9, metadata !"a", metadata !5, i32 16777221, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [a] [line 5] +!17 = metadata !{i32 5, i32 0, metadata !9, null} +!18 = metadata !{i32 6, i32 0, metadata !9, null} + diff --git a/test/DebugInfo/dead-argument-order.ll b/test/DebugInfo/dead-argument-order.ll new file mode 100644 index 000000000000..ea805a4872fa --- /dev/null +++ b/test/DebugInfo/dead-argument-order.ll @@ -0,0 +1,81 @@ +; REQUIRES: object-emission + +; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s + +; Built from the following source with clang -O1 +; struct S { int i; }; +; int function(struct S s, int i) { return s.i + i; } + +; Due to the X86_64 ABI, 's' is passed in registers and once optimized, the +; entirety of 's' is never reconstituted, since only the int is required, and +; thus the variable's location is unknown/dead to debug info. + +; Future/current work should enable us to describe partial variables, which, in +; this case, happens to be the entire variable. + +; CHECK: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "function" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "s" +; CHECK-NOT: DW_TAG +; FIXME: Even though 's' is never reconstituted into a struct, the one member +; variable is still live and used, and so we should be able to describe 's's +; location as the location of that int. +; CHECK-NOT: DW_AT_location +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_location +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "i" + + +%struct.S = type { i32 } + +; Function Attrs: nounwind readnone uwtable +define i32 @_Z8function1Si(i32 %s.coerce, i32 %i) #0 { +entry: + tail call void @llvm.dbg.declare(metadata !19, metadata !14), !dbg !20 + tail call void @llvm.dbg.value(metadata !{i32 %i}, i64 0, metadata !15), !dbg !20 + %add = add nsw i32 %i, %s.coerce, !dbg !20 + ret i32 %add, !dbg !20 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.value(metadata, i64, metadata) #1 + +attributes #0 = { nounwind readnone uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!16, !17} +!llvm.ident = !{!18} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 true, metadata !"", i32 0, metadata !2, metadata !3, metadata !8, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/dead-argument-order.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"dead-argument-order.cpp", metadata !"/tmp/dbginfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786451, metadata !1, null, metadata !"S", i32 1, i64 32, i64 32, i32 0, i32 0, null, metadata !5, i32 0, null, null, metadata !"_ZTS1S"} ; [ DW_TAG_structure_type ] [S] [line 1, size 32, align 32, offset 0] [def] [from ] +!5 = metadata !{metadata !6} +!6 = metadata !{i32 786445, metadata !1, metadata !"_ZTS1S", metadata !"i", i32 1, i64 32, i64 32, i64 0, i32 0, metadata !7} ; [ DW_TAG_member ] [i] [line 1, size 32, align 32, offset 0] [from int] +!7 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!8 = metadata !{metadata !9} +!9 = metadata !{i32 786478, metadata !1, metadata !10, metadata !"function", metadata !"function", metadata !"_Z8function1Si", i32 2, metadata !11, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 (i32, i32)* @_Z8function1Si, null, null, metadata !13, i32 2} ; [ DW_TAG_subprogram ] [line 2] [def] [function] +!10 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/dead-argument-order.cpp] +!11 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!12 = metadata !{metadata !7, metadata !4, metadata !7} +!13 = metadata !{metadata !14, metadata !15} +!14 = metadata !{i32 786689, metadata !9, metadata !"s", metadata !10, i32 16777218, metadata !"_ZTS1S", i32 0, i32 0} ; [ DW_TAG_arg_variable ] [s] [line 2] +!15 = metadata !{i32 786689, metadata !9, metadata !"i", metadata !10, i32 33554434, metadata !7, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [i] [line 2] +!16 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!17 = metadata !{i32 2, metadata !"Debug Info Version", i32 1} +!18 = metadata !{metadata !"clang version 3.5.0 "} +!19 = metadata !{%struct.S* undef} +!20 = metadata !{i32 2, i32 0, metadata !9, null} + diff --git a/test/DebugInfo/debug-info-qualifiers.ll b/test/DebugInfo/debug-info-qualifiers.ll new file mode 100644 index 000000000000..b624d3874cb3 --- /dev/null +++ b/test/DebugInfo/debug-info-qualifiers.ll @@ -0,0 +1,100 @@ +; REQUIRES: object-emission +; Test (r)value qualifiers on C++11 non-static member functions. +; Generated from tools/clang/test/CodeGenCXX/debug-info-qualifiers.cpp +; +; class A { +; public: +; void l() const &; +; void r() const &&; +; }; +; +; void g() { +; A a; +; auto pl = &A::l; +; auto pr = &A::r; +; } +; +; RUN: %llc_dwarf -filetype=obj -O0 < %s | llvm-dwarfdump - | FileCheck %s +; CHECK: DW_TAG_subroutine_type DW_CHILDREN_yes +; CHECK-NEXT: DW_AT_reference DW_FORM_flag_present +; CHECK: DW_TAG_subroutine_type DW_CHILDREN_yes +; CHECK-NEXT: DW_AT_rvalue_reference DW_FORM_flag_present +; +; CHECK: DW_TAG_subprogram +; CHECK-NOT: DW_TAG_subprogram +; CHECK: DW_AT_name {{.*}}"l" +; CHECK-NOT: DW_TAG_subprogram +; CHECK: DW_AT_reference [DW_FORM_flag_present] (true) + +; CHECK: DW_TAG_subprogram +; CHECK-NOT: DW_TAG_subprogram +; CHECK: DW_AT_name {{.*}}"r" +; CHECK-NOT: DW_TAG_subprogram +; CHECK: DW_AT_rvalue_reference [DW_FORM_flag_present] (true) + +%class.A = type { i8 } + +; Function Attrs: nounwind +define void @_Z1gv() #0 { + %a = alloca %class.A, align 1 + %pl = alloca { i64, i64 }, align 8 + %pr = alloca { i64, i64 }, align 8 + call void @llvm.dbg.declare(metadata !{%class.A* %a}, metadata !24), !dbg !25 + call void @llvm.dbg.declare(metadata !{{ i64, i64 }* %pl}, metadata !26), !dbg !31 + store { i64, i64 } { i64 ptrtoint (void (%class.A*)* @_ZNKR1A1lEv to i64), i64 0 }, { i64, i64 }* %pl, align 8, !dbg !31 + call void @llvm.dbg.declare(metadata !{{ i64, i64 }* %pr}, metadata !32), !dbg !35 + store { i64, i64 } { i64 ptrtoint (void (%class.A*)* @_ZNKO1A1rEv to i64), i64 0 }, { i64, i64 }* %pr, align 8, !dbg !35 + ret void, !dbg !36 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +declare void @_ZNKR1A1lEv(%class.A*) + +declare void @_ZNKO1A1rEv(%class.A*) + +attributes #0 = { nounwind } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!21, !22} +!llvm.ident = !{!23} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5 ", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !16, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"", metadata !""} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786434, metadata !5, null, metadata !"A", i32 2, i64 8, i64 8, i32 0, i32 0, null, metadata !6, i32 0, null, null, metadata !"_ZTS1A"} ; [ DW_TAG_class_type ] [A] [line 2, size 8, align 8, offset 0] [def] [from ] +!5 = metadata !{metadata !"debug-info-qualifiers.cpp", metadata !""} +!6 = metadata !{metadata !7, metadata !13} +!7 = metadata !{i32 786478, metadata !5, metadata !"_ZTS1A", metadata !"l", metadata !"l", metadata !"_ZNKR1A1lEv", i32 5, metadata !8, i1 false, i1 false, i32 0, i32 0, null, i32 16640, i1 false, null, null, i32 0, metadata !12, i32 5} ; [ DW_TAG_subprogram ] [line 5] [reference] [l] +!8 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 16384, null, metadata !9, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [reference] [from ] +!9 = metadata !{null, metadata !10} +!10 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !11} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from ] +!11 = metadata !{i32 786470, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !"_ZTS1A"} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from _ZTS1A] +!12 = metadata !{i32 786468} +!13 = metadata !{i32 786478, metadata !5, metadata !"_ZTS1A", metadata !"r", metadata !"r", metadata !"_ZNKO1A1rEv", i32 7, metadata !14, i1 false, i1 false, i32 0, i32 0, null, i32 33024, i1 false, null, null, i32 0, metadata !15, i32 7} ; [ DW_TAG_subprogram ] [line 7] [rvalue reference] [r] +!14 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 32768, null, metadata !9, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [rvalue reference] [from ] +!15 = metadata !{i32 786468} +!16 = metadata !{metadata !17} +!17 = metadata !{i32 786478, metadata !5, metadata !18, metadata !"g", metadata !"g", metadata !"_Z1gv", i32 10, metadata !19, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_Z1gv, null, null, metadata !2, i32 10} ; [ DW_TAG_subprogram ] [line 10] [def] [g] +!18 = metadata !{i32 786473, metadata !5} ; [ DW_TAG_file_type ] +!19 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !20, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!20 = metadata !{null} +!21 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!22 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!23 = metadata !{metadata !"clang version 3.5 "} +!24 = metadata !{i32 786688, metadata !17, metadata !"a", metadata !18, i32 11, metadata !4, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [a] [line 11] +!25 = metadata !{i32 11, i32 0, metadata !17, null} +!26 = metadata !{i32 786688, metadata !17, metadata !"pl", metadata !18, i32 16, metadata !27, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [pl] [line 16] +!27 = metadata !{i32 786463, null, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !28, metadata !"_ZTS1A"} ; [ DW_TAG_ptr_to_member_type ] [line 0, size 0, align 0, offset 0] [from ] +!28 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 16384, null, metadata !29, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [reference] [from ] +!29 = metadata !{null, metadata !30} +!30 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !"_ZTS1A"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from _ZTS1A] +!31 = metadata !{i32 16, i32 0, metadata !17, null} +!32 = metadata !{i32 786688, metadata !17, metadata !"pr", metadata !18, i32 21, metadata !33, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [pr] [line 21] +!33 = metadata !{i32 786463, null, null, null, i32 0, i64 0, i64 0, i64 0, i32 0, metadata !34, metadata !"_ZTS1A"} ; [ DW_TAG_ptr_to_member_type ] [line 0, size 0, align 0, offset 0] [from ] +!34 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 32768, null, metadata !29, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [rvalue reference] [from ] +!35 = metadata !{i32 21, i32 0, metadata !17, null} +!36 = metadata !{i32 22, i32 0, metadata !17, null} diff --git a/test/DebugInfo/dwarf-public-names.ll b/test/DebugInfo/dwarf-public-names.ll index fc3363133e68..72189641e3aa 100644 --- a/test/DebugInfo/dwarf-public-names.ll +++ b/test/DebugInfo/dwarf-public-names.ll @@ -1,6 +1,6 @@ ; REQUIRES: object-emission -; RUN: llc -generate-dwarf-pub-sections=Enable -filetype=obj -o %t.o < %s +; RUN: %llc_dwarf -generate-dwarf-pub-sections=Enable -filetype=obj -o %t.o < %s ; RUN: llvm-dwarfdump -debug-dump=pubnames %t.o | FileCheck %s ; ModuleID = 'dwarf-public-names.cpp' ; @@ -40,12 +40,14 @@ ; CHECK: version = 0x0002 ; Check for each name in the output. -; CHECK: global_namespace_variable -; CHECK: global_namespace_function -; CHECK: static_member_function -; CHECK: global_variable -; CHECK: global_function -; CHECK: member_function +; CHECK-DAG: "ns" +; CHECK-DAG: "C::static_member_function" +; CHECK-DAG: "global_variable" +; CHECK-DAG: "ns::global_namespace_variable" +; CHECK-DAG: "ns::global_namespace_function" +; CHECK-DAG: "global_function" +; CHECK-DAG: "C::static_member_variable" +; CHECK-DAG: "C::member_function" %struct.C = type { i8 } @@ -88,8 +90,8 @@ attributes #1 = { nounwind readnone } !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!38} -!0 = metadata !{i32 786449, metadata !37, i32 4, metadata !"clang version 3.3 (http://llvm.org/git/clang.git a09cd8103a6a719cb2628cdf0c91682250a17bd2) (http://llvm.org/git/llvm.git 47d03cec0afca0c01ae42b82916d1d731716cd20)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !2, metadata !24, metadata !24, metadata !""} ; [ DW_TAG_compile_unit ] [/usr2/kparzysz/s.hex/t/dwarf-public-names.cpp] [DW_LANG_C_plus_plus] -!1 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !37, i32 4, metadata !"clang version 3.3 (http://llvm.org/git/clang.git a09cd8103a6a719cb2628cdf0c91682250a17bd2) (http://llvm.org/git/llvm.git 47d03cec0afca0c01ae42b82916d1d731716cd20)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !2, metadata !24, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/usr2/kparzysz/s.hex/t/dwarf-public-names.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{} !2 = metadata !{metadata !3, metadata !18, metadata !19, metadata !20} !3 = metadata !{i32 786478, metadata !4, null, metadata !"member_function", metadata !"member_function", metadata !"_ZN1C15member_functionEv", i32 9, metadata !5, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%struct.C*)* @_ZN1C15member_functionEv, null, metadata !12, metadata !1, i32 9} ; [ DW_TAG_subprogram ] [line 9] [def] [member_function] !4 = metadata !{i32 786473, metadata !37} ; [ DW_TAG_file_type ] @@ -109,7 +111,7 @@ attributes #1 = { nounwind readnone } !18 = metadata !{i32 786478, metadata !4, null, metadata !"static_member_function", metadata !"static_member_function", metadata !"_ZN1C22static_member_functionEv", i32 13, metadata !15, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @_ZN1C22static_member_functionEv, null, metadata !14, metadata !1, i32 13} ; [ DW_TAG_subprogram ] [line 13] [def] [static_member_function] !19 = metadata !{i32 786478, metadata !4, metadata !4, metadata !"global_function", metadata !"global_function", metadata !"_Z15global_functionv", i32 19, metadata !15, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @_Z15global_functionv, null, null, metadata !1, i32 19} ; [ DW_TAG_subprogram ] [line 19] [def] [global_function] !20 = metadata !{i32 786478, metadata !4, metadata !21, metadata !"global_namespace_function", metadata !"global_namespace_function", metadata !"_ZN2ns25global_namespace_functionEv", i32 24, metadata !22, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_ZN2ns25global_namespace_functionEv, null, null, metadata !1, i32 24} ; [ DW_TAG_subprogram ] [line 24] [def] [global_namespace_function] -!21 = metadata !{i32 786489, null, metadata !"ns", metadata !4, i32 23} ; [ DW_TAG_namespace ] [/usr2/kparzysz/s.hex/t/dwarf-public-names.cpp] +!21 = metadata !{i32 786489, metadata !4, null, metadata !"ns", i32 23} ; [ DW_TAG_namespace ] [/usr2/kparzysz/s.hex/t/dwarf-public-names.cpp] !22 = metadata !{i32 786453, i32 0, null, i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !23, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !23 = metadata !{null} !24 = metadata !{metadata !25, metadata !26, metadata !27} diff --git a/test/DebugInfo/dwarfdump-inlining.test b/test/DebugInfo/dwarfdump-inlining.test deleted file mode 100644 index e926634d52f6..000000000000 --- a/test/DebugInfo/dwarfdump-inlining.test +++ /dev/null @@ -1,28 +0,0 @@ -RUN: llvm-dwarfdump %p/Inputs/dwarfdump-inl-test.elf-x86-64 --address=0x710 \ -RUN: --inlining --functions | FileCheck %s -check-prefix DEEP_STACK -RUN: llvm-dwarfdump %p/Inputs/dwarfdump-inl-test.elf-x86-64 --address=0x7d1 \ -RUN: --inlining | FileCheck %s -check-prefix SHORTER_STACK -RUN: llvm-dwarfdump %p/Inputs/dwarfdump-inl-test.elf-x86-64 --address=0x785 \ -RUN: --inlining | FileCheck %s -check-prefix SHORT_STACK -RUN: llvm-dwarfdump %p/Inputs/dwarfdump-inl-test.elf-x86-64 --address=0x737 \ -RUN: --functions | FileCheck %s -check-prefix INL_FUNC_NAME - -DEEP_STACK: inlined_h -DEEP_STACK-NEXT: dwarfdump-inl-test.h:2 -DEEP_STACK-NEXT: inlined_g -DEEP_STACK-NEXT: dwarfdump-inl-test.h:7 -DEEP_STACK-NEXT: inlined_f -DEEP_STACK-NEXT: dwarfdump-inl-test.cc:3 -DEEP_STACK-NEXT: main -DEEP_STACK-NEXT: dwarfdump-inl-test.cc:8 - -SHORTER_STACK: dwarfdump-inl-test.h:7 -SHORTER_STACK-NEXT: dwarfdump-inl-test.cc:3 -SHORTER_STACK-NEXT: dwarfdump-inl-test.cc:8 - -SHORT_STACK: dwarfdump-inl-test.cc:3 -SHORT_STACK-NEXT: dwarfdump-inl-test.cc:8 - -INL_FUNC_NAME: inlined_g -INL_FUNC_NAME-NEXT: dwarfdump-inl-test.h:7 - diff --git a/test/DebugInfo/dwarfdump-line-dwo.test b/test/DebugInfo/dwarfdump-line-dwo.test new file mode 100644 index 000000000000..3178a5d29922 --- /dev/null +++ b/test/DebugInfo/dwarfdump-line-dwo.test @@ -0,0 +1,6 @@ +RUN: llvm-dwarfdump %p/Inputs/dwarfdump-line-dwo.elf-x86-64 | FileCheck %s + +CHECK: .debug_line.dwo contents: +CHECK: version: 4 +CHECK: max_ops_per_inst: 1 +CHECK: file_names[ 1]{{.*}}dwarfdump-line-dwo.cc diff --git a/test/DebugInfo/dwarfdump-ranges.test b/test/DebugInfo/dwarfdump-ranges.test new file mode 100644 index 000000000000..c9e33dcdc975 --- /dev/null +++ b/test/DebugInfo/dwarfdump-ranges.test @@ -0,0 +1,10 @@ +RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test4.elf-x86-64 | FileCheck %s + +CHECK: .debug_ranges contents: +CHECK-NEXT: 00000000 000000000000062c 0000000000000637 +CHECK-NEXT: 00000000 0000000000000637 000000000000063d +CHECK-NEXT: 00000000 <End of list> +CHECK-NEXT: 00000030 0000000000000640 000000000000064b +CHECK-NEXT: 00000030 0000000000000637 000000000000063d +CHECK-NEXT: 00000030 <End of list> + diff --git a/test/DebugInfo/dwarfdump-test.test b/test/DebugInfo/dwarfdump-test.test deleted file mode 100644 index 058d6a36981a..000000000000 --- a/test/DebugInfo/dwarfdump-test.test +++ /dev/null @@ -1,56 +0,0 @@ -RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test.elf-x86-64 \ -RUN: --address=0x400559 --functions | FileCheck %s -check-prefix MAIN -RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test.elf-x86-64 \ -RUN: --address=0x400528 --functions | FileCheck %s -check-prefix FUNCTION -RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test.elf-x86-64 \ -RUN: --address=0x400586 --functions | FileCheck %s -check-prefix CTOR_WITH_SPEC -RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test2.elf-x86-64 \ -RUN: --address=0x4004e8 --functions | FileCheck %s -check-prefix MANY_CU_1 -RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test2.elf-x86-64 \ -RUN: --address=0x4004f4 --functions | FileCheck %s -check-prefix MANY_CU_2 -RUN: llvm-dwarfdump "%p/Inputs/dwarfdump-test3.elf-x86-64 space" \ -RUN: --address=0x640 --functions | FileCheck %s -check-prefix ABS_ORIGIN_1 -RUN: llvm-dwarfdump "%p/Inputs/dwarfdump-test3.elf-x86-64 space" \ -RUN: --address=0x633 --functions | FileCheck %s -check-prefix INCLUDE_TEST_1 -RUN: llvm-dwarfdump "%p/Inputs/dwarfdump-test3.elf-x86-64 space" \ -RUN: --address=0x62d --functions | FileCheck %s -check-prefix INCLUDE_TEST_2 -RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test4.elf-x86-64 \ -RUN: --address=0x62c --functions \ -RUN: | FileCheck %s -check-prefix MANY_SEQ_IN_LINE_TABLE -RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test4.elf-x86-64 \ -RUN: | FileCheck %s -check-prefix DEBUG_RANGES - -MAIN: main -MAIN-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test.cc:16 - -FUNCTION: _Z1fii -FUNCTION-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test.cc:11 - -CTOR_WITH_SPEC: DummyClass -CTOR_WITH_SPEC-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test.cc:4 - -MANY_CU_1: a -MANY_CU_1-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test2-helper.cc:2 - -MANY_CU_2: main -MANY_CU_2-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test2-main.cc:4 - -ABS_ORIGIN_1: C -ABS_ORIGIN_1-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test3.cc:3 - -INCLUDE_TEST_1: _Z3do1v -INCLUDE_TEST_1-NEXT: /tmp/include{{[/\\]}}dwarfdump-test3-decl.h:7 - -INCLUDE_TEST_2: _Z3do2v -INCLUDE_TEST_2-NEXT: /tmp/dbginfo{{[/\\]}}include{{[/\\]}}dwarfdump-test3-decl2.h:1 - -MANY_SEQ_IN_LINE_TABLE: _Z1cv -MANY_SEQ_IN_LINE_TABLE-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test4-part1.cc:2 - -DEBUG_RANGES: .debug_ranges contents: -DEBUG_RANGES-NEXT: 00000000 000000000000062c 0000000000000637 -DEBUG_RANGES-NEXT: 00000000 0000000000000637 000000000000063d -DEBUG_RANGES-NEXT: 00000000 <End of list> -DEBUG_RANGES-NEXT: 00000030 0000000000000640 000000000000064b -DEBUG_RANGES-NEXT: 00000030 0000000000000637 000000000000063d -DEBUG_RANGES-NEXT: 00000030 <End of list> diff --git a/test/DebugInfo/dwarfdump-zlib.test b/test/DebugInfo/dwarfdump-zlib.test index 8ce2cf7690d0..cbd85ca093c1 100644 --- a/test/DebugInfo/dwarfdump-zlib.test +++ b/test/DebugInfo/dwarfdump-zlib.test @@ -1,12 +1,6 @@ REQUIRES: zlib -RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test-zlib.elf-x86-64 \ -RUN: | FileCheck %s -check-prefix FULLDUMP -RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test-zlib.elf-x86-64 \ -RUN: --address=0x400559 --functions | FileCheck %s -check-prefix MAIN +RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test-zlib.elf-x86-64 | FileCheck %s -FULLDUMP: .debug_abbrev contents -FULLDUMP: .debug_info contents - -MAIN: main -MAIN-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test-zlib.cc:16 +CHECK: .debug_abbrev contents +CHECK: .debug_info contents diff --git a/test/DebugInfo/empty.ll b/test/DebugInfo/empty.ll new file mode 100644 index 000000000000..cf40523e7e4a --- /dev/null +++ b/test/DebugInfo/empty.ll @@ -0,0 +1,31 @@ +; REQUIRES: object-emission + +; RUN: %llc_dwarf < %s -filetype=obj | llvm-dwarfdump - | FileCheck %s +; RUN: %llc_dwarf -split-dwarf=Enable < %s -filetype=obj | llvm-dwarfdump - | FileCheck --check-prefix=FISSION %s + +; darwin has a workaround for a linker bug so it always emits one line table entry +; XFAIL: darwin + +; Expect no line table entry since there are no functions and file references in this compile unit +; CHECK: .debug_line contents: +; CHECK: Line table prologue: +; CHECK: total_length: 0x00000019 +; CHECK-NOT: file_names[ + +; CHECK: .debug_pubnames contents: +; CHECK-NOT: Offset + +; CHECK: .debug_pubtypes contents: +; CHECK-NOT: Offset + +; Don't emit DW_AT_addr_base when there are no addresses. +; FISSION-NOT: DW_AT_GNU_addr_base [DW_FORM_sec_offset] + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!5} + +!0 = metadata !{i32 720913, metadata !4, i32 12, metadata !"clang version 3.1 (trunk 143523)", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !2, metadata !2, null, metadata !""} ; [ DW_TAG_compile_unit ] +!2 = metadata !{} +!3 = metadata !{i32 786473, metadata !4} ; [ DW_TAG_file_type ] +!4 = metadata !{metadata !"empty.c", metadata !"/home/nlewycky"} +!5 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/DebugInfo/enum.ll b/test/DebugInfo/enum.ll index bc09846bb8e1..df097a6ea92b 100644 --- a/test/DebugInfo/enum.ll +++ b/test/DebugInfo/enum.ll @@ -1,6 +1,6 @@ ; REQUIRES: object-emission -; RUN: llc -O0 -filetype=obj < %s > %t +; RUN: %llc_dwarf -O0 -filetype=obj < %s > %t ; RUN: llvm-dwarfdump %t | FileCheck %s ; IR generated from the following code compiled with clang -g: @@ -64,7 +64,7 @@ attributes #1 = { nounwind readnone } !8 = metadata !{i32 786436, metadata !1, null, metadata !"e2", i32 2, i64 32, i64 32, i32 0, i32 0, null, metadata !9, i32 0, null, null, null} ; [ DW_TAG_enumeration_type ] [e2] [line 2, size 32, align 32, offset 0] [def] [from ] !9 = metadata !{metadata !10} !10 = metadata !{i32 786472, metadata !"X", i64 0} ; [ DW_TAG_enumerator ] [X :: 0] -!11 = metadata !{i32 0} +!11 = metadata !{} !12 = metadata !{metadata !13} !13 = metadata !{i32 786478, metadata !1, metadata !14, metadata !"func", metadata !"func", metadata !"_Z4funcv", i32 3, metadata !15, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_Z4funcv, null, null, metadata !11, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [func] !14 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/enum.cpp] diff --git a/test/DebugInfo/global.ll b/test/DebugInfo/global.ll index 9a0c32ad91a3..3c97f0cb2279 100644 --- a/test/DebugInfo/global.ll +++ b/test/DebugInfo/global.ll @@ -1,8 +1,11 @@ ; REQUIRES: object-emission -; RUN: llc -O0 -filetype=obj < %s > %t +; RUN: %llc_dwarf -O0 -filetype=obj < %s > %t ; RUN: llvm-dwarfdump %t | FileCheck %s +; Also test that the null streamer doesn't crash with debug info. +; RUN: %llc_dwarf -O0 -filetype=null < %s + ; generated from the following source compiled to bitcode with clang -g -O1 ; static int i; ; int main() { @@ -25,7 +28,7 @@ attributes #0 = { nounwind readnone uwtable "less-precise-fpmad"="false" "no-fra !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 ", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !9, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/tmp/global.cpp] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !"global.cpp", metadata !"/tmp"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4} !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"main", metadata !"main", metadata !"", i32 2, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 ()* @main, null, null, metadata !2, i32 2} ; [ DW_TAG_subprogram ] [line 2] [def] [main] !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/global.cpp] diff --git a/test/DebugInfo/incorrect-variable-debugloc.ll b/test/DebugInfo/incorrect-variable-debugloc.ll new file mode 100644 index 000000000000..284704c54a91 --- /dev/null +++ b/test/DebugInfo/incorrect-variable-debugloc.ll @@ -0,0 +1,391 @@ +; REQUIRES: object-emission + +; RUN: %llc_dwarf -O2 -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s + +; This is a test case that's as reduced as I can get it, though I haven't fully +; understood the mechanisms by which this bug occurs, so perhaps there's further +; simplification to be had (it's certainly a bit non-obvious what's going on). I +; hesitate to hand-craft or otherwise simplify the IR compared to what Clang +; generates as this is a particular tickling of optimizations and debug location +; propagation I want a realistic example of. + +; Generated with clang-tot -cc1 -g -O2 -w -std=c++11 -fsanitize=address,use-after-return -fcxx-exceptions -fexceptions -x c++ incorrect-variable-debug-loc.cpp -emit-llvm + +; struct A { +; int m_fn1(); +; }; +; +; struct B { +; void __attribute__((always_inline)) m_fn2() { i = 0; } +; int i; +; }; +; +; struct C { +; void m_fn3(); +; int j; +; B b; +; }; +; +; int fn1() { +; C A; +; A.b.m_fn2(); +; A.m_fn3(); +; } +; void C::m_fn3() { +; A().m_fn1(); +; b.m_fn2(); +; } + +; CHECK: DW_TAG_structure_type +; CHECK-NEXT: DW_AT_name {{.*}} "C" +; CHECK: [[FN3_DECL:.*]]: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "m_fn3" + +; CHECK: DW_AT_specification {{.*}} {[[FN3_DECL]]} +; CHECK-NOT: DW_TAG +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "this" + +%struct.C = type { i32, %struct.B } +%struct.B = type { i32 } +%struct.A = type { i8 } + +@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 1, void ()* @asan.module_ctor }] +@__asan_option_detect_stack_use_after_return = external global i32 +@__asan_gen_ = private unnamed_addr constant [11 x i8] c"1 32 8 1 A\00", align 1 +@__asan_gen_1 = private unnamed_addr constant [13 x i8] c"1 32 1 3 tmp\00", align 1 + +; Function Attrs: noreturn sanitize_address +define i32 @_Z3fn1v() #0 { +entry: + %MyAlloca = alloca [64 x i8], align 32, !dbg !39 + %0 = ptrtoint [64 x i8]* %MyAlloca to i64, !dbg !39 + %1 = load i32* @__asan_option_detect_stack_use_after_return, !dbg !39 + %2 = icmp ne i32 %1, 0, !dbg !39 + br i1 %2, label %3, label %5 + +; <label>:3 ; preds = %entry + %4 = call i64 @__asan_stack_malloc_0(i64 64, i64 %0), !dbg !39 + br label %5 + +; <label>:5 ; preds = %entry, %3 + %6 = phi i64 [ %0, %entry ], [ %4, %3 ], !dbg !39 + %7 = add i64 %6, 32, !dbg !39 + %8 = inttoptr i64 %7 to %struct.C*, !dbg !39 + %9 = inttoptr i64 %6 to i64*, !dbg !39 + store i64 1102416563, i64* %9, !dbg !39 + %10 = add i64 %6, 8, !dbg !39 + %11 = inttoptr i64 %10 to i64*, !dbg !39 + store i64 ptrtoint ([11 x i8]* @__asan_gen_ to i64), i64* %11, !dbg !39 + %12 = add i64 %6, 16, !dbg !39 + %13 = inttoptr i64 %12 to i64*, !dbg !39 + store i64 ptrtoint (i32 ()* @_Z3fn1v to i64), i64* %13, !dbg !39 + %14 = lshr i64 %6, 3, !dbg !39 + %15 = add i64 %14, 2147450880, !dbg !39 + %16 = add i64 %15, 0, !dbg !39 + %17 = inttoptr i64 %16 to i64*, !dbg !39 + store i64 -868083117767659023, i64* %17, !dbg !39 + %i.i = getelementptr inbounds %struct.C* %8, i64 0, i32 1, i32 0, !dbg !39 + %18 = ptrtoint i32* %i.i to i64, !dbg !39 + %19 = lshr i64 %18, 3, !dbg !39 + %20 = add i64 %19, 2147450880, !dbg !39 + %21 = inttoptr i64 %20 to i8*, !dbg !39 + %22 = load i8* %21, !dbg !39 + %23 = icmp ne i8 %22, 0, !dbg !39 + br i1 %23, label %24, label %30, !dbg !39 + +; <label>:24 ; preds = %5 + %25 = and i64 %18, 7, !dbg !39 + %26 = add i64 %25, 3, !dbg !39 + %27 = trunc i64 %26 to i8, !dbg !39 + %28 = icmp sge i8 %27, %22, !dbg !39 + br i1 %28, label %29, label %30 + +; <label>:29 ; preds = %24 + call void @__asan_report_store4(i64 %18), !dbg !39 + call void asm sideeffect "", ""() + unreachable + +; <label>:30 ; preds = %24, %5 + store i32 0, i32* %i.i, align 4, !dbg !39, !tbaa !41 + tail call void @llvm.dbg.value(metadata !{%struct.C* %8}, i64 0, metadata !27), !dbg !46 + call void @_ZN1C5m_fn3Ev(%struct.C* %8), !dbg !47 + unreachable, !dbg !47 +} + +; Function Attrs: sanitize_address +define void @_ZN1C5m_fn3Ev(%struct.C* nocapture %this) #1 align 2 { +entry: + %MyAlloca = alloca [64 x i8], align 32, !dbg !48 + %0 = ptrtoint [64 x i8]* %MyAlloca to i64, !dbg !48 + %1 = load i32* @__asan_option_detect_stack_use_after_return, !dbg !48 + %2 = icmp ne i32 %1, 0, !dbg !48 + br i1 %2, label %3, label %5 + +; <label>:3 ; preds = %entry + %4 = call i64 @__asan_stack_malloc_0(i64 64, i64 %0), !dbg !48 + br label %5 + +; <label>:5 ; preds = %entry, %3 + %6 = phi i64 [ %0, %entry ], [ %4, %3 ], !dbg !48 + %7 = add i64 %6, 32, !dbg !48 + %8 = inttoptr i64 %7 to %struct.A*, !dbg !48 + %9 = inttoptr i64 %6 to i64*, !dbg !48 + store i64 1102416563, i64* %9, !dbg !48 + %10 = add i64 %6, 8, !dbg !48 + %11 = inttoptr i64 %10 to i64*, !dbg !48 + store i64 ptrtoint ([13 x i8]* @__asan_gen_1 to i64), i64* %11, !dbg !48 + %12 = add i64 %6, 16, !dbg !48 + %13 = inttoptr i64 %12 to i64*, !dbg !48 + store i64 ptrtoint (void (%struct.C*)* @_ZN1C5m_fn3Ev to i64), i64* %13, !dbg !48 + %14 = lshr i64 %6, 3, !dbg !48 + %15 = add i64 %14, 2147450880, !dbg !48 + %16 = add i64 %15, 0, !dbg !48 + %17 = inttoptr i64 %16 to i64*, !dbg !48 + store i64 -868083113472691727, i64* %17, !dbg !48 + tail call void @llvm.dbg.value(metadata !{%struct.C* %this}, i64 0, metadata !30), !dbg !48 + %call = call i32 @_ZN1A5m_fn1Ev(%struct.A* %8), !dbg !49 + %i.i = getelementptr inbounds %struct.C* %this, i64 0, i32 1, i32 0, !dbg !50 + %18 = ptrtoint i32* %i.i to i64, !dbg !50 + %19 = lshr i64 %18, 3, !dbg !50 + %20 = add i64 %19, 2147450880, !dbg !50 + %21 = inttoptr i64 %20 to i8*, !dbg !50 + %22 = load i8* %21, !dbg !50 + %23 = icmp ne i8 %22, 0, !dbg !50 + br i1 %23, label %24, label %30, !dbg !50 + +; <label>:24 ; preds = %5 + %25 = and i64 %18, 7, !dbg !50 + %26 = add i64 %25, 3, !dbg !50 + %27 = trunc i64 %26 to i8, !dbg !50 + %28 = icmp sge i8 %27, %22, !dbg !50 + br i1 %28, label %29, label %30 + +; <label>:29 ; preds = %24 + call void @__asan_report_store4(i64 %18), !dbg !50 + call void asm sideeffect "", ""() + unreachable + +; <label>:30 ; preds = %24, %5 + store i32 0, i32* %i.i, align 4, !dbg !50, !tbaa !41 + store i64 1172321806, i64* %9, !dbg !52 + %31 = icmp ne i64 %6, %0, !dbg !52 + br i1 %31, label %32, label %39, !dbg !52 + +; <label>:32 ; preds = %30 + %33 = add i64 %15, 0, !dbg !52 + %34 = inttoptr i64 %33 to i64*, !dbg !52 + store i64 -723401728380766731, i64* %34, !dbg !52 + %35 = add i64 %6, 56, !dbg !52 + %36 = inttoptr i64 %35 to i64*, !dbg !52 + %37 = load i64* %36, !dbg !52 + %38 = inttoptr i64 %37 to i8*, !dbg !52 + store i8 0, i8* %38, !dbg !52 + br label %42, !dbg !52 + +; <label>:39 ; preds = %30 + %40 = add i64 %15, 0, !dbg !52 + %41 = inttoptr i64 %40 to i64*, !dbg !52 + store i64 0, i64* %41, !dbg !52 + br label %42, !dbg !52 + +; <label>:42 ; preds = %39, %32 + ret void, !dbg !52 +} + +declare i32 @_ZN1A5m_fn1Ev(%struct.A*) #2 + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.value(metadata, i64, metadata) #3 + +define internal void @asan.module_ctor() { + tail call void @__asan_init_v3() + ret void +} + +declare void @__asan_init_v3() + +declare void @__asan_report_load1(i64) + +declare void @__asan_load1(i64) + +declare void @__asan_report_load2(i64) + +declare void @__asan_load2(i64) + +declare void @__asan_report_load4(i64) + +declare void @__asan_load4(i64) + +declare void @__asan_report_load8(i64) + +declare void @__asan_load8(i64) + +declare void @__asan_report_load16(i64) + +declare void @__asan_load16(i64) + +declare void @__asan_report_store1(i64) + +declare void @__asan_store1(i64) + +declare void @__asan_report_store2(i64) + +declare void @__asan_store2(i64) + +declare void @__asan_report_store4(i64) + +declare void @__asan_store4(i64) + +declare void @__asan_report_store8(i64) + +declare void @__asan_store8(i64) + +declare void @__asan_report_store16(i64) + +declare void @__asan_store16(i64) + +declare void @__asan_report_load_n(i64, i64) + +declare void @__asan_report_store_n(i64, i64) + +declare void @__asan_loadN(i64, i64) + +declare void @__asan_storeN(i64, i64) + +declare i8* @__asan_memmove(i8*, i8*, i64) + +declare i8* @__asan_memcpy(i8*, i8*, i64) + +declare i8* @__asan_memset(i8*, i32, i64) + +declare void @__asan_handle_no_return() + +declare void @__sanitizer_cov() + +declare void @__sanitizer_ptr_cmp(i64, i64) + +declare void @__sanitizer_ptr_sub(i64, i64) + +declare i64 @__asan_stack_malloc_0(i64, i64) + +declare void @__asan_stack_free_0(i64, i64, i64) + +declare i64 @__asan_stack_malloc_1(i64, i64) + +declare void @__asan_stack_free_1(i64, i64, i64) + +declare i64 @__asan_stack_malloc_2(i64, i64) + +declare void @__asan_stack_free_2(i64, i64, i64) + +declare i64 @__asan_stack_malloc_3(i64, i64) + +declare void @__asan_stack_free_3(i64, i64, i64) + +declare i64 @__asan_stack_malloc_4(i64, i64) + +declare void @__asan_stack_free_4(i64, i64, i64) + +declare i64 @__asan_stack_malloc_5(i64, i64) + +declare void @__asan_stack_free_5(i64, i64, i64) + +declare i64 @__asan_stack_malloc_6(i64, i64) + +declare void @__asan_stack_free_6(i64, i64, i64) + +declare i64 @__asan_stack_malloc_7(i64, i64) + +declare void @__asan_stack_free_7(i64, i64, i64) + +declare i64 @__asan_stack_malloc_8(i64, i64) + +declare void @__asan_stack_free_8(i64, i64, i64) + +declare i64 @__asan_stack_malloc_9(i64, i64) + +declare void @__asan_stack_free_9(i64, i64, i64) + +declare i64 @__asan_stack_malloc_10(i64, i64) + +declare void @__asan_stack_free_10(i64, i64, i64) + +declare void @__asan_poison_stack_memory(i64, i64) + +declare void @__asan_unpoison_stack_memory(i64, i64) + +declare void @__asan_before_dynamic_init(i64) + +declare void @__asan_after_dynamic_init() + +declare void @__asan_register_globals(i64, i64) + +declare void @__asan_unregister_globals(i64, i64) + +declare void @__sanitizer_cov_module_init(i64) + +attributes #0 = { noreturn sanitize_address "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { sanitize_address "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #2 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #3 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!36, !37} +!llvm.ident = !{!38} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 true, metadata !"", i32 0, metadata !2, metadata !3, metadata !21, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/<stdin>] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"<stdin>", metadata !"/tmp/dbginfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !14} +!4 = metadata !{i32 786451, metadata !5, null, metadata !"C", i32 10, i64 64, i64 32, i32 0, i32 0, null, metadata !6, i32 0, null, null, metadata !"_ZTS1C"} ; [ DW_TAG_structure_type ] [C] [line 10, size 64, align 32, offset 0] [def] [from ] +!5 = metadata !{metadata !"incorrect-variable-debug-loc.cpp", metadata !"/tmp/dbginfo"} +!6 = metadata !{metadata !7, metadata !9, metadata !10} +!7 = metadata !{i32 786445, metadata !5, metadata !"_ZTS1C", metadata !"j", i32 12, i64 32, i64 32, i64 0, i32 0, metadata !8} ; [ DW_TAG_member ] [j] [line 12, size 32, align 32, offset 0] [from int] +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{i32 786445, metadata !5, metadata !"_ZTS1C", metadata !"b", i32 13, i64 32, i64 32, i64 32, i32 0, metadata !"_ZTS1B"} ; [ DW_TAG_member ] [b] [line 13, size 32, align 32, offset 32] [from _ZTS1B] +!10 = metadata !{i32 786478, metadata !5, metadata !"_ZTS1C", metadata !"m_fn3", metadata !"m_fn3", metadata !"_ZN1C5m_fn3Ev", i32 11, metadata !11, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 true, null, null, i32 0, null, i32 11} ; [ DW_TAG_subprogram ] [line 11] [m_fn3] +!11 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!12 = metadata !{null, metadata !13} +!13 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !"_ZTS1C"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from _ZTS1C] +!14 = metadata !{i32 786451, metadata !5, null, metadata !"B", i32 5, i64 32, i64 32, i32 0, i32 0, null, metadata !15, i32 0, null, null, metadata !"_ZTS1B"} ; [ DW_TAG_structure_type ] [B] [line 5, size 32, align 32, offset 0] [def] [from ] +!15 = metadata !{metadata !16, metadata !17} +!16 = metadata !{i32 786445, metadata !5, metadata !"_ZTS1B", metadata !"i", i32 7, i64 32, i64 32, i64 0, i32 0, metadata !8} ; [ DW_TAG_member ] [i] [line 7, size 32, align 32, offset 0] [from int] +!17 = metadata !{i32 786478, metadata !5, metadata !"_ZTS1B", metadata !"m_fn2", metadata !"m_fn2", metadata !"_ZN1B5m_fn2Ev", i32 6, metadata !18, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 true, null, null, i32 0, null, i32 6} ; [ DW_TAG_subprogram ] [line 6] [m_fn2] +!18 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !19, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!19 = metadata !{null, metadata !20} +!20 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !"_ZTS1B"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from _ZTS1B] +!21 = metadata !{metadata !22, metadata !28, metadata !32} +!22 = metadata !{i32 786478, metadata !5, metadata !23, metadata !"fn1", metadata !"fn1", metadata !"_Z3fn1v", i32 16, metadata !24, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 ()* @_Z3fn1v, null, null, metadata !26, i32 16} ; [ DW_TAG_subprogram ] [line 16] [def] [fn1] +!23 = metadata !{i32 786473, metadata !5} ; [ DW_TAG_file_type ] [/tmp/dbginfo/incorrect-variable-debug-loc.cpp] +!24 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !25, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!25 = metadata !{metadata !8} +!26 = metadata !{metadata !27} +!27 = metadata !{i32 786688, metadata !22, metadata !"A", metadata !23, i32 17, metadata !"_ZTS1C", i32 0, i32 0} ; [ DW_TAG_auto_variable ] [A] [line 17] +!28 = metadata !{i32 786478, metadata !5, metadata !"_ZTS1C", metadata !"m_fn3", metadata !"m_fn3", metadata !"_ZN1C5m_fn3Ev", i32 21, metadata !11, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void (%struct.C*)* @_ZN1C5m_fn3Ev, null, metadata !10, metadata !29, i32 21} ; [ DW_TAG_subprogram ] [line 21] [def] [m_fn3] +!29 = metadata !{metadata !30} +!30 = metadata !{i32 786689, metadata !28, metadata !"this", null, i32 16777216, metadata !31, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!31 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !"_ZTS1C"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from _ZTS1C] +!32 = metadata !{i32 786478, metadata !5, metadata !"_ZTS1B", metadata !"m_fn2", metadata !"m_fn2", metadata !"_ZN1B5m_fn2Ev", i32 6, metadata !18, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, null, null, metadata !17, metadata !33, i32 6} ; [ DW_TAG_subprogram ] [line 6] [def] [m_fn2] +!33 = metadata !{metadata !34} +!34 = metadata !{i32 786689, metadata !32, metadata !"this", null, i32 16777216, metadata !35, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0] +!35 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !"_ZTS1B"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from _ZTS1B] +!36 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!37 = metadata !{i32 2, metadata !"Debug Info Version", i32 1} +!38 = metadata !{metadata !"clang version 3.5.0 "} +!39 = metadata !{i32 6, i32 0, metadata !32, metadata !40} +!40 = metadata !{i32 18, i32 0, metadata !22, null} +!41 = metadata !{metadata !42, metadata !43, i64 0} +!42 = metadata !{metadata !"_ZTS1B", metadata !43, i64 0} +!43 = metadata !{metadata !"int", metadata !44, i64 0} +!44 = metadata !{metadata !"omnipotent char", metadata !45, i64 0} +!45 = metadata !{metadata !"Simple C/C++ TBAA"} +!46 = metadata !{i32 17, i32 0, metadata !22, null} +!47 = metadata !{i32 19, i32 0, metadata !22, null} +!48 = metadata !{i32 0, i32 0, metadata !28, null} +!49 = metadata !{i32 22, i32 0, metadata !28, null} +!50 = metadata !{i32 6, i32 0, metadata !32, metadata !51} +!51 = metadata !{i32 23, i32 0, metadata !28, null} +!52 = metadata !{i32 24, i32 0, metadata !28, null} diff --git a/test/DebugInfo/inline-no-debug-info.ll b/test/DebugInfo/inline-no-debug-info.ll new file mode 100644 index 000000000000..2257b8961fb5 --- /dev/null +++ b/test/DebugInfo/inline-no-debug-info.ll @@ -0,0 +1,69 @@ +; RUN: opt < %s -inline -S | FileCheck %s + +; This was generated from the following source: +; int a, b; +; __attribute__((__always_inline__)) static void callee2() { b = 2; } +; __attribute__((__nodebug__)) void callee() { a = 1; callee2(); } +; void caller() { callee(); } +; by running +; clang -S test.c -emit-llvm -O1 -gline-tables-only -fno-strict-aliasing + +; CHECK-LABEL: @caller( + +; This instruction did not have a !dbg metadata in the callee. +; CHECK: store i32 1, {{.*}}, !dbg [[A:!.*]] + +; This instruction came from callee with a !dbg metadata. +; CHECK: store i32 2, {{.*}}, !dbg [[B:!.*]] + +; The remaining instruction from the caller. +; CHECK: ret void, !dbg [[A]] + +; Debug location of the code in caller() and of the inlined code that did not +; have any debug location before. +; CHECK-DAG: [[A]] = metadata !{i32 4, i32 0, metadata !{{[01-9]+}}, null} + +; Debug location of the inlined code. +; CHECK-DAG: [[B]] = metadata !{i32 2, i32 0, metadata !{{[01-9]+}}, metadata [[A]]} + + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +@a = common global i32 0, align 4 +@b = common global i32 0, align 4 + +; Function Attrs: nounwind uwtable +define void @callee() #0 { +entry: + store i32 1, i32* @a, align 4 + store i32 2, i32* @b, align 4, !dbg !11 + ret void +} + +; Function Attrs: nounwind uwtable +define void @caller() #0 { +entry: + tail call void @callee(), !dbg !12 + ret void, !dbg !12 +} + +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!8, !9} +!llvm.ident = !{!10} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5.0 (210174)", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 2} ; [ DW_TAG_compile_unit ] [/code/llvm/build0/test.c] [DW_LANG_C99] +!1 = metadata !{metadata !"test.c", metadata !"/code/llvm/build0"} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !7} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"caller", metadata !"caller", metadata !"", i32 4, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 true, void ()* @caller, null, null, metadata !2, i32 4} ; [ DW_TAG_subprogram ] [line 4] [def] [caller] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/code/llvm/build0/test.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !2, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"callee2", metadata !"callee2", metadata !"", i32 2, metadata !6, i1 true, i1 true, i32 0, i32 0, null, i32 0, i1 true, null, null, null, metadata !2, i32 2} ; [ DW_TAG_subprogram ] [line 2] [local] [def] [callee2] +!8 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!9 = metadata !{i32 2, metadata !"Debug Info Version", i32 1} +!10 = metadata !{metadata !"clang version 3.5.0 (210174)"} +!11 = metadata !{i32 2, i32 0, metadata !7, null} +!12 = metadata !{i32 4, i32 0, metadata !4, null} diff --git a/test/DebugInfo/inline-scopes.ll b/test/DebugInfo/inline-scopes.ll new file mode 100644 index 000000000000..36c073516c56 --- /dev/null +++ b/test/DebugInfo/inline-scopes.ll @@ -0,0 +1,130 @@ +; REQUIRES: object-emission + +; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s + +; bool f(); +; inline __attribute__((always_inline)) int f1() { +; if (bool b = f()) +; return 1; +; return 2; +; } +; +; inline __attribute__((always_inline)) int f2() { +; # 2 "y.cc" +; if (bool b = f()) +; return 3; +; return 4; +; } +; +; int main() { +; f1(); +; f2(); +; } + +; Ensure that lexical_blocks within inlined_subroutines are preserved/emitted. +; CHECK: DW_TAG_inlined_subroutine +; CHECK-NOT: DW_TAG +; CHECK-NOT: NULL +; CHECK: DW_TAG_lexical_block +; CHECK-NOT: DW_TAG +; CHECK-NOT: NULL +; CHECK: DW_TAG_variable +; Ensure that file changes don't interfere with creating inlined subroutines. +; (see the line directive inside 'f2' in thesource) +; CHECK: DW_TAG_inlined_subroutine +; CHECK: DW_TAG_variable +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_abstract_origin + +; Function Attrs: uwtable +define i32 @main() #0 { +entry: + %retval.i2 = alloca i32, align 4 + %b.i3 = alloca i8, align 1 + %retval.i = alloca i32, align 4 + %b.i = alloca i8, align 1 + call void @llvm.dbg.declare(metadata !{i8* %b.i}, metadata !16), !dbg !19 + %call.i = call zeroext i1 @_Z1fv(), !dbg !19 + %frombool.i = zext i1 %call.i to i8, !dbg !19 + store i8 %frombool.i, i8* %b.i, align 1, !dbg !19 + %0 = load i8* %b.i, align 1, !dbg !19 + %tobool.i = trunc i8 %0 to i1, !dbg !19 + br i1 %tobool.i, label %if.then.i, label %if.end.i, !dbg !19 + +if.then.i: ; preds = %entry + store i32 1, i32* %retval.i, !dbg !21 + br label %_Z2f1v.exit, !dbg !21 + +if.end.i: ; preds = %entry + store i32 2, i32* %retval.i, !dbg !22 + br label %_Z2f1v.exit, !dbg !22 + +_Z2f1v.exit: ; preds = %if.then.i, %if.end.i + %1 = load i32* %retval.i, !dbg !23 + call void @llvm.dbg.declare(metadata !{i8* %b.i3}, metadata !24), !dbg !27 + %call.i4 = call zeroext i1 @_Z1fv(), !dbg !27 + %frombool.i5 = zext i1 %call.i4 to i8, !dbg !27 + store i8 %frombool.i5, i8* %b.i3, align 1, !dbg !27 + %2 = load i8* %b.i3, align 1, !dbg !27 + %tobool.i6 = trunc i8 %2 to i1, !dbg !27 + br i1 %tobool.i6, label %if.then.i7, label %if.end.i8, !dbg !27 + +if.then.i7: ; preds = %_Z2f1v.exit + store i32 3, i32* %retval.i2, !dbg !29 + br label %_Z2f2v.exit, !dbg !29 + +if.end.i8: ; preds = %_Z2f1v.exit + store i32 4, i32* %retval.i2, !dbg !30 + br label %_Z2f2v.exit, !dbg !30 + +_Z2f2v.exit: ; preds = %if.then.i7, %if.end.i8 + %3 = load i32* %retval.i2, !dbg !31 + ret i32 0, !dbg !32 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +declare zeroext i1 @_Z1fv() #2 + +attributes #0 = { uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } +attributes #2 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!13, !14} +!llvm.ident = !{!15} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/inline-scopes.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"inline-scopes.cpp", metadata !"/tmp/dbginfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !10, metadata !12} +!4 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"main", metadata !"main", metadata !"", i32 7, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, metadata !2, i32 7} ; [ DW_TAG_subprogram ] [line 7] [def] [main] +!5 = metadata !{metadata !"y.cc", metadata !"/tmp/dbginfo"} +!6 = metadata !{i32 786473, metadata !5} ; [ DW_TAG_file_type ] [/tmp/dbginfo/y.cc] +!7 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{metadata !9} +!9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = metadata !{i32 786478, metadata !1, metadata !11, metadata !"f2", metadata !"f2", metadata !"_Z2f2v", i32 8, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, null, null, null, metadata !2, i32 8} ; [ DW_TAG_subprogram ] [line 8] [def] [f2] +!11 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/inline-scopes.cpp] +!12 = metadata !{i32 786478, metadata !1, metadata !11, metadata !"f1", metadata !"f1", metadata !"_Z2f1v", i32 2, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, null, null, null, metadata !2, i32 2} ; [ DW_TAG_subprogram ] [line 2] [def] [f1] +!13 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!14 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!15 = metadata !{metadata !"clang version 3.5.0 "} +!16 = metadata !{i32 786688, metadata !17, metadata !"b", metadata !11, i32 3, metadata !18, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [b] [line 3] +!17 = metadata !{i32 786443, metadata !1, metadata !12, i32 3, i32 0, i32 0, i32 1} ; [ DW_TAG_lexical_block ] [/tmp/dbginfo/inline-scopes.cpp] +!18 = metadata !{i32 786468, null, null, metadata !"bool", i32 0, i64 8, i64 8, i64 0, i32 0, i32 2} ; [ DW_TAG_base_type ] [bool] [line 0, size 8, align 8, offset 0, enc DW_ATE_boolean] +!19 = metadata !{i32 3, i32 0, metadata !17, metadata !20} +!20 = metadata !{i32 8, i32 0, metadata !4, null} ; [ DW_TAG_imported_declaration ] +!21 = metadata !{i32 4, i32 0, metadata !17, metadata !20} +!22 = metadata !{i32 5, i32 0, metadata !12, metadata !20} +!23 = metadata !{i32 6, i32 0, metadata !12, metadata !20} +!24 = metadata !{i32 786688, metadata !25, metadata !"b", metadata !6, i32 2, metadata !18, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [b] [line 2] +!25 = metadata !{i32 786443, metadata !5, metadata !26, i32 2, i32 0, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [/tmp/dbginfo/y.cc] +!26 = metadata !{i32 786443, metadata !5, metadata !10} ; [ DW_TAG_lexical_block ] [/tmp/dbginfo/y.cc] +!27 = metadata !{i32 2, i32 0, metadata !25, metadata !28} +!28 = metadata !{i32 9, i32 0, metadata !4, null} +!29 = metadata !{i32 3, i32 0, metadata !25, metadata !28} +!30 = metadata !{i32 4, i32 0, metadata !26, metadata !28} +!31 = metadata !{i32 5, i32 0, metadata !26, metadata !28} +!32 = metadata !{i32 10, i32 0, metadata !4, null} diff --git a/test/DebugInfo/inlined-arguments.ll b/test/DebugInfo/inlined-arguments.ll index 1dd5b2c07f94..6979862a536f 100644 --- a/test/DebugInfo/inlined-arguments.ll +++ b/test/DebugInfo/inlined-arguments.ll @@ -1,6 +1,6 @@ ; REQUIRES: object-emission -; RUN: llc -filetype=obj < %s > %t +; RUN: %llc_dwarf -filetype=obj < %s > %t ; RUN: llvm-dwarfdump %t | FileCheck %s ; IR generated from clang -O -g with the following source @@ -16,9 +16,11 @@ ; CHECK: DW_AT_name{{.*}}"f1" ; CHECK: DW_TAG_formal_parameter -; CHECK-NEXT: DW_AT_name{{.*}}"x" +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name{{.*}}"x" ; CHECK: DW_TAG_formal_parameter -; CHECK-NEXT: DW_AT_name{{.*}}"y" +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name{{.*}}"y" ; Function Attrs: uwtable define void @_Z2f2v() #0 { @@ -50,7 +52,7 @@ attributes #2 = { nounwind readnone } !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 ", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/blaikie/dev/scratch/exp.cpp] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !"exp.cpp", metadata !"/usr/local/google/home/blaikie/dev/scratch"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4, metadata !8} !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"f2", metadata !"f2", metadata !"_Z2f2v", i32 3, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void ()* @_Z2f2v, null, null, metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [f2] !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/usr/local/google/home/blaikie/dev/scratch/exp.cpp] diff --git a/test/DebugInfo/inlined-vars.ll b/test/DebugInfo/inlined-vars.ll index 34c5101a1426..9cfde1f26039 100644 --- a/test/DebugInfo/inlined-vars.ll +++ b/test/DebugInfo/inlined-vars.ll @@ -1,5 +1,5 @@ -; RUN: llc -O0 < %s | FileCheck %s -check-prefix ARGUMENT -; RUN: llc -O0 < %s | FileCheck %s -check-prefix VARIABLE +; RUN: %llc_dwarf -O0 < %s | FileCheck %s -check-prefix ARGUMENT +; RUN: %llc_dwarf -O0 < %s | FileCheck %s -check-prefix VARIABLE ; PR 13202 define i32 @main() uwtable { @@ -18,10 +18,11 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!27} -!0 = metadata !{i32 786449, metadata !26, i32 4, metadata !"clang version 3.2 (trunk 159419)", i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] +!0 = metadata !{i32 786449, metadata !26, i32 4, metadata !"clang version 3.2 (trunk 159419)", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] !1 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !5, metadata !10} -!5 = metadata !{i32 786478, metadata !26, metadata !6, metadata !"main", metadata !"main", metadata !"", i32 10, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 ()* @main, null, null, metadata !1, i32 10} ; [ DW_TAG_subprogram ] +!5 = metadata !{i32 786478, metadata !26, metadata !6, metadata !"main", metadata !"main", metadata !"", i32 10, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 ()* @main, null, null, metadata !2, i32 10} ; [ DW_TAG_subprogram ] !6 = metadata !{i32 786473, metadata !26} ; [ DW_TAG_file_type ] !7 = metadata !{i32 786453, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !8 = metadata !{metadata !9} @@ -29,8 +30,7 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !10 = metadata !{i32 786478, metadata !26, metadata !6, metadata !"f", metadata !"f", metadata !"_ZL1fi", i32 3, metadata !11, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 true, null, null, null, metadata !13, i32 3} ; [ DW_TAG_subprogram ] !11 = metadata !{i32 786453, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !12 = metadata !{metadata !9, metadata !9} -!13 = metadata !{metadata !14} -!14 = metadata !{metadata !15, metadata !16} +!13 = metadata !{metadata !15, metadata !16} !15 = metadata !{i32 786689, metadata !10, metadata !"argument", metadata !6, i32 16777219, metadata !9, i32 0, i32 0} ; [ DW_TAG_arg_variable ] ; Two DW_TAG_formal_parameter: one abstract and one inlined. diff --git a/test/DebugInfo/llvm-symbolizer-zlib.test b/test/DebugInfo/llvm-symbolizer-zlib.test new file mode 100644 index 000000000000..0aae7e6c6923 --- /dev/null +++ b/test/DebugInfo/llvm-symbolizer-zlib.test @@ -0,0 +1,7 @@ +REQUIRES: zlib + +RUN: echo "%p/Inputs/dwarfdump-test-zlib.elf-x86-64 0x400559" > %t.input +RUN: llvm-symbolizer < %t.input | FileCheck %s + +CHECK: main +CHECK-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test-zlib.cc:16 diff --git a/test/DebugInfo/llvm-symbolizer.test b/test/DebugInfo/llvm-symbolizer.test index a8799cfa5460..20d3dda21ab0 100644 --- a/test/DebugInfo/llvm-symbolizer.test +++ b/test/DebugInfo/llvm-symbolizer.test @@ -1,15 +1,26 @@ RUN: echo "%p/Inputs/dwarfdump-test.elf-x86-64 0x400559" > %t.input RUN: echo "%p/Inputs/dwarfdump-test.elf-x86-64.debuglink 0x400559" >> %t.input RUN: echo "%p/Inputs/dwarfdump-test.elf-x86-64 0x400436" >> %t.input +RUN: echo "%p/Inputs/dwarfdump-test.elf-x86-64 0x400528" >> %t.input +RUN: echo "%p/Inputs/dwarfdump-test.elf-x86-64 0x400586" >> %t.input +RUN: echo "%p/Inputs/dwarfdump-test2.elf-x86-64 0x4004e8" >> %t.input +RUN: echo "%p/Inputs/dwarfdump-test2.elf-x86-64 0x4004f4" >> %t.input RUN: echo "%p/Inputs/dwarfdump-test4.elf-x86-64 0x62c" >> %t.input RUN: echo "%p/Inputs/dwarfdump-inl-test.elf-x86-64 0x710" >> %t.input +RUN: echo "%p/Inputs/dwarfdump-inl-test.elf-x86-64 0x7d1" >> %t.input +RUN: echo "%p/Inputs/dwarfdump-inl-test.elf-x86-64 0x785" >> %t.input RUN: echo "%p/Inputs/dwarfdump-inl-test.high_pc.elf-x86-64 0x568" >> %t.input +RUN: echo "\"%p/Inputs/dwarfdump-test3.elf-x86-64 space\" 0x640" >> %t.input RUN: echo "\"%p/Inputs/dwarfdump-test3.elf-x86-64 space\" 0x633" >> %t.input +RUN: echo "\"%p/Inputs/dwarfdump-test3.elf-x86-64 space\" 0x62d" >> %t.input RUN: echo "%p/Inputs/macho-universal 0x1f84" >> %t.input RUN: echo "%p/Inputs/macho-universal:i386 0x1f67" >> %t.input RUN: echo "%p/Inputs/macho-universal:x86_64 0x100000f05" >> %t.input +RUN: echo "%p/Inputs/llvm-symbolizer-dwo-test 0x400514" >> %t.input +RUN: echo "%p/Inputs/fission-ranges.elf-x86_64 0x720" >> %t.input +RUN: echo "%p/Inputs/arange-overlap.elf-x86_64 0x714" >> %t.input -RUN: llvm-symbolizer --functions --inlining --demangle=false \ +RUN: llvm-symbolizer --functions=linkage --inlining --demangle=false \ RUN: --default-arch=i386 < %t.input | FileCheck %s CHECK: main @@ -20,6 +31,18 @@ CHECK-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test.cc:16 CHECK: _start +CHECK: _Z1fii +CHECK-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test.cc:11 + +CHECK: DummyClass +CHECK-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test.cc:4 + +CHECK: a +CHECK-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test2-helper.cc:2 + +CHECK: main +CHECK-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test2-main.cc:4 + CHECK: _Z1cv CHECK-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test4-part1.cc:2 @@ -30,7 +53,19 @@ CHECK-NEXT: dwarfdump-inl-test.h:7 CHECK-NEXT: inlined_f CHECK-NEXT: dwarfdump-inl-test.cc:3 CHECK-NEXT: main -CHECK-NEXT: dwarfdump-inl-test.cc: +CHECK-NEXT: dwarfdump-inl-test.cc:8 + +CHECK: inlined_g +CHECK-NEXT: dwarfdump-inl-test.h:7 +CHECK-NEXT: inlined_f +CHECK-NEXT: dwarfdump-inl-test.cc:3 +CHECK-NEXT: main +CHECK-NEXT: dwarfdump-inl-test.cc:8 + +CHECK: inlined_f +CHECK-NEXT: dwarfdump-inl-test.cc:3 +CHECK-NEXT: main +CHECK-NEXT: dwarfdump-inl-test.cc:8 CHECK: inlined_h CHECK-NEXT: dwarfdump-inl-test.h:3 @@ -39,15 +74,30 @@ CHECK-NEXT: dwarfdump-inl-test.h:7 CHECK-NEXT: inlined_f CHECK-NEXT: dwarfdump-inl-test.cc:3 CHECK-NEXT: main -CHECK-NEXT: dwarfdump-inl-test.cc: +CHECK-NEXT: dwarfdump-inl-test.cc:8 + +CHECK: C +CHECK-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test3.cc:3 -CHECK: _Z3do1v -CHECK-NEXT: dwarfdump-test3-decl.h:7 +CHECK: _Z3do1v +CHECK-NEXT: /tmp/include{{[/\\]}}dwarfdump-test3-decl.h:7 + +CHECK: _Z3do2v +CHECK-NEXT: /tmp/dbginfo{{[/\\]}}include{{[/\\]}}dwarfdump-test3-decl2.h:1 CHECK: main CHECK: _Z3inci CHECK: _Z3inci +CHECK: main +CHECK-NEXT: llvm-symbolizer-dwo-test.cc:11 + +CHECK: main +CHECK-NEXT: {{.*}}fission-ranges.cc:6 + +CHECK: _ZN1S3bazEv +CHECK-NEXT: {{.*}}arange-overlap.cc:6 + RUN: echo "unexisting-file 0x1234" > %t.input2 RUN: llvm-symbolizer < %t.input2 @@ -57,3 +107,35 @@ RUN: llvm-symbolizer < %t.input3 | FileCheck %s --check-prefix=UNKNOWN-ARCH UNKNOWN-ARCH-NOT: main UNKNOWN-ARCH: ?? UNKNOWN-ARCH-NOT: main + +RUN: echo "0x400559" > %t.input4 +RUN: echo "0x400436" >> %t.input4 +RUN: llvm-symbolizer --obj %p/Inputs/dwarfdump-test.elf-x86-64 < %t.input4 \ +RUN: | FileCheck %s --check-prefix=BINARY + +BINARY: main +BINARY-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test.cc:16 +BINARY: _start + +RUN: echo "0x400720" > %t.input5 +RUN: echo "0x4004a0" >> %t.input5 +RUN: echo "0x4006f0" >> %t.input5 +RUN: llvm-symbolizer --obj %p/Inputs/llvm-symbolizer-test.elf-x86-64 < %t.input5 \ +RUN: | FileCheck %s --check-prefix=BINARY_C + +BINARY_C: main +BINARY_C-NEXT: /tmp/dbginfo{{[/\\]}}llvm-symbolizer-test.c:10 +BINARY_C: _start +BINARY_C: {{g$}} + +RUN: echo "0x1f1" > %t.input6 +RUN: llvm-symbolizer --obj %p/Inputs/shared-object-stripped.elf-i386 < %t.input6 \ +RUN: | FileCheck %s --check-prefix=STRIPPED + +STRIPPED: global_func + +RUN: echo "%p/Inputs/dwarfdump-test4.elf-x86-64 0x62c" > %t.input7 +RUN: llvm-symbolizer --functions=short --use-symbol-table=false --demangle=false < %t.input7 \ +RUN: | FileCheck %s --check-prefix=SHORT_FUNCTION_NAME + +SHORT_FUNCTION_NAME-NOT: _Z1cv diff --git a/test/DebugInfo/lto-comp-dir.ll b/test/DebugInfo/lto-comp-dir.ll new file mode 100644 index 000000000000..d272dff6ea82 --- /dev/null +++ b/test/DebugInfo/lto-comp-dir.ll @@ -0,0 +1,84 @@ +; REQUIRES: object-emission + +; RUN: %llc_dwarf < %s -filetype=obj | llvm-dwarfdump -debug-dump=line - | FileCheck %s +; RUN: %llc_dwarf < %s -filetype=asm | FileCheck --check-prefix=ASM %s + +; If multiple line tables are emitted, one per CU, those line tables can +; unambiguously rely on the comp_dir of their owning CU and use directory '0' +; to refer to it. + +; CHECK: .debug_line contents: +; CHECK-NEXT: Line table prologue: +; CHECK-NOT: include_directories +; CHECK: file_names[ 1] 0 {{.*}} a.cpp +; CHECK-NOT: file_names + +; CHECK: Line table prologue: +; CHECK-NOT: include_directories +; CHECK: file_names[ 1] 0 {{.*}} b.cpp +; CHECK-NOT: file_names + +; However, if a single line table is emitted and shared between CUs, the +; comp_dir is ambiguous and relying on it would lead to different path +; interpretations depending on which CU lead to the table - so ensure that +; full paths are always emitted in this case, never comp_dir relative. + +; ASM: .file 1 "/tmp/dbginfo/a{{[/\\]+}}a.cpp" +; ASM: .file 2 "/tmp/dbginfo/b{{[/\\]+}}b.cpp" + +; Generated from the following source compiled to bitcode from within their +; respective directories (with debug info) and linked together with llvm-link + +; a/a.cpp +; void func() { +; } + +; b/b.cpp +; void func(); +; int main() { +; func(); +; } + +; Function Attrs: nounwind uwtable +define void @_Z4funcv() #0 { +entry: + ret void, !dbg !19 +} + +; Function Attrs: uwtable +define i32 @main() #1 { +entry: + call void @_Z4funcv(), !dbg !20 + ret i32 0, !dbg !21 +} + +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0, !8} +!llvm.module.flags = !{!16, !17} +!llvm.ident = !{!18, !18} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} +!1 = metadata !{metadata !"a.cpp", metadata !"/tmp/dbginfo/a"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"func", metadata !"func", metadata !"_Z4funcv", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_Z4funcv, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [func] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/a/a.cpp] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{null} +!8 = metadata !{i32 786449, metadata !9, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !10, metadata !2, metadata !2, metadata !"", i32 1} +!9 = metadata !{metadata !"b.cpp", metadata !"/tmp/dbginfo/b"} +!10 = metadata !{metadata !11} +!11 = metadata !{i32 786478, metadata !9, metadata !12, metadata !"main", metadata !"main", metadata !"", i32 2, metadata !13, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, metadata !2, i32 2} ; [ DW_TAG_subprogram ] [line 2] [def] [main] +!12 = metadata !{i32 786473, metadata !9} ; [ DW_TAG_file_type ] [/tmp/dbginfo/b/b.cpp] +!13 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !14, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!14 = metadata !{metadata !15} +!15 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!16 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!17 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!18 = metadata !{metadata !"clang version 3.5.0 "} +!19 = metadata !{i32 2, i32 0, metadata !4, null} +!20 = metadata !{i32 3, i32 0, metadata !11, null} +!21 = metadata !{i32 4, i32 0, metadata !11, null} + diff --git a/test/DebugInfo/member-order.ll b/test/DebugInfo/member-order.ll index a0c283db5a16..652a6cd6c314 100644 --- a/test/DebugInfo/member-order.ll +++ b/test/DebugInfo/member-order.ll @@ -1,6 +1,6 @@ ; REQUIRES: object-emission -; RUN: llc -filetype=obj -O0 < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s +; RUN: %llc_dwarf -filetype=obj -O0 < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s ; generated by clang from: ; struct foo { @@ -45,7 +45,7 @@ attributes #1 = { nounwind readnone } !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !13, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/member-order.cpp] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !"member-order.cpp", metadata !"/tmp/dbginfo"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4} !4 = metadata !{i32 786451, metadata !1, null, metadata !"foo", i32 1, i64 8, i64 8, i32 0, i32 0, null, metadata !5, i32 0, null, null, metadata !"_ZTS3foo"} ; [ DW_TAG_structure_type ] [foo] [line 1, size 8, align 8, offset 0] [def] [from ] !5 = metadata !{metadata !6, metadata !11} diff --git a/test/DebugInfo/member-pointers.ll b/test/DebugInfo/member-pointers.ll index 0bc4ee67265b..4ca69426efbe 100644 --- a/test/DebugInfo/member-pointers.ll +++ b/test/DebugInfo/member-pointers.ll @@ -1,7 +1,7 @@ ; REQUIRES: object-emission ; XFAIL: hexagon -; RUN: llc -filetype=obj -O0 < %s > %t +; RUN: %llc_dwarf -filetype=obj -O0 < %s > %t ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; CHECK: DW_TAG_ptr_to_member_type ; CHECK: DW_TAG_ptr_to_member_type @@ -23,8 +23,8 @@ !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!16} -!0 = metadata !{i32 786449, metadata !15, i32 4, metadata !"clang version 3.3 ", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !3, metadata !""} ; [ DW_TAG_compile_unit ] [/home/blaikie/Development/scratch/simple.cpp] [DW_LANG_C_plus_plus] -!1 = metadata !{i32 0} +!0 = metadata !{i32 786449, metadata !15, i32 4, metadata !"clang version 3.3 ", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/home/blaikie/Development/scratch/simple.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{} !3 = metadata !{metadata !5, metadata !10} !5 = metadata !{i32 786484, i32 0, null, metadata !"x", metadata !"x", metadata !"", metadata !6, i32 4, metadata !7, i32 0, i32 1, i64* @x, null} ; [ DW_TAG_variable ] [x] [line 4] [def] !6 = metadata !{i32 786473, metadata !15} ; [ DW_TAG_file_type ] diff --git a/test/DebugInfo/missing-abstract-variable.ll b/test/DebugInfo/missing-abstract-variable.ll new file mode 100644 index 000000000000..59a38cf39d5f --- /dev/null +++ b/test/DebugInfo/missing-abstract-variable.ll @@ -0,0 +1,191 @@ +; REQUIRES: object-emission + +; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s + +; The formal parameter 'b' for Function 'x' when inlined within 'a' is lost on +; mips and powerpc64 (and on x86_64 at at least -O2). Presumably this is a +; SelectionDAG issue (do mips/powerpc64 use FastISel?). +; XFAIL: mips, powerpc64, s390x + +; Build from the following source with clang -O2. + +; The important details are that 'x's abstract definition is first built during +; the definition of 'b', where the parameter to 'x' is constant and so 'x's 's' +; variable is optimized away. No abstract definition DIE for 's' is constructed. +; Then, during 'a' emission, the abstract DbgVariable for 's' is created, but +; the abstract DIE isn't (since the abstract definition for 'b' is already +; built). This results in 's' inlined in 'a' being emitted with its name, line, +; file there, rather than referencing an abstract definition. + +; extern int t; +; +; void f(int); +; +; inline void x(bool b) { +; if (b) { +; int s = t; +; f(s); +; } +; f(0); +; } +; +; void b() { +; x(false); +; } +; +; void a(bool u) { +; x(u); +; } + +; CHECK: [[ABS_X:.*]]: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "x" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: [[ABS_B:.*]]: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "b" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_lexical_block +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_lexical_block +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: [[ABS_S:.*]]: DW_TAG_variable +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "s" + +; CHECK: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "b" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_inlined_subroutine +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_abstract_origin {{.*}} {[[ABS_X]]} +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_abstract_origin {{.*}} {[[ABS_B]]} +; Notice 'x's local variable 's' is missing. Not necessarily a bug here, +; since it's been optimized entirely away and it should be described in +; abstract subprogram. +; CHECK-NOT: DW_TAG +; CHECK: NULL +; CHECK-NOT: DW_TAG +; CHECK: NULL + +; CHECK: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "a" +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_inlined_subroutine +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_abstract_origin {{.*}} {[[ABS_X]]} +; CHECK-NOT: {{DW_TAG|NULL}} +; FIXME: This formal parameter goes missing at least at -O2 (& on +; mips/powerpc), maybe before that. Perhaps SelectionDAG is to blame (and +; fastisel succeeds). +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_abstract_origin {{.*}} {[[ABS_B]]} + +; The two lexical blocks here are caused by the scope of the if that includes +; the condition variable, and the scope within the if's composite statement. I'm +; not sure we really need both of them since there's no variable declared in the +; outer of the two + +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_lexical_block +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_lexical_block +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_variable +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_abstract_origin {{.*}} {[[ABS_S]]} + +@t = external global i32 + +; Function Attrs: uwtable +define void @_Z1bv() #0 { +entry: + tail call void @llvm.dbg.value(metadata !24, i64 0, metadata !25), !dbg !27 + tail call void @_Z1fi(i32 0), !dbg !28 + ret void, !dbg !29 +} + +; Function Attrs: uwtable +define void @_Z1ab(i1 zeroext %u) #0 { +entry: + tail call void @llvm.dbg.value(metadata !{i1 %u}, i64 0, metadata !13), !dbg !30 + tail call void @llvm.dbg.value(metadata !{i1 %u}, i64 0, metadata !31), !dbg !33 + br i1 %u, label %if.then.i, label %_Z1xb.exit, !dbg !34 + +if.then.i: ; preds = %entry + %0 = load i32* @t, align 4, !dbg !35, !tbaa !36 + tail call void @llvm.dbg.value(metadata !{i32 %0}, i64 0, metadata !40), !dbg !35 + tail call void @_Z1fi(i32 %0), !dbg !41 + br label %_Z1xb.exit, !dbg !42 + +_Z1xb.exit: ; preds = %entry, %if.then.i + tail call void @_Z1fi(i32 0), !dbg !43 + ret void, !dbg !44 +} + +declare void @_Z1fi(i32) #1 + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.value(metadata, i64, metadata) #2 + +attributes #0 = { uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #2 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!21, !22} +!llvm.ident = !{!23} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/missing-abstract-variables.cc] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"missing-abstract-variables.cc", metadata !"/tmp/dbginfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !8, metadata !14} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"b", metadata !"b", metadata !"_Z1bv", i32 13, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void ()* @_Z1bv, null, null, metadata !2, i32 13} ; [ DW_TAG_subprogram ] [line 13] [def] [b] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/missing-abstract-variables.cc] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{null} +!8 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"a", metadata !"a", metadata !"_Z1ab", i32 17, metadata !9, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void (i1)* @_Z1ab, null, null, metadata !12, i32 17} ; [ DW_TAG_subprogram ] [line 17] [def] [a] +!9 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !10, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!10 = metadata !{null, metadata !11} +!11 = metadata !{i32 786468, null, null, metadata !"bool", i32 0, i64 8, i64 8, i64 0, i32 0, i32 2} ; [ DW_TAG_base_type ] [bool] [line 0, size 8, align 8, offset 0, enc DW_ATE_boolean] +!12 = metadata !{metadata !13} +!13 = metadata !{i32 786689, metadata !8, metadata !"u", metadata !5, i32 16777233, metadata !11, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [u] [line 17] +!14 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"x", metadata !"x", metadata !"_Z1xb", i32 5, metadata !9, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, null, null, null, metadata !15, i32 5} ; [ DW_TAG_subprogram ] [line 5] [def] [x] +!15 = metadata !{metadata !16, metadata !17} +!16 = metadata !{i32 786689, metadata !14, metadata !"b", metadata !5, i32 16777221, metadata !11, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [b] [line 5] +!17 = metadata !{i32 786688, metadata !18, metadata !"s", metadata !5, i32 7, metadata !20, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [s] [line 7] +!18 = metadata !{i32 786443, metadata !1, metadata !19, i32 6, i32 0, i32 0, i32 1} ; [ DW_TAG_lexical_block ] [/tmp/dbginfo/missing-abstract-variables.cc] +!19 = metadata !{i32 786443, metadata !1, metadata !14, i32 6, i32 0, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [/tmp/dbginfo/missing-abstract-variables.cc] +!20 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!21 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!22 = metadata !{i32 2, metadata !"Debug Info Version", i32 1} +!23 = metadata !{metadata !"clang version 3.5.0 "} +!24 = metadata !{i1 false} +!25 = metadata !{i32 786689, metadata !14, metadata !"b", metadata !5, i32 16777221, metadata !11, i32 0, metadata !26} ; [ DW_TAG_arg_variable ] [b] [line 5] +!26 = metadata !{i32 14, i32 0, metadata !4, null} +!27 = metadata !{i32 5, i32 0, metadata !14, metadata !26} +!28 = metadata !{i32 10, i32 0, metadata !14, metadata !26} +!29 = metadata !{i32 15, i32 0, metadata !4, null} +!30 = metadata !{i32 17, i32 0, metadata !8, null} +!31 = metadata !{i32 786689, metadata !14, metadata !"b", metadata !5, i32 16777221, metadata !11, i32 0, metadata !32} ; [ DW_TAG_arg_variable ] [b] [line 5] +!32 = metadata !{i32 18, i32 0, metadata !8, null} +!33 = metadata !{i32 5, i32 0, metadata !14, metadata !32} +!34 = metadata !{i32 6, i32 0, metadata !19, metadata !32} +!35 = metadata !{i32 7, i32 0, metadata !18, metadata !32} +!36 = metadata !{metadata !37, metadata !37, i64 0} +!37 = metadata !{metadata !"int", metadata !38, i64 0} +!38 = metadata !{metadata !"omnipotent char", metadata !39, i64 0} +!39 = metadata !{metadata !"Simple C/C++ TBAA"} +!40 = metadata !{i32 786688, metadata !18, metadata !"s", metadata !5, i32 7, metadata !20, i32 0, metadata !32} ; [ DW_TAG_auto_variable ] [s] [line 7] +!41 = metadata !{i32 8, i32 0, metadata !18, metadata !32} ; [ DW_TAG_imported_declaration ] +!42 = metadata !{i32 9, i32 0, metadata !18, metadata !32} +!43 = metadata !{i32 10, i32 0, metadata !14, metadata !32} +!44 = metadata !{i32 19, i32 0, metadata !8, null} diff --git a/test/DebugInfo/namespace.ll b/test/DebugInfo/namespace.ll index 9d0b25c74bae..a9de62c39062 100644 --- a/test/DebugInfo/namespace.ll +++ b/test/DebugInfo/namespace.ll @@ -1,6 +1,6 @@ ; REQUIRES: object-emission -; RUN: llc -O0 -filetype=obj < %s > %t +; RUN: %llc_dwarf -O0 -filetype=obj < %s > %t ; RUN: llvm-dwarfdump %t | FileCheck %s ; CHECK: debug_info contents ; CHECK: [[NS1:0x[0-9a-f]*]]:{{ *}}DW_TAG_namespace @@ -16,14 +16,6 @@ ; CHECK: [[I:0x[0-9a-f]*]]:{{ *}}DW_TAG_variable ; CHECK-NEXT: DW_AT_name{{.*}}= "i" ; CHECK-NOT: NULL -; CHECK: DW_TAG_subprogram -; CHECK-NEXT: DW_AT_MIPS_linkage_name -; CHECK-NEXT: DW_AT_name{{.*}}= "f1" -; CHECK: [[FUNC1:0x[0-9a-f]*]]:{{ *}}DW_TAG_subprogram -; CHECK-NEXT: DW_AT_MIPS_linkage_name -; CHECK-NEXT: DW_AT_name{{.*}}= "f1" -; CHECK: NULL -; CHECK-NOT: NULL ; CHECK: [[FOO:0x[0-9a-f]*]]:{{ *}}DW_TAG_structure_type ; CHECK-NEXT: DW_AT_name{{.*}}= "foo" ; CHECK-NEXT: DW_AT_declaration @@ -31,7 +23,16 @@ ; CHECK: [[BAR:0x[0-9a-f]*]]:{{ *}}DW_TAG_structure_type ; CHECK-NEXT: DW_AT_name{{.*}}= "bar" ; CHECK: NULL -; CHECK: NULL +; CHECK: [[FUNC1:.*]]: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_MIPS_linkage_name +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name{{.*}}= "f1" +; CHECK: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_MIPS_linkage_name +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name{{.*}}= "f1" ; CHECK: NULL ; CHECK-NOT: NULL @@ -44,9 +45,18 @@ ; CHECK: NULL ; CHECK-NOT: NULL +; CHECK: DW_TAG_imported_module +; Same bug as above, this should be F2, not F1 +; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F1]]) +; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x0b) +; CHECK-NEXT: DW_AT_import{{.*}}=> {[[NS1]]}) +; CHECK-NOT: NULL + ; CHECK: DW_TAG_subprogram -; CHECK-NEXT: DW_AT_MIPS_linkage_name -; CHECK-NEXT: DW_AT_name{{.*}}= "func" +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_MIPS_linkage_name +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name{{.*}}= "func" ; CHECK-NOT: NULL ; CHECK: DW_TAG_imported_module ; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F2]]) @@ -73,13 +83,13 @@ ; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x16) ; CHECK-NEXT: DW_AT_import{{.*}}=> {[[I]]}) ; CHECK-NOT: NULL -; CHECK: [[X:0x[0-9a-f]*]]:{{ *}}DW_TAG_imported_module +; CHECK: [[X:0x[0-9a-f]*]]:{{ *}}DW_TAG_imported_declaration ; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F2]]) ; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x18) ; CHECK-NEXT: DW_AT_import{{.*}}=> {[[NS1]]}) ; CHECK-NEXT: DW_AT_name{{.*}}"X" ; CHECK-NOT: NULL -; CHECK: DW_TAG_imported_module +; CHECK: DW_TAG_imported_declaration ; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F2]]) ; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x19) ; CHECK-NEXT: DW_AT_import{{.*}}=> {[[X]]}) @@ -93,13 +103,7 @@ ; CHECK-NEXT: DW_AT_import{{.*}}=> {[[NS2]]}) ; CHECK: NULL ; CHECK: NULL -; CHECK-NOT: NULL - -; CHECK: DW_TAG_imported_module -; Same bug as above, this should be F2, not F1 -; CHECK-NEXT: DW_AT_decl_file{{.*}}(0x0[[F1]]) -; CHECK-NEXT: DW_AT_decl_line{{.*}}(0x0b) -; CHECK-NEXT: DW_AT_import{{.*}}=> {[[NS1]]}) +; CHECK: NULL ; CHECK: file_names[ [[F1]]]{{.*}}debug-info-namespace.cpp ; CHECK: file_names[ [[F2]]]{{.*}}foo.cpp @@ -199,7 +203,7 @@ attributes #1 = { nounwind readnone } !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !19, metadata !21, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/blaikie/dev/llvm/build/clang/debug//usr/local/google/home/blaikie/dev/llvm/src/tools/clang/test/CodeGenCXX/debug-info-namespace.cpp] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !"/usr/local/google/home/blaikie/dev/llvm/src/tools/clang/test/CodeGenCXX/debug-info-namespace.cpp", metadata !"/usr/local/google/home/blaikie/dev/llvm/build/clang/debug"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4, metadata !10, metadata !14} !4 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"f1", metadata !"f1", metadata !"_ZN1A1B2f1Ev", i32 3, metadata !8, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_ZN1A1B2f1Ev, null, null, metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [f1] !5 = metadata !{metadata !"foo.cpp", metadata !"/usr/local/google/home/blaikie/dev/llvm/build/clang/debug"} @@ -236,8 +240,8 @@ attributes #1 = { nounwind readnone } !36 = metadata !{i32 786468} !37 = metadata !{i32 786440, metadata !14, metadata !10, i32 21} ; [ DW_TAG_imported_declaration ] !38 = metadata !{i32 786440, metadata !14, metadata !20, i32 22} ; [ DW_TAG_imported_declaration ] -!39 = metadata !{i32 786490, metadata !14, metadata !7, i32 24, metadata !"X"} ; [ DW_TAG_imported_module ] -!40 = metadata !{i32 786490, metadata !14, metadata !39, i32 25, metadata !"Y"} ; [ DW_TAG_imported_module ] +!39 = metadata !{i32 786440, metadata !14, metadata !7, i32 24, metadata !"X"} ; [ DW_TAG_imported_declaration ] +!40 = metadata !{i32 786440, metadata !14, metadata !39, i32 25, metadata !"Y"} ; [ DW_TAG_imported_declaration ] !41 = metadata !{i32 3, i32 0, metadata !4, null} !42 = metadata !{i32 786689, metadata !10, metadata !"", metadata !15, i32 16777220, metadata !13, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [line 4] !43 = metadata !{i32 4, i32 0, metadata !10, null} diff --git a/test/DebugInfo/namespace_function_definition.ll b/test/DebugInfo/namespace_function_definition.ll new file mode 100644 index 000000000000..590f2b301ffe --- /dev/null +++ b/test/DebugInfo/namespace_function_definition.ll @@ -0,0 +1,44 @@ +; REQUIRES: object-emission + +; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s + +; Generated from clang with the following source: +; namespace ns { +; void func() { +; } +; } + +; CHECK: DW_TAG_namespace +; CHECK-NEXT: DW_AT_name {{.*}} "ns" +; CHECK: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_low_pc +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_MIPS_linkage_name {{.*}} "_ZN2ns4funcEv" +; CHECK: NULL +; CHECK: NULL + +; Function Attrs: nounwind uwtable +define void @_ZN2ns4funcEv() #0 { +entry: + ret void, !dbg !11 +} + +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!8, !9} +!llvm.ident = !{!10} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/namespace_function_definition.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"namespace_function_definition.cpp", metadata !"/tmp/dbginfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"func", metadata !"func", metadata !"_ZN2ns4funcEv", i32 2, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @_ZN2ns4funcEv, null, null, metadata !2, i32 2} ; [ DW_TAG_subprogram ] [line 2] [def] [func] +!5 = metadata !{i32 786489, metadata !1, null, metadata !"ns", i32 1} ; [ DW_TAG_namespace ] [ns] [line 1] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{null} +!8 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!9 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!10 = metadata !{metadata !"clang version 3.5.0 "} +!11 = metadata !{i32 3, i32 0, metadata !4, null} diff --git a/test/DebugInfo/namespace_inline_function_definition.ll b/test/DebugInfo/namespace_inline_function_definition.ll new file mode 100644 index 000000000000..65fa4a442dc6 --- /dev/null +++ b/test/DebugInfo/namespace_inline_function_definition.ll @@ -0,0 +1,92 @@ +; REQUIRES: object-emission + +; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s + +; Generate from clang with the following source. Note that the definition of +; the inline function follows its use to workaround another bug that should be +; fixed soon. +; namespace ns { +; int func(int i); +; } +; extern int x; +; int main() { return ns::func(x); } +; int __attribute__((always_inline)) ns::func(int i) { return i * 2; } + +; CHECK: DW_TAG_namespace +; CHECK-NEXT: DW_AT_name {{.*}} "ns" +; CHECK-NOT: DW_TAG +; CHECK: [[ABS_DEF:0x.*]]: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_MIPS_linkage_name {{.*}} "_ZN2ns4funcEi" +; CHECK-NOT: DW_TAG +; CHECK: [[ABS_PRM:0x.*]]: DW_TAG_formal_parameter +; CHECK: NULL +; CHECK-NOT: NULL +; CHECK: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_abstract_origin {{.*}} {[[ABS_DEF]]} +; CHECK-NOT: DW_TAG +; CHECK: DW_TAG_formal_parameter +; CHECK: DW_AT_abstract_origin {{.*}} {[[ABS_PRM]]} +; CHECK: NULL +; CHECK: NULL +; CHECK: NULL + +@x = external global i32 + +; Function Attrs: uwtable +define i32 @main() #0 { +entry: + %i.addr.i = alloca i32, align 4 + %retval = alloca i32, align 4 + store i32 0, i32* %retval + %0 = load i32* @x, align 4, !dbg !16 + store i32 %0, i32* %i.addr.i, align 4 + call void @llvm.dbg.declare(metadata !{i32* %i.addr.i}, metadata !17), !dbg !18 + %1 = load i32* %i.addr.i, align 4, !dbg !18 + %mul.i = mul nsw i32 %1, 2, !dbg !18 + ret i32 %mul.i, !dbg !16 +} + +; Function Attrs: alwaysinline nounwind uwtable +define i32 @_ZN2ns4funcEi(i32 %i) #1 { +entry: + %i.addr = alloca i32, align 4 + store i32 %i, i32* %i.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %i.addr}, metadata !17), !dbg !19 + %0 = load i32* %i.addr, align 4, !dbg !19 + %mul = mul nsw i32 %0, 2, !dbg !19 + ret i32 %mul, !dbg !19 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #2 + +attributes #0 = { uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { alwaysinline nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #2 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!13, !14} +!llvm.ident = !{!15} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/namespace_inline_function_definition.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"namespace_inline_function_definition.cpp", metadata !"/tmp/dbginfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !9} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"main", metadata !"main", metadata !"", i32 5, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, metadata !2, i32 5} ; [ DW_TAG_subprogram ] [line 5] [def] [main] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/namespace_inline_function_definition.cpp] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{metadata !8} +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{i32 786478, metadata !1, metadata !10, metadata !"func", metadata !"func", metadata !"_ZN2ns4funcEi", i32 6, metadata !11, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32)* @_ZN2ns4funcEi, null, null, metadata !2, i32 6} ; [ DW_TAG_subprogram ] [line 6] [def] [func] +!10 = metadata !{i32 786489, metadata !1, null, metadata !"ns", i32 1} ; [ DW_TAG_namespace ] [ns] [line 1] +!11 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !12, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!12 = metadata !{metadata !8, metadata !8} +!13 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!14 = metadata !{i32 2, metadata !"Debug Info Version", i32 1} +!15 = metadata !{metadata !"clang version 3.5.0 "} +!16 = metadata !{i32 5, i32 0, metadata !4, null} +!17 = metadata !{i32 786689, metadata !9, metadata !"i", metadata !5, i32 16777222, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [i] [line 6] +!18 = metadata !{i32 6, i32 0, metadata !9, metadata !16} +!19 = metadata !{i32 6, i32 0, metadata !9, null} diff --git a/test/DebugInfo/restrict.ll b/test/DebugInfo/restrict.ll new file mode 100644 index 000000000000..ceb844f16efe --- /dev/null +++ b/test/DebugInfo/restrict.ll @@ -0,0 +1,53 @@ +; REQUIRES: object-emission + +; RUN: %llc_dwarf -dwarf-version=2 -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck --check-prefix=CHECK --check-prefix=V2 %s +; RUN: %llc_dwarf -dwarf-version=3 -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck --check-prefix=CHECK --check-prefix=V3 %s + +; CHECK: DW_AT_name {{.*}} "dst" +; V2: DW_AT_type {{.*}} {[[PTR:0x.*]]} +; V3: DW_AT_type {{.*}} {[[RESTRICT:0x.*]]} +; V3: [[RESTRICT]]: {{.*}}DW_TAG_restrict_type +; V3-NEXT: DW_AT_type {{.*}} {[[PTR:0x.*]]} +; CHECK: [[PTR]]: {{.*}}DW_TAG_pointer_type +; CHECK-NOT: DW_AT_type + +; Generated with clang from: +; void foo(void* __restrict__ dst) { +; } + + +; Function Attrs: nounwind uwtable +define void @_Z3fooPv(i8* noalias %dst) #0 { +entry: + %dst.addr = alloca i8*, align 8 + store i8* %dst, i8** %dst.addr, align 8 + call void @llvm.dbg.declare(metadata !{i8** %dst.addr}, metadata !13), !dbg !14 + ret void, !dbg !15 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!10, !11} +!llvm.ident = !{!12} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/restrict.c] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"restrict.c", metadata !"/tmp/dbginfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"foo", metadata !"foo", metadata !"_Z3fooPv", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i8*)* @_Z3fooPv, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [foo] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/restrict.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{null, metadata !8} +!8 = metadata !{i32 786487, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !9} ; [ DW_TAG_restrict_type ] [line 0, size 0, align 0, offset 0] [from ] +!9 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, null} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ] +!10 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!11 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!12 = metadata !{metadata !"clang version 3.5.0 "} +!13 = metadata !{i32 786689, metadata !4, metadata !"dst", metadata !5, i32 16777217, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [dst] [line 1] +!14 = metadata !{i32 1, i32 0, metadata !4, null} +!15 = metadata !{i32 2, i32 0, metadata !4, null} diff --git a/test/DebugInfo/sugared-constants.ll b/test/DebugInfo/sugared-constants.ll new file mode 100644 index 000000000000..0d2ebe663c00 --- /dev/null +++ b/test/DebugInfo/sugared-constants.ll @@ -0,0 +1,82 @@ +; REQUIRES: object-emission + +; RUN: %llc_dwarf -O0 -filetype=obj %s -o - | llvm-dwarfdump -debug-dump=info - | FileCheck %s +; Use correct signedness when emitting constants of derived (sugared) types. + +; Test compiled to IR from clang with -O1 and the following source: + +; void func(int); +; void func(unsigned); +; void func(char16_t); +; int main() { +; const int i = 42; +; func(i); +; const unsigned j = 117; +; func(j); +; char16_t c = 7; +; func(c); +; } + +; CHECK: DW_AT_const_value [DW_FORM_sdata] (42) +; CHECK: DW_AT_const_value [DW_FORM_udata] (117) +; CHECK: DW_AT_const_value [DW_FORM_udata] (7) + +; Function Attrs: uwtable +define i32 @main() #0 { +entry: + tail call void @llvm.dbg.value(metadata !20, i64 0, metadata !10), !dbg !21 + tail call void @_Z4funci(i32 42), !dbg !22 + tail call void @llvm.dbg.value(metadata !23, i64 0, metadata !12), !dbg !24 + tail call void @_Z4funcj(i32 117), !dbg !25 + tail call void @llvm.dbg.value(metadata !26, i64 0, metadata !15), !dbg !27 + tail call void @_Z4funcDs(i16 zeroext 7), !dbg !28 + ret i32 0, !dbg !29 +} + +declare void @_Z4funci(i32) #1 + +declare void @_Z4funcj(i32) #1 + +declare void @_Z4funcDs(i16 zeroext) #1 + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.value(metadata, i64, metadata) #2 + +attributes #0 = { uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #2 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!17, !18} +!llvm.ident = !{!19} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/const.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"const.cpp", metadata !"/tmp/dbginfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"main", metadata !"main", metadata !"", i32 4, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 ()* @main, null, null, metadata !9, i32 4} ; [ DW_TAG_subprogram ] [line 4] [def] [main] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/const.cpp] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{metadata !8} +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{metadata !10, metadata !12, metadata !15} +!10 = metadata !{i32 786688, metadata !4, metadata !"i", metadata !5, i32 5, metadata !11, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [i] [line 5] +!11 = metadata !{i32 786470, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !8} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from int] +!12 = metadata !{i32 786688, metadata !4, metadata !"j", metadata !5, i32 7, metadata !13, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [j] [line 7] +!13 = metadata !{i32 786470, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !14} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from unsigned int] +!14 = metadata !{i32 786468, null, null, metadata !"unsigned int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] [unsigned int] [line 0, size 32, align 32, offset 0, enc DW_ATE_unsigned] +!15 = metadata !{i32 786688, metadata !4, metadata !"c", metadata !5, i32 9, metadata !16, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [c] [line 9] +!16 = metadata !{i32 786468, null, null, metadata !"char16_t", i32 0, i64 16, i64 16, i64 0, i32 0, i32 16} ; [ DW_TAG_base_type ] [char16_t] [line 0, size 16, align 16, offset 0, enc DW_ATE_UTF] +!17 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!18 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!19 = metadata !{metadata !"clang version 3.5.0 "} +!20 = metadata !{i32 42} +!21 = metadata !{i32 5, i32 0, metadata !4, null} +!22 = metadata !{i32 6, i32 0, metadata !4, null} +!23 = metadata !{i32 117} +!24 = metadata !{i32 7, i32 0, metadata !4, null} +!25 = metadata !{i32 8, i32 0, metadata !4, null} ; [ DW_TAG_imported_declaration ] +!26 = metadata !{i16 7} +!27 = metadata !{i32 9, i32 0, metadata !4, null} +!28 = metadata !{i32 10, i32 0, metadata !4, null} +!29 = metadata !{i32 11, i32 0, metadata !4, null} diff --git a/test/DebugInfo/template-recursive-void.ll b/test/DebugInfo/template-recursive-void.ll index 2ed57a6576f3..ffbc30e7504c 100644 --- a/test/DebugInfo/template-recursive-void.ll +++ b/test/DebugInfo/template-recursive-void.ll @@ -1,6 +1,6 @@ ; REQUIRES: object-emission -; RUN: llc -O0 -filetype=obj < %s > %t +; RUN: %llc_dwarf -O0 -filetype=obj < %s > %t ; RUN: llvm-dwarfdump %t | FileCheck %s ; This was pulled from clang's debug-info-template-recursive.cpp test. @@ -27,7 +27,7 @@ !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4 (trunk 187958) (llvm/trunk 187964)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !2, metadata !3, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/echristo/tmp/debug-info-template-recursive.cpp] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !"debug-info-template-recursive.cpp", metadata !"/usr/local/google/home/echristo/tmp"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4} !4 = metadata !{i32 786484, i32 0, null, metadata !"filters", metadata !"filters", metadata !"", metadata !5, i32 10, metadata !6, i32 0, i32 1, %class.bar* @filters, null} ; [ DW_TAG_variable ] [filters] [line 10] [def] !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/usr/local/google/home/echristo/tmp/debug-info-template-recursive.cpp] diff --git a/test/DebugInfo/tu-composite.ll b/test/DebugInfo/tu-composite.ll index f838eca72a67..7a8ff5712659 100644 --- a/test/DebugInfo/tu-composite.ll +++ b/test/DebugInfo/tu-composite.ll @@ -1,6 +1,6 @@ ; REQUIRES: object-emission -; RUN: llc -filetype=obj -O0 < %s > %t +; RUN: %llc_dwarf -filetype=obj -O0 < %s > %t ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; CHECK: [[TYPE:.*]]: DW_TAG_structure_type ; Make sure we correctly handle containing type of a struct being a type identifier. @@ -125,7 +125,7 @@ attributes #1 = { nounwind readnone } !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !30, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [tmp.cpp] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !"tmp.cpp", metadata !"."} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4, metadata !18, metadata !19, metadata !22, metadata !23, metadata !24} !4 = metadata !{i32 786451, metadata !1, null, metadata !"C", i32 1, i64 64, i64 64, i32 0, i32 0, null, metadata !5, i32 0, metadata !"_ZTS1C", null, metadata !"_ZTS1C"} ; [ DW_TAG_structure_type ] [C] [line 1, size 64, align 64, offset 0] [def] [from ] !5 = metadata !{metadata !6, metadata !13} diff --git a/test/DebugInfo/tu-member-pointer.ll b/test/DebugInfo/tu-member-pointer.ll index b746d3b6d4f1..cd37a9892f42 100644 --- a/test/DebugInfo/tu-member-pointer.ll +++ b/test/DebugInfo/tu-member-pointer.ll @@ -1,6 +1,6 @@ ; REQUIRES: object-emission -; RUN: llc -filetype=obj -O0 < %s > %t +; RUN: %llc_dwarf -filetype=obj -O0 < %s > %t ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; CHECK: DW_TAG_ptr_to_member_type ; CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + {{.*}} => {[[TYPE:0x[0-9a-f]+]]}) @@ -18,7 +18,7 @@ !0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.4", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !2, metadata !5, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [foo.cpp] [DW_LANG_C_plus_plus] !1 = metadata !{metadata !"foo.cpp", metadata !"."} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4} !4 = metadata !{i32 786451, metadata !1, null, metadata !"Foo", i32 1, i64 0, i64 0, i32 0, i32 4, null, null, i32 0, null, null, metadata !"_ZTS3Foo"} ; [ DW_TAG_structure_type ] [Foo] [line 1, size 0, align 0, offset 0] [decl] [from ] !5 = metadata !{metadata !6} diff --git a/test/DebugInfo/two-cus-from-same-file.ll b/test/DebugInfo/two-cus-from-same-file.ll index 8589840a6955..2ab82a9a244a 100644 --- a/test/DebugInfo/two-cus-from-same-file.ll +++ b/test/DebugInfo/two-cus-from-same-file.ll @@ -5,7 +5,7 @@ ; REQUIRES: object-emission -; RUN: llc %s -o %t -filetype=obj -O0 +; RUN: %llc_dwarf %s -o %t -filetype=obj -O0 ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; ModuleID = 'test.bc' @@ -36,7 +36,7 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !llvm.module.flags = !{!33} !0 = metadata !{i32 786449, metadata !32, i32 12, metadata !"clang version 3.2 (trunk 156513)", i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !1, metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] -!1 = metadata !{i32 0} +!1 = metadata !{} !3 = metadata !{metadata !5} !5 = metadata !{i32 786478, metadata !32, metadata !6, metadata !"foo", metadata !"foo", metadata !"", i32 5, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, void ()* @foo, null, null, metadata !1, i32 5} ; [ DW_TAG_subprogram ] !6 = metadata !{i32 786473, metadata !32} ; [ DW_TAG_file_type ] @@ -51,8 +51,7 @@ declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone !16 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 32, i64 32, i64 0, i32 0, metadata !17} ; [ DW_TAG_pointer_type ] !17 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 32, i64 32, i64 0, i32 0, metadata !18} ; [ DW_TAG_pointer_type ] !18 = metadata !{i32 786468, null, null, metadata !"char", i32 0, i64 8, i64 8, i64 0, i32 0, i32 6} ; [ DW_TAG_base_type ] -!19 = metadata !{metadata !20} -!20 = metadata !{metadata !21, metadata !22} +!19 = metadata !{metadata !21, metadata !22} !21 = metadata !{i32 786689, metadata !12, metadata !"argc", metadata !6, i32 16777227, metadata !15, i32 0, i32 0} ; [ DW_TAG_arg_variable ] !22 = metadata !{i32 786689, metadata !12, metadata !"argv", metadata !6, i32 33554443, metadata !16, i32 0, i32 0} ; [ DW_TAG_arg_variable ] !23 = metadata !{i32 6, i32 3, metadata !24, null} diff --git a/test/DebugInfo/typedef.ll b/test/DebugInfo/typedef.ll new file mode 100644 index 000000000000..40cecdfc3930 --- /dev/null +++ b/test/DebugInfo/typedef.ll @@ -0,0 +1,32 @@ +; REQUIRES: object-emission + +; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s + +; From source: +; typedef void x; +; x *y; + +; Check that a typedef with no DW_AT_type is produced. The absence of a type is used to imply the 'void' type. + +; CHECK: DW_TAG_typedef +; CHECK-NOT: DW_AT_type +; CHECK: {{DW_TAG|NULL}} + +@y = global i8* null, align 8 + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!8, !9} +!llvm.ident = !{!10} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !2, metadata !3, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/typedef.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"typedef.cpp", metadata !"/tmp/dbginfo"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786484, i32 0, null, metadata !"y", metadata !"y", metadata !"", metadata !5, i32 2, metadata !6, i32 0, i32 1, i8** @y, null} ; [ DW_TAG_variable ] [y] [line 2] [def] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/typedef.cpp] +!6 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !7} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from x] +!7 = metadata !{i32 786454, metadata !1, null, metadata !"x", i32 1, i64 0, i64 0, i64 0, i32 0, null} ; [ DW_TAG_typedef ] [x] [line 1, size 0, align 0, offset 0] [from ] +!8 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!9 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!10 = metadata !{metadata !"clang version 3.5.0 "} + diff --git a/test/DebugInfo/unconditional-branch.ll b/test/DebugInfo/unconditional-branch.ll new file mode 100644 index 000000000000..6c31375f4644 --- /dev/null +++ b/test/DebugInfo/unconditional-branch.ll @@ -0,0 +1,64 @@ +; REQUIRES: object-emission +; PR 19261 + +; RUN: %llc_dwarf -fast-isel=false -O0 -filetype=obj %s -o %t +; RUN: llvm-dwarfdump %t | FileCheck %s + +; CHECK: {{0x[0-9a-f]+}} 1 0 1 0 0 is_stmt +; CHECK: {{0x[0-9a-f]+}} 2 0 1 0 0 is_stmt +; CHECK: {{0x[0-9a-f]+}} 4 0 1 0 0 is_stmt + +; IR generated from clang -O0 -g with the following source: +;void foo(int i){ +; switch(i){ +; default: +; break; +; } +; return; +;} + +; Function Attrs: nounwind +define void @foo(i32 %i) #0 { +entry: + %i.addr = alloca i32, align 4 + store i32 %i, i32* %i.addr, align 4 + call void @llvm.dbg.declare(metadata !{i32* %i.addr}, metadata !12), !dbg !13 + %0 = load i32* %i.addr, align 4, !dbg !14 + switch i32 %0, label %sw.default [ + ], !dbg !14 + +sw.default: ; preds = %entry + br label %sw.epilog, !dbg !15 + +sw.epilog: ; preds = %sw.default + ret void, !dbg !17 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!9, !10} +!llvm.ident = !{!11} + +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5.0 (204712)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [D:\work\EPRs\396363/test.c] [DW_LANG_C99] +!1 = metadata !{metadata !"test.c", metadata !"D:\5Cwork\5CEPRs\5C396363"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"foo", metadata !"foo", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i32)* @foo, null, null, metadata !2, i32 1} ; [ DW_TAG_subprogram ] [line 1] [def] [foo] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [D:\work\EPRs\396363/test.c] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{null, metadata !8} +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!10 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!11 = metadata !{metadata !"clang version 3.5.0 (204712)"} +!12 = metadata !{i32 786689, metadata !4, metadata !"i", metadata !5, i32 16777217, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [i] [line 1] +!13 = metadata !{i32 1, i32 0, metadata !4, null} +!14 = metadata !{i32 2, i32 0, metadata !4, null} +!15 = metadata !{i32 4, i32 0, metadata !16, null} +!16 = metadata !{i32 786443, metadata !1, metadata !4, i32 2, i32 0, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [D:\work\EPRs\396363/test.c] +!17 = metadata !{i32 6, i32 0, metadata !4, null} diff --git a/test/DebugInfo/varargs.ll b/test/DebugInfo/varargs.ll new file mode 100644 index 000000000000..ddfcd858f539 --- /dev/null +++ b/test/DebugInfo/varargs.ll @@ -0,0 +1,99 @@ +; RUN: %llc_dwarf -O0 -filetype=obj -o %t.o %s +; RUN: llvm-dwarfdump -debug-dump=info %t.o | FileCheck %s +; REQUIRES: object-emission +; +; Test debug info for variadic function arguments. +; Created from tools/clang/tests/CodeGenCXX/debug-info-varargs.cpp +; +; The ... parameter of variadic should be emitted as +; DW_TAG_unspecified_parameters. +; +; Normal variadic function. +; void b(int c, ...); +; +; CHECK: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "a" +; CHECK-NOT: DW_TAG +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_TAG_unspecified_parameters +; +; CHECK: DW_TAG_subprogram +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}} "b" +; CHECK-NOT: DW_TAG +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_TAG_unspecified_parameters +; +; Variadic C++ member function. +; struct A { void a(int c, ...); } +; +; Variadic function pointer. +; void (*fptr)(int, ...); +; +; CHECK: DW_TAG_subroutine_type +; CHECK-NOT: DW_TAG +; CHECK: DW_TAG_formal_parameter +; CHECK-NOT: DW_TAG +; CHECK: DW_TAG_unspecified_parameters +; +; ModuleID = 'llvm/tools/clang/test/CodeGenCXX/debug-info-varargs.cpp' + +%struct.A = type { i8 } + +; Function Attrs: nounwind ssp uwtable +define void @_Z1biz(i32 %c, ...) #0 { + %1 = alloca i32, align 4 + %a = alloca %struct.A, align 1 + %fptr = alloca void (i32, ...)*, align 8 + store i32 %c, i32* %1, align 4 + call void @llvm.dbg.declare(metadata !{i32* %1}, metadata !21), !dbg !22 + call void @llvm.dbg.declare(metadata !{%struct.A* %a}, metadata !23), !dbg !24 + call void @llvm.dbg.declare(metadata !{void (i32, ...)** %fptr}, metadata !25), !dbg !27 + store void (i32, ...)* @_Z1biz, void (i32, ...)** %fptr, align 8, !dbg !27 + ret void, !dbg !28 +} + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata) #1 + +attributes #0 = { nounwind ssp uwtable } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!18, !19} +!llvm.ident = !{!20} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5 ", i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !13, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [llvm/tools/clang/test/CodeGenCXX/debug-info-varargs.cpp] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"llvm/tools/clang/test/CodeGenCXX/debug-info-varargs.cpp", metadata !"radar/13690847"} +!2 = metadata !{} +!3 = metadata !{metadata !4} +!4 = metadata !{i32 786451, metadata !1, null, metadata !"A", i32 3, i64 8, i64 8, i32 0, i32 0, null, metadata !5, i32 0, null, null, metadata !"_ZTS1A"} ; [ DW_TAG_structure_type ] [A] [line 3, size 8, align 8, offset 0] [def] [from ] +!5 = metadata !{metadata !6} +!6 = metadata !{i32 786478, metadata !1, metadata !"_ZTS1A", metadata !"a", metadata !"a", metadata !"_ZN1A1aEiz", i32 6, metadata !7, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null, null, i32 0, metadata !12, i32 6} ; [ DW_TAG_subprogram ] [line 6] [a] +!7 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = metadata !{null, metadata !9, metadata !10, metadata !11} +!9 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 1088, metadata !"_ZTS1A"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from _ZTS1A] +!10 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!11 = metadata !{i32 786456} +!12 = metadata !{i32 786468} +!13 = metadata !{metadata !14} +!14 = metadata !{i32 786478, metadata !1, metadata !15, metadata !"b", metadata !"b", metadata !"_Z1biz", i32 13, metadata !16, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i32, ...)* @_Z1biz, null, null, metadata !2, i32 13} ; [ DW_TAG_subprogram ] [line 13] [def] [b] +!15 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [llvm/tools/clang/test/CodeGenCXX/debug-info-varargs.cpp] +!16 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !17, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!17 = metadata !{null, metadata !10, metadata !11} +!18 = metadata !{i32 2, metadata !"Dwarf Version", i32 2} +!19 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} +!20 = metadata !{metadata !"clang version 3.5 "} +!21 = metadata !{i32 786689, metadata !14, metadata !"c", metadata !15, i32 16777229, metadata !10, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [c] [line 13] +!22 = metadata !{i32 13, i32 0, metadata !14, null} +!23 = metadata !{i32 786688, metadata !14, metadata !"a", metadata !15, i32 16, metadata !4, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [a] [line 16] +!24 = metadata !{i32 16, i32 0, metadata !14, null} +!25 = metadata !{i32 786688, metadata !14, metadata !"fptr", metadata !15, i32 18, metadata !26, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [fptr] [line 18] +!26 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !16} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ] +!27 = metadata !{i32 18, i32 0, metadata !14, null} +!28 = metadata !{i32 22, i32 0, metadata !14, null} diff --git a/test/DebugInfo/version.ll b/test/DebugInfo/version.ll index f4dde0a24988..9a201ebf3091 100644 --- a/test/DebugInfo/version.ll +++ b/test/DebugInfo/version.ll @@ -1,6 +1,6 @@ ; REQUIRES: object-emission -; RUN: llc -O0 -filetype=obj < %s > %t +; RUN: %llc_dwarf -O0 -filetype=obj < %s > %t ; RUN: llvm-dwarfdump %t | FileCheck %s ; Make sure we are generating DWARF version 3 when module flag says so. @@ -20,7 +20,7 @@ attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointe !0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.4 (trunk 185475)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] !1 = metadata !{metadata !"CodeGen/dwarf-version.c", metadata !"test"} -!2 = metadata !{i32 0} +!2 = metadata !{} !3 = metadata !{metadata !4} !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"main", metadata !"main", metadata !"", i32 6, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, metadata !2, i32 6} ; [ DW_TAG_subprogram ] [line 6] [def] [main] !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] |
