Index: lib/Transforms/Utils/InlineFunction.cpp =================================================================== --- lib/Transforms/Utils/InlineFunction.cpp +++ lib/Transforms/Utils/InlineFunction.cpp @@ -466,7 +466,13 @@ for (BasicBlock::iterator BI = FI->begin(), BE = FI->end(); BI != BE; ++BI) { DebugLoc DL = BI->getDebugLoc(); - if (!DL.isUnknown()) { + if (DL.isUnknown()) { + // If the inlined instruction has no line number, make it look as if it + // originates from the call location. This covers the case of + // ((__always_inline__, __nodebug__)) functions in *intrin.h missing + // line numbers after inlining. + BI->setDebugLoc(TheCallDL); + } else { BI->setDebugLoc(updateInlinedAtInfo(DL, TheCallDL, BI->getContext())); if (DbgValueInst *DVI = dyn_cast(BI)) { LLVMContext &Ctx = BI->getContext(); Index: test/Transforms/Inline/inline-line-numbers.ll =================================================================== --- test/Transforms/Inline/inline-line-numbers.ll +++ test/Transforms/Inline/inline-line-numbers.ll @@ -0,0 +1,81 @@ +; RUN: opt < %s -inline -S | FileCheck %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +; Function Attrs: nounwind readnone uwtable +define i32 @test2f(i32 %x) #0 { +entry: + tail call void @llvm.dbg.value(metadata !{i32 %x}, i64 0, metadata !10), !dbg !21 + %mul = shl i32 %x, 1 + tail call void @llvm.dbg.value(metadata !{i32 %mul}, i64 0, metadata !11), !dbg !22 + %add = add nsw i32 %mul, 3, !dbg !23 + ret i32 %add, !dbg !23 +} + +; Function Attrs: nounwind readnone uwtable +define i32 @test2(i32 %x, i32 %y) #0 { +entry: + tail call void @llvm.dbg.value(metadata !{i32 %x}, i64 0, metadata !16), !dbg !24 + tail call void @llvm.dbg.value(metadata !{i32 %y}, i64 0, metadata !17), !dbg !24 + %call = tail call i32 @test2f(i32 %x), !dbg !25 + %add = add nsw i32 %call, %y, !dbg !25 + ret i32 %add, !dbg !25 +} + +; CHECK-LABEL: @test2f( +; CHECK: = shl i32 {{.*}}, 1{{$}} +; CHECK: = add nsw i32 {{.*}} 3, !dbg ! +; CHECK: ret i32 + +; CHECK-LABEL: @test2( + +; This instruction did not have a !dbg metadata in the callee. +; CHECK: = shl i32 {{.*}}, 1, !dbg [[B:!.*]] + +; This instruction came from the callee with a !dbg metadata. +; CHECK: = add nsw i32 {{.*}}, 3, !dbg [[C:!.*]] + +; These are the remaining instructions from the caller. +; CHECK: = add nsw i32 {{.*}}, {{.*}}, !dbg [[B]] +; CHECK: ret i32 {{.*}}, !dbg [[B]] + +; CHECK-DAG: [[C]] = metadata !{i32 4, i32 0, metadata !{{[01-9]+}}, metadata !{{[01-9]+}}} + + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.value(metadata, i64, metadata) #1 + +attributes #0 = { nounwind readnone 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" } +attributes #1 = { nounwind readnone } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!18, !19} +!llvm.ident = !{!20} + +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5.0 (210008)", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/code/llvm/build0/../2.cc] [DW_LANG_C_plus_plus] +!1 = metadata !{metadata !"../2.cc", metadata !"/code/llvm/build0"} +!2 = metadata !{} +!3 = metadata !{metadata !4, metadata !12} +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"test2f", metadata !"test2f", metadata !"", i32 2, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 (i32)* @test2f, null, null, metadata !9, i32 2} ; [ DW_TAG_subprogram ] [line 2] [def] [test2f] +!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/code/llvm/build0/../2.cc] +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = metadata !{metadata !8, metadata !8} +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = metadata !{metadata !10, metadata !11} +!10 = metadata !{i32 786689, metadata !4, metadata !"x", metadata !5, i32 16777218, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [x] [line 2] +!11 = metadata !{i32 786688, metadata !4, metadata !"x1", metadata !5, i32 3, metadata !8, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [x1] [line 3] +!12 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"test2", metadata !"test2", metadata !"", i32 7, metadata !13, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 (i32, i32)* @test2, null, null, metadata !15, i32 7} ; [ DW_TAG_subprogram ] [line 7] [def] [test2] +!13 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !14, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!14 = metadata !{metadata !8, metadata !8, metadata !8} +!15 = metadata !{metadata !16, metadata !17} +!16 = metadata !{i32 786689, metadata !12, metadata !"x", metadata !5, i32 16777223, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [x] [line 7] +!17 = metadata !{i32 786689, metadata !12, metadata !"y", metadata !5, i32 33554439, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [y] [line 7] +!18 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} +!19 = metadata !{i32 2, metadata !"Debug Info Version", i32 1} +!20 = metadata !{metadata !"clang version 3.5.0 (210008)"} +!21 = metadata !{i32 2, i32 0, metadata !4, null} +!22 = metadata !{i32 3, i32 0, metadata !4, null} +!23 = metadata !{i32 4, i32 0, metadata !4, null} +!24 = metadata !{i32 7, i32 0, metadata !12, null} +!25 = metadata !{i32 8, i32 0, metadata !12, null} ; [ DW_TAG_imported_declaration ]