diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-05-29 16:25:25 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-05-29 16:25:25 +0000 |
commit | ab44ce3d598882e51a25eb82eb7ae6308de85ae6 (patch) | |
tree | 568d786a59d49bef961dcb9bd09d422701b9da5b /test/DebugInfo | |
parent | b5630dbadf9a2a06754194387d6b0fd9962a67f1 (diff) | |
download | src-ab44ce3d598882e51a25eb82eb7ae6308de85ae6.tar.gz src-ab44ce3d598882e51a25eb82eb7ae6308de85ae6.zip |
Vendor import of llvm trunk r304149:vendor/llvm/llvm-trunk-r304149
Notes
Notes:
svn path=/vendor/llvm/dist/; revision=319140
svn path=/vendor/llvm/llvm-trunk-r304149/; revision=319141; tag=vendor/llvm/llvm-trunk-r304149
Diffstat (limited to 'test/DebugInfo')
34 files changed, 963 insertions, 124 deletions
diff --git a/test/DebugInfo/Generic/empty.ll b/test/DebugInfo/Generic/empty.ll index d5f738fa0271..79912841fa6d 100644 --- a/test/DebugInfo/Generic/empty.ll +++ b/test/DebugInfo/Generic/empty.ll @@ -13,10 +13,9 @@ ; CHECK-NOT: file_names[ ; CHECK: .debug_pubnames contents: -; CHECK-NOT: Offset +; CHECK-NOT: {{^}}0x -; CHECK: .debug_pubtypes contents: -; CHECK-NOT: Offset +; CHECK: contents: ; Don't emit DW_AT_addr_base when there are no addresses. ; FISSION-NOT: DW_AT_GNU_addr_base [DW_FORM_sec_offset] @@ -24,8 +23,10 @@ !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!5} -!0 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 3.1 (trunk 143523)", isOptimized: true, emissionKind: FullDebug, file: !4, enums: !2, retainedTypes: !2, globals: !2) +!0 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 3.1 (trunk 143523)", isOptimized: true, emissionKind: FullDebug, file: !4, enums: !2, retainedTypes: !6, globals: !2) !2 = !{} !3 = !DIFile(filename: "empty.c", directory: "/home/nlewycky") !4 = !DIFile(filename: "empty.c", directory: "/home/nlewycky") !5 = !{i32 1, !"Debug Info Version", i32 3} +!6 = !{!7} +!7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) diff --git a/test/DebugInfo/Generic/nodebug.ll b/test/DebugInfo/Generic/nodebug.ll index f85b00bf9f7e..9b0eb9b4dd07 100644 --- a/test/DebugInfo/Generic/nodebug.ll +++ b/test/DebugInfo/Generic/nodebug.ll @@ -1,6 +1,6 @@ ; REQUIRES: object-emission -; RUN: %llc_dwarf < %s -filetype=obj | llvm-dwarfdump -debug-dump=info - | FileCheck %s +; RUN: %llc_dwarf < %s -filetype=obj | llvm-dwarfdump - | FileCheck %s ; Test that a nodebug function (a function not appearing in the debug info IR ; metadata subprogram list) with DebugLocs on its IR doesn't cause crashes/does @@ -17,9 +17,16 @@ ; } ; Check that there's no DW_TAG_subprogram, not even for the 'f2' function. +; CHECK: .debug_info contents: ; CHECK: DW_TAG_compile_unit ; CHECK-NOT: DW_TAG_subprogram +; 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[ + @i = external global i32 ; Function Attrs: uwtable @@ -35,7 +42,7 @@ attributes #0 = { uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"=" !llvm.module.flags = !{!8, !9} !llvm.ident = !{!10} -!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.5.0 ", isOptimized: false, emissionKind: FullDebug, file: !1, enums: !2, retainedTypes: !2, globals: !2, imports: !2) +!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.5.0 ", isOptimized: false, emissionKind: FullDebug, file: !1, enums: !2, retainedTypes: !12, globals: !2, imports: !2) !1 = !DIFile(filename: "nodebug.cpp", directory: "/tmp/dbginfo") !2 = !{} !4 = distinct !DISubprogram(name: "f1", linkageName: "_Z2f1v", line: 2, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 2, file: !1, scope: !5, type: !6, variables: !2) @@ -46,3 +53,5 @@ attributes #0 = { uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"=" !9 = !{i32 2, !"Debug Info Version", i32 3} !10 = !{!"clang version 3.5.0 "} !11 = !DILocation(line: 3, scope: !4) +!12 = !{!13} +!13 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) diff --git a/test/DebugInfo/Generic/skeletoncu.ll b/test/DebugInfo/Generic/skeletoncu.ll index 6d91afd0fa79..b9761b2ab565 100644 --- a/test/DebugInfo/Generic/skeletoncu.ll +++ b/test/DebugInfo/Generic/skeletoncu.ll @@ -7,9 +7,11 @@ !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!3, !4} -!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "LLVM", isOptimized: false, runtimeVersion: 2, splitDebugFilename: "my.dwo", emissionKind: FullDebug, enums: !2, retainedTypes: !2, globals: !2, imports: !2, dwoId: 43981) +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "LLVM", isOptimized: false, runtimeVersion: 2, splitDebugFilename: "my.dwo", emissionKind: FullDebug, enums: !2, retainedTypes: !5, globals: !2, imports: !2, dwoId: 43981) !1 = !DIFile(filename: "<stdin>", directory: "/") !2 = !{} !3 = !{i32 2, !"Dwarf Version", i32 4} !4 = !{i32 2, !"Debug Info Version", i32 3} +!5 = !{!6} +!6 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) diff --git a/test/DebugInfo/Inputs/split-dwarf-dwp.cpp b/test/DebugInfo/Inputs/split-dwarf-dwp.cpp new file mode 100644 index 000000000000..b07a1537d6bf --- /dev/null +++ b/test/DebugInfo/Inputs/split-dwarf-dwp.cpp @@ -0,0 +1,12 @@ +void f1(); +__attribute__((always_inline)) void f2() { + f1(); +} +void f3() { + f2(); +} + +To produce split-dwarf-dwp.o{,dwp}, run: + + $ clang++ split-dwarf-dwp.cpp -gsplit-dwarf -c -Xclang -fdebug-compilation-dir=Output -fno-split-dwarf-inlining + $ llvm-dwp split-dwarf-dwp.dwo -o split-dwarf-dwp.o.dwp diff --git a/test/DebugInfo/Inputs/split-dwarf-dwp.o b/test/DebugInfo/Inputs/split-dwarf-dwp.o Binary files differnew file mode 100644 index 000000000000..614c62040dec --- /dev/null +++ b/test/DebugInfo/Inputs/split-dwarf-dwp.o diff --git a/test/DebugInfo/Inputs/split-dwarf-dwp.o.dwp b/test/DebugInfo/Inputs/split-dwarf-dwp.o.dwp Binary files differnew file mode 100644 index 000000000000..16a0af8c062f --- /dev/null +++ b/test/DebugInfo/Inputs/split-dwarf-dwp.o.dwp diff --git a/test/DebugInfo/MIR/X86/empty-inline.mir b/test/DebugInfo/MIR/X86/empty-inline.mir new file mode 100644 index 000000000000..1766a8f44616 --- /dev/null +++ b/test/DebugInfo/MIR/X86/empty-inline.mir @@ -0,0 +1,122 @@ +# RUN: llc -filetype=obj -o - %s | llvm-dwarfdump - | FileCheck %s +# +# This testcase has an implicit def pseudo-iunstruction with a debug location. +# +# CHECK: .debug_info contents: +# CHECK: DW_TAG_subprogram +# CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) +# CHECK-NOT: DW_TAG +# CHECK: DW_AT_specification {{.*}} "_ZN1C5m_fn3Ev" +# CHECK-NOT: DW_TAG +# Here should not be an inlined subroutine with 0 length. +# CHECK: NULL +# +# CHECK: Address Line Column File ISA Discriminator Flags +# CHECK-NEXT: --- +# CHECK-NEXT: 25 0 1 0 0 is_stmt +# CHECK-NEXT: 29 28 1 0 0 is_stmt prologue_end +# CHECK-NEXT: 29 28 1 0 0 is_stmt end_sequence +--- | + source_filename = "t.ll" + target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" + target triple = "x86_64-apple-macosx" + + %class.E = type { %class.D } + %class.D = type { %class.B } + %class.B = type { %class.A, %class.A } + %class.A = type { i8 } + %class.C = type <{ %class.E*, %class.B, [2 x i8] }> + + @a = local_unnamed_addr global %class.E* null, align 4 + + define i32 @_ZN1C5m_fn3Ev(%class.C* nocapture) local_unnamed_addr align 2 !dbg !6 { + %2 = alloca %class.B, align 1 + %3 = load %class.E*, %class.E** @a, align 4 + %4 = icmp eq %class.E* %3, null + br i1 %4, label %10, label %5 + + ; <label>:5: ; preds = %1 + %6 = bitcast %class.C* %0 to %class.D** + %7 = load %class.D*, %class.D** %6, align 4 + %8 = bitcast %class.D* %7 to i8* + %9 = load i8, i8* %8, align 1 + br label %10 + + ; <label>:10: ; preds = %5, %1 + %11 = phi i8 [ %9, %5 ], [ undef, %1 ], !dbg !10 + %12 = getelementptr inbounds %class.C, %class.C* %0, i32 0, i32 1, i32 0, i32 0 + store i8 %11, i8* %12, align 1, !dbg !14 + ret i32 undef + } + + !llvm.dbg.cu = !{!0} + !llvm.module.flags = !{!3, !4, !5} + + !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "Apple LLVM version 8.1.0 (clang-802.0.30.3)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, globals: !2) + !1 = !DIFile(filename: "test.ii", directory: "/") + !2 = !{} + !3 = !{i32 2, !"Dwarf Version", i32 4} + !4 = !{i32 2, !"Debug Info Version", i32 3} + !5 = !{i32 1, !"PIC Level", i32 2} + !6 = distinct !DISubprogram(name: "m_fn3", linkageName: "_ZN1C5m_fn3Ev", scope: !7, file: !1, line: 25, type: !8, isLocal: false, isDefinition: true, scopeLine: 25, flags: DIFlagPrototyped, isOptimized: true, unit: !0, declaration: !9, variables: !2) + !7 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "C", file: !1, line: 14, size: 64, align: 32, elements: !2, identifier: "_ZTS1C") + !8 = !DISubroutineType(types: !2) + !9 = !DISubprogram(name: "m_fn3", linkageName: "_ZN1C5m_fn3Ev", scope: !7, file: !1, line: 15, type: !8, isLocal: false, isDefinition: false, scopeLine: 15, flags: DIFlagPrototyped, isOptimized: true) + !10 = !DILocation(line: 99, column: 9, scope: !11, inlinedAt: !14) + !11 = distinct !DISubprogram(name: "m_fn1", linkageName: "_ZN1A5m_fn1Ev", scope: !12, file: !1, line: 5, type: !8, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: true, unit: !0, declaration: !13, variables: !2) + !12 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "A", file: !1, line: 1, size: 8, align: 8, elements: !2, identifier: "_ZTS1A") + !13 = !DISubprogram(name: "m_fn1", linkageName: "_ZN1A5m_fn1Ev", scope: !12, file: !1, line: 5, type: !8, isLocal: false, isDefinition: false, scopeLine: 5, flags: DIFlagPublic | DIFlagPrototyped, isOptimized: true) + !14 = !DILocation(line: 29, column: 28, scope: !6) + +... +--- +name: _ZN1C5m_fn3Ev +alignment: 4 +exposesReturnsTwice: false +noVRegs: true +legalized: false +regBankSelected: false +selected: false +tracksRegLiveness: true +liveins: + - { reg: '%rdi' } +frameInfo: + isFrameAddressTaken: false + isReturnAddressTaken: false + hasStackMap: false + hasPatchPoint: false + stackSize: 0 + offsetAdjustment: 0 + maxAlignment: 8 + adjustsStack: false + hasCalls: false + maxCallFrameSize: 0 + hasOpaqueSPAdjustment: false + hasVAStart: false + hasMustTailInVarArgFunc: false +#stack: +# - { id: 0, name: '<unnamed alloca>', offset: -16, size: 2, alignment: 8 } +body: | + bb.0 (%ir-block.1): + successors: %bb.1(0x30000000), %bb.2(0x50000000) + liveins: %rdi + + CMP64mi8 %rip, 1, _, @a, _, 0, implicit-def %eflags :: (dereferenceable load 8 from @a, align 4) + JE_1 %bb.1, implicit %eflags + + bb.2 (%ir-block.5): + liveins: %rdi + + %rax = MOV64rm %rdi, 1, _, 0, _ :: (load 8 from %ir.6, align 4) + %al = MOV8rm killed %rax, 1, _, 0, _ :: (load 1 from %ir.8) + MOV8mr killed %rdi, 1, _, 8, _, killed %al, debug-location !14 :: (store 1 into %ir.12) + RETQ undef %eax + + bb.1: + liveins: %rdi + + %al = IMPLICIT_DEF debug-location !10 + MOV8mr killed %rdi, 1, _, 8, _, killed %al, debug-location !14 :: (store 1 into %ir.12) + RETQ undef %eax + +... diff --git a/test/DebugInfo/PDB/Inputs/merge-ids-1.yaml b/test/DebugInfo/PDB/Inputs/merge-ids-1.yaml new file mode 100644 index 000000000000..3b5e8b5e761a --- /dev/null +++ b/test/DebugInfo/PDB/Inputs/merge-ids-1.yaml @@ -0,0 +1,36 @@ +IpiStream: + Records: + # 'One' [TypeIndex: 0x1000 (4096)] + - Kind: LF_STRING_ID + StringId: + Id: 0 + String: 'One' + # 'Two' [TypeIndex: 0x1001 (4097)] + - Kind: LF_STRING_ID + StringId: + Id: 0 + String: 'Two' + # 'OnlyInFirst' [TypeIndex: 0x1002 (4098)] + - Kind: LF_STRING_ID + StringId: + Id: 0 + String: 'OnlyInFirst' + # 'SubOne' [TypeIndex: 0x1003 (4099)] + - Kind: LF_STRING_ID + StringId: + Id: 0 + String: 'SubOne' + # 'SubTwo' [TypeIndex: 0x1004 (4100)] + - Kind: LF_STRING_ID + StringId: + Id: 0 + String: 'SubTwo' + # 'SubOne', 'SubTwo' [TypeIndex: 0x1005 (4101)] + - Kind: LF_SUBSTR_LIST + StringList: + StringIndices: [ 4099, 4100 ] + # 'Main' {'SubOne', 'SubTwo'} [TypeIndex: 0x1006 (4102)] + - Kind: LF_STRING_ID + StringId: + Id: 4101 + String: 'Main' diff --git a/test/DebugInfo/PDB/Inputs/merge-ids-2.yaml b/test/DebugInfo/PDB/Inputs/merge-ids-2.yaml new file mode 100644 index 000000000000..74f6ee502249 --- /dev/null +++ b/test/DebugInfo/PDB/Inputs/merge-ids-2.yaml @@ -0,0 +1,31 @@ +IpiStream: + Records: + # 'SubTwo' [TypeIndex: 0x1000 (4096)] + - Kind: LF_STRING_ID + StringId: + Id: 0 + String: 'SubTwo' + # 'OnlyInSecond' [TypeIndex: 0x1001 (4097)] + - Kind: LF_STRING_ID + StringId: + Id: 0 + String: 'OnlyInSecond' + # 'SubOne' [TypeIndex: 0x1002 (4098)] + - Kind: LF_STRING_ID + StringId: + Id: 0 + String: 'SubOne' + # 'SubOne', 'SubTwo' [TypeIndex: 0x1003 (4099)] + - Kind: LF_SUBSTR_LIST + StringList: + StringIndices: [ 4098, 4096 ] + # 'One' [TypeIndex: 0x1004 (4100)] + - Kind: LF_STRING_ID + StringId: + Id: 0 + String: 'One' + # 'Main' {'SubOne', 'SubTwo'} [TypeIndex: 0x1005 (4101)] + - Kind: LF_STRING_ID + StringId: + Id: 4099 + String: 'Main' diff --git a/test/DebugInfo/PDB/Inputs/merge-ids-and-types-1.yaml b/test/DebugInfo/PDB/Inputs/merge-ids-and-types-1.yaml new file mode 100644 index 000000000000..30ff563d7fc6 --- /dev/null +++ b/test/DebugInfo/PDB/Inputs/merge-ids-and-types-1.yaml @@ -0,0 +1,113 @@ +# The idea is to set up some types in the TPI stream, and then have records in +# the IPI stream that refer to them. There are three types of IPI records that +# can refer to TPI records. They are: +# 1) LF_PROCEDURE - Referred to by LF_FUNC_ID +# 2) LF_STRUCTURE - Referred to by LF_UDT_MOD_SRC_LINE +# Referred to by LF_UDT_SRC_LINE +# 3) LF_MFUNCTION - Referred to by LF_MFUNC_ID +# We will set up one of each of these, and then create IPI records that refer to +# them. We intentionally choose an unintuitive ordering of the records in both +# streams (while still maintaining the topological sorting required by CodeView +# type streams), to make sure the merging algorithm is sufficiently exercised. +# For easy understanding, a semantic representation of the types we will set up +# is as follows: +# - int main(int, char**) +# +# - struct FooBar { +# public: +# void *FooMember; +# void FooMethod(int); +# }; +TpiStream: + Records: + # TypeIndex: 4096 (0x1000) + # char** + - Kind: LF_POINTER + Pointer: + ReferentType: 1136 + Attrs: 32778 + # TypeIndex: 4097 (0x1001) + # public void *FooMember + - Kind: LF_FIELDLIST + FieldList: + - Kind: LF_MEMBER + DataMember: + Attrs: 3 # public + Type: 1027 # void* + FieldOffset: 0 + Name: FooMember # FooMember + # TypeIndex: 4098 (0x1002) + # (int, char**) + - Kind: LF_ARGLIST + ArgList: + ArgIndices: [ 116, 4096 ] + # TypeIndex: 4099 (0x1003) + # struct FooBar { + # public: + # void *FooMember; + # }; + - Kind: LF_STRUCTURE + Class: + MemberCount: 1 + Options: [ None, HasUniqueName ] + FieldList: 4097 + Name: FooBar + UniqueName: 'FooBar' + DerivationList: 0 + VTableShape: 0 + Size: 4 + # TypeIndex: 4100 (0x1004) + # FooBar * + - Kind: LF_POINTER + Pointer: + ReferentType: 4099 # FooBar + Attrs: 32778 + # TypeIndex: 4101 (0x1005) + # (int) + - Kind: LF_ARGLIST + ArgList: + ArgIndices: [ 116 ] + # TypeIndex: 4102 (0x1006) + - Kind: LF_MFUNCTION + MemberFunction: + ReturnType: 3 # void + ClassType: 4099 # struct FooBar + ThisType: 4100 # FooBar * + CallConv: ThisCall + Options: [ None, Constructor ] + ParameterCount: 1 + ArgumentList: 4101 # (int) + ThisPointerAdjustment: 0 + # TypeIndex: 4103 (0x1007) + # int (int, char**) + - Kind: LF_PROCEDURE + Procedure: + ReturnType: 116 # int + CallConv: NearC + Options: [ None ] + ParameterCount: 2 + ArgumentList: 4098 # (int, char**) +IpiStream: + Records: + # TypeIndex: 4096 (0x1000) + # int main(int, char **) + - Kind: LF_FUNC_ID + FuncId: + ParentScope: 0 + FunctionType: 4103 # int main(int, char**) + Name: main + # TypeIndex: 4097 (0x1001) + # void FooBar::FooMethod(int) + - Kind: LF_MFUNC_ID + MemberFuncId: + ClassType: 4099 # struct FooBar + FunctionType: 4102 # void FooMethod(int) + Name: FooMethod + # TypeIndex: 4098 (0x1002) + # struct FooBar + - Kind: LF_UDT_MOD_SRC_LINE + UdtModSourceLine: + UDT: 4099 # struct FooBar + SourceFile: 0 # We don't support this yet + LineNumber: 0 + Module: 0 # We don't support this yet diff --git a/test/DebugInfo/PDB/Inputs/merge-ids-and-types-2.yaml b/test/DebugInfo/PDB/Inputs/merge-ids-and-types-2.yaml new file mode 100644 index 000000000000..1bd54deebffd --- /dev/null +++ b/test/DebugInfo/PDB/Inputs/merge-ids-and-types-2.yaml @@ -0,0 +1,143 @@ +# In file 1 we set up some basic types and IDs to refer to them. In this file +# we will set up the same types. For some of them we will make them identical +# but re-order the records in the file to make sure they have different type +# indices and appear in different orders. In other cases we will make slight +# adjustments to the types, to ensure that they do not get merged in. +# +# For easy understanding, a semantic representation of the types we will set up +# is as follows: +# - int main(int, char**) // This record should share an LF_PROCEDURE and id +# // record with corresponding function from the +# // first file. +# - int main2(int, char**) // This record should share the LF_PROCEDURE +# // record but have a unique id record. +# - void foo(int, char**) // This record should have a unique LF_PROCEDURE +# // record, but the LF_ARGLIST record internally +# // should be shared. +# +# - struct FooBar { // Because the type of this record exactly matches +# // the corresponding file, its entire type record +# // hierarchy should be shared. +# public: +# void *FooMember; +# void FooMethod2(int); // Note that the *type* of this member should be +# // the same as the type of the record from the +# // first stream. But since it has a different +# // name, it will not share an id record. +# }; +TpiStream: + Records: + # TypeIndex: 4096 (0x1000) + # (int) + - Kind: LF_ARGLIST + ArgList: + ArgIndices: [ 116 ] + # TypeIndex: 4097 (0x1001) + # public void *FooMember + - Kind: LF_FIELDLIST + FieldList: + - Kind: LF_MEMBER + DataMember: + Attrs: 3 # public + Type: 1027 # void* + FieldOffset: 0 + Name: FooMember # FooMember + # TypeIndex: 4098 (0x1002) + # char** + - Kind: LF_POINTER + Pointer: + ReferentType: 1136 + Attrs: 32778 + # TypeIndex: 4099 (0x1003) + # (int, char**) + - Kind: LF_ARGLIST + ArgList: + ArgIndices: [ 116, 4098 ] + # TypeIndex: 4100 (0x1004) + # struct FooBar { + # public: + # void *FooMember; + # }; + - Kind: LF_STRUCTURE + Class: + MemberCount: 1 + Options: [ None, HasUniqueName ] + FieldList: 4097 + Name: FooBar + UniqueName: 'FooBar' + DerivationList: 0 + VTableShape: 0 + Size: 4 + # TypeIndex: 4101 (0x1005) + # void (int, char**) + - Kind: LF_PROCEDURE + Procedure: + ReturnType: 3 # void + CallConv: NearC + Options: [ None ] + ParameterCount: 2 + ArgumentList: 4099 # (int, char**) + # TypeIndex: 4102 (0x1006) + # FooBar * + - Kind: LF_POINTER + Pointer: + ReferentType: 4100 # FooBar + Attrs: 32778 + # TypeIndex: 4103 (0x1007) + # int (int, char**) + - Kind: LF_PROCEDURE + Procedure: + ReturnType: 116 # int + CallConv: NearC + Options: [ None ] + ParameterCount: 2 + ArgumentList: 4099 # (int, char**) + # TypeIndex: 4104 (0x1008) + - Kind: LF_MFUNCTION + MemberFunction: + ReturnType: 3 # void + ClassType: 4100 # struct FooBar + ThisType: 4102 # FooBar * + CallConv: ThisCall + Options: [ None, Constructor ] + ParameterCount: 1 + ArgumentList: 4096 # (int) + ThisPointerAdjustment: 0 +IpiStream: + Records: + # TypeIndex: 4096 (0x1000) + # struct FooBar + - Kind: LF_UDT_MOD_SRC_LINE + UdtModSourceLine: + UDT: 4100 # struct FooBar + SourceFile: 0 # We don't support this yet + LineNumber: 0 + Module: 0 # We don't support this yet + # TypeIndex: 4097 (0x1001) + # int main2(int, char **) + - Kind: LF_FUNC_ID + FuncId: + ParentScope: 0 + FunctionType: 4103 # int main2(int, char**) + Name: main2 + # TypeIndex: 4098 (0x1002) + # void foo(int, char **) + - Kind: LF_FUNC_ID + FuncId: + ParentScope: 0 + FunctionType: 4101 # void main2(int, char**) + Name: foo + # TypeIndex: 4099 (0x1003) + # void FooBar::FooMethod2(int) + - Kind: LF_MFUNC_ID + MemberFuncId: + ClassType: 4100 # struct FooBar + FunctionType: 4104 # void FooBar::FooMethod2(int) + Name: FooMethod2 + # TypeIndex: 4100 (0x1004) + # int main(int, char **) + - Kind: LF_FUNC_ID + FuncId: + ParentScope: 0 + FunctionType: 4103 # int main(int, char**) + Name: main diff --git a/test/DebugInfo/PDB/Inputs/merge1.yaml b/test/DebugInfo/PDB/Inputs/merge-types-1.yaml index 89d471e3343d..89d471e3343d 100644 --- a/test/DebugInfo/PDB/Inputs/merge1.yaml +++ b/test/DebugInfo/PDB/Inputs/merge-types-1.yaml diff --git a/test/DebugInfo/PDB/Inputs/merge2.yaml b/test/DebugInfo/PDB/Inputs/merge-types-2.yaml index b6cbdb98f0ca..b6cbdb98f0ca 100644 --- a/test/DebugInfo/PDB/Inputs/merge2.yaml +++ b/test/DebugInfo/PDB/Inputs/merge-types-2.yaml diff --git a/test/DebugInfo/PDB/Inputs/source-names-1.yaml b/test/DebugInfo/PDB/Inputs/source-names-1.yaml new file mode 100644 index 000000000000..96f7dedd2fc4 --- /dev/null +++ b/test/DebugInfo/PDB/Inputs/source-names-1.yaml @@ -0,0 +1,8 @@ +--- +DbiStream: + Modules: + - Module: 'C:\src\test.obj' + ObjFile: 'C:\src\test.obj' + SourceFiles: + - 'C:\src\test.c' +... diff --git a/test/DebugInfo/PDB/Inputs/source-names-2.yaml b/test/DebugInfo/PDB/Inputs/source-names-2.yaml new file mode 100644 index 000000000000..5f782ddbca25 --- /dev/null +++ b/test/DebugInfo/PDB/Inputs/source-names-2.yaml @@ -0,0 +1,8 @@ +--- +DbiStream: + Modules: + - Module: 'C:\src\test.obj' + ObjFile: 'C:\src\test.obj' + SourceFiles: + - 'C:\src\test.cc' +... diff --git a/test/DebugInfo/PDB/pdbdump-merge-ids-and-types.test b/test/DebugInfo/PDB/pdbdump-merge-ids-and-types.test new file mode 100644 index 000000000000..ac32ce040b98 --- /dev/null +++ b/test/DebugInfo/PDB/pdbdump-merge-ids-and-types.test @@ -0,0 +1,65 @@ +; RUN: llvm-pdbdump yaml2pdb -pdb=%t.1.pdb %p/Inputs/merge-ids-and-types-1.yaml +; RUN: llvm-pdbdump yaml2pdb -pdb=%t.2.pdb %p/Inputs/merge-ids-and-types-2.yaml +; RUN: llvm-pdbdump merge -pdb=%t.3.pdb %t.1.pdb %t.2.pdb +; RUN: llvm-pdbdump raw -tpi-records %t.3.pdb | FileCheck -check-prefix=TPI-TYPES %s +; RUN: llvm-pdbdump raw -tpi-records %t.3.pdb | FileCheck -check-prefix=INTMAIN %s +; RUN: llvm-pdbdump raw -tpi-records %t.3.pdb | FileCheck -check-prefix=VOIDMAIN %s +; RUN: llvm-pdbdump raw -ipi-records %t.3.pdb | FileCheck -check-prefix=IPI-TYPES %s +; RUN: llvm-pdbdump raw -ipi-records %t.3.pdb | FileCheck -check-prefix=IPI-NAMES %s +; RUN: llvm-pdbdump raw -ipi-records %t.3.pdb | FileCheck -check-prefix=IPI-UDT %s + +TPI-TYPES: Type Info Stream (TPI) +TPI-TYPES: Record count: 9 +TPI-TYPES-DAG: TypeLeafKind: LF_POINTER +TPI-TYPES-DAG: TypeLeafKind: LF_FIELDLIST +TPI-TYPES-DAG: TypeLeafKind: LF_ARGLIST +TPI-TYPES-DAG: TypeLeafKind: LF_STRUCTURE +TPI-TYPES-DAG: TypeLeafKind: LF_MEMBER +TPI-TYPES-DAG: TypeLeafKind: LF_POINTER +TPI-TYPES-DAG: TypeLeafKind: LF_ARGLIST +TPI-TYPES-DAG: TypeLeafKind: LF_MFUNCTION +TPI-TYPES-DAG: TypeLeafKind: LF_PROCEDURE +TPI-TYPES-DAG: TypeLeafKind: LF_PROCEDURE +TPI-TYPES-DAG: TypeLeafKind: LF_ARGLIST + +; Both procedures should use the same arglist even though they have a different +; return type. +INTMAIN: ArgList ([[ID:.*]]) +INTMAIN-NEXT: TypeLeafKind: LF_ARGLIST +INTMAIN-NEXT: NumArgs: 2 +INTMAIN-NEXT: Arguments [ +INTMAIN-NEXT: ArgType: int +INTMAIN-NEXT: ArgType: char** +INTMAIN: TypeLeafKind: LF_PROCEDURE +INTMAIN: ReturnType: int +INTMAIN: NumParameters: 2 +INTMAIN-NEXT: ArgListType: (int, char**) ([[ID]]) + +VOIDMAIN: ArgList ([[ID:.*]]) +VOIDMAIN-NEXT: TypeLeafKind: LF_ARGLIST +VOIDMAIN-NEXT: NumArgs: 2 +VOIDMAIN-NEXT: Arguments [ +VOIDMAIN-NEXT: ArgType: int +VOIDMAIN-NEXT: ArgType: char** +VOIDMAIN: TypeLeafKind: LF_PROCEDURE +VOIDMAIN: ReturnType: void +VOIDMAIN: NumParameters: 2 +VOIDMAIN-NEXT: ArgListType: (int, char**) ([[ID]]) + +IPI-TYPES: Type Info Stream (IPI) +IPI-TYPES: Record count: 6 +IPI-TYPES-DAG: TypeLeafKind: LF_FUNC_ID +IPI-TYPES-DAG: TypeLeafKind: LF_MFUNC_ID +IPI-TYPES-DAG: TypeLeafKind: LF_UDT_MOD_SRC_LINE +IPI-TYPES-DAG: TypeLeafKind: LF_FUNC_ID +IPI-TYPES-DAG: TypeLeafKind: LF_FUNC_ID +IPI-TYPES-DAG: TypeLeafKind: LF_MFUNC_ID + +IPI-NAMES-DAG: Name: main +IPI-NAMES-DAG: Name: FooMethod +IPI-NAMES-DAG: Name: main2 +IPI-NAMES-DAG: Name: foo +IPI-NAMES-DAG: Name: FooMethod2 + +IPI-UDT: TypeLeafKind: LF_UDT_MOD_SRC_LINE +IPI-UDT-NEXT: UDT: FooBar diff --git a/test/DebugInfo/PDB/pdbdump-mergeids.test b/test/DebugInfo/PDB/pdbdump-mergeids.test new file mode 100644 index 000000000000..6a4d19eba042 --- /dev/null +++ b/test/DebugInfo/PDB/pdbdump-mergeids.test @@ -0,0 +1,31 @@ +; RUN: llvm-pdbdump yaml2pdb -pdb=%t.1.pdb %p/Inputs/merge-ids-1.yaml +; RUN: llvm-pdbdump yaml2pdb -pdb=%t.2.pdb %p/Inputs/merge-ids-2.yaml +; RUN: llvm-pdbdump merge -pdb=%t.3.pdb %t.1.pdb %t.2.pdb +; RUN: llvm-pdbdump raw -ipi-records %t.3.pdb | FileCheck -check-prefix=MERGED %s +; RUN: llvm-pdbdump raw -ipi-records %t.3.pdb | FileCheck -check-prefix=SUBSTRS %s +; RUN: llvm-pdbdump raw -tpi-records %t.3.pdb | FileCheck -check-prefix=TPI-EMPTY %s + + +MERGED: Type Info Stream (IPI) +MERGED: Record count: 8 +MERGED-DAG: StringData: One +MERGED-DAG: StringData: Two +MERGED-DAG: StringData: SubOne +MERGED-DAG: StringData: SubTwo +MERGED-DAG: StringData: Main +MERGED-DAG: TypeLeafKind: LF_SUBSTR_LIST +MERGED-DAG: StringData: OnlyInFirst +MERGED-DAG: StringData: OnlyInSecond + +SUBSTRS: StringList +SUBSTRS: TypeLeafKind: LF_SUBSTR_LIST +SUBSTRS-NEXT: NumStrings: 2 +SUBSTRS-NEXT: Strings [ +SUBSTRS-NEXT: SubOne +SUBSTRS-NEXT: SubTwo +SUBSTRS: StringId +SUBSTRS-NEXT: TypeLeafKind: LF_STRING_ID +SUBSTRS-NEXT: Id: "SubOne" "SubTwo" +SUBSTRS-NEXT: StringData: Main + +TPI-EMPTY: Record count: 0 diff --git a/test/DebugInfo/PDB/pdbdump-mergetypes.test b/test/DebugInfo/PDB/pdbdump-mergetypes.test index 96f6316d4766..a26b92631828 100644 --- a/test/DebugInfo/PDB/pdbdump-mergetypes.test +++ b/test/DebugInfo/PDB/pdbdump-mergetypes.test @@ -1,5 +1,5 @@ -; RUN: llvm-pdbdump yaml2pdb -pdb=%t.1.pdb %p/Inputs/merge1.yaml
-; RUN: llvm-pdbdump yaml2pdb -pdb=%t.2.pdb %p/Inputs/merge2.yaml
+; RUN: llvm-pdbdump yaml2pdb -pdb=%t.1.pdb %p/Inputs/merge-types-1.yaml
+; RUN: llvm-pdbdump yaml2pdb -pdb=%t.2.pdb %p/Inputs/merge-types-2.yaml
; RUN: llvm-pdbdump merge -pdb=%t.3.pdb %t.1.pdb %t.2.pdb
; RUN: llvm-pdbdump raw -tpi-records %t.3.pdb | FileCheck -check-prefix=MERGED %s
; RUN: llvm-pdbdump raw -tpi-records %t.3.pdb | FileCheck -check-prefix=ARGLIST %s
diff --git a/test/DebugInfo/PDB/pdbdump-objfilename.yaml b/test/DebugInfo/PDB/pdbdump-objfilename.yaml new file mode 100644 index 000000000000..fac9ce9083c7 --- /dev/null +++ b/test/DebugInfo/PDB/pdbdump-objfilename.yaml @@ -0,0 +1,14 @@ +# RUN: llvm-pdbdump yaml2pdb -pdb=%T/objfilename.pdb %s +# RUN: llvm-pdbdump pdb2yaml -dbi-module-info %T/objfilename.pdb \ +# RUN: | FileCheck %s +# +# CHECK: DbiStream: +# CHECK: Modules: +# CHECK-NEXT: - Module:{{ *}}'C:\src\test.obj' +# CHECK-NEXT: ObjFile:{{ *}}'C:\src\test.obj' +--- +DbiStream: + Modules: + - Module: 'C:\src\test.obj' + ObjFile: 'C:\src\test.obj' +... diff --git a/test/DebugInfo/PDB/pdbdump-source-names.test b/test/DebugInfo/PDB/pdbdump-source-names.test new file mode 100644 index 000000000000..181f4d5e0ee4 --- /dev/null +++ b/test/DebugInfo/PDB/pdbdump-source-names.test @@ -0,0 +1,20 @@ +# Test that we can write source file names to PDBs and read them back. +# Because the subsection the file names are stored in is 4-byte +# aligned, there is a possibility of misaligning the file names. This +# will cause them to be read back empty or truncated. To guard +# against this, we test with two different lengths of file name data +# that differ by one byte, so that at least one of those will only +# pass if alignment is implemented correctly. + +RUN: llvm-pdbdump yaml2pdb -pdb=%T/source-names-1.pdb %p/Inputs/source-names-1.yaml +RUN: llvm-pdbdump pdb2yaml -dbi-module-source-info %T/source-names-1.pdb \ +RUN: | FileCheck -check-prefix=CHECK1 %s +RUN: llvm-pdbdump yaml2pdb -pdb=%T/source-names-2.pdb %p/Inputs/source-names-2.yaml +RUN: llvm-pdbdump pdb2yaml -dbi-module-source-info %T/source-names-2.pdb \ +RUN: | FileCheck -check-prefix=CHECK2 %s + +CHECK1: SourceFiles: +CHECK1: 'C:\src\test.c' + +CHECK2: SourceFiles: +CHECK2: 'C:\src\test.cc' diff --git a/test/DebugInfo/X86/array.ll b/test/DebugInfo/X86/array.ll index 78cffcf69cf9..78dc12b4d377 100644 --- a/test/DebugInfo/X86/array.ll +++ b/test/DebugInfo/X86/array.ll @@ -16,85 +16,109 @@ ; Test that we only emit register-indirect locations for the array array. ; rdar://problem/14874886 ; -; CHECK: ##DEBUG_VALUE: main:array <- [%RSP+0] ; CHECK-NOT: ##DEBUG_VALUE: main:array <- %R{{.*}} +; CHECK: movq %rsp, %rdi +; CHECK-NOT: ##DEBUG_VALUE: main:array <- %R{{.*}} +; CHECK: ##DEBUG_VALUE: main:array <- [%RDI+0] +; CHECK-NOT: ##DEBUG_VALUE: main:array <- %R{{.*}} +; ModuleID = '/tmp/array.c' +source_filename = "/tmp/array.c" target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-apple-macosx10.9.0" +target triple = "x86_64-apple-macosx10.12.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 !dbg !4 { - tail call void @llvm.dbg.value(metadata i32* %p, i64 0, metadata !11, metadata !DIExpression()), !dbg !28 - store i32 42, i32* %p, align 4, !dbg !29, !tbaa !30 - ret void, !dbg !34 +define void @f(i32* nocapture %p) local_unnamed_addr #0 !dbg !8 { +entry: + tail call void @llvm.dbg.value(metadata i32* %p, i64 0, metadata !14, metadata !15), !dbg !16 + store i32 42, i32* %p, align 4, !dbg !17, !tbaa !18 + ret void, !dbg !22 } +; Function Attrs: nounwind readnone speculatable +declare void @llvm.dbg.declare(metadata, metadata, metadata) #1 + ; Function Attrs: nounwind ssp uwtable -define i32 @main(i32 %argc, i8** nocapture readnone %argv) #0 !dbg !12 { +define i32 @main(i32 %argc, i8** nocapture readnone %argv) local_unnamed_addr #0 !dbg !23 { +entry: %array = alloca [4 x i32], align 16 - tail call void @llvm.dbg.value(metadata i32 %argc, i64 0, metadata !19, metadata !DIExpression()), !dbg !35 - tail call void @llvm.dbg.value(metadata i8** %argv, i64 0, metadata !20, metadata !DIExpression()), !dbg !35 - tail call void @llvm.dbg.value(metadata [4 x i32]* %array, i64 0, metadata !21, metadata !DIExpression(DW_OP_deref)), !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, metadata !DIExpression(DW_OP_deref)), !dbg !36 - %2 = getelementptr inbounds [4 x i32], [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, metadata !DIExpression(DW_OP_deref)), !dbg !36 - %3 = load i32, i32* %2, align 16, !dbg !38, !tbaa !30 - ret i32 %3, !dbg !38 + tail call void @llvm.dbg.value(metadata i32 %argc, i64 0, metadata !30, metadata !15), !dbg !36 + tail call void @llvm.dbg.value(metadata i8** %argv, i64 0, metadata !31, metadata !15), !dbg !37 + %0 = bitcast [4 x i32]* %array to i8*, !dbg !38 + call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %0) #3, !dbg !38 + tail call void @llvm.dbg.declare(metadata [4 x i32]* %array, metadata !32, metadata !15), !dbg !39 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull %0, i8* bitcast ([4 x i32]* @main.array to i8*), i64 16, i32 16, i1 false), !dbg !39 + %arraydecay = getelementptr inbounds [4 x i32], [4 x i32]* %array, i64 0, i64 0, !dbg !40 + call void @f(i32* nonnull %arraydecay), !dbg !41 + %1 = load i32, i32* %arraydecay, align 16, !dbg !42, !tbaa !18 + call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %0) #3, !dbg !43 + ret i32 %1, !dbg !44 } -; Function Attrs: nounwind -declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) #1 +; Function Attrs: argmemonly nounwind +declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #2 + +; Function Attrs: argmemonly nounwind +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i32, i1) #2 + +; Function Attrs: argmemonly nounwind +declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #2 -; Function Attrs: nounwind readnone -declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #2 +; Function Attrs: nounwind readnone speculatable +declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #1 attributes #0 = { nounwind ssp uwtable } -attributes #1 = { nounwind } -attributes #2 = { nounwind readnone } +attributes #1 = { nounwind readnone speculatable } +attributes #2 = { argmemonly nounwind } +attributes #3 = { nounwind } !llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!25, !26} -!llvm.ident = !{!27} +!llvm.module.flags = !{!3, !4, !5, !6} +!llvm.ident = !{!7} -!0 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 3.5.0 ", isOptimized: true, emissionKind: FullDebug, file: !1, enums: !2, retainedTypes: !2, globals: !2, imports: !2) -!1 = !DIFile(filename: "array.c", directory: "") +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 5.0.0 (trunk 303873) (llvm/trunk 303875)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2) +!1 = !DIFile(filename: "/tmp/array.c", directory: "/") !2 = !{} -!4 = distinct !DISubprogram(name: "f", line: 1, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: true, unit: !0, scopeLine: 1, file: !1, scope: !5, type: !6, variables: !10) -!5 = !DIFile(filename: "array.c", directory: "") -!6 = !DISubroutineType(types: !7) -!7 = !{null, !8} -!8 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, baseType: !9) -!9 = !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed) -!10 = !{!11} -!11 = !DILocalVariable(name: "p", line: 1, arg: 1, scope: !4, file: !5, type: !8) -!12 = distinct !DISubprogram(name: "main", line: 5, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: true, unit: !0, scopeLine: 5, file: !1, scope: !5, type: !13, variables: !18) -!13 = !DISubroutineType(types: !14) -!14 = !{!9, !9, !15} -!15 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, baseType: !16) -!16 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, baseType: !17) -!17 = !DIBasicType(tag: DW_TAG_base_type, name: "char", size: 8, align: 8, encoding: DW_ATE_signed_char) -!18 = !{!19, !20, !21} -!19 = !DILocalVariable(name: "argc", line: 5, arg: 1, scope: !12, file: !5, type: !9) -!20 = !DILocalVariable(name: "argv", line: 5, arg: 2, scope: !12, file: !5, type: !15) -!21 = !DILocalVariable(name: "array", line: 6, scope: !12, file: !5, type: !22) -!22 = !DICompositeType(tag: DW_TAG_array_type, size: 128, align: 32, baseType: !9, elements: !23) -!23 = !{!24} -!24 = !DISubrange(count: 4) -!25 = !{i32 2, !"Dwarf Version", i32 2} -!26 = !{i32 1, !"Debug Info Version", i32 3} -!27 = !{!"clang version 3.5.0 "} -!28 = !DILocation(line: 1, scope: !4) -!29 = !DILocation(line: 2, scope: !4) -!30 = !{!31, !31, i64 0} -!31 = !{!"int", !32, i64 0} -!32 = !{!"omnipotent char", !33, i64 0} -!33 = !{!"Simple C/C++ TBAA"} -!34 = !DILocation(line: 3, scope: !4) -!35 = !DILocation(line: 5, scope: !12) -!36 = !DILocation(line: 6, scope: !12) -!37 = !DILocation(line: 7, scope: !12) -!38 = !DILocation(line: 8, scope: !12) +!3 = !{i32 2, !"Dwarf Version", i32 4} +!4 = !{i32 2, !"Debug Info Version", i32 3} +!5 = !{i32 1, !"wchar_size", i32 4} +!6 = !{i32 7, !"PIC Level", i32 2} +!7 = !{!"clang version 5.0.0 (trunk 303873) (llvm/trunk 303875)"} +!8 = distinct !DISubprogram(name: "f", scope: !1, file: !1, line: 1, type: !9, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, variables: !13) +!9 = !DISubroutineType(types: !10) +!10 = !{null, !11} +!11 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !12, size: 64) +!12 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!13 = !{!14} +!14 = !DILocalVariable(name: "p", arg: 1, scope: !8, file: !1, line: 1, type: !11) +!15 = !DIExpression() +!16 = !DILocation(line: 1, column: 13, scope: !8) +!17 = !DILocation(line: 2, column: 8, scope: !8) +!18 = !{!19, !19, i64 0} +!19 = !{!"int", !20, i64 0} +!20 = !{!"omnipotent char", !21, i64 0} +!21 = !{!"Simple C/C++ TBAA"} +!22 = !DILocation(line: 3, column: 1, scope: !8) +!23 = distinct !DISubprogram(name: "main", scope: !1, file: !1, line: 5, type: !24, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: true, unit: !0, variables: !29) +!24 = !DISubroutineType(types: !25) +!25 = !{!12, !12, !26} +!26 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !27, size: 64) +!27 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !28, size: 64) +!28 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char) +!29 = !{!30, !31, !32} +!30 = !DILocalVariable(name: "argc", arg: 1, scope: !23, file: !1, line: 5, type: !12) +!31 = !DILocalVariable(name: "argv", arg: 2, scope: !23, file: !1, line: 5, type: !26) +!32 = !DILocalVariable(name: "array", scope: !23, file: !1, line: 6, type: !33) +!33 = !DICompositeType(tag: DW_TAG_array_type, baseType: !12, size: 128, elements: !34) +!34 = !{!35} +!35 = !DISubrange(count: 4) +!36 = !DILocation(line: 5, column: 14, scope: !23) +!37 = !DILocation(line: 5, column: 27, scope: !23) +!38 = !DILocation(line: 6, column: 3, scope: !23) +!39 = !DILocation(line: 6, column: 7, scope: !23) +!40 = !DILocation(line: 7, column: 5, scope: !23) +!41 = !DILocation(line: 7, column: 3, scope: !23) +!42 = !DILocation(line: 8, column: 10, scope: !23) +!43 = !DILocation(line: 9, column: 1, scope: !23) +!44 = !DILocation(line: 8, column: 3, scope: !23) diff --git a/test/DebugInfo/X86/dbg-value-frame-index.ll b/test/DebugInfo/X86/dbg-value-frame-index.ll index 7b49aacfaefd..3c3c21257ed9 100644 --- a/test/DebugInfo/X86/dbg-value-frame-index.ll +++ b/test/DebugInfo/X86/dbg-value-frame-index.ll @@ -32,7 +32,7 @@ declare void @llvm.dbg.value(metadata, i64, metadata, metadata) !3 = !{i32 2, !"Debug Info Version", i32 3} !4 = distinct !DISubprogram(name: "test", type: !10, unit: !0) !5 = !DILocalVariable(name: "w", scope: !4, type: !9) -!6 = !DIExpression(DW_OP_deref) +!6 = !DIExpression() !7 = !DILocation(line: 210, column: 12, scope: !4) !8 = !{!9} !9 = !DIBasicType(name: "bool", size: 8, encoding: DW_ATE_boolean) diff --git a/test/DebugInfo/X86/debug-loc-offset.ll b/test/DebugInfo/X86/debug-loc-offset.ll index 8e3e1e97c319..8f2210e2c014 100644 --- a/test/DebugInfo/X86/debug-loc-offset.ll +++ b/test/DebugInfo/X86/debug-loc-offset.ll @@ -35,10 +35,6 @@ ; 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_linkage_name [DW_FORM_strp]{{.*}}"_Z3baz1A" @@ -53,6 +49,10 @@ ; CHECK: DW_AT_location [DW_FORM_exprloc] ; CHECK-NOT: DW_AT_location +; CHECK: DW_TAG_compile_unit +; CHECK: DW_AT_low_pc +; CHECK: DW_AT_high_pc + ; CHECK: .debug_loc contents: ; CHECK: 0x00000000: Beginning address offset: 0x0000000000000000 ; CHECK: Ending address offset: 0x0000000000000017 diff --git a/test/DebugInfo/X86/debug-macro.ll b/test/DebugInfo/X86/debug-macro.ll index 2b3adce4776e..a8b3d4b9b87e 100644 --- a/test/DebugInfo/X86/debug-macro.ll +++ b/test/DebugInfo/X86/debug-macro.ll @@ -1,40 +1,38 @@ -; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck --check-prefix=CHECK-INFO %s -; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=macro - | FileCheck --check-prefix=CHECK-MACRO %s -; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=line - | FileCheck --check-prefix=CHECK-LINE %s +; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump - | FileCheck %s -; CHECK-INFO: .debug_info contents: -; CHECK-INFO: DW_TAG_compile_unit -; CHECK-INFO-NOT: DW_TAG -; CHECK-INFO: DW_AT_name {{.*}}"debug-macro.cpp") -; CHECK-INFO: DW_AT_macro_info {{.*}}(0x00000000) -; CHECK-INFO: DW_TAG_compile_unit -; CHECK-INFO-NOT: DW_TAG -; CHECK-INFO: DW_AT_name {{.*}}"debug-macro1.cpp") -; CHECK-INFO: DW_AT_macro_info {{.*}}(0x00000044) -; CHECK-INFO: DW_TAG_compile_unit -; CHECK-INFO-NOT: DW_TAG -; CHECK-INFO: DW_AT_name {{.*}}"debug-macro2.cpp") -; CHECK-INFO-NOT: DW_AT_macro_info +; CHECK-LABEL: .debug_info contents: +; CHECK: DW_TAG_compile_unit +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}}"debug-macro.cpp") +; CHECK: DW_AT_macro_info {{.*}}(0x00000000) +; CHECK: DW_TAG_compile_unit +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}}"debug-macro1.cpp") +; CHECK: DW_AT_macro_info {{.*}}(0x00000044) +; CHECK: DW_TAG_compile_unit +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_name {{.*}}"debug-macro2.cpp") +; CHECK-NOT: DW_AT_macro_info -; CHECK-MACRO: .debug_macinfo contents: -; CHECK-MACRO-NEXT: DW_MACINFO_define - lineno: 0 macro: NameCMD ValueCMD -; CHECK-MACRO-NEXT: DW_MACINFO_start_file - lineno: 0 filenum: 1 -; CHECK-MACRO-NEXT: DW_MACINFO_start_file - lineno: 9 filenum: 2 -; CHECK-MACRO-NEXT: DW_MACINFO_define - lineno: 1 macro: NameDef Value -; CHECK-MACRO-NEXT: DW_MACINFO_undef - lineno: 11 macro: NameUndef -; CHECK-MACRO-NEXT: DW_MACINFO_end_file -; CHECK-MACRO-NEXT: DW_MACINFO_undef - lineno: 10 macro: NameUndef2 -; CHECK-MACRO-NEXT: DW_MACINFO_end_file -; CHECK-MACRO-NEXT: DW_MACINFO_start_file - lineno: 0 filenum: 1 -; CHECK-MACRO-NEXT: DW_MACINFO_end_file +; CHECK-LABEL: .debug_macinfo contents: +; CHECK-NEXT: DW_MACINFO_define - lineno: 0 macro: NameCMD ValueCMD +; CHECK-NEXT: DW_MACINFO_start_file - lineno: 0 filenum: 1 +; CHECK-NEXT: DW_MACINFO_start_file - lineno: 9 filenum: 2 +; CHECK-NEXT: DW_MACINFO_define - lineno: 1 macro: NameDef Value +; CHECK-NEXT: DW_MACINFO_undef - lineno: 11 macro: NameUndef +; CHECK-NEXT: DW_MACINFO_end_file +; CHECK-NEXT: DW_MACINFO_undef - lineno: 10 macro: NameUndef2 +; CHECK-NEXT: DW_MACINFO_end_file +; CHECK-NEXT: DW_MACINFO_start_file - lineno: 0 filenum: 1 +; CHECK-NEXT: DW_MACINFO_end_file -; CHECK-LINE: .debug_line contents: -; CHECK-LINE: Dir Mod Time File Len File Name -; CHECK-LINE: file_names[ 1] {{.*}}debug-macro.cpp -; CHECK-LINE: file_names[ 2] {{.*}}debug-macro.h -; CHECK-LINE: Dir Mod Time File Len File Name -; CHECK-LINE: file_names[ 1] {{.*}}debug-macro1.cpp +; CHECK-LABEL: .debug_line contents: +; CHECK: Dir Mod Time File Len File Name +; CHECK: file_names[ 1] {{.*}}debug-macro.cpp +; CHECK: file_names[ 2] {{.*}}debug-macro.h +; CHECK: Dir Mod Time File Len File Name +; CHECK: file_names[ 1] {{.*}}debug-macro1.cpp !llvm.dbg.cu = !{!0, !16, !20} !llvm.module.flags = !{!13, !14} @@ -58,10 +56,14 @@ !14 = !{i32 1, !"Debug Info Version", i32 3} !15 = !{!"clang version 3.5.0 "} -!16 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.5.0 ", isOptimized: false, emissionKind: FullDebug, file: !17, enums: !2, retainedTypes: !2, globals: !2, imports: !2, macros: !18) +!16 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.5.0 ", isOptimized: false, emissionKind: FullDebug, file: !17, enums: !2, retainedTypes: !22, globals: !2, imports: !2, macros: !18) !17 = !DIFile(filename: "debug-macro1.cpp", directory: "/") !18 = !{!19} !19 = !DIMacroFile(line: 0, file: !17, nodes: !2) -!20 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.5.0 ", isOptimized: false, emissionKind: FullDebug, file: !21, enums: !2, retainedTypes: !2, globals: !2, imports: !2) +!20 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.5.0 ", isOptimized: false, emissionKind: FullDebug, file: !21, enums: !2, retainedTypes: !24, globals: !2, imports: !2) !21 = !DIFile(filename: "debug-macro2.cpp", directory: "/") +!22 = !{!23} +!23 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!24 = !{!25} +!25 = !DIBasicType(name: "float", size: 32, encoding: DW_ATE_float) diff --git a/test/DebugInfo/X86/empty.ll b/test/DebugInfo/X86/empty.ll index 774b908adb30..b89af579fd90 100644 --- a/test/DebugInfo/X86/empty.ll +++ b/test/DebugInfo/X86/empty.ll @@ -8,10 +8,9 @@ ; CHECK-NOT: file_names[ ; CHECK: .debug_pubnames contents: -; CHECK-NOT: Offset - -; CHECK: .debug_pubtypes contents: -; CHECK-NOT: Offset +; CHECK-NEXT: length = 0x0000000e +; CHECK-NEXT: Offset +; CHECK-NEXT: {{^$}} ; Don't emit DW_AT_addr_base when there are no addresses. ; FISSION-NOT: DW_AT_GNU_addr_base [DW_FORM_sec_offset] @@ -19,8 +18,10 @@ !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!5} -!0 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 3.1 (trunk 143523)", isOptimized: true, emissionKind: FullDebug, file: !4, enums: !2, retainedTypes: !2, globals: !2) +!0 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 3.1 (trunk 143523)", isOptimized: true, emissionKind: FullDebug, file: !4, enums: !2, retainedTypes: !6, globals: !2) !2 = !{} !3 = !DIFile(filename: "empty.c", directory: "/home/nlewycky") !4 = !DIFile(filename: "empty.c", directory: "/home/nlewycky") !5 = !{i32 1, !"Debug Info Version", i32 3} +!6 = !{!7} +!7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) diff --git a/test/DebugInfo/X86/fission-hash.ll b/test/DebugInfo/X86/fission-hash.ll index 1a5fba293175..de9966ab0be0 100644 --- a/test/DebugInfo/X86/fission-hash.ll +++ b/test/DebugInfo/X86/fission-hash.ll @@ -1,16 +1,18 @@ ; RUN: llc -split-dwarf-file=foo.dwo -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. +; The source is an empty file, modified to include/retain an 'int' type, since empty CUs are omitted. -; CHECK: DW_AT_GNU_dwo_id [DW_FORM_data8] (0x0c1e629c9e5ada4f) -; CHECK: DW_AT_GNU_dwo_id [DW_FORM_data8] (0x0c1e629c9e5ada4f) +; CHECK: DW_AT_GNU_dwo_id [DW_FORM_data8] (0x50d985146a74bb00) +; CHECK: DW_AT_GNU_dwo_id [DW_FORM_data8] (0x50d985146a74bb00) !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!3, !4} -!0 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 3.4 (trunk 188230) (llvm/trunk 188234)", isOptimized: false, splitDebugFilename: "foo.dwo", emissionKind: FullDebug, file: !1, enums: !2, retainedTypes: !2, globals: !2, imports: !2) +!0 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 3.4 (trunk 188230) (llvm/trunk 188234)", isOptimized: false, splitDebugFilename: "foo.dwo", emissionKind: FullDebug, file: !1, enums: !2, retainedTypes: !5, globals: !2, imports: !2) !1 = !DIFile(filename: "foo.c", directory: "/usr/local/google/home/echristo/tmp") !2 = !{} !3 = !{i32 2, !"Dwarf Version", i32 3} !4 = !{i32 1, !"Debug Info Version", i32 3} +!5 = !{!6} +!6 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) diff --git a/test/DebugInfo/X86/gnu-public-names-empty.ll b/test/DebugInfo/X86/gnu-public-names-empty.ll index b04f7af64908..c5d44ad0f082 100644 --- a/test/DebugInfo/X86/gnu-public-names-empty.ll +++ b/test/DebugInfo/X86/gnu-public-names-empty.ll @@ -9,11 +9,18 @@ ; CHECK: DW_AT_GNU_pubnames [DW_FORM_flag_present] (true) ; CHECK-NOT: DW_AT_GNU_pubtypes [ +; CHECK: .debug_gnu_pubnames contents: +; CHECK-NEXT: length = 0x0000000e +; CHECK-NEXT: Offset +; CHECK-NEXT: {{^$}} + !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!3, !4} -!0 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 3.4 (trunk 191846) (llvm/trunk 191866)", isOptimized: false, emissionKind: FullDebug, file: !1, enums: !2, retainedTypes: !2, globals: !2, imports: !2) +!0 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 3.4 (trunk 191846) (llvm/trunk 191866)", isOptimized: false, emissionKind: FullDebug, file: !1, enums: !2, retainedTypes: !5, globals: !2, imports: !2) !1 = !DIFile(filename: "foo.c", directory: "/usr/local/google/home/echristo/tmp") !2 = !{} !3 = !{i32 2, !"Dwarf Version", i32 4} !4 = !{i32 1, !"Debug Info Version", i32 3} +!5 = !{!6} +!6 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) diff --git a/test/DebugInfo/X86/gnu-public-names-gmlt.ll b/test/DebugInfo/X86/gnu-public-names-gmlt.ll new file mode 100644 index 000000000000..569f56a50af0 --- /dev/null +++ b/test/DebugInfo/X86/gnu-public-names-gmlt.ll @@ -0,0 +1,68 @@ +; RUN: llc -mtriple=x86_64-pc-linux-gnu -filetype=obj < %s -generate-gnu-dwarf-pub-sections | llvm-dwarfdump - | FileCheck --check-prefix=GPUB --check-prefix=CHECK %s +; RUN: llc -mtriple=x86_64-pc-linux-gnu -filetype=obj < %s -generate-dwarf-pub-sections=Enable | llvm-dwarfdump - | FileCheck --check-prefix=PUB --check-prefix=CHECK %s +; RUN: llc -mtriple=x86_64-pc-linux-gnu -filetype=obj < %s | llvm-dwarfdump - | FileCheck --check-prefix=NONE %s + +; Generated from: +; void f1(); +; inline __attribute__((always_inline)) void f2() { +; f1(); +; } +; void f3() { +; f2(); +; } +; $ clang++ -gmlt %s -emit-llvm -S + +; GPUB: Compile Unit +; GPUB: DW_AT_GNU_pubnames + +; GPUB: .debug_gnu_pubnames contents: +; PUB: .debug_pubnames contents: +; CHECK-NEXT: unit_offset = 0x00000000 +; CHECK-NEXT: Name +; CHECK-NEXT: "f2" +; CHECK-NEXT: "f3" + +; GPUB: .debug_gnu_pubtypes contents: +; PUB: .debug_pubtypes contents: +; CHECK-NEXT: length = 0x0000000e version = 0x0002 unit_offset = 0x00000000 +; CHECK-NEXT: Name + +; NONE: .debug_pubnames contents: +; NONE: {{^$}} +; NONE: .debug_pubtypes contents: +; NONE: {{^$}} +; NONE: .debug_gnu_pubnames contents: +; NONE: {{^$}} +; NONE: .debug_gnu_pubtypes contents: +; NONE: {{^$}} + + +; Function Attrs: noinline uwtable +define void @_Z2f3v() #0 !dbg !7 { +entry: + call void @_Z2f1v(), !dbg !9 + ret void, !dbg !12 +} + +declare void @_Z2f1v() #1 + +attributes #0 = { noinline uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "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" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!3, !4, !5} +!llvm.ident = !{!6} + +!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 5.0.0 (trunk 303768) (llvm/trunk 303774)", isOptimized: false, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !2) +!1 = !DIFile(filename: "gnu-public-names-gmlt.cpp", directory: "/usr/local/google/home/blaikie/dev/scratch") +!2 = !{} +!3 = !{i32 2, !"Dwarf Version", i32 4} +!4 = !{i32 2, !"Debug Info Version", i32 3} +!5 = !{i32 1, !"wchar_size", i32 4} +!6 = !{!"clang version 5.0.0 (trunk 303768) (llvm/trunk 303774)"} +!7 = distinct !DISubprogram(name: "f3", scope: !1, file: !1, line: 5, type: !8, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2) +!8 = !DISubroutineType(types: !2) +!9 = !DILocation(line: 3, column: 3, scope: !10, inlinedAt: !11) +!10 = distinct !DISubprogram(name: "f2", scope: !1, file: !1, line: 2, type: !8, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2) +!11 = distinct !DILocation(line: 6, column: 3, scope: !7) +!12 = !DILocation(line: 7, column: 1, scope: !7) diff --git a/test/DebugInfo/X86/split-dwarf-multiple-cu-hash.ll b/test/DebugInfo/X86/split-dwarf-multiple-cu-hash.ll new file mode 100644 index 000000000000..f801ade27bd9 --- /dev/null +++ b/test/DebugInfo/X86/split-dwarf-multiple-cu-hash.ll @@ -0,0 +1,42 @@ +; RUN: %llc_dwarf -split-dwarf-file=foo.dwo %s -filetype=obj -o %T/a.o +; RUN: %llc_dwarf -split-dwarf-file=bar.dwo %s -filetype=obj -o %T/b.o +; RUN: llvm-dwarfdump -debug-dump=info %T/a.o %T/b.o | FileCheck %s + +; CHECK: dwo_id {{.*}}([[HASH:.*]]) +; CHECK-NOT: dwo_id {{.*}}([[HASH]]) + +target triple = "x86_64-pc-linux" + +; Function Attrs: noinline nounwind uwtable +define void @_Z1av() #0 !dbg !9 { +entry: + ret void, !dbg !12 +} + +; Function Attrs: noinline nounwind uwtable +define void @_Z1bv() #0 !dbg !13 { +entry: + ret void, !dbg !14 +} + +attributes #0 = { noinline nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.dbg.cu = !{!0, !3} +!llvm.ident = !{!5, !5} +!llvm.module.flags = !{!6, !7, !8} + +!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 5.0.0 (trunk 304107) (llvm/trunk 304109)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2) +!1 = !DIFile(filename: "a.cpp", directory: "/usr/local/google/home/blaikie/dev/scratch") +!2 = !{} +!3 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !4, producer: "clang version 5.0.0 (trunk 304107) (llvm/trunk 304109)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2) +!4 = !DIFile(filename: "b.cpp", directory: "/usr/local/google/home/blaikie/dev/scratch") +!5 = !{!"clang version 5.0.0 (trunk 304107) (llvm/trunk 304109)"} +!6 = !{i32 2, !"Dwarf Version", i32 4} +!7 = !{i32 2, !"Debug Info Version", i32 3} +!8 = !{i32 1, !"wchar_size", i32 4} +!9 = distinct !DISubprogram(name: "a", linkageName: "_Z1av", scope: !1, file: !1, line: 1, type: !10, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2) +!10 = !DISubroutineType(types: !11) +!11 = !{null} +!12 = !DILocation(line: 2, column: 1, scope: !9) +!13 = distinct !DISubprogram(name: "b", linkageName: "_Z1bv", scope: !4, file: !4, line: 1, type: !10, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !3, variables: !2) +!14 = !DILocation(line: 2, column: 1, scope: !13) diff --git a/test/DebugInfo/X86/split-dwarf-omit-empty.ll b/test/DebugInfo/X86/split-dwarf-omit-empty.ll new file mode 100644 index 000000000000..5f824bd43cd3 --- /dev/null +++ b/test/DebugInfo/X86/split-dwarf-omit-empty.ll @@ -0,0 +1,54 @@ +; RUN: %llc_dwarf -split-dwarf-file=foo.dwo %s -filetype=obj -o - | llvm-dwarfdump -debug-dump=info - | FileCheck %s + +; Created from: +; a.cpp: +; void f1(); +; inline __attribute__((always_inline)) __attribute__((used)) void f2() { f1(); } +; b.cpp: +; void f2(); +; void f3() { +; f2(); +; } +; $ clang++ -fno-split-dwarf-inlining {a,b}.cpp -emit-llvm -S -g +; $ llvm-link {a,b}.ll -S -o ab.ll +; Then strip out the @llvm.used global, so no out of line definition of 'f2' +; will be emitted. This emulates something more like the available_externally +; import performed by ThinLTO. + +; CHECK: Compile Unit +; CHECK-NOT: Compile Unit + +target triple = "x86_64-pc-linux" + +declare void @_Z2f1v() + +; Function Attrs: noinline norecurse uwtable +define i32 @main() !dbg !9 { +entry: + call void @_Z2f1v(), !dbg !13 + ret i32 0, !dbg !18 +} + +!llvm.dbg.cu = !{!0, !3} +!llvm.ident = !{!5, !5} +!llvm.module.flags = !{!6, !7, !8} + +!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 5.0.0 (trunk 304054) (llvm/trunk 304080)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false) +!1 = !DIFile(filename: "a.cpp", directory: "/usr/local/google/home/blaikie/dev/scratch") +!2 = !{} +!3 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !4, producer: "clang version 5.0.0 (trunk 304054) (llvm/trunk 304080)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false) +!4 = !DIFile(filename: "b.cpp", directory: "/usr/local/google/home/blaikie/dev/scratch") +!5 = !{!"clang version 5.0.0 (trunk 304054) (llvm/trunk 304080)"} +!6 = !{i32 2, !"Dwarf Version", i32 4} +!7 = !{i32 2, !"Debug Info Version", i32 3} +!8 = !{i32 1, !"wchar_size", i32 4} +!9 = distinct !DISubprogram(name: "main", scope: !4, file: !4, line: 2, type: !10, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: false, unit: !3, variables: !2) +!10 = !DISubroutineType(types: !11) +!11 = !{!12} +!12 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!13 = !DILocation(line: 2, column: 73, scope: !14, inlinedAt: !17) +!14 = distinct !DISubprogram(name: "f2", linkageName: "_Z2f2v", scope: !1, file: !1, line: 2, type: !15, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2) +!15 = !DISubroutineType(types: !16) +!16 = !{null} +!17 = distinct !DILocation(line: 3, column: 3, scope: !9) +!18 = !DILocation(line: 4, column: 1, scope: !9) diff --git a/test/DebugInfo/dwo.ll b/test/DebugInfo/dwo.ll index 5eeca541e78d..b6de943c0239 100644 --- a/test/DebugInfo/dwo.ll +++ b/test/DebugInfo/dwo.ll @@ -8,8 +8,10 @@ !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!3, !4} -!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "LLVM", isOptimized: false, runtimeVersion: 2, emissionKind: FullDebug, enums: !2, retainedTypes: !2, globals: !2, imports: !2, dwoId: 43981) +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "LLVM", isOptimized: false, runtimeVersion: 2, emissionKind: FullDebug, enums: !2, retainedTypes: !5, globals: !2, imports: !2, dwoId: 43981) !1 = !DIFile(filename: "<stdin>", directory: "/") !2 = !{} !3 = !{i32 2, !"Dwarf Version", i32 4} !4 = !{i32 2, !"Debug Info Version", i32 3} +!5 = !{!6} +!6 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) diff --git a/test/DebugInfo/llvm-symbolizer.test b/test/DebugInfo/llvm-symbolizer.test index f0db8f4b921f..2c64804659fc 100644 --- a/test/DebugInfo/llvm-symbolizer.test +++ b/test/DebugInfo/llvm-symbolizer.test @@ -27,6 +27,9 @@ RUN: cp %p/Inputs/split-dwarf-multiple-cu.dwo %T RUN: echo "%p/Inputs/split-dwarf-multiple-cu.o 0x4" >> %t.input RUN: cp %p/Inputs/split-dwarf-addr-object-relocation.dwo %T RUN: echo "%p/Inputs/split-dwarf-addr-object-relocation.o 0x14" >> %t.input +RUN: cp %p/Inputs/split-dwarf-dwp.o %T +RUN: cp %p/Inputs/split-dwarf-dwp.o.dwp %T +RUN: echo "%T/split-dwarf-dwp.o 0x4" >> %t.input RUN: llvm-symbolizer --functions=linkage --inlining --demangle=false \ RUN: --default-arch=i386 < %t.input | FileCheck --check-prefix=CHECK --check-prefix=SPLIT --check-prefix=DWO %s @@ -147,6 +150,11 @@ CHECK-NEXT: split-dwarf-addr-object-relocation.cpp:3:3 CHECK-NEXT: f3 CHECK-NEXT: split-dwarf-addr-object-relocation.cpp:6:0 +CHECK: f2 +CHECK-NEXT: split-dwarf-dwp.cpp:3:3 +CHECK-NEXT: f3 +CHECK-NEXT: split-dwarf-dwp.cpp:6:0 + RUN: echo "unexisting-file 0x1234" > %t.input2 RUN: llvm-symbolizer < %t.input2 2>&1 | FileCheck %s --check-prefix=MISSING-FILE diff --git a/test/DebugInfo/omit-empty.ll b/test/DebugInfo/omit-empty.ll new file mode 100644 index 000000000000..92450050d208 --- /dev/null +++ b/test/DebugInfo/omit-empty.ll @@ -0,0 +1,12 @@ +; RUN: %llc_dwarf %s -filetype=obj -o - | llvm-objdump -h - | FileCheck %s + +; CHECK-NOT: .debug_ + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!3, !4} + +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "LLVM", isOptimized: false, runtimeVersion: 2, emissionKind: FullDebug, enums: !2, retainedTypes: !2, globals: !2, imports: !2) +!1 = !DIFile(filename: "<stdin>", directory: "/") +!2 = !{} +!3 = !{i32 2, !"Dwarf Version", i32 4} +!4 = !{i32 2, !"Debug Info Version", i32 3} diff --git a/test/DebugInfo/skeletoncu.ll b/test/DebugInfo/skeletoncu.ll index a90c8b355ce2..4c96d82036e7 100644 --- a/test/DebugInfo/skeletoncu.ll +++ b/test/DebugInfo/skeletoncu.ll @@ -8,9 +8,11 @@ !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!3, !4} -!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "LLVM", isOptimized: false, runtimeVersion: 2, splitDebugFilename: "my.dwo", emissionKind: FullDebug, enums: !2, retainedTypes: !2, globals: !2, imports: !2, dwoId: 43981) +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "LLVM", isOptimized: false, runtimeVersion: 2, splitDebugFilename: "my.dwo", emissionKind: FullDebug, enums: !2, retainedTypes: !6, globals: !2, imports: !2, dwoId: 43981) !1 = !DIFile(filename: "<stdin>", directory: "/") !2 = !{} !3 = !{i32 2, !"Dwarf Version", i32 4} !4 = !{i32 2, !"Debug Info Version", i32 3} +!5 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!6 = !{!5} |