Description
Minimum reproducer:
//@ run-pass
//! Test that item kind works as expected.
//@ ignore-stage1
//@ ignore-cross-compile
//@ ignore-remote
//@ edition: 2021
#![feature(rustc_private)]
#![feature(assert_matches)]
extern crate rustc_middle;
#[macro_use]
extern crate rustc_smir;
extern crate rustc_driver;
extern crate rustc_interface;
extern crate stable_mir;
use rustc_smir::rustc_internal;
use std::io::Write;
use std::ops::ControlFlow;
const CRATE_NAME: &str = "input";
/// This function uses the Stable MIR APIs to get information about the test crate.
fn test_item_kind() -> ControlFlow<()> {
let items = stable_mir::all_local_items();
// Constructor item.
for item in items {
let _ = item.kind();
}
ControlFlow::Continue(())
}
/// This test will generate and analyze a dummy crate using the stable mir.
/// For that, it will first write the dummy crate into a file.
/// Then it will create a `StableMir` using custom arguments and then
/// it will run the compiler.
fn main() {
let path = "item_kind_input.rs";
generate_input(&path).unwrap();
let args = vec![
"rustc".to_string(),
"-Cpanic=abort".to_string(),
"--crate-type=lib".to_string(),
"--crate-name".to_string(),
CRATE_NAME.to_string(),
path.to_string(),
];
run!(args, test_item_kind).unwrap();
}
fn generate_input(path: &str) -> std::io::Result<()> {
let mut file = std::fs::File::create(path)?;
write!(
file,
r##"
std::arch::global_asm!(r#"
.global my_noop
.text
my_noop:
ret
"#);
"##
)?;
Ok(())
}
[toolchain]
channel = "nightly-2025-03-02"
components = ["llvm-tools", "rustc-dev", "rust-src", "rustfmt"]
❯ cargo run
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/stable-mir-bug`
thread 'rustc' panicked at compiler/rustc_smir/src/rustc_smir/mod.rs:145:13:
internal error: entered unreachable code: Not a valid item kind: GlobalAsm
stack backtrace:
0: 0x11c029b50 - <std::sys::backtrace::BacktraceLock::print::DisplayBacktrace as core::fmt::Display>::fmt::h01f5e23dcfa2a90e
1: 0x118fcec23 - core::fmt::write::he4853cc08b80db6c
2: 0x11c01ddb2 - std::io::Write::write_fmt::h2d4ff1e93b93926d
3: 0x11c0299a2 - std::sys::backtrace::BacktraceLock::print::hc1c953a08614aca4
4: 0x11c02c520 - std::panicking::default_hook::{{closure}}::h29c83fe2f5c6f731
5: 0x11c02c124 - std::panicking::default_hook::h0666ac6f30006983
6: 0x11c02ce3e - std::panicking::rust_panic_with_hook::hc99d3b08a18f95f9
7: 0x11c02cb28 - std::panicking::begin_panic_handler::{{closure}}::h5b3ef507ee63af0e
8: 0x11c029ff9 - std::sys::backtrace::__rust_end_short_backtrace::h7b36728f4c4db291
9: 0x11c02c764 - _rust_begin_unwind
10: 0x11f353eaf - core::panicking::panic_fmt::he11055326097ecd8
11: 0x11b935943 - <rustc_smir[a1f7f53badb6847c]::rustc_smir::context::TablesWrapper as stable_mir[3c1241d0939fa9]::compiler_interface::Context>::item_kind
12: 0x10d6c9022 - stable_mir_bug::test_item_kind::hdc645e6427a486e8
at /Users/delmasrd/projects/stable-mir-bug/src/main.rs:30:18
13: 0x10d6c9afd - stable_mir_bug::main::{{closure}}::he4a8877abdbd151b
at /Users/delmasrd/.rustup/toolchains/nightly-2025-03-02-x86_64-apple-darwin/lib/rustlib/src/rust/compiler/rustc_smir/src/rustc_internal/mod.rs:279:31
14: 0x10d6c9ab1 - <stable_mir_bug::main::StableMir<B,C,F> as rustc_driver_impl::Callbacks>::after_analysis::{{closure}}::h866eb4518471c3f9
at /Users/delmasrd/.rustup/toolchains/nightly-2025-03-02-x86_64-apple-darwin/lib/rustlib/src/rust/compiler/rustc_smir/src/rustc_internal/mod.rs:386:44
15: 0x10d6c8351 - rustc_smir::rustc_internal::init::{{closure}}::h4473f79754c35572
at /Users/delmasrd/.rustup/toolchains/nightly-2025-03-02-x86_64-apple-darwin/lib/rustlib/src/rust/compiler/rustc_smir/src/rustc_internal/mod.rs:196:33
16: 0x10d6c6dcc - scoped_tls::ScopedKey<T>::set::h8a831d5ecd414d27
at /rust/deps/scoped-tls-1.0.1/src/lib.rs:137:9
17: 0x10d6c8303 - rustc_smir::rustc_internal::init::h14cea51accd9d4d8
at /Users/delmasrd/.rustup/toolchains/nightly-2025-03-02-x86_64-apple-darwin/lib/rustlib/src/rust/compiler/rustc_smir/src/rustc_internal/mod.rs:196:5
18: 0x10d6c8285 - rustc_smir::rustc_internal::run::{{closure}}::h50942426ffddc9c8
at /Users/delmasrd/.rustup/toolchains/nightly-2025-03-02-x86_64-apple-darwin/lib/rustlib/src/rust/compiler/rustc_smir/src/rustc_internal/mod.rs:227:53
19: 0x10d6c9d73 - stable_mir::compiler_interface::run::{{closure}}::h58b5e7ef6698d7d2
at /Users/delmasrd/.rustup/toolchains/nightly-2025-03-02-x86_64-apple-darwin/lib/rustlib/src/rust/compiler/stable_mir/src/compiler_interface.rs:268:40
20: 0x10d6c6e97 - scoped_tls::ScopedKey<T>::set::hc6f7b556f6350e22
at /rust/deps/scoped-tls-1.0.1/src/lib.rs:137:9
21: 0x10d6c9ceb - stable_mir::compiler_interface::run::h7c47e5f0420eaf0d
at /Users/delmasrd/.rustup/toolchains/nightly-2025-03-02-x86_64-apple-darwin/lib/rustlib/src/rust/compiler/stable_mir/src/compiler_interface.rs:268:9
22: 0x10d6c8212 - rustc_smir::rustc_internal::run::h3267ecc81af27e0b
at /Users/delmasrd/.rustup/toolchains/nightly-2025-03-02-x86_64-apple-darwin/lib/rustlib/src/rust/compiler/rustc_smir/src/rustc_internal/mod.rs:227:5
23: 0x10d6c99e4 - <stable_mir_bug::main::StableMir<B,C,F> as rustc_driver_impl::Callbacks>::after_analysis::h715cb9875dad65ee
at /Users/delmasrd/.rustup/toolchains/nightly-2025-03-02-x86_64-apple-darwin/lib/rustlib/src/rust/compiler/rustc_smir/src/rustc_internal/mod.rs:385:21
24: 0x119c3d3a7 - rustc_interface[12e2c5bb59b8f261]::passes::create_and_enter_global_ctxt::<core[e62a462baba2588e]::option::Option<rustc_interface[12e2c5bb59b8f261]::queries::Linker>, rustc_driver_impl[fa162f55ecd1d14e]::run_compiler::{closure#0}::{closure#2}>
25: 0x119c8ee38 - rustc_interface[12e2c5bb59b8f261]::interface::run_compiler::<(), rustc_driver_impl[fa162f55ecd1d14e]::run_compiler::{closure#0}>::{closure#1}
26: 0x119c7e80d - std[f99b8324fcf2a019]::sys::backtrace::__rust_begin_short_backtrace::<rustc_interface[12e2c5bb59b8f261]::util::run_in_thread_with_globals<rustc_interface[12e2c5bb59b8f261]::util::run_in_thread_pool_with_globals<rustc_interface[12e2c5bb59b8f261]::interface::run_compiler<(), rustc_driver_impl[fa162f55ecd1d14e]::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>
27: 0x119c9826d - <<std[f99b8324fcf2a019]::thread::Builder>::spawn_unchecked_<rustc_interface[12e2c5bb59b8f261]::util::run_in_thread_with_globals<rustc_interface[12e2c5bb59b8f261]::util::run_in_thread_pool_with_globals<rustc_interface[12e2c5bb59b8f261]::interface::run_compiler<(), rustc_driver_impl[fa162f55ecd1d14e]::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>::{closure#1} as core[e62a462baba2588e]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
28: 0x11c0387fb - std::sys::pal::unix::thread::Thread::new::thread_start::h703431e570bc9684
29: 0x7ff802bb3253 - __pthread_start
This is triggered from Kani, which uses stable MIR to load up a crate and find all MonoItems it contains to use them as entry points for analysis/GOTO codegen.
/// Collect all (top-level) items in the crate that matches the given predicate.
/// An item can only be a root if they are a non-generic function.
pub fn filter_crate_items<F>(tcx: TyCtxt, predicate: F) -> Vec<Instance>
where
F: Fn(TyCtxt, Instance) -> bool,
{
let crate_items = stable_mir::all_local_items();
// Filter regular items.
crate_items
.iter()
.filter_map(|item| {
// Only collect monomorphic items.
matches!(item.kind(), ItemKind::Fn) <<<<<<< Problem happens here
.then(|| {
Instance::try_from(*item)
.ok()
.and_then(|instance| predicate(tcx, instance).then_some(instance))
})
.flatten()
})
.collect::<Vec<_>>()
}
At the Kani level we don't need to surface a representation of the ASM code. Adding an ItemKind::GlobalAsm would be sufficient for Kani to introspect/filter the Items found in a crate.
Metadata
Metadata
Assignees
Labels
No labels