Skip to content

MIR inlining causes incorrect line numbers for inlined code #103068

Closed
@wesleywiser

Description

@wesleywiser

The following program generates a backtrace with incorrect line numbers:

#[inline(always)]
fn foo() {
    bar();  // line 3
}

#[inline(never)]
fn bar() {
    panic!();  // line 8
}

fn main() {
    foo();  // line 12
}
$ rustc +nightly -g --crate-name mir_inlining -O mir_inlining.rs
$ RUST_BACKTRACE=1 ./mir_inlining
thread 'main' panicked at 'explicit panic', mir_inlining.rs:8:5
stack backtrace:
   0: std::panicking::begin_panic
             at /rustc/6b3ede3f7bc502eba7bbd202b4b9312d812adcd7/library/std/src/panicking.rs:607:12
   1: mir_inlining::bar
             at ./mir_inlining.rs:8:5
   2: mir_inlining::foo
             at ./mir_inlining.rs:12:5
   3: mir_inlining::main
             at ./mir_inlining.rs:12:5
   4: core::ops::function::FnOnce::call_once
             at /rustc/6b3ede3f7bc502eba7bbd202b4b9312d812adcd7/library/core/src/ops/function.rs:251:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

Notice that frames 2 and 3 both indicate they come from line 12 (frame 2 should be at line 3).

This seems to be a result of MIR inlining because the LLVM IR (pre LLVM optimization) has the same issue:

; mir_inlining::main
; Function Attrs: nonlazybind uwtable
define internal void @_ZN12mir_inlining4main17h04ea6567a81cf010E() unnamed_addr #0 !dbg !1610 {
start:
; call mir_inlining::bar
  call void @_ZN12mir_inlining3bar17hfea3a56d969a7806E(), !dbg !1611
  br label %bb1, !dbg !1611

bb1:                                              ; preds = %start
  ret void, !dbg !1614
}

!1611 = !DILocation(line: 12, column: 5, scope: !1612, inlinedAt: !1613)
!1613 = !DILocation(line: 12, column: 5, scope: !1610)

Meta

rustc --version --verbose:

rustc 1.66.0-nightly (6b3ede3f7 2022-10-13)
binary: rustc
commit-hash: 6b3ede3f7bc502eba7bbd202b4b9312d812adcd7
commit-date: 2022-10-13
host: x86_64-unknown-linux-gnu
release: 1.66.0-nightly
LLVM version: 15.0.2

Metadata

Metadata

Assignees

Labels

A-debuginfoArea: Debugging information in compiled programs (DWARF, PDB, etc.)A-mir-opt-inliningArea: MIR inliningC-bugCategory: This is a bug.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions