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_ssa | |
| 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_ssa')
| -rw-r--r-- | src/librustc_codegen_ssa/back/link.rs | 6 | ||||
| -rw-r--r-- | src/librustc_codegen_ssa/back/linker.rs | 21 |
2 files changed, 26 insertions, 1 deletions
diff --git a/src/librustc_codegen_ssa/back/link.rs b/src/librustc_codegen_ssa/back/link.rs index f56a4170c0a..bc0322ffe1d 100644 --- a/src/librustc_codegen_ssa/back/link.rs +++ b/src/librustc_codegen_ssa/back/link.rs @@ -1,7 +1,7 @@ use rustc::middle::cstore::{EncodedMetadata, LibSource, NativeLibrary, NativeLibraryKind}; use rustc::middle::dependency_format::Linkage; use rustc::session::config::{ - self, DebugInfo, OutputFilenames, OutputType, PrintRequest, Sanitizer, + self, CFGuard, DebugInfo, OutputFilenames, OutputType, PrintRequest, Sanitizer, }; use rustc::session::search_paths::PathKind; /// For all the linkers we support, and information they might @@ -1294,6 +1294,10 @@ fn link_args<'a, B: ArchiveBuilder<'a>>( cmd.pgo_gen(); } + if sess.opts.debugging_opts.control_flow_guard != CFGuard::Disabled { + cmd.control_flow_guard(); + } + // FIXME (#2397): At some point we want to rpath our guesses as to // where extern libraries might live, based on the // addl_lib_search_paths diff --git a/src/librustc_codegen_ssa/back/linker.rs b/src/librustc_codegen_ssa/back/linker.rs index 695f171dfb4..5aafb8a12d7 100644 --- a/src/librustc_codegen_ssa/back/linker.rs +++ b/src/librustc_codegen_ssa/back/linker.rs @@ -106,6 +106,7 @@ pub trait Linker { fn no_relro(&mut self); fn optimize(&mut self); fn pgo_gen(&mut self); + fn control_flow_guard(&mut self); fn debuginfo(&mut self); fn no_default_libraries(&mut self); fn build_dylib(&mut self, out_filename: &Path); @@ -360,6 +361,10 @@ impl<'a> Linker for GccLinker<'a> { self.cmd.arg("__llvm_profile_runtime"); } + fn control_flow_guard(&mut self) { + self.sess.warn("Windows Control Flow Guard is not supported by this linker."); + } + fn debuginfo(&mut self) { if let DebugInfo::None = self.sess.opts.debuginfo { // If we are building without debuginfo enabled and we were called with @@ -660,6 +665,10 @@ impl<'a> Linker for MsvcLinker<'a> { // Nothing needed here. } + fn control_flow_guard(&mut self) { + self.cmd.arg("/guard:cf"); + } + fn debuginfo(&mut self) { // This will cause the Microsoft linker to generate a PDB file // from the CodeView line tables in the object files. @@ -862,6 +871,10 @@ impl<'a> Linker for EmLinker<'a> { // noop, but maybe we need something like the gnu linker? } + fn control_flow_guard(&mut self) { + self.sess.warn("Windows Control Flow Guard is not supported by this linker."); + } + fn debuginfo(&mut self) { // Preserve names or generate source maps depending on debug info self.cmd.arg(match self.sess.opts.debuginfo { @@ -1058,6 +1071,10 @@ impl<'a> Linker for WasmLd<'a> { fn debuginfo(&mut self) {} + fn control_flow_guard(&mut self) { + self.sess.warn("Windows Control Flow Guard is not supported by this linker."); + } + fn no_default_libraries(&mut self) {} fn build_dylib(&mut self, _out_filename: &Path) { @@ -1233,6 +1250,10 @@ impl<'a> Linker for PtxLinker<'a> { fn no_default_libraries(&mut self) {} + fn control_flow_guard(&mut self) { + self.sess.warn("Windows Control Flow Guard is not supported by this linker."); + } + fn build_dylib(&mut self, _out_filename: &Path) {} fn export_symbols(&mut self, _tmpdir: &Path, _crate_type: CrateType) {} |
