Skip to content

Compiler crashes when using object instead of reference to object for input to inline assembly #40885

Closed
@SKTech8462

Description

@SKTech8462

Compiler crashes when using object instead of reference to object for input to inline assembly

Ran into this while trying to use Intel's lidt instruction. It takes a single operand (the address to a structure in memory containing the size and location of your new Interrupt Descriptor Table) and loads the new IDT. I had mistakenly given the struct object as an input instead of a reference to the struct object and compiling that inline asm statement caused the compiler to crash.

Here's the code with the asm! line that crashed the compiler:

unsafe fn load(&self) {
    let idtr = IDTR { size: (41*16)-1, offset: ((self as *const IDT) as u64) };
    asm!("lidt ($0)" :: "r"(idtr) : "memory");
  }

Here's the fixed code that works:

unsafe fn load(&self) {
    let idtr = IDTR { size: (41*16)-1, offset: ((self as *const IDT) as u64) };
    asm!("lidt ($0)" :: "r"(&idtr) : "memory");
  }

Here's the error I got:

error: internal compiler error: /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_trans/mir/operand.rs:83: not immediate: OperandRef(Pair((i16:  %8 = load i16, i16* %6, !dbg !45), (i64:  %9 = load i64, i64* %7, !dbg !45)) @ IDTR)

note: the compiler unexpectedly panicked. this is a bug.

Here's the backtrace:

thread 'rustc' panicked at 'Box<Any>', /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_errors/lib.rs:423
stack backtrace:
   1:     0x7f123b601fbc - std::sys::imp::backtrace::tracing::imp::write::h9c41d2f69e5caabf
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/sys/unix/backtrace/tracing/gcc_s.rs:42
   2:     0x7f123b61043e - std::panicking::default_hook::{{closure}}::h1f61f3c769fffe7a
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/panicking.rs:351
   3:     0x7f123b60ffe3 - std::panicking::default_hook::hd5bda4e453dfb4be
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/panicking.rs:361
   4:     0x7f123b6108db - std::panicking::rust_panic_with_hook::hffbc74969c7b5d87
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/panicking.rs:555
   5:     0x7f1233c819fa - std::panicking::begin_panic::h74ad4f050841c998
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/panicking.rs:517
   6:     0x7f1233c968bd - rustc_errors::Handler::bug::h7088c6afc4a008fb
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_errors/lib.rs:423
   7:     0x7f1238987091 - rustc::session::opt_span_bug_fmt::{{closure}}::h8e30a0fda5e6d8ea
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc/session/mod.rs:788
   8:     0x7f1238986eae - rustc::session::opt_span_bug_fmt::h4fd6d943719c63ae
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc/ty/context.rs:1003
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc/session/mod.rs:784
   9:     0x7f1238986b12 - rustc::session::bug_fmt::he01375c3004c5cfe
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc/session/mod.rs:768
  10:     0x7f123ad4e429 - rustc_trans::mir::rvalue::<impl rustc_trans::mir::MirContext<'a, 'tcx>>::trans_rvalue::h7dc15384ecc85210
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_trans/mir/operand.rs:83
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_trans/mir/rvalue.rs:162
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libcore/ops.rs:2706
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libcore/option.rs:383
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libcore/iter/mod.rs:999
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libcollections/vec.rs:1655
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libcollections/vec.rs:1638
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libcollections/vec.rs:1525
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libcore/iter/iterator.rs:1218
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_trans/mir/rvalue.rs:161
  11:     0x7f123ad3a16d - rustc_trans::mir::block::<impl rustc_trans::mir::MirContext<'a, 'tcx>>::trans_block::h31596f784d651219
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_trans/mir/statement.rs:35
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_trans/mir/block.rs:109
  12:     0x7f123ad37cf1 - rustc_trans::mir::trans_mir::h7e5fc59940d6977e
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_trans/mir/mod.rs:337
  13:     0x7f123ad58d77 - rustc_trans::trans_item::TransItem::define::h929f421e720c71df
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_trans/base.rs:596
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_trans/trans_item.rs:88
  14:     0x7f123acdbfcc - rustc_trans::base::trans_crate::h496d157cb52a4b02
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_trans/base.rs:1218
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc/dep_graph/graph.rs:83
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_trans/base.rs:1216
  15:     0x7f123b9c0ffd - rustc_driver::driver::phase_4_translate_to_llvm::h106eb073675c3bee
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_driver/driver.rs:1046
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc/util/common.rs:48
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_driver/driver.rs:1044
  16:     0x7f123b990bad - rustc_driver::driver::compile_input::{{closure}}::hf0a8bd39d338ce94
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_driver/driver.rs:200
  17:     0x7f123b9b4e35 - rustc_driver::driver::phase_3_run_analysis_passes::{{closure}}::haccf5097991f72ff
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_driver/driver.rs:992
  18:     0x7f123b9a44dc - rustc_driver::driver::phase_3_run_analysis_passes::hc8affcb7a7c3c449
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc/ty/context.rs:974
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/thread/local.rs:253
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc/ty/context.rs:971
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc/ty/context.rs:958
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/thread/local.rs:253
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc/ty/context.rs:955
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc/ty/context.rs:733
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_driver/driver.rs:867
  19:     0x7f123b98ebd6 - rustc_driver::driver::compile_input::h44853ffed84a12cb
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_driver/driver.rs:166
  20:     0x7f123b9d5558 - rustc_driver::run_compiler::hdc4bb0fcf7d0917a
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_driver/lib.rs:221
  21:     0x7f123b8e2948 - std::panicking::try::do_call::ha583797d32a865bd
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_driver/lib.rs:1119
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_driver/lib.rs:137
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/librustc_driver/lib.rs:1053
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/panic.rs:296
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/panicking.rs:460
  22:     0x7f123b61975a - __rust_maybe_catch_panic
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libpanic_unwind/lib.rs:98
  23:     0x7f123b90be1b - <F as alloc::boxed::FnBox<A>>::call_box::h6903719257a678be
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/panicking.rs:436
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/panic.rs:361
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/thread/mod.rs:357
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/liballoc/boxed.rs:605
  24:     0x7f123b60f294 - std::sys::imp::thread::Thread::new::thread_start::h76badbf9b0ecaf58
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/liballoc/boxed.rs:615
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/sys_common/thread.rs:21
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/sys/unix/thread.rs:84
  25:     0x7f123342d0a3 - start_thread
  26:     0x7f123b2c662c - clone
  27:                0x0 - <unknown>

error: Could not compile `interrupt_handler`.

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-inline-assemblyArea: Inline assembly (`asm!(…)`)C-bugCategory: This is a bug.I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions