mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
68fcd6e209
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
100 lines
4.5 KiB
LLVM
100 lines
4.5 KiB
LLVM
; 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)
|