-
Notifications
You must be signed in to change notification settings - Fork 12.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Recommit "[CodeView] Add option to disable inline line tables."
This reverts commit 004ed2b. Original commit hash 6d03890 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
- Loading branch information
Showing
10 changed files
with
184 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
// RUN: %clang_cc1 -triple x86_64-windows-msvc -debug-info-kind=limited \ | ||
// RUN: -gno-inline-line-tables -emit-llvm -o - %s | FileCheck %s | ||
// RUN: %clang -gno-inline-line-tables -S -emit-llvm -o - %s | FileCheck %s \ | ||
// RUN: -check-prefix=INLINE-FLAG | ||
// RUN: %clang -S -emit-llvm -o - %s | FileCheck %s -check-prefix=NO-FLAG | ||
|
||
int x; | ||
__attribute((always_inline)) void f() { | ||
x += 1; | ||
} | ||
int main() { | ||
f(); | ||
x += 2; | ||
return x; | ||
} | ||
|
||
// Check that clang emits the location of the call site and not the inlined | ||
// function in the debug info. | ||
// CHECK: define dso_local i32 @main() | ||
// CHECK: %{{.+}} = load i32, i32* @x, align 4, !dbg [[DbgLoc:![0-9]+]] | ||
|
||
// Check that the no-inline-line-tables attribute is added. | ||
// CHECK: attributes #0 = {{.*}}"no-inline-line-tables"{{.*}} | ||
// CHECK: attributes #1 = {{.*}}"no-inline-line-tables"{{.*}} | ||
|
||
// CHECK: [[DbgLoc]] = !DILocation(line: 12, | ||
// CHECK-NOT: inlinedAt: | ||
|
||
// INLINE-FLAG: attributes #0 = {{.*}}"no-inline-line-tables"{{.*}} | ||
// INLINE-FLAG: attributes #1 = {{.*}}"no-inline-line-tables"{{.*}} | ||
// NO-FLAG-NOT: "no-inline-line-tables" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) |