Use the LLVM option NoTrapAfterNoreturn

Use the LLVM option NoTrapAfterNoreturn: https://llvm.org/doxygen/classllvm_1_1TargetOptions.html#acd83fce25de1ac9f6c975135a8235c22
when TrapUnreachable is enabled. This prevents codegenning unnecessary
double-traps in some situations.
Also, ensure NoTrapAfterNoreturn is set to false when targeting WebAssembly,
as it is known to cause bugs.
This commit is contained in:
Matt Harding 2023-04-18 12:24:22 +01:00
parent 50be229640
commit 4a8c5cbe7a

View File

@ -480,6 +480,14 @@ extern "C" LLVMTargetMachineRef LLVMRustCreateTargetMachine(
// it prevents control flow from "falling through" into whatever code // it prevents control flow from "falling through" into whatever code
// happens to be laid out next in memory. // happens to be laid out next in memory.
Options.TrapUnreachable = true; Options.TrapUnreachable = true;
// But don't emit traps after other traps or no-returns unnecessarily.
// ...except for when targeting WebAssembly, because the NoTrapAfterNoreturn
// option causes bugs in the LLVM WebAssembly backend. You should be able to
// remove this check when Rust's minimum supported LLVM version is >= 18
// https://github.com/llvm/llvm-project/pull/65876
if (!Trip.isWasm()) {
Options.NoTrapAfterNoreturn = true;
}
} }
if (Singlethread) { if (Singlethread) {