llvm / llvm/llvm-project

[clang] Crash with `-fwasm-exceptions` when compiling for non-wasm target

Open
#195,428 0 comments 0 reactions 0 assignees View on GitHub
clang
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

Attempting to compile a trivial throwing code (attached) causes `clang++` to crash with the following error.

Error

```
fatal error: error in backend: Cannot select: intrinsic %llvm.wasm.catch
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0. Program arguments: clang++ -nostdlib -fwasm-exceptions -c a.cpp
1. parser at end of file
2. Code generation
3. Running pass 'Function Pass Manager' on module 'a.cpp'.
4. Running pass 'X86 DAG->DAG Instruction Selection' on function '@main'
#0 0x00007f3ceb756aed llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/Support/Unix/Signals.inc:842:22
#1 0x00007f3ceb7545c7 llvm::sys::RunSignalHandlers() /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/Support/Signals.cpp:108:20
#2 0x00007f3ceb7545c7 llvm::sys::CleanupOnSignal(unsigned long) /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/Support/Unix/Signals.inc:376:31
#3 0x00007f3ceb61cf4a HandleCrash /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/Support/CrashRecoveryContext.cpp:73:18
#4 0x00007f3ceb61cf4a llvm::CrashRecoveryContext::HandleExit(int) /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/Support/CrashRecoveryContext.cpp:444:20
#5 0x00007f3ceb74d556 llvm::sys::Process::ExitNoCleanup(int) /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/Support/Unix/Process.inc:433:62
#6 0x00007f3ceb74d556 llvm::sys::Process::Exit(int, bool) /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/Support/Process.cpp:115:18
#7 0x000055751dedfceb clang::DiagStorageAllocator::Deallocate(clang::DiagnosticStorage*) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/include/clang/Basic/Diagnostic.h:217:36
#8 0x000055751dedfceb clang::StreamingDiagnostic::freeStorageSlow() /usr/src/debug/clang/llvm-project-22.1.3.src/clang/include/clang/Basic/Diagnostic.h:1153:26
#9 0x000055751dedfceb clang::StreamingDiagnostic::freeStorage() /usr/src/debug/clang/llvm-project-22.1.3.src/clang/include/clang/Basic/Diagnostic.h:1147:20
#10 0x000055751dedfceb clang::StreamingDiagnostic::~StreamingDiagnostic() /usr/src/debug/clang/llvm-project-22.1.3.src/clang/include/clang/Basic/Diagnostic.h:1215:39
#11 0x000055751dedfceb clang::DiagnosticBuilder::~DiagnosticBuilder() /usr/src/debug/clang/llvm-project-22.1.3.src/clang/include/clang/Basic/Diagnostic.h:1330:34
#12 0x000055751dedfceb LLVMErrorHandler /usr/src/debug/clang/llvm-project-22.1.3.src/clang/tools/driver/cc1_main.cpp:73:15
#13 0x00007f3ceb63930e std::__cxx11::basic_string, std::allocator>::_M_data() const /usr/include/c++/15.2.1/bits/basic_string.h:239:28
#14 0x00007f3ceb63930e std::__cxx11::basic_string, std::allocator>::_M_is_local() const /usr/include/c++/15.2.1/bits/basic_string.h:280:13
#15 0x00007f3ceb63930e std::__cxx11::basic_string, std::allocator>::_M_dispose() /usr/include/c++/15.2.1/bits/basic_string.h:298:18
#16 0x00007f3ceb63930e std::__cxx11::basic_string, std::allocator>::~basic_string() /usr/include/c++/15.2.1/bits/basic_string.h:896:19
#17 0x00007f3ceb63930e llvm::report_fatal_error(llvm::Twine const&, bool) /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/Support/ErrorHandling.cpp:117:36
#18 0x00007f3cec4fbb8e llvm::SelectionDAGISel::CannotYetSelect(llvm::SDNode*) /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:4496:14
#19 0x00007f3cec4fdffb llvm::SelectionDAGISel::SelectCodeCommon(llvm::SDNode*, unsigned char const*, unsigned int) /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:4402:24
#20 0x00007f3cf05e0a18 llvm::TrackingMDRef::untrack() /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/include/llvm/IR/TrackingMDRef.h:89:9
#21 0x00007f3cf05e0a18 llvm::TrackingMDRef::~TrackingMDRef() /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/include/llvm/IR/TrackingMDRef.h:55:29
#22 0x00007f3cf05e0a18 llvm::TypedTrackingMDRef::~TypedTrackingMDRef() /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/include/llvm/IR/TrackingMDRef.h:106:26
#23 0x00007f3cf05e0a18 llvm::DebugLoc::~DebugLoc() /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/include/llvm/IR/DebugLoc.h:123:7
#24 0x00007f3cf05e0a18 llvm::SDLoc::~SDLoc() /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1236:7
#25 0x00007f3cf05e0a18 Select /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:6713:1
#26 0x00007f3cec4f6439 llvm::SelectionDAGISel::DoInstructionSelection() /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1303:28
#27 0x00007f3cec503c23 llvm::TimeRegion::~TimeRegion() /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/include/llvm/Support/Timer.h:167:9
#28 0x00007f3cec503c23 llvm::NamedRegionTimer::~NamedRegionTimer() /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/include/llvm/Support/Timer.h:175:8
#29 0x00007f3cec503c23 llvm::SelectionDAGISel::CodeGenAndEmitDAG() /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1142:3
#30 0x00007f3cec506f8a llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1872:11
#31 0x00007f3cec508980 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:635:22
#32 0x00007f3cec4f601b llvm::OptLevelChanger::~OptLevelChanger() /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:285:7
#33 0x00007f3cec4f601b llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:402:1
#34 0x00007f3cec4f601b llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:374:6
#35 0x00007f3cebd81d05 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/CodeGen/MachineFunctionPass.cpp:108:30
#36 0x00007f3ceb93e2d3 llvm::FPPassManager::runOnFunction(llvm::Function&) /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/IR/LegacyPassManager.cpp:1398:40
#37 0x00007f3ceb93e4b3 llvm::ilist_detail::node_base_prevnext, false>::getNext() const /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/include/llvm/ADT/ilist_node_base.h:28:38
#38 0x00007f3ceb93e4b3 llvm::ilist_node_impl>::getNext() /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/include/llvm/ADT/ilist_node.h:108:66
#39 0x00007f3ceb93e4b3 llvm::ilist_iterator, false, false>::operator++() /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/include/llvm/ADT/ilist_iterator.h:187:25
#40 0x00007f3ceb93e4b3 llvm::FPPassManager::runOnModule(llvm::Module&) /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/IR/LegacyPassManager.cpp:1443:22
#41 0x00007f3ceb93d762 runOnModule /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/IR/LegacyPassManager.cpp:1513:38
#42 0x00007f3ceb93d762 llvm::legacy::PassManagerImpl::run(llvm::Module&) /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/IR/LegacyPassManager.cpp:531:55
#43 0x00007f3cf717b78f RunCodegenPipeline /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/CodeGen/BackendUtil.cpp:1278:9
#44 0x00007f3cf717b78f emitAssembly /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/CodeGen/BackendUtil.cpp:1301:21
#45 0x00007f3cf717bd0d std::unique_ptr>::~unique_ptr() /usr/include/c++/15.2.1/bits/unique_ptr.h:397:2
#46 0x00007f3cf717bd0d clang::emitBackendOutput(clang::CompilerInstance&, clang::CodeGenOptions&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::IntrusiveRefCntPtr, std::unique_ptr>, clang::BackendConsumer*) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/CodeGen/BackendUtil.cpp:1473:25
#47 0x00007f3cf7584065 llvm::IntrusiveRefCntPtr::release() /usr/include/llvm/ADT/IntrusiveRefCntPtr.h:232:9
#48 0x00007f3cf7584065 llvm::IntrusiveRefCntPtr::~IntrusiveRefCntPtr() /usr/include/llvm/ADT/IntrusiveRefCntPtr.h:196:34
#49 0x00007f3cf7584065 clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/CodeGen/CodeGenAction.cpp:310:20
#50 0x00007f3cf58dadb4 clang::ParseAST(clang::Sema&, bool, bool) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Parse/ParseAST.cpp:183:34
#51 0x00007f3cf800d9ec clang::FrontendAction::Execute() /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Frontend/FrontendAction.cpp:1317:38
#52 0x00007f3cf7f7b901 llvm::Error::getPtr() const /usr/include/llvm/Support/Error.h:281:12
#53 0x00007f3cf7f7b901 llvm::Error::operator bool() /usr/include/llvm/Support/Error.h:241:22
#54 0x00007f3cf7f7b901 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Frontend/CompilerInstance.cpp:1006:42
#55 0x00007f3cf80c86b0 std::__shared_ptr::get() const /usr/include/c++/15.2.1/bits/shared_ptr_base.h:1673:16
#56 0x00007f3cf80c86b0 std::__shared_ptr_access::_M_get() const /usr/include/c++/15.2.1/bits/shared_ptr_base.h:1370:69
#57 0x00007f3cf80c86b0 std::__shared_ptr_access::operator*() const /usr/include/c++/15.2.1/bits/shared_ptr_base.h:1358:40
#58 0x00007f3cf80c86b0 clang::CompilerInvocation::getFrontendOpts() /usr/src/debug/clang/llvm-project-22.1.3.src/clang/include/clang/Frontend/CompilerInvocation.h:277:48
#59 0x00007f3cf80c86b0 clang::CompilerInstance::getFrontendOpts() /usr/src/debug/clang/llvm-project-22.1.3.src/clang/include/clang/Frontend/CompilerInstance.h:301:39
#60 0x00007f3cf80c86b0 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:311:29
#61 0x000055751dee2f98 cc1_main(llvm::ArrayRef, char const*, void*) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/tools/driver/cc1_main.cpp:304:40
#62 0x000055751ded98d1 ExecuteCC1Tool /usr/src/debug/clang/llvm-project-22.1.3.src/clang/tools/driver/driver.cpp:226:20
#63 0x000055751ded9a9c std::__atomic_base::fetch_sub(int, std::memory_order) /usr/include/c++/15.2.1/bits/atomic_base.h:641:34
#64 0x000055751ded9a9c llvm::ThreadSafeRefCountedBase::Release() const /usr/include/llvm/ADT/IntrusiveRefCntPtr.h:134:41
#65 0x000055751ded9a9c llvm::IntrusiveRefCntPtrInfo::release(llvm::vfs::FileSystem*) /usr/include/llvm/ADT/IntrusiveRefCntPtr.h:164:45
#66 0x000055751ded9a9c llvm::IntrusiveRefCntPtr::release() /usr/include/llvm/ADT/IntrusiveRefCntPtr.h:233:41
#67 0x000055751ded9a9c llvm::IntrusiveRefCntPtr::~IntrusiveRefCntPtr() /usr/include/llvm/ADT/IntrusiveRefCntPtr.h:196:34
#68 0x000055751ded9a9c operator() /usr/src/debug/clang/llvm-project-22.1.3.src/clang/tools/driver/driver.cpp:376:26
#69 0x000055751ded9a9c callback_fn&)> > /usr/include/llvm/ADT/STLFunctionalExtras.h:46:52
#70 0x00007f3cf7b20865 operator() /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Driver/Job.cpp:442:32
#71 0x00007f3cf7b20865 callback_fn >, std::string*, bool*) const:: > /usr/include/llvm/ADT/STLFunctionalExtras.h:46:52
#72 0x00007f3ceb61ce38 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref) /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/Support/CrashRecoveryContext.cpp:428:1
#73 0x00007f3cf7b212a5 clang::driver::CC1Command::Execute(llvm::ArrayRef>, std::__cxx11::basic_string, std::allocator>*, bool*) const /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Driver/Job.cpp:446:10
#74 0x00007f3cf7ad2eda clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Driver/Compilation.cpp:196:22
#75 0x00007f3cf7ad3e4c clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl>&, bool) const /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Driver/Compilation.cpp:246:5
#76 0x00007f3cf7aec916 llvm::SmallVectorBase::empty() const /usr/include/llvm/ADT/SmallVector.h:83:46
#77 0x00007f3cf7aec916 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl>&) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Driver/Driver.cpp:2265:28
#78 0x000055751dedec07 llvm::SmallVectorBase::size() const /usr/include/llvm/ADT/SmallVector.h:80:32
#79 0x000055751dedec07 llvm::SmallVectorTemplateCommon, void>::end() /usr/include/llvm/ADT/SmallVector.h:275:41
#80 0x000055751dedec07 clang_main(int, char**, llvm::ToolContext const&) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/tools/driver/driver.cpp:416:26
#81 0x000055751ded90c0 main /usr/src/debug/clang/llvm-project-22.1.3.src/clang/build/tools/driver/clang-driver.cpp:18:1
#82 0x00007f3cea6276c1 __libc_start_call_main /usr/src/debug/glibc/glibc/csu/../sysdeps/nptl/libc_start_call_main.h:83:3
#83 0x00007f3cea6277f9 call_init /usr/src/debug/glibc/glibc/csu/../csu/libc-start.c:128:20
#84 0x00007f3cea6277f9 __libc_start_main /usr/src/debug/glibc/glibc/csu/../csu/libc-start.c:347:5
#85 0x000055751ded9125 _start (/usr/bin/clang+++0xc125)
clang++: error: clang frontend command failed with exit code 70 (use -v to see invocation)
clang version 22.1.3
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
clang++: note: diagnostic msg:
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang++: note: diagnostic msg: /tmp/a-c909a8.cpp
clang++: note: diagnostic msg: /tmp/a-c909a8.sh
clang++: note: diagnostic msg:

********************
```

[a-c909a8.cpp](https://github.com/user-attachments/files/27298897/a-c909a8.cpp)
[a-c909a8.sh](https://github.com/user-attachments/files/27298898/a-c909a8.sh)

Contributor guide

Open the contributing guide

Research direction

Reproduce the crash with clang++ -nostdlib -fwasm-exceptions -c a.cpp using the reported throwing example. Start by tracing the X86 DAG instruction-selection path and handling of the llvm.wasm.catch intrinsic; done means compiling for a non-wasm target no longer crashes and reports an appropriate result.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp, wasm
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.