Closed
Description
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`.