mirror of
https://github.com/rust-lang/rust.git
synced 2025-11-17 11:58:12 +00:00
Revert most of #133194 (except the test and the comment fixes). Then refix not emitting locations at all when the correct location discriminator value exceeds LLVM's capacity.
66 lines
2.2 KiB
Rust
66 lines
2.2 KiB
Rust
//! Regression test for <https://github.com/rust-lang/rust/issues/135332>.
|
|
//!
|
|
//! We can't simply drop debuginfo location spans when LLVM's location discriminator value limit is
|
|
//! reached. Otherwise, with `-Z verify-llvm-ir` and fat LTO, LLVM will report a broken module for
|
|
//!
|
|
//! ```text
|
|
//! inlinable function call in a function with debug info must have a !dbg location
|
|
//! ```
|
|
|
|
//@ ignore-cross-compile
|
|
//@ needs-dynamic-linking
|
|
//@ only-nightly (requires unstable rustc flag)
|
|
|
|
#![deny(warnings)]
|
|
|
|
use run_make_support::{dynamic_lib_name, rfs, rust_lib_name, rustc};
|
|
|
|
// Synthesize a function that will have a large (`n`) number of functions
|
|
// MIR-inlined into it. When combined with a proc-macro, all of these inline
|
|
// callsites will have the same span, forcing rustc to use the DWARF
|
|
// discriminator to distinguish between them. LLVM's capacity to store that
|
|
// discriminator is not infinite (currently it allocates 12 bits for a
|
|
// maximum value of 4096) so if this function gets big enough rustc's error
|
|
// handling path will be exercised.
|
|
fn generate_program(n: u32) -> String {
|
|
let mut program = String::from("pub type BigType = Vec<Vec<String>>;\n\n");
|
|
program.push_str("pub fn big_function() -> BigType {\n");
|
|
program.push_str(" vec![\n");
|
|
for i in 1..=n {
|
|
program.push_str(&format!("vec![\"string{}\".to_owned()],\n", i));
|
|
}
|
|
program.push_str(" ]\n");
|
|
program.push_str("}\n");
|
|
program
|
|
}
|
|
|
|
fn main() {
|
|
// The reported threshold is around 1366 (4096/3), but let's bump it to
|
|
// around 1500 to be less sensitive.
|
|
rfs::write("generated.rs", generate_program(1500));
|
|
|
|
rustc()
|
|
.input("proc.rs")
|
|
.crate_type("proc-macro")
|
|
.edition("2021")
|
|
.arg("-Cdebuginfo=line-tables-only")
|
|
.run();
|
|
rustc()
|
|
.extern_("proc", dynamic_lib_name("proc"))
|
|
.input("other.rs")
|
|
.crate_type("rlib")
|
|
.edition("2021")
|
|
.opt_level("3")
|
|
.arg("-Cdebuginfo=line-tables-only")
|
|
.run();
|
|
rustc()
|
|
.extern_("other", rust_lib_name("other"))
|
|
.input("main.rs")
|
|
.edition("2021")
|
|
.opt_level("3")
|
|
.arg("-Cdebuginfo=line-tables-only")
|
|
.arg("-Clto=fat")
|
|
.arg("-Zverify-llvm-ir")
|
|
.run();
|
|
}
|