diff options
author | Amy Huang <akhuang@google.com> | 2019-10-31 09:15:53 -0700 |
---|---|---|
committer | Amy Huang <akhuang@google.com> | 2019-11-04 09:15:26 -0800 |
commit | ab76cfdd200d35177df2042a1c0c7e86868d01bc (patch) | |
tree | 58cd05d4ee64a5839c6492207413b60d1478f4ab /llvm/test/Transforms | |
parent | 2c6fae179e6984c7330ff8a284d7a10ce142eef9 (diff) | |
download | bcm5719-llvm-ab76cfdd200d35177df2042a1c0c7e86868d01bc.tar.gz bcm5719-llvm-ab76cfdd200d35177df2042a1c0c7e86868d01bc.zip |
Recommit "[CodeView] Add option to disable inline line tables."
This reverts commit 004ed2b0d1b86d424643ffc88fce20ad8bab6804.
Original commit hash 6d03890384517919a3ba7fe4c35535425f278f89
Summary:
This adds a clang option to disable inline line tables. When it is used,
the inliner uses the call site as the location of the inlined function instead of
marking it as an inline location with the function location.
https://reviews.llvm.org/D67723
Diffstat (limited to 'llvm/test/Transforms')
-rw-r--r-- | llvm/test/Transforms/Inline/no-inline-line-tables.ll | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/llvm/test/Transforms/Inline/no-inline-line-tables.ll b/llvm/test/Transforms/Inline/no-inline-line-tables.ll new file mode 100644 index 00000000000..b20f6b75888 --- /dev/null +++ b/llvm/test/Transforms/Inline/no-inline-line-tables.ll @@ -0,0 +1,99 @@ +; RUN: opt < %s -inline -S | FileCheck %s + +; This tests that functions with the attribute `no-inline-line-tables` have the +; correct debug information when they are inlined. + +; ModuleID = 't.c' +source_filename = "t.c" +target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-windows-msvc" + +; Function Attrs: alwaysinline nounwind +define dso_local i32 @f(i32 %x) #0 !dbg !7 { +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 !12, metadata !DIExpression()), !dbg !13 + %0 = load i32, i32* %x.addr, align 4, !dbg !14 + ret i32 %0, !dbg !14 +} + +; Function Attrs: nounwind readnone speculatable willreturn +declare void @llvm.dbg.declare(metadata, metadata, metadata) #1 + +; Function Attrs: alwaysinline nounwind +define i32 @g(i32 %x) #0 !dbg !15 { +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 !16, metadata !DIExpression()), !dbg !17 + br label %L, !dbg !17 + +L: ; preds = %entry + call void @llvm.dbg.label(metadata !18), !dbg !19 + store i32 42, i32* %x.addr, align 4, !dbg !20 + %0 = load i32, i32* %x.addr, align 4, !dbg !21 + ret i32 %0, !dbg !21 +} + +; Function Attrs: nounwind readnone speculatable willreturn +declare void @llvm.dbg.label(metadata) #1 + +; Check that debug info for inlined code uses the call location and that debug +; intrinsics are removed. +; Function Attrs: noinline nounwind optnone +define i32 @main() #2 !dbg !22 { +entry: +; CHECK-LABEL: @main() +; CHECK-NOT: @f +; CHECK-NOT: @llvm.dbg.declare +; CHECK: %{{[0-9]+}} = load i32, i32* %x.addr.i, align 4, !dbg ![[VAR1:[0-9]+]] + %call = call i32 @f(i32 3), !dbg !25 + +; Another test for inlining debug intrinsics where the intrinsic appears at the +; start of the basic block. +; CHECK-NOT: @g +; CHECK-NOT: @llvm.dbg.label +; CHECK: %{{[0-9]+}} = load i32, i32* %x.addr.i1, align 4, !dbg ![[VAR2:[0-9]+]] + %call1 = call i32 @g(i32 340), !dbg !26 + ret i32 0, !dbg !27 +} + +; CHECK: ![[VAR1]] = !DILocation(line: 10, scope: ![[SCOPE:[0-9]+]]) +; CHECK: ![[VAR2]] = !DILocation(line: 11, scope: ![[SCOPE]]) + +attributes #0 = { alwaysinline nounwind "no-inline-line-tables" } +attributes #2 = { noinline nounwind optnone "no-inline-line-tables"} + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!3, !4, !5} +!llvm.ident = !{!6} + +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 10.0.0 (https://github.com/llvm/llvm-project.git 03ec3a12a94bbbaa11999b6da3a43221a5aa54a5)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, nameTableKind: None) +!1 = !DIFile(filename: "<stdin>", directory: "/usr/local/google/home/akhuang/testing/inline-line-tables", checksumkind: CSK_MD5, checksum: "38a4785b48742d3ea655b8f3461436a4") +!2 = !{} +!3 = !{i32 2, !"CodeView", i32 1} +!4 = !{i32 2, !"Debug Info Version", i32 3} +!5 = !{i32 1, !"wchar_size", i32 4} +!6 = !{!"clang version 10.0.0 (https://github.com/llvm/llvm-project.git 03ec3a12a94bbbaa11999b6da3a43221a5aa54a5)"} +!7 = distinct !DISubprogram(name: "f", scope: !8, file: !8, line: 1, type: !9, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) +!8 = !DIFile(filename: "t.c", directory: "/usr/local/google/home/akhuang/testing/inline-line-tables", checksumkind: CSK_MD5, checksum: "38a4785b48742d3ea655b8f3461436a4") +!9 = !DISubroutineType(types: !10) +!10 = !{!11, !11} +!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!12 = !DILocalVariable(name: "x", arg: 1, scope: !7, file: !8, line: 1, type: !11) +!13 = !DILocation(line: 1, scope: !7) +!14 = !DILocation(line: 2, scope: !7) +!15 = distinct !DISubprogram(name: "g", scope: !8, file: !8, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) +!16 = !DILocalVariable(name: "x", arg: 1, scope: !15, file: !8, line: 4, type: !11) +!17 = !DILocation(line: 4, scope: !15) +!18 = !DILabel(scope: !15, name: "L", file: !8, line: 5) +!19 = !DILocation(line: 5, scope: !15) +!20 = !DILocation(line: 6, scope: !15) +!21 = !DILocation(line: 7, scope: !15) +!22 = distinct !DISubprogram(name: "main", scope: !8, file: !8, line: 9, type: !23, scopeLine: 9, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) +!23 = !DISubroutineType(types: !24) +!24 = !{!11} +!25 = !DILocation(line: 10, scope: !22) +!26 = !DILocation(line: 11, scope: !22) +!27 = !DILocation(line: 12, scope: !22) |