Skip to content

wasm-ld crash related to exceptions and LTO #14776

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
gl84 opened this issue Jul 28, 2021 · 5 comments
Closed

wasm-ld crash related to exceptions and LTO #14776

gl84 opened this issue Jul 28, 2021 · 5 comments

Comments

@gl84
Copy link
Contributor

gl84 commented Jul 28, 2021

While preparing tests over a custom libpng build I encountered a wasm-ld crash that is triggered through the wasm-ld flags
-mllvm -enable-emscripten-cxx-exceptions -mllvm -enable-emscripten-sjlj:

It seems a recent change creates a crash in wasm-ld (37bf094 works).

@aheejin Do you have an idea?

The stacktrace and invocation is:
wasm-ld: /b/s/w/ir/cache/builder/emscripten-releases/llvm-project/llvm/include/llvm/IR/Instructions.h:2784: llvm::Value *llvm::PHINode::getIncomingValueForBlock(const llvm::BasicBlock *) const: AssertionIdx >= 0 && "Invalid basic block argument!"' failed.
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace.
Stack dump:
0. Program arguments: /emsdk/upstream/bin/wasm-ld -o catch2_test.wasm test/libcatch2_font_library_main.bc /png/wasm_32/install/lib/libpng.bc -L/emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten -mllvm -enable-emscripten-cxx-exceptions -mllvm -enable-emscripten-sjlj --import-undefined --export-if-defined=png_destroy_read_struct --export-table -z stack-size=5242880 --initial-memory=16777216 --no-entry --max-memory=16777216 --global-base=1024
1 . Running pass 'Function Pass Manager' on module 'ld-temp.o'.
2 . Running pass 'WebAssembly Instruction Selection' on function '@_ZN5Catch5clara8TextFlowlsERNSt3__213basic_ostreamIcNS2_11char_traitsIcEEEERKNS1_6ColumnE'
#0 0x00007f6d79c931a3 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/emsdk/upstream/bin/../lib/libLLVM-13git.so+0x19471a3)
#1 0x00007f6d79c90f4e llvm::sys::RunSignalHandlers() (/emsdk/upstream/bin/../lib/libLLVM-13git.so+0x1944f4e)
#2 0x00007f6d79c9366f SignalHandler(int) Signals.cpp:0:0
#3 0x00007f6d7c2d53c0 __restore_rt (/usr/lib/x86_64-linux-gnu/libpthread.so.0+0x153c0)
#4 0x00007f6d7803618b raise (/usr/lib/x86_64-linux-gnu/libc.so.6+0x4618b)
#5 0x00007f6d78015859 abort (/usr/lib/x86_64-linux-gnu/libc.so.6+0x25859)
#6 0x00007f6d78015729 (/usr/lib/x86_64-linux-gnu/libc.so.6+0x25729)
#7 0x00007f6d78026f36 (/usr/lib/x86_64-linux-gnu/libc.so.6+0x36f36)
#8 0x00007f6d7a55a788 llvm::SelectionDAGBuilder::HandlePHINodesInSuccessorBlocks(llvm::BasicBlock const*) (/emsdk/upstream/bin/../lib/libLLVM-13git.so+0x220e788)
#9 0x00007f6d7a559d44 llvm::SelectionDAGBuilder::visit(llvm::Instruction const&) (/emsdk/upstream/bin/../lib/libLLVM-13git.so+0x220dd44)
#10 0x00007f6d7a5f9aa0 llvm::SelectionDAGISel::SelectBasicBlock(llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, true, false, void>, false, true>, llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, true, false, void>, false, true>, bool&) (/emsdk/upstream/bin/../lib/libLLVM-13git.so+0x22adaa0)
#11 0x00007f6d7a5f8f1d llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/emsdk/upstream/bin/../lib/libLLVM-13git.so+0x22acf1d)
#12 0x00007f6d7a5f5751 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (/emsdk/upstream/bin/../lib/libLLVM-13git.so+0x22a9751)
#13 0x00007f6d7a0ce10d llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/emsdk/upstream/bin/../lib/libLLVM-13git.so+0x1d8210d)
#14 0x00007f6d79e0fcd8 llvm::FPPassManager::runOnFunction(llvm::Function&) (/emsdk/upstream/bin/../lib/libLLVM-13git.so+0x1ac3cd8)
#15 0x00007f6d79e180b1 llvm::FPPassManager::runOnModule(llvm::Module&) (/emsdk/upstream/bin/../lib/libLLVM-13git.so+0x1acc0b1)
#16 0x00007f6d79e107eb llvm::legacy::PassManagerImpl::run(llvm::Module&) (/emsdk/upstream/bin/../lib/libLLVM-13git.so+0x1ac47eb)
#17 0x00007f6d7b4f50a6 codegen(llvm::lto::Config const&, llvm::TargetMachine*, std::function<std::unique_ptr<llvm::lto::NativeObjectStream, std::default_deletellvm::lto::NativeObjectStream > (unsigned int)>, unsigned int, llvm::Module&, llvm::ModuleSummaryIndex const&) LTOBackend.cpp:0:0
#18 0x00007f6d7b4f4562 llvm::lto::backend(llvm::lto::Config const&, std::function<std::unique_ptr<llvm::lto::NativeObjectStream, std::default_deletellvm::lto::NativeObjectStream > (unsigned int)>, unsigned int, llvm::Module&, llvm::ModuleSummaryIndex&) (/emsdk/upstream/bin/../lib/libLLVM-13git.so+0x31a8562)
#19 0x00007f6d7b4e8546 llvm::lto::LTO::runRegularLTO(std::function<std::unique_ptr<llvm::lto::NativeObjectStream, std::default_deletellvm::lto::NativeObjectStream > (unsigned int)>) (/emsdk/upstream/bin/../lib/libLLVM-13git.so+0x319c546)
#20 0x00007f6d7b4e7c12 llvm::lto::LTO::run(std::function<std::unique_ptr<llvm::lto::NativeObjectStream, std::default_deletellvm::lto::NativeObjectStream > (unsigned int)>, std::function<std::function<std::unique_ptr<llvm::lto::NativeObjectStream, std::default_deletellvm::lto::NativeObjectStream > (unsigned int)> (unsigned int, llvm::StringRef)>) (/emsdk/upstream/bin/../lib/libLLVM-13git.so+0x319bc12)
#21 0x0000000000765496 lld::wasm::BitcodeCompiler::compile() (/emsdk/upstream/bin/wasm-ld+0x765496)
#22 0x0000000000767189 lld::wasm::SymbolTable::addCombinedLTOObject() (/emsdk/upstream/bin/wasm-ld+0x767189)
#23 0x00000000007508ee lld::wasm::(anonymous namespace)::LinkerDriver::linkerMain(llvm::ArrayRef<char const*>) Driver.cpp:0:0
#24 0x000000000074b4ba lld::wasm::link(llvm::ArrayRef<char const*>, bool, llvm::raw_ostream&, llvm::raw_ostream&) (/emsdk/upstream/bin/wasm-ld+0x74b4ba)
#25 0x00000000003d545e lldMain(int, char const**, llvm::raw_ostream&, llvm::raw_ostream&, bool) lld.cpp:0:0
#26 0x00000000003d4ff3 main (/emsdk/upstream/bin/wasm-ld+0x3d4ff3)
#27 0x00007f6d780170b3 __libc_start_main (/usr/lib/x86_64-linux-gnu/libc.so.6+0x270b3)
#28 0x00000000003d4cda _start (/emsdk/upstream/bin/wasm-ld+0x3d4cda)
Aborted (core dumped)
`

The wasm-ld call that produced the crash
/emsdk/upstream/bin/wasm-ld -o catch2_test.wasm catch2_main.bc /png/wasm_32/install/lib/libpng.bc -L/emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten -mllvm -enable-emscripten-cxx-exceptions -mllvm -enable-emscripten-sjlj --import-undefined --export-if-defined=png_destroy_read_struct --export-table -z stack-size=5242880 --initial-memory=16777216 --no-entry --max-memory=16777216 --global-base=1024

I'm trying to create a source only repro case.

@gl84
Copy link
Contributor Author

gl84 commented Jul 28, 2021

Additional info: The crash does not occur in release 2.0.26

@aheejin
Copy link
Member

aheejin commented Jul 28, 2021

Hmm, I don't have a clue looking the stack trace. If you have a repro I'd appreciate that, even if it doesn't crash with the latest release, because it might be a real bug and other changes in 2.0.26 can mask it.

@gl84
Copy link
Contributor Author

gl84 commented Jul 29, 2021

Sure, I'll try to create something reproducible but sadly not before next week. I don't have access to my computer atm.

Are bitcode files ok?

Your help is highly appreciated!

@aheejin
Copy link
Member

aheejin commented Jul 29, 2021

Yes, anything that I can reproduce the bug with should be fine. Thanks!

@gl84
Copy link
Contributor Author

gl84 commented Aug 30, 2021

With 2.0.29 the wasm-ld crash has vanished.

The first emscripten release that works again has the hash f0ad0cc. It seems your fix for PHI & longjmps fixed my crash.

Many thanks!

@gl84 gl84 closed this as completed Aug 30, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants