From d9f0e88f19b691cd3e69be997c4ec75ea14c1db3 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Fri, 10 Nov 2017 11:00:52 -0800 Subject: [PATCH] Enable TrapUnreachable in LLVM. Enable LLVM's TrapUnreachable flag, which tells it to translate `unreachable` instructions into hardware trap instructions, rather than allowing control flow to "fall through" into whatever code happens to follow it in memory. --- src/rustllvm/PassWrapper.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/rustllvm/PassWrapper.cpp b/src/rustllvm/PassWrapper.cpp index b397ad1e98f..1fc8c42f1dd 100644 --- a/src/rustllvm/PassWrapper.cpp +++ b/src/rustllvm/PassWrapper.cpp @@ -398,6 +398,12 @@ extern "C" LLVMTargetMachineRef LLVMRustCreateTargetMachine( Options.DataSections = DataSections; Options.FunctionSections = FunctionSections; + // Tell LLVM to translate `unreachable` into an explicit trap instruction. + // This limits the extent of possible undefined behavior in some cases, as it + // prevents control flow from "falling through" into whatever code happens to + // be layed out next in memory. + Options.TrapUnreachable = true; + TargetMachine *TM = TheTarget->createTargetMachine( Trip.getTriple(), RealCPU, Feature, Options, RM, CM, OptLevel); return wrap(TM);