Previously, WebAssembly::mayThrow() assumed all inputs are global
addresses. But when intrinsics, such as memcpy, memmove, or memset
are lowered to external symbols in instruction selection and later
emitted as library calls. And these functions don't throw.
This patch adds handling to those memory intrinsics to mayThrow
function. But while most of libcalls don't throw, we can't guarantee all
of them don't throw, so currently we conservatively return true for all
other external symbols.
I think a better way to solve this problem is to embed 'nounwind' info
in [[ https://github.com/llvm/llvm-project/blob/de0e3aac2a27496545f809f2dffac48b5ab7f594/llvm/include/llvm/CodeGen/TargetLowering.h#L3417-L3570 | TargetLowering::CallLoweringInfo ]], so that we can access the info
from the backend. This will also enable transferring 'nounwind'
properties of LLVM IR instructions. Currently we don't transfer that
info and we can only access properties of callee functions, if the
callees are within the module. Other targets don't need this info in the
backend because they do all the processing before isel, but it will help
us because that info will reduce code size increase in fixing unwind
destination mismatches in CFGStackify.
But for now we return false for these memory intrinsics and true for all
other libcalls conservatively.