Stabilize control-flow-guard codegen option

This commit is contained in:
Andrew Paverd 2020-07-14 15:27:42 +01:00
parent c724b67e1b
commit 31c7aae113
12 changed files with 24 additions and 12 deletions

View File

@ -1231,7 +1231,7 @@ impl<'a> Builder<'a> {
&& self.config.control_flow_guard && self.config.control_flow_guard
&& compiler.stage >= 1 && compiler.stage >= 1
{ {
rustflags.arg("-Zcontrol-flow-guard"); rustflags.arg("-Ccontrol-flow-guard");
} }
// For `cargo doc` invocations, make rustdoc print the Rust version into the docs // For `cargo doc` invocations, make rustdoc print the Rust version into the docs

View File

@ -42,6 +42,18 @@ generated code, but may be slower to compile.
The default value, if not specified, is 16 for non-incremental builds. For The default value, if not specified, is 16 for non-incremental builds. For
incremental builds the default is 256 which allows caching to be more granular. incremental builds the default is 256 which allows caching to be more granular.
## control-flow-guard
This flag controls whether LLVM enables the Windows [Control Flow
Guard](https://docs.microsoft.com/en-us/windows/win32/secbp/control-flow-guard)
platform security feature. This flag is currently ignored for non-Windows targets.
It takes one of the following values:
* `y`, `yes`, `on`, `checks`, or no value: enable Control Flow Guard.
* `nochecks`: emit Control Flow Guard metadata without runtime enforcement checks (this
should only be used for testing purposes as it does not provide security enforcement).
* `n`, `no`, `off`: do not enable Control Flow Guard (the default).
## debug-assertions ## debug-assertions
This flag lets you turn `cfg(debug_assertions)` [conditional This flag lets you turn `cfg(debug_assertions)` [conditional

View File

@ -190,7 +190,7 @@ pub unsafe fn create_module(
// Control Flow Guard is currently only supported by the MSVC linker on Windows. // Control Flow Guard is currently only supported by the MSVC linker on Windows.
if sess.target.target.options.is_like_msvc { if sess.target.target.options.is_like_msvc {
match sess.opts.debugging_opts.control_flow_guard { match sess.opts.cg.control_flow_guard {
CFGuard::Disabled => {} CFGuard::Disabled => {}
CFGuard::NoChecks => { CFGuard::NoChecks => {
// Set `cfguard=1` module flag to emit metadata only. // Set `cfguard=1` module flag to emit metadata only.

View File

@ -1700,7 +1700,7 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>(
} }
// OBJECT-FILES-NO, AUDIT-ORDER // OBJECT-FILES-NO, AUDIT-ORDER
if sess.opts.debugging_opts.control_flow_guard != CFGuard::Disabled { if sess.opts.cg.control_flow_guard != CFGuard::Disabled {
cmd.control_flow_guard(); cmd.control_flow_guard();
} }

View File

@ -420,6 +420,7 @@ fn test_codegen_options_tracking_hash() {
// Make sure that changing a [TRACKED] option changes the hash. // Make sure that changing a [TRACKED] option changes the hash.
// This list is in alphabetical order. // This list is in alphabetical order.
tracked!(code_model, Some(CodeModel::Large)); tracked!(code_model, Some(CodeModel::Large));
tracked!(control_flow_guard, CFGuard::Checks);
tracked!(debug_assertions, Some(true)); tracked!(debug_assertions, Some(true));
tracked!(debuginfo, 0xdeadbeef); tracked!(debuginfo, 0xdeadbeef);
tracked!(embed_bitcode, false); tracked!(embed_bitcode, false);
@ -537,7 +538,6 @@ fn test_debugging_options_tracking_hash() {
tracked!(binary_dep_depinfo, true); tracked!(binary_dep_depinfo, true);
tracked!(chalk, true); tracked!(chalk, true);
tracked!(codegen_backend, Some("abc".to_string())); tracked!(codegen_backend, Some("abc".to_string()));
tracked!(control_flow_guard, CFGuard::Checks);
tracked!(crate_attr, vec!["abc".to_string()]); tracked!(crate_attr, vec!["abc".to_string()]);
tracked!(debug_macros, true); tracked!(debug_macros, true);
tracked!(dep_info_omit_d_target, true); tracked!(dep_info_omit_d_target, true);

View File

@ -103,7 +103,7 @@ pub enum Strip {
Symbols, Symbols,
} }
/// The different settings that the `-Z control-flow-guard` flag can have. /// The different settings that the `-C control-flow-guard` flag can have.
#[derive(Clone, Copy, PartialEq, Hash, Debug)] #[derive(Clone, Copy, PartialEq, Hash, Debug)]
pub enum CFGuard { pub enum CFGuard {
/// Do not emit Control Flow Guard metadata or checks. /// Do not emit Control Flow Guard metadata or checks.

View File

@ -692,6 +692,8 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options,
"choose the code model to use (`rustc --print code-models` for details)"), "choose the code model to use (`rustc --print code-models` for details)"),
codegen_units: Option<usize> = (None, parse_opt_uint, [UNTRACKED], codegen_units: Option<usize> = (None, parse_opt_uint, [UNTRACKED],
"divide crate into N units to optimize in parallel"), "divide crate into N units to optimize in parallel"),
control_flow_guard: CFGuard = (CFGuard::Disabled, parse_cfguard, [TRACKED],
"use Windows Control Flow Guard (default: no)"),
debug_assertions: Option<bool> = (None, parse_opt_bool, [TRACKED], debug_assertions: Option<bool> = (None, parse_opt_bool, [TRACKED],
"explicitly enable the `cfg(debug_assertions)` directive"), "explicitly enable the `cfg(debug_assertions)` directive"),
debuginfo: usize = (0, parse_uint, [TRACKED], debuginfo: usize = (0, parse_uint, [TRACKED],
@ -809,8 +811,6 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
"enable the experimental Chalk-based trait solving engine"), "enable the experimental Chalk-based trait solving engine"),
codegen_backend: Option<String> = (None, parse_opt_string, [TRACKED], codegen_backend: Option<String> = (None, parse_opt_string, [TRACKED],
"the backend to use"), "the backend to use"),
control_flow_guard: CFGuard = (CFGuard::Disabled, parse_cfguard, [TRACKED],
"use Windows Control Flow Guard (default: no)"),
crate_attr: Vec<String> = (Vec::new(), parse_string_push, [TRACKED], crate_attr: Vec<String> = (Vec::new(), parse_string_push, [TRACKED],
"inject the given attribute in the crate"), "inject the given attribute in the crate"),
debug_macros: bool = (false, parse_bool, [TRACKED], debug_macros: bool = (false, parse_bool, [TRACKED],

View File

@ -1,4 +1,4 @@
// compile-flags: -Z control-flow-guard=checks // compile-flags: -C control-flow-guard=checks
// only-msvc // only-msvc
#![crate_type = "lib"] #![crate_type = "lib"]

View File

@ -1,4 +1,4 @@
// compile-flags: -Z control-flow-guard=no // compile-flags: -C control-flow-guard=no
// only-msvc // only-msvc
#![crate_type = "lib"] #![crate_type = "lib"]

View File

@ -1,4 +1,4 @@
// compile-flags: -Z control-flow-guard=nochecks // compile-flags: -C control-flow-guard=nochecks
// only-msvc // only-msvc
#![crate_type = "lib"] #![crate_type = "lib"]

View File

@ -1,4 +1,4 @@
// compile-flags: -Z control-flow-guard // compile-flags: -C control-flow-guard
// ignore-msvc // ignore-msvc
#![crate_type = "lib"] #![crate_type = "lib"]

View File

@ -1,5 +1,5 @@
// run-pass // run-pass
// compile-flags: -Z control-flow-guard // compile-flags: -C control-flow-guard
pub fn main() { pub fn main() {
println!("hello, world"); println!("hello, world");