| # RUN: llc -verify-machineinstrs -start-after=virtregrewriter -filetype=obj -o - %s | llvm-dwarfdump -a - | FileCheck %s |
| # |
| # This testcase has an implicit def pseudo-instruction with a debug location. |
| # |
| # CHECK: .debug_info contents: |
| # CHECK: DW_TAG_subprogram |
| # CHECK: DW_AT_low_pc (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, retainedNodes: !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, retainedNodes: !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 |
| 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 |
| |
| ... |