Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Panic in item.kind() when the underlying item kind is GlobalAsm #95

Open
remi-delmas-3000 opened this issue Mar 4, 2025 · 0 comments · May be fixed by rust-lang/rust#138025
Open

Panic in item.kind() when the underlying item kind is GlobalAsm #95

remi-delmas-3000 opened this issue Mar 4, 2025 · 0 comments · May be fixed by rust-lang/rust#138025

Comments

@remi-delmas-3000
Copy link

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant