Files
clang-p2996/llvm/test/CodeGen/X86/machine-outliner-disubprogram.ll
Jessica Paquette a499c3c29d Add optional DICompileUnit to DIBuilder + make outliner debug info use it
Previously, the DIBuilder didn't expose functionality to set its compile unit
in any other way than calling createCompileUnit. This meant that the outliner,
which creates new functions, had to create a new compile unit for its debug
info.

This commit adds an optional parameter in the DIBuilder's constructor which
lets you set its CU at construction.

It also changes the MachineOutliner so that it keeps track of the DISubprograms
for each outlined sequence. If debugging information is requested, then it
uses one of the outlined sequence's DISubprograms to grab a CU. It then uses
that CU to construct the DISubprogram for the new outlined function.

The test has also been updated to reflect this change.

See https://reviews.llvm.org/D42254 for more information. Also see the e-mail
discussion on D42254 in llvm-commits for more context.

llvm-svn: 322992
2018-01-19 21:21:49 +00:00

215 lines
11 KiB
LLVM

; Ensure that we can correctly emit a compile unit for outlined functions and
; that we correctly emit DISubprograms for those functions.
; Also make sure that the DISubprograms reference the generated unit.
; make sure that if there are two outlined functions in the program,
; RUN: llc %s -enable-machine-outliner -mtriple=x86_64-apple-darwin -o /dev/null -print-after=machine-outliner
define void @f6() #0 !dbg !8 {
entry:
%dog = alloca i32, align 4
%cat = alloca i32, align 4
%pangolin = alloca i32, align 4
call void @llvm.dbg.declare(metadata i32* %dog, metadata !11, metadata !DIExpression()), !dbg !13
store i32 16, i32* %dog, align 4, !dbg !13
call void @llvm.dbg.declare(metadata i32* %cat, metadata !14, metadata !DIExpression()), !dbg !15
store i32 32, i32* %cat, align 4, !dbg !15
call void @llvm.dbg.declare(metadata i32* %pangolin, metadata !16, metadata !DIExpression()), !dbg !17
store i32 48, i32* %pangolin, align 4, !dbg !17
ret void, !dbg !18
}
declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
define void @f5() #0 !dbg !19 {
entry:
%dog = alloca i32, align 4
%cat = alloca i32, align 4
%pangolin = alloca i32, align 4
call void @llvm.dbg.declare(metadata i32* %dog, metadata !20, metadata !DIExpression()), !dbg !21
store i32 16, i32* %dog, align 4, !dbg !21
call void @llvm.dbg.declare(metadata i32* %cat, metadata !22, metadata !DIExpression()), !dbg !23
store i32 32, i32* %cat, align 4, !dbg !23
call void @llvm.dbg.declare(metadata i32* %pangolin, metadata !24, metadata !DIExpression()), !dbg !25
store i32 48, i32* %pangolin, align 4, !dbg !25
ret void, !dbg !26
}
define void @f4() #0 !dbg !27 {
entry:
%dog = alloca i32, align 4
%cat = alloca i32, align 4
%pangolin = alloca i32, align 4
call void @llvm.dbg.declare(metadata i32* %dog, metadata !28, metadata !DIExpression()), !dbg !29
store i32 16, i32* %dog, align 4, !dbg !29
call void @llvm.dbg.declare(metadata i32* %cat, metadata !30, metadata !DIExpression()), !dbg !31
store i32 32, i32* %cat, align 4, !dbg !31
call void @llvm.dbg.declare(metadata i32* %pangolin, metadata !32, metadata !DIExpression()), !dbg !33
store i32 48, i32* %pangolin, align 4, !dbg !33
ret void, !dbg !34
}
define i32 @f1() #0 !dbg !35 {
entry:
%dog = alloca i32, align 4
%cat = alloca i32, align 4
%pangolin = alloca i32, align 4
call void @llvm.dbg.declare(metadata i32* %dog, metadata !38, metadata !DIExpression()), !dbg !39
store i32 1, i32* %dog, align 4, !dbg !39
call void @llvm.dbg.declare(metadata i32* %cat, metadata !40, metadata !DIExpression()), !dbg !41
store i32 2, i32* %cat, align 4, !dbg !41
call void @llvm.dbg.declare(metadata i32* %pangolin, metadata !42, metadata !DIExpression()), !dbg !43
store i32 3, i32* %pangolin, align 4, !dbg !43
store i32 16, i32* %dog, align 4, !dbg !44
%0 = load i32, i32* %dog, align 4, !dbg !45
ret i32 %0, !dbg !46
}
define i32 @f2() #0 !dbg !47 {
entry:
%dog = alloca i32, align 4
%cat = alloca i32, align 4
%pangolin = alloca i32, align 4
call void @llvm.dbg.declare(metadata i32* %dog, metadata !48, metadata !DIExpression()), !dbg !49
store i32 1, i32* %dog, align 4, !dbg !49
call void @llvm.dbg.declare(metadata i32* %cat, metadata !50, metadata !DIExpression()), !dbg !51
store i32 2, i32* %cat, align 4, !dbg !51
call void @llvm.dbg.declare(metadata i32* %pangolin, metadata !52, metadata !DIExpression()), !dbg !53
store i32 3, i32* %pangolin, align 4, !dbg !53
store i32 16, i32* %dog, align 4, !dbg !54
%0 = load i32, i32* %dog, align 4, !dbg !55
ret i32 %0, !dbg !56
}
define i32 @f3() #0 !dbg !57 {
entry:
%dog = alloca i32, align 4
%cat = alloca i32, align 4
%pangolin = alloca i32, align 4
call void @llvm.dbg.declare(metadata i32* %dog, metadata !58, metadata !DIExpression()), !dbg !59
store i32 1, i32* %dog, align 4, !dbg !59
call void @llvm.dbg.declare(metadata i32* %cat, metadata !60, metadata !DIExpression()), !dbg !61
store i32 2, i32* %cat, align 4, !dbg !61
call void @llvm.dbg.declare(metadata i32* %pangolin, metadata !62, metadata !DIExpression()), !dbg !63
store i32 3, i32* %pangolin, align 4, !dbg !63
store i32 16, i32* %dog, align 4, !dbg !64
%0 = load i32, i32* %dog, align 4, !dbg !65
ret i32 %0, !dbg !66
}
define i32 @main() #0 !dbg !67 {
entry:
%retval = alloca i32, align 4
%a = alloca i32, align 4
store i32 0, i32* %retval, align 4
call void @llvm.dbg.declare(metadata i32* %a, metadata !68, metadata !DIExpression()), !dbg !69
store i32 4, i32* %a, align 4, !dbg !69
%call = call i32 @f1() #2, !dbg !70
%call1 = call i32 @f2() #2, !dbg !71
%call2 = call i32 @f3() #2, !dbg !72
ret i32 0, !dbg !73
}
; CHECK: distinct !DISubprogram(name: "OUTLINED_FUNCTION_1",
; CHECK-SAME: scope: !1,
; CHECK-SAME: file: !1,
; CHECK-SAME: type: [[TYPE:![0-9]+]],
; CHECK-SAME: isLocal: false,
; CHECK-SAME: isDefinition: true,
; CHECK-SAME: flags: DIFlagArtificial,
; CHECK-SAME: isOptimized: true,
; CHECK-SAME: unit: !0,
; CHECK-SAME: variables: [[VARS:![0-9]+]]
; CHECK: distinct !DISubprogram(name: "OUTLINED_FUNCTION_0",
; CHECK-SAME: scope: !1,
; CHECK-SAME: file: !1,
; CHECK-SAME: type: [[TYPE]],
; CHECK-SAME: isLocal: false,
; CHECK-SAME: isDefinition: true,
; CHECK-SAME: flags: DIFlagArtificial,
; CHECK-SAME: isOptimized: true,
; CHECK-SAME: unit: !0,
; CHECK-SAME: variables: [[VARS]]
attributes #0 = { noinline noredzone nounwind optnone ssp uwtable "no-frame-pointer-elim"="true" }
attributes #1 = { nounwind readnone speculatable }
attributes #2 = { noredzone }
!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!3, !4, !5, !6}
!llvm.ident = !{!7}
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
!1 = !DIFile(filename: "test.c", directory: "/")
!2 = !{}
!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"}
!8 = distinct !DISubprogram(name: "f6", scope: !1, file: !1, line: 3, type: !9, isLocal: false, isDefinition: true, scopeLine: 3, isOptimized: false, unit: !0, variables: !2)
!9 = !DISubroutineType(types: !10)
!10 = !{null}
!11 = !DILocalVariable(name: "dog", scope: !8, file: !1, line: 4, type: !12)
!12 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!13 = !DILocation(line: 4, column: 16, scope: !8)
!14 = !DILocalVariable(name: "cat", scope: !8, file: !1, line: 5, type: !12)
!15 = !DILocation(line: 5, column: 16, scope: !8)
!16 = !DILocalVariable(name: "pangolin", scope: !8, file: !1, line: 6, type: !12)
!17 = !DILocation(line: 6, column: 16, scope: !8)
!18 = !DILocation(line: 7, column: 1, scope: !8)
!19 = distinct !DISubprogram(name: "f5", scope: !1, file: !1, line: 9, type: !9, isLocal: false, isDefinition: true, scopeLine: 9, isOptimized: false, unit: !0, variables: !2)
!20 = !DILocalVariable(name: "dog", scope: !19, file: !1, line: 10, type: !12)
!21 = !DILocation(line: 10, column: 16, scope: !19)
!22 = !DILocalVariable(name: "cat", scope: !19, file: !1, line: 11, type: !12)
!23 = !DILocation(line: 11, column: 16, scope: !19)
!24 = !DILocalVariable(name: "pangolin", scope: !19, file: !1, line: 12, type: !12)
!25 = !DILocation(line: 12, column: 16, scope: !19)
!26 = !DILocation(line: 13, column: 1, scope: !19)
!27 = distinct !DISubprogram(name: "f4", scope: !1, file: !1, line: 15, type: !9, isLocal: false, isDefinition: true, scopeLine: 15, isOptimized: false, unit: !0, variables: !2)
!28 = !DILocalVariable(name: "dog", scope: !27, file: !1, line: 16, type: !12)
!29 = !DILocation(line: 16, column: 16, scope: !27)
!30 = !DILocalVariable(name: "cat", scope: !27, file: !1, line: 17, type: !12)
!31 = !DILocation(line: 17, column: 16, scope: !27)
!32 = !DILocalVariable(name: "pangolin", scope: !27, file: !1, line: 18, type: !12)
!33 = !DILocation(line: 18, column: 16, scope: !27)
!34 = !DILocation(line: 19, column: 1, scope: !27)
!35 = distinct !DISubprogram(name: "f1", scope: !1, file: !1, line: 21, type: !36, isLocal: false, isDefinition: true, scopeLine: 21, isOptimized: false, unit: !0, variables: !2)
!36 = !DISubroutineType(types: !37)
!37 = !{!12}
!38 = !DILocalVariable(name: "dog", scope: !35, file: !1, line: 22, type: !12)
!39 = !DILocation(line: 22, column: 16, scope: !35)
!40 = !DILocalVariable(name: "cat", scope: !35, file: !1, line: 23, type: !12)
!41 = !DILocation(line: 23, column: 16, scope: !35)
!42 = !DILocalVariable(name: "pangolin", scope: !35, file: !1, line: 24, type: !12)
!43 = !DILocation(line: 24, column: 16, scope: !35)
!44 = !DILocation(line: 25, column: 7, scope: !35)
!45 = !DILocation(line: 26, column: 10, scope: !35)
!46 = !DILocation(line: 26, column: 3, scope: !35)
!47 = distinct !DISubprogram(name: "f2", scope: !1, file: !1, line: 29, type: !36, isLocal: false, isDefinition: true, scopeLine: 29, isOptimized: false, unit: !0, variables: !2)
!48 = !DILocalVariable(name: "dog", scope: !47, file: !1, line: 30, type: !12)
!49 = !DILocation(line: 30, column: 16, scope: !47)
!50 = !DILocalVariable(name: "cat", scope: !47, file: !1, line: 31, type: !12)
!51 = !DILocation(line: 31, column: 16, scope: !47)
!52 = !DILocalVariable(name: "pangolin", scope: !47, file: !1, line: 32, type: !12)
!53 = !DILocation(line: 32, column: 16, scope: !47)
!54 = !DILocation(line: 33, column: 7, scope: !47)
!55 = !DILocation(line: 34, column: 10, scope: !47)
!56 = !DILocation(line: 34, column: 3, scope: !47)
!57 = distinct !DISubprogram(name: "f3", scope: !1, file: !1, line: 37, type: !36, isLocal: false, isDefinition: true, scopeLine: 37, isOptimized: false, unit: !0, variables: !2)
!58 = !DILocalVariable(name: "dog", scope: !57, file: !1, line: 38, type: !12)
!59 = !DILocation(line: 38, column: 16, scope: !57)
!60 = !DILocalVariable(name: "cat", scope: !57, file: !1, line: 39, type: !12)
!61 = !DILocation(line: 39, column: 16, scope: !57)
!62 = !DILocalVariable(name: "pangolin", scope: !57, file: !1, line: 40, type: !12)
!63 = !DILocation(line: 40, column: 16, scope: !57)
!64 = !DILocation(line: 41, column: 7, scope: !57)
!65 = !DILocation(line: 42, column: 10, scope: !57)
!66 = !DILocation(line: 42, column: 3, scope: !57)
!67 = distinct !DISubprogram(name: "main", scope: !1, file: !1, line: 45, type: !36, isLocal: false, isDefinition: true, scopeLine: 45, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
!68 = !DILocalVariable(name: "a", scope: !67, file: !1, line: 46, type: !12)
!69 = !DILocation(line: 46, column: 16, scope: !67)
!70 = !DILocation(line: 47, column: 3, scope: !67)
!71 = !DILocation(line: 48, column: 3, scope: !67)
!72 = !DILocation(line: 49, column: 3, scope: !67)
!73 = !DILocation(line: 51, column: 3, scope: !67)