diff options
| author | bors <bors@rust-lang.org> | 2020-02-01 15:02:58 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-02-01 15:02:58 +0000 |
| commit | 64184a3288eca13ddfb7bc2e7b5231cbb8d5b88f (patch) | |
| tree | efbbb7c0d1b0a9570650f4fb9d4708fb64663c10 /src/librustc_codegen_llvm | |
| parent | 6c0b779b7bb23ad1bead914e8023642cc2368406 (diff) | |
| parent | c0744e1e0c35b1083733fd5c74fc3fb5a6cd04f7 (diff) | |
Auto merge of #68180 - ajpaverd:cfguard-rust, r=nagisa
Add support for Control Flow Guard on Windows. LLVM now supports Windows Control Flow Guard (CFG): https://github.com/llvm/llvm-project/commit/d157a9bc8ba1085cc4808c6941412322a7fd884e This patch adds support for rustc to emit the required LLVM module flags to enable CFG metadata (cfguard=1) or metadata and checks (cfguard=2). The LLVM module flags are ignored on unsupported targets and operating systems.
Diffstat (limited to 'src/librustc_codegen_llvm')
| -rw-r--r-- | src/librustc_codegen_llvm/context.rs | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/librustc_codegen_llvm/context.rs b/src/librustc_codegen_llvm/context.rs index 50a35fe3dcf..6b31f14410d 100644 --- a/src/librustc_codegen_llvm/context.rs +++ b/src/librustc_codegen_llvm/context.rs @@ -12,7 +12,7 @@ use rustc_codegen_ssa::traits::*; use crate::callee::get_fn; use rustc::bug; use rustc::mir::mono::CodegenUnit; -use rustc::session::config::{self, DebugInfo}; +use rustc::session::config::{self, CFGuard, DebugInfo}; use rustc::session::Session; use rustc::ty::layout::{ FnAbiExt, HasParamEnv, LayoutError, LayoutOf, PointeeInfo, Size, TyLayout, VariantIdx, @@ -227,6 +227,16 @@ pub unsafe fn create_module( llvm::LLVMRustAddModuleFlag(llmod, avoid_plt, 1); } + // Set module flags to enable Windows Control Flow Guard (/guard:cf) metadata + // only (`cfguard=1`) or metadata and checks (`cfguard=2`). + match sess.opts.debugging_opts.control_flow_guard { + CFGuard::Disabled => {} + CFGuard::NoChecks => { + llvm::LLVMRustAddModuleFlag(llmod, "cfguard\0".as_ptr() as *const _, 1) + } + CFGuard::Checks => llvm::LLVMRustAddModuleFlag(llmod, "cfguard\0".as_ptr() as *const _, 2), + } + llmod } |
