c3c icon indicating copy to clipboard operation
c3c copied to clipboard

Compiler segfault when compiling `@naked` function with optional return at `-O1` and above

Open Book-reader opened this issue 10 months ago • 2 comments

fn int main()
{
  (void)test();
  return 0;
}

fn int! test() @naked
{
  return 123;
}

Book-reader avatar Feb 11 '25 19:02 Book-reader

valgrind logs because I was on my phone when I wrote this:

==183562== Thread 5:
==183562== Conditional jump or move depends on uninitialised value(s)
==183562==    at 0x152002F: std::__detail::__variant::__gen_vtable_impl<true, std::__detail::__variant::_Multi_array<void (*)(llvm::DwarfCompileUnit::constructVariableDIE(llvm::DbgVariable&, bool)::$_0&&, std::variant<std::monostate, llvm::Loc::Single, llvm::Loc::Multi, llvm::Loc::MMI, llvm::Loc::EntryValue>&)>, std::tuple<std::variant<std::monostate, llvm::Loc::Single, llvm::Loc::Multi, llvm::Loc::MMI, llvm::Loc::EntryValue>&>, std::integer_sequence<unsigned long, 2ul> >::__visit_invoke(llvm::DwarfCompileUnit::constructVariableDIE(llvm::DbgVariable&, bool)::$_0&&, std::variant<std::monostate, llvm::Loc::Single, llvm::Loc::Multi, llvm::Loc::MMI, llvm::Loc::EntryValue>&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x151C818: llvm::DwarfCompileUnit::constructVariableDIE(llvm::DbgVariable&, bool) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x151B4D1: llvm::DwarfCompileUnit::createAndAddScopeChildren(llvm::LexicalScope*, llvm::DIE&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x151D7AB: llvm::DwarfCompileUnit::constructSubprogramScopeDIE(llvm::DISubprogram const*, llvm::LexicalScope*) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x14C0A9E: llvm::DwarfDebug::endFunctionImpl(llvm::MachineFunction const*) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x151464F: llvm::DebugHandlerBase::endFunction(llvm::MachineFunction const*) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x149C3AB: llvm::AsmPrinter::emitFunctionBody() (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0xED38EF: llvm::X86AsmPrinter::runOnMachineFunction(llvm::MachineFunction&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x2C406B3: llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x162B35E: llvm::FPPassManager::runOnFunction(llvm::Function&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x1630C52: llvm::FPPassManager::runOnModule(llvm::Module&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x162BA53: llvm::legacy::PassManagerImpl::run(llvm::Module&) (in /var/home/user/git/c3c/bin/c3c)
==183562==
==183562== Conditional jump or move depends on uninitialised value(s)
==183562==    at 0x152002F: std::__detail::__variant::__gen_vtable_impl<true, std::__detail::__variant::_Multi_array<void (*)(llvm::DwarfCompileUnit::constructVariableDIE(llvm::DbgVariable&, bool)::$_0&&, std::variant<std::monostate, llvm::Loc::Single, llvm::Loc::Multi, llvm::Loc::MMI, llvm::Loc::EntryValue>&)>, std::tuple<std::variant<std::monostate, llvm::Loc::Single, llvm::Loc::Multi, llvm::Loc::MMI, llvm::Loc::EntryValue>&>, std::integer_sequence<unsigned long, 2ul> >::__visit_invoke(llvm::DwarfCompileUnit::constructVariableDIE(llvm::DbgVariable&, bool)::$_0&&, std::variant<std::monostate, llvm::Loc::Single, llvm::Loc::Multi, llvm::Loc::MMI, llvm::Loc::EntryValue>&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x151C818: llvm::DwarfCompileUnit::constructVariableDIE(llvm::DbgVariable&, bool) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x151BEF7: llvm::DwarfCompileUnit::createAndAddScopeChildren(llvm::LexicalScope*, llvm::DIE&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x151C08F: llvm::DwarfCompileUnit::createAndAddScopeChildren(llvm::LexicalScope*, llvm::DIE&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x151C186: llvm::DwarfCompileUnit::createAndAddScopeChildren(llvm::LexicalScope*, llvm::DIE&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x151D7AB: llvm::DwarfCompileUnit::constructSubprogramScopeDIE(llvm::DISubprogram const*, llvm::LexicalScope*) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x14C0A9E: llvm::DwarfDebug::endFunctionImpl(llvm::MachineFunction const*) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x151464F: llvm::DebugHandlerBase::endFunction(llvm::MachineFunction const*) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x149C3AB: llvm::AsmPrinter::emitFunctionBody() (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0xED38EF: llvm::X86AsmPrinter::runOnMachineFunction(llvm::MachineFunction&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x2C406B3: llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x162B35E: llvm::FPPassManager::runOnFunction(llvm::Function&) (in /var/home/user/git/c3c/bin/c3c)
==183562==
==183562== Conditional jump or move depends on uninitialised value(s)
==183562==    at 0x152002F: std::__detail::__variant::__gen_vtable_impl<true, std::__detail::__variant::_Multi_array<void (*)(llvm::DwarfCompileUnit::constructVariableDIE(llvm::DbgVariable&, bool)::$_0&&, std::variant<std::monostate, llvm::Loc::Single, llvm::Loc::Multi, llvm::Loc::MMI, llvm::Loc::EntryValue>&)>, std::tuple<std::variant<std::monostate, llvm::Loc::Single, llvm::Loc::Multi, llvm::Loc::MMI, llvm::Loc::EntryValue>&>, std::integer_sequence<unsigned long, 2ul> >::__visit_invoke(llvm::DwarfCompileUnit::constructVariableDIE(llvm::DbgVariable&, bool)::$_0&&, std::variant<std::monostate, llvm::Loc::Single, llvm::Loc::Multi, llvm::Loc::MMI, llvm::Loc::EntryValue>&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x151C818: llvm::DwarfCompileUnit::constructVariableDIE(llvm::DbgVariable&, bool) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x151B4D1: llvm::DwarfCompileUnit::createAndAddScopeChildren(llvm::LexicalScope*, llvm::DIE&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x151C08F: llvm::DwarfCompileUnit::createAndAddScopeChildren(llvm::LexicalScope*, llvm::DIE&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x151D7AB: llvm::DwarfCompileUnit::constructSubprogramScopeDIE(llvm::DISubprogram const*, llvm::LexicalScope*) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x14C0A9E: llvm::DwarfDebug::endFunctionImpl(llvm::MachineFunction const*) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x151464F: llvm::DebugHandlerBase::endFunction(llvm::MachineFunction const*) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x149C3AB: llvm::AsmPrinter::emitFunctionBody() (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0xED38EF: llvm::X86AsmPrinter::runOnMachineFunction(llvm::MachineFunction&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x2C406B3: llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x162B35E: llvm::FPPassManager::runOnFunction(llvm::Function&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x1630C52: llvm::FPPassManager::runOnModule(llvm::Module&) (in /var/home/user/git/c3c/bin/c3c)
==183562==
==183562== Conditional jump or move depends on uninitialised value(s)
==183562==    at 0x152002F: std::__detail::__variant::__gen_vtable_impl<true, std::__detail::__variant::_Multi_array<void (*)(llvm::DwarfCompileUnit::constructVariableDIE(llvm::DbgVariable&, bool)::$_0&&, std::variant<std::monostate, llvm::Loc::Single, llvm::Loc::Multi, llvm::Loc::MMI, llvm::Loc::EntryValue>&)>, std::tuple<std::variant<std::monostate, llvm::Loc::Single, llvm::Loc::Multi, llvm::Loc::MMI, llvm::Loc::EntryValue>&>, std::integer_sequence<unsigned long, 2ul> >::__visit_invoke(llvm::DwarfCompileUnit::constructVariableDIE(llvm::DbgVariable&, bool)::$_0&&, std::variant<std::monostate, llvm::Loc::Single, llvm::Loc::Multi, llvm::Loc::MMI, llvm::Loc::EntryValue>&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x151C818: llvm::DwarfCompileUnit::constructVariableDIE(llvm::DbgVariable&, bool) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x151BEF7: llvm::DwarfCompileUnit::createAndAddScopeChildren(llvm::LexicalScope*, llvm::DIE&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x151D7AB: llvm::DwarfCompileUnit::constructSubprogramScopeDIE(llvm::DISubprogram const*, llvm::LexicalScope*) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x14C0A9E: llvm::DwarfDebug::endFunctionImpl(llvm::MachineFunction const*) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x151464F: llvm::DebugHandlerBase::endFunction(llvm::MachineFunction const*) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x149C3AB: llvm::AsmPrinter::emitFunctionBody() (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0xED38EF: llvm::X86AsmPrinter::runOnMachineFunction(llvm::MachineFunction&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x2C406B3: llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x162B35E: llvm::FPPassManager::runOnFunction(llvm::Function&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x1630C52: llvm::FPPassManager::runOnModule(llvm::Module&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x162BA53: llvm::legacy::PassManagerImpl::run(llvm::Module&) (in /var/home/user/git/c3c/bin/c3c)
==183562==
==183562== Thread 7:
==183562== Conditional jump or move depends on uninitialised value(s)
==183562==    at 0x1019212: llvm::APInt::setLowBits(unsigned int) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x143C649: computeKnownBits(llvm::Value const*, llvm::APInt const&, llvm::KnownBits&, unsigned int, llvm::SimplifyQuery const&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x143C7CB: llvm::computeKnownBits(llvm::Value const*, llvm::KnownBits&, llvm::DataLayout const&, unsigned int, llvm::AssumptionCache*, llvm::Instruction const*, llvm::DominatorTree const*, bool) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x26F0FF5: llvm::SelectionDAG::InferPtrAlign(llvm::SDValue) const (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x25CD0E1: (anonymous namespace)::DAGCombiner::visitLOAD(llvm::SDNode*) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x259B0D0: (anonymous namespace)::DAGCombiner::combine(llvm::SDNode*) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x2598DC1: llvm::SelectionDAG::Combine(llvm::CombineLevel, llvm::AAResults*, llvm::CodeGenOptLevel) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x270169A: llvm::SelectionDAGISel::CodeGenAndEmitDAG() (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x2700851: llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x26FEA0D: llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0xF8319E: (anonymous namespace)::X86DAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x2C406B3: llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (in /var/home/user/git/c3c/bin/c3c)
==183562==
==183562== Thread 2:
==183562== Invalid read of size 1
==183562==    at 0x26D68E7: llvm::SelectionDAG::getMemBasePlusOffset(llvm::SDValue, llvm::TypeSize, llvm::SDLoc const&, llvm::SDNodeFlags) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x2675637: llvm::SelectionDAGBuilder::visitStore(llvm::StoreInst const&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x266F331: llvm::SelectionDAGBuilder::visit(llvm::Instruction const&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x27010F5: llvm::SelectionDAGISel::SelectBasicBlock(llvm::ilist_iterator_w_bits<llvm::ilist_detail::node_options<llvm::Instruction, false, false, void, true>, false, true>, llvm::ilist_iterator_w_bits<llvm::ilist_detail::node_options<llvm::Instruction, false, false, void, true>, false, true>, bool&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x2700851: llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x26FEA0D: llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0xF8319E: (anonymous namespace)::X86DAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x2C406B3: llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x162B35E: llvm::FPPassManager::runOnFunction(llvm::Function&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x1630C52: llvm::FPPassManager::runOnModule(llvm::Module&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x162BA53: llvm::legacy::PassManagerImpl::run(llvm::Module&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x186BBE4: LLVMTargetMachineEmit(LLVMOpaqueTargetMachine*, LLVMOpaqueModule*, llvm::raw_pwrite_stream&, LLVMCodeGenFileType, char**) (in /var/home/user/git/c3c/bin/c3c)
==183562==  Address 0x4e73b5b30 is not stack'd, malloc'd or (recently) free'd
==183562==
==183562==
==183562== Process terminating with default action of signal 11 (SIGSEGV): dumping core
==183562==  Access not within mapped region at address 0x4E73B5B30
==183562==    at 0x26D68E7: llvm::SelectionDAG::getMemBasePlusOffset(llvm::SDValue, llvm::TypeSize, llvm::SDLoc const&, llvm::SDNodeFlags) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x2675637: llvm::SelectionDAGBuilder::visitStore(llvm::StoreInst const&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x266F331: llvm::SelectionDAGBuilder::visit(llvm::Instruction const&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x27010F5: llvm::SelectionDAGISel::SelectBasicBlock(llvm::ilist_iterator_w_bits<llvm::ilist_detail::node_options<llvm::Instruction, false, false, void, true>, false, true>, llvm::ilist_iterator_w_bits<llvm::ilist_detail::node_options<llvm::Instruction, false, false, void, true>, false, true>, bool&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x2700851: llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x26FEA0D: llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0xF8319E: (anonymous namespace)::X86DAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x2C406B3: llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x162B35E: llvm::FPPassManager::runOnFunction(llvm::Function&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x1630C52: llvm::FPPassManager::runOnModule(llvm::Module&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x162BA53: llvm::legacy::PassManagerImpl::run(llvm::Module&) (in /var/home/user/git/c3c/bin/c3c)
==183562==    by 0x186BBE4: LLVMTargetMachineEmit(LLVMOpaqueTargetMachine*, LLVMOpaqueModule*, llvm::raw_pwrite_stream&, LLVMCodeGenFileType, char**) (in /var/home/user/git/c3c/bin/c3c)
==183562==  If you believe this happened as a result of a stack
==183562==  overflow in your program's main thread (unlikely but
==183562==  possible), you can try to increase the size of the
==183562==  main thread stack using the --main-stacksize= flag.
==183562==  The main thread stack size used in this run was 8388608.

this doesn't seem very helpful, but maybe you can figure out what it means

Book-reader avatar Feb 12 '25 21:02 Book-reader

As mentioned in #1955 this should not even be allowed under the current rules. So we'll see what will happen with it.

lerno avatar Feb 12 '25 22:02 lerno

The return is not allowed, but see if you can reproduce something similar now.

lerno avatar Jul 29 '25 19:07 lerno