diff --git a/test/DebugInfo/AArch64/machine-outliner.ll b/test/DebugInfo/AArch64/machine-outliner.ll new file mode 100644 index 00000000000..9670b96e7ee --- /dev/null +++ b/test/DebugInfo/AArch64/machine-outliner.ll @@ -0,0 +1,85 @@ +; RUN: llc -O0 -verify-machineinstrs -filetype=obj -mtriple=aarch64-- \ +; RUN: -enable-machine-outliner < %s | llvm-dwarfdump - | FileCheck %s + +; Ensure that the MachineOutliner produces valid DWARF when it creates outlined +; functions. Check that the outlined function has a subprogram, and that the +; expected DWARF attributes are present. + +; The outlined function appears after bar. Skip past the functions we don't +; care about. +; CHECK: DW_TAG_compile_unit +; CHECK-DAG: DW_AT_name ("foo") +; CHECK-DAG: DW_AT_name ("p") + +; Check the high address of bar. This is one past the end of bar. It should be +; the beginning of the outlined function. +; CHECK: DW_AT_high_pc ([[ONE_PAST_BAR:0x[a-f0-9]+]]) +; CHECK-NEXT: DW_AT_frame_base (DW_OP_reg29 W29) +; CHECK-NEXT: DW_AT_name ("bar") + +; Check the outlined function's DWARF. +; CHECK-DAG: DW_TAG_subprogram +; CHECK-NEXT: DW_AT_low_pc ([[ONE_PAST_BAR]]) +; CHECK-NEXT: DW_AT_high_pc (0x{{[0-9a-f]+}}) +; CHECK-NEXT: DW_AT_frame_base (DW_OP_reg29 W29) +; CHECK-NEXT: DW_AT_MIPS_linkage_name ("[[NAME:OUTLINED_FUNCTION_[0-9]+]]") +; CHECK-NEXT: DW_AT_name ("[[NAME]]") +; CHECK-NEXT: DW_AT_artificial (0x01) +; CHECK-NEXT: DW_AT_external (0x01) + +define void @foo() #0 !dbg !8 { +entry: + %p = alloca i32*, align 8 + call void @llvm.dbg.declare(metadata i32** %p, metadata !11, metadata !DIExpression()), !dbg !14 + %0 = load i32*, i32** %p, align 8, !dbg !15 + %incdec.ptr = getelementptr inbounds i32, i32* %0, i32 1, !dbg !15 + store i32* %incdec.ptr, i32** %p, align 8, !dbg !15 + call void @foo(), !dbg !16 + ret void, !dbg !17 +} + +declare void @llvm.dbg.declare(metadata, metadata, metadata) #1 + +define void @bar() #0 !dbg !18 { +entry: + %p = alloca i32*, align 8 + call void @llvm.dbg.declare(metadata i32** %p, metadata !19, metadata !DIExpression()), !dbg !20 + %0 = load i32*, i32** %p, align 8, !dbg !21 + %incdec.ptr = getelementptr inbounds i32, i32* %0, i32 1, !dbg !21 + store i32* %incdec.ptr, i32** %p, align 8, !dbg !21 + call void @foo(), !dbg !22 + ret void, !dbg !23 +} + +attributes #0 = { nounwind ssp uwtable "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" } +attributes #1 = { nounwind readnone speculatable } + +!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: "something.c", directory: "somewhere") +!2 = !{} +!3 = !{i32 2, !"Dwarf Version", i32 2} +!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: "foo", scope: !1, file: !1, line: 1, type: !9, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2) +!9 = !DISubroutineType(types: !10) +!10 = !{null} +!11 = !DILocalVariable(name: "p", scope: !8, file: !1, line: 2, type: !12) +!12 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !13, size: 64) +!13 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!14 = !DILocation(line: 2, column: 8, scope: !8) +!15 = !DILocation(line: 3, column: 4, scope: !8) +!16 = !DILocation(line: 4, column: 3, scope: !8) +!17 = !DILocation(line: 5, column: 1, scope: !8) +!18 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 7, type: !9, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2) +!19 = !DILocalVariable(name: "p", scope: !18, file: !1, line: 9, type: !12) +!20 = !DILocation(line: 9, column: 8, scope: !18) +!21 = !DILocation(line: 10, column: 4, scope: !18) +!22 = !DILocation(line: 11, column: 3, scope: !18) +!23 = !DILocation(line: 12, column: 1, scope: !18) +