Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit 503af43

Browse files
committed
Fix line numbers for code inlined from __nodebug__ functions.
Instructions from __nodebug__ functions don't have file:line information even when inlined into no-nodebug functions. As a result, intrinsics (SSE and other) from <*intrin.h> clang headers _never_ have file:line information. With this change, an instruction without !dbg metadata gets one from the call instruction when inlined. Fixes PR19001. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210459 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 544c895 commit 503af43

File tree

2 files changed

+76
-1
lines changed

2 files changed

+76
-1
lines changed

lib/Transforms/Utils/InlineFunction.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,13 @@ static void fixupLineNumbers(Function *Fn, Function::iterator FI,
466466
for (BasicBlock::iterator BI = FI->begin(), BE = FI->end();
467467
BI != BE; ++BI) {
468468
DebugLoc DL = BI->getDebugLoc();
469-
if (!DL.isUnknown()) {
469+
if (DL.isUnknown()) {
470+
// If the inlined instruction has no line number, make it look as if it
471+
// originates from the call location. This is important for
472+
// ((__always_inline__, __nodebug__)) functions which must use caller
473+
// location for all instructions in their function body.
474+
BI->setDebugLoc(TheCallDL);
475+
} else {
470476
BI->setDebugLoc(updateInlinedAtInfo(DL, TheCallDL, BI->getContext()));
471477
if (DbgValueInst *DVI = dyn_cast<DbgValueInst>(BI)) {
472478
LLVMContext &Ctx = BI->getContext();
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
; RUN: opt < %s -inline -S | FileCheck %s
2+
3+
; This was generated from the following source:
4+
; int a, b;
5+
; __attribute__((__always_inline__)) static void callee2() { b = 2; }
6+
; __attribute__((__nodebug__)) void callee() { a = 1; callee2(); }
7+
; void caller() { callee(); }
8+
; by running
9+
; clang -S test.c -emit-llvm -O1 -gline-tables-only -fno-strict-aliasing
10+
11+
; CHECK-LABEL: @caller(
12+
13+
; This instruction did not have a !dbg metadata in the callee.
14+
; CHECK: store i32 1, {{.*}}, !dbg [[A:!.*]]
15+
16+
; This instruction came from callee with a !dbg metadata.
17+
; CHECK: store i32 2, {{.*}}, !dbg [[B:!.*]]
18+
19+
; The remaining instruction from the caller.
20+
; CHECK: ret void, !dbg [[A]]
21+
22+
; Debug location of the code in caller() and of the inlined code that did not
23+
; have any debug location before.
24+
; CHECK-DAG: [[A]] = metadata !{i32 4, i32 0, metadata !{{[01-9]+}}, null}
25+
26+
; Debug location of the inlined code.
27+
; CHECK-DAG: [[B]] = metadata !{i32 2, i32 0, metadata !{{[01-9]+}}, metadata !{{[01-9]+}}}
28+
29+
30+
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
31+
target triple = "x86_64-unknown-linux-gnu"
32+
33+
@a = common global i32 0, align 4
34+
@b = common global i32 0, align 4
35+
36+
; Function Attrs: nounwind uwtable
37+
define void @callee() #0 {
38+
entry:
39+
store i32 1, i32* @a, align 4
40+
store i32 2, i32* @b, align 4, !dbg !11
41+
ret void
42+
}
43+
44+
; Function Attrs: nounwind uwtable
45+
define void @caller() #0 {
46+
entry:
47+
tail call void @callee(), !dbg !12
48+
ret void, !dbg !12
49+
}
50+
51+
attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
52+
53+
!llvm.dbg.cu = !{!0}
54+
!llvm.module.flags = !{!8, !9}
55+
!llvm.ident = !{!10}
56+
57+
!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5.0 (210174)", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 2} ; [ DW_TAG_compile_unit ] [/code/llvm/build0/test.c] [DW_LANG_C99]
58+
!1 = metadata !{metadata !"test.c", metadata !"/code/llvm/build0"}
59+
!2 = metadata !{}
60+
!3 = metadata !{metadata !4, metadata !7}
61+
!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"caller", metadata !"caller", metadata !"", i32 4, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 true, void ()* @caller, null, null, metadata !2, i32 4} ; [ DW_TAG_subprogram ] [line 4] [def] [caller]
62+
!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/code/llvm/build0/test.c]
63+
!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !2, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
64+
!7 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"callee2", metadata !"callee2", metadata !"", i32 2, metadata !6, i1 true, i1 true, i32 0, i32 0, null, i32 0, i1 true, null, null, null, metadata !2, i32 2} ; [ DW_TAG_subprogram ] [line 2] [local] [def] [callee2]
65+
!8 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
66+
!9 = metadata !{i32 2, metadata !"Debug Info Version", i32 1}
67+
!10 = metadata !{metadata !"clang version 3.5.0 (210174)"}
68+
!11 = metadata !{i32 2, i32 0, metadata !7, null}
69+
!12 = metadata !{i32 4, i32 0, metadata !4, null}

0 commit comments

Comments
 (0)