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:
parent
50be229640
commit
4a8c5cbe7a
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user