From 7824d04c402d38d41d1444e5720317cee852423c Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Fri, 31 Jan 2025 09:12:39 +0100 Subject: [PATCH 1/5] Constrain -mguard to be Clang-only GCC does not support Control Flow Guard. --- src/flags.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/flags.rs b/src/flags.rs index 933916335..8abea1374 100644 --- a/src/flags.rs +++ b/src/flags.rs @@ -197,18 +197,6 @@ impl<'this> RustcCodegenFlags<'this> { if self.no_vectorize_slp { push_if_supported("-fno-slp-vectorize".into()); } - // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-mguard - if let Some(value) = self.control_flow_guard { - let cc_val = match value { - "y" | "yes" | "on" | "true" | "checks" => Some("cf"), - "nochecks" => Some("cf-nochecks"), - "n" | "no" | "off" | "false" => Some("none"), - _ => None, - }; - if let Some(cc_val) = cc_val { - push_if_supported(format!("-mguard={cc_val}").into()); - } - } // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-fPIC // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-fPIE // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-mdynamic-no-pic @@ -287,6 +275,18 @@ impl<'this> RustcCodegenFlags<'this> { push_if_supported(format!("-flto={cc_val}").into()); } } + // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-mguard + if let Some(value) = self.control_flow_guard { + let cc_val = match value { + "y" | "yes" | "on" | "true" | "checks" => Some("cf"), + "nochecks" => Some("cf-nochecks"), + "n" | "no" | "off" | "false" => Some("none"), + _ => None, + }; + if let Some(cc_val) = cc_val { + push_if_supported(format!("-mguard={cc_val}").into()); + } + } } ToolFamily::Gnu { .. } => {} ToolFamily::Msvc { .. } => { From 7673c8e960a14d083e86e497724baa9cab233998 Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Fri, 31 Jan 2025 09:15:19 +0100 Subject: [PATCH 2/5] Remove -Clink-dead-code inheritance This is a linker-level flag, and doesn't make sense to use when compiling (which is the only thing that cc-rs does (bar dynamic linking, which is very undersupported anyhow, and will likely need more thinking whether it wants this flag or not)). --- src/flags.rs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/flags.rs b/src/flags.rs index 8abea1374..b9d3ff7fb 100644 --- a/src/flags.rs +++ b/src/flags.rs @@ -16,7 +16,6 @@ pub(crate) struct RustcCodegenFlags<'a> { relocation_model: Option<&'a str>, embed_bitcode: Option, force_frame_pointers: Option, - link_dead_code: Option, no_redzone: Option, soft_float: Option, } @@ -138,8 +137,6 @@ impl<'this> RustcCodegenFlags<'this> { "-Cforce-frame-pointers" => { self.force_frame_pointers = value.map_or(Some(true), arg_to_bool) } - // https://doc.rust-lang.org/rustc/codegen-options/index.html#link-dead-code - "-Clink-dead-code" => self.link_dead_code = value.map_or(Some(true), arg_to_bool), // https://doc.rust-lang.org/rustc/codegen-options/index.html#no-redzone "-Cno-redzone" => self.no_redzone = value.map_or(Some(true), arg_to_bool), // https://doc.rust-lang.org/rustc/codegen-options/index.html#soft-float @@ -221,10 +218,6 @@ impl<'this> RustcCodegenFlags<'this> { }; push_if_supported(cc_flag.into()); } - // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-dead_strip - if let Some(false) = self.link_dead_code { - push_if_supported("-dead_strip".into()); - } // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-mno-red-zone // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-mred-zone if let Some(value) = self.no_redzone { @@ -478,7 +471,6 @@ mod tests { control_flow_guard: Some("yes"), embed_bitcode: Some(false), force_frame_pointers: Some(true), - link_dead_code: Some(true), lto: Some("false"), no_redzone: Some(true), no_vectorize_loops: true, From 68a46d454dc183e111f4ff30e4f17cb27c8cae2c Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Fri, 31 Jan 2025 09:24:06 +0100 Subject: [PATCH 3/5] Fix -Csoft-float=no inheritance Use -mhard-float instead of -mno-soft-float. --- src/flags.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/flags.rs b/src/flags.rs index b9d3ff7fb..e31a5469d 100644 --- a/src/flags.rs +++ b/src/flags.rs @@ -225,12 +225,15 @@ impl<'this> RustcCodegenFlags<'this> { push_if_supported(cc_flag.into()); } // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-msoft-float - // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-mno-soft-float + // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-mhard-float + // https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html (several archs, search for `-msoft-float`). + // https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html (several archs, search for `-mhard-float`). if let Some(value) = self.soft_float { let cc_flag = if value { "-msoft-float" } else { - "-mno-soft-float" + // Do not use -mno-soft-float, that's basically just an alias for -mno-implicit-float. + "-mhard-float" }; push_if_supported(cc_flag.into()); } From 71f9601c92ea166fd9b8894adf9659952771083e Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Fri, 31 Jan 2025 09:25:57 +0100 Subject: [PATCH 4/5] Add GCC documentation for flags --- src/flags.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/flags.rs b/src/flags.rs index e31a5469d..33b5e713e 100644 --- a/src/flags.rs +++ b/src/flags.rs @@ -177,30 +177,40 @@ impl<'this> RustcCodegenFlags<'this> { // Flags shared between clang and gnu if clang_or_gnu { // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-mbranch-protection + // https://gcc.gnu.org/onlinedocs/gcc/AArch64-Options.html#index-mbranch-protection (Aarch64) + // https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html#index-mbranch-protection-1 (ARM) + // FIXME(madsmtm): Parse the value, and make sure we pass it in the correct format. if let Some(value) = self.branch_protection { push_if_supported( format!("-mbranch-protection={}", value.replace(",", "+")).into(), ); } // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-mcmodel + // https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html (several archs, search for `-mcmodel=`). + // FIXME(madsmtm): Parse the model, to make sure we pass the correct value (depending on arch). if let Some(value) = self.code_model { push_if_supported(format!("-mcmodel={value}").into()); } // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-fno-vectorize + // https://gcc.gnu.org/onlinedocs/gnat_ugn/Vectorization-of-loops.html if self.no_vectorize_loops { push_if_supported("-fno-vectorize".into()); } // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-fno-slp-vectorize + // https://gcc.gnu.org/onlinedocs/gnat_ugn/Vectorization-of-loops.html if self.no_vectorize_slp { push_if_supported("-fno-slp-vectorize".into()); } - // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-fPIC - // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-fPIE - // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-mdynamic-no-pic if let Some(value) = self.relocation_model { let cc_flag = match value { + // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-fPIC + // https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#index-fPIC "pic" => Some("-fPIC"), + // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-fPIE + // https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#index-fPIE "pie" => Some("-fPIE"), + // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-mdynamic-no-pic + // https://gcc.gnu.org/onlinedocs/gcc/RS_002f6000-and-PowerPC-Options.html#index-mdynamic-no-pic "dynamic-no-pic" => Some("-mdynamic-no-pic"), _ => None, }; @@ -210,6 +220,7 @@ impl<'this> RustcCodegenFlags<'this> { } // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-fno-omit-frame-pointer // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-fomit-frame-pointer + // https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-fomit-frame-pointer if let Some(value) = self.force_frame_pointers { let cc_flag = if value { "-fno-omit-frame-pointer" @@ -219,7 +230,9 @@ impl<'this> RustcCodegenFlags<'this> { push_if_supported(cc_flag.into()); } // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-mno-red-zone + // https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html#index-mno-red-zone // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-mred-zone + // https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html#index-mred-zone if let Some(value) = self.no_redzone { let cc_flag = if value { "-mno-red-zone" } else { "-mred-zone" }; push_if_supported(cc_flag.into()); From a100f79897e66fd9d85197d19689145ce7600553 Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Fri, 31 Jan 2025 18:29:49 +0100 Subject: [PATCH 5/5] Add ARM documentation for -mbranch-protection --- src/flags.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/flags.rs b/src/flags.rs index 33b5e713e..996c647d7 100644 --- a/src/flags.rs +++ b/src/flags.rs @@ -179,7 +179,7 @@ impl<'this> RustcCodegenFlags<'this> { // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-mbranch-protection // https://gcc.gnu.org/onlinedocs/gcc/AArch64-Options.html#index-mbranch-protection (Aarch64) // https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html#index-mbranch-protection-1 (ARM) - // FIXME(madsmtm): Parse the value, and make sure we pass it in the correct format. + // https://developer.arm.com/documentation/101754/0619/armclang-Reference/armclang-Command-line-Options/-mbranch-protection if let Some(value) = self.branch_protection { push_if_supported( format!("-mbranch-protection={}", value.replace(",", "+")).into(),