Skip to content

nightly: segfault with asm!() / #[naked] (possible LLVM 11 bug) #75922

Closed
@jgouly

Description

@jgouly

Compiling the following code with cargo build --release causes a (signal: 11, SIGSEGV: invalid memory reference) error.

Code

#![feature(asm)]
#![feature(naked_functions)]

#[inline(never)]
// Removing #[naked] allows this to compile.
#[naked]
fn bar(ptr: *mut u64) -> u64 {
  let v;
  unsafe {
    asm!(
     "mov {bar}, {foo}",
     foo = in(reg) *ptr,
     bar = out(reg) v,
    )
  }
  v
}

fn main() {
  bar(&mut 0);
}

It was introduced by:

$ rustc --version
rustc 1.47.0-nightly (5180f3da5 2020-08-23)

Using the previous nightly works:

$ rustc --version
rustc 1.47.0-nightly (663d2f5cd 2020-08-22)

Looking at 663d2f5...5180f3d, the biggest change I see is the upgrade to LLVM 11.

Backtrace

(gdb) bt
#0  0x00007ffff0ccb4ed in llvm::SelectionDAGBuilder::visitLoad(llvm::LoadInst const&) ()
   from /home/build/rust/rustup/toolchains/nightly-2020-08-24-x86_64-unknown-linux-gnu/bin/../lib/../lib/libLLVM-11-rust-1.47.0-nightly.so
#1  0x00007ffff0cc3637 in llvm::SelectionDAGBuilder::visit(llvm::Instruction const&) ()
   from /home/build/rust/rustup/toolchains/nightly-2020-08-24-x86_64-unknown-linux-gnu/bin/../lib/../lib/libLLVM-11-rust-1.47.0-nightly.so
#2  0x00007ffff0d8404e in llvm::SelectionDAGISel::SelectBasicBlock(llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, false, false, void>, false, true>, llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, false, false, void>, false, true>, bool&) ()
   from /home/build/rust/rustup/toolchains/nightly-2020-08-24-x86_64-unknown-linux-gnu/bin/../lib/../lib/libLLVM-11-rust-1.47.0-nightly.so
#3  0x00007ffff0d83667 in llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) ()
   from /home/build/rust/rustup/toolchains/nightly-2020-08-24-x86_64-unknown-linux-gnu/bin/../lib/../lib/libLLVM-11-rust-1.47.0-nightly.so
#4  0x00007ffff0d80342 in llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) ()
   from /home/build/rust/rustup/toolchains/nightly-2020-08-24-x86_64-unknown-linux-gnu/bin/../lib/../lib/libLLVM-11-rust-1.47.0-nightly.so
#5  0x00007ffff2b1de87 in (anonymous namespace)::X86DAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&)
    ()
   from /home/build/rust/rustup/toolchains/nightly-2020-08-24-x86_64-unknown-linux-gnu/bin/../lib/../lib/libLLVM-11-rust-1.47.0-nightly.so
#6  0x00007ffff08db6ae in llvm::MachineFunctionPass::runOnFunction(llvm::Function&) ()
   from /home/build/rust/rustup/toolchains/nightly-2020-08-24-x86_64-unknown-linux-gnu/bin/../lib/../lib/libLLVM-11-rust-1.47.0-nightly.so
#7  0x00007ffff06b1002 in llvm::FPPassManager::runOnFunction(llvm::Function&) ()
   from /home/build/rust/rustup/toolchains/nightly-2020-08-24-x86_64-unknown-linux-gnu/bin/../lib/../lib/libLLVM-11-rust-1.47.0-nightly.so

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-nakedArea: `#[naked]`, prologue and epilogue-free, functions, https://git.io/vAzzSC-bugCategory: This is a bug.F-asm`#![feature(asm)]` (not `llvm_asm`)I-crashIssue: The compiler crashes (SIGSEGV, SIGABRT, etc). Use I-ICE instead when the compiler panics.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.requires-nightlyThis issue requires a nightly compiler in some way.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions