From 65040749515a202331658d3883a19372f1194f1f Mon Sep 17 00:00:00 2001 From: Kajetan Puchalski Date: Sun, 12 Jan 2025 00:40:01 +0000 Subject: [PATCH] build: Don't pass inherited PGO flags to GNU compilers Clang and GNU use different PGO libraries, so PGO flags inherited from rustc should not automatically be passed to GNU compilers. Fixes #1354 --- src/flags.rs | 187 +++++++++++++++++++++++++++------------------------ 1 file changed, 98 insertions(+), 89 deletions(-) diff --git a/src/flags.rs b/src/flags.rs index 8b0d7563..d6270bf2 100644 --- a/src/flags.rs +++ b/src/flags.rs @@ -174,26 +174,106 @@ impl<'this> RustcCodegenFlags<'this> { } }; - match family { - ToolFamily::Clang { .. } | ToolFamily::Gnu => { - // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-mbranch-protection - 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 - if let Some(value) = self.code_model { - push_if_supported(format!("-mcmodel={value}").into()); + let clang_or_gnu = + matches!(family, ToolFamily::Clang { .. }) || matches!(family, ToolFamily::Gnu { .. }); + + // Flags shared between clang and gnu + if clang_or_gnu { + // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-mbranch-protection + 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 + 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 + if self.no_vectorize_loops { + push_if_supported("-fno-vectorize".into()); + } + // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-fno-slp-vectorize + 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-fno-vectorize - if self.no_vectorize_loops { - push_if_supported("-fno-vectorize".into()); + } + // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-flto + if let Some(value) = self.lto { + let cc_val = match value { + "y" | "yes" | "on" | "true" | "fat" => Some("full"), + "thin" => Some("thin"), + _ => None, + }; + if let Some(cc_val) = cc_val { + push_if_supported(format!("-flto={cc_val}").into()); } - // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-fno-slp-vectorize - 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 { + "pic" => Some("-fPIC"), + "pie" => Some("-fPIE"), + "dynamic-no-pic" => Some("-mdynamic-no-pic"), + _ => None, + }; + if let Some(cc_flag) = cc_flag { + push_if_supported(cc_flag.into()); } + } + // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-fembed-bitcode + if let Some(value) = self.embed_bitcode { + let cc_val = if value { "all" } else { "off" }; + push_if_supported(format!("-fembed-bitcode={cc_val}").into()); + } + // 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 + if let Some(value) = self.force_frame_pointers { + let cc_flag = if value { + "-fno-omit-frame-pointer" + } else { + "-fomit-frame-pointer" + }; + 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 { + let cc_flag = if value { "-mno-red-zone" } else { "-mred-zone" }; + 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 + if let Some(value) = self.soft_float { + let cc_flag = if value { + "-msoft-float" + } else { + "-mno-soft-float" + }; + push_if_supported(cc_flag.into()); + } + } + + // Compiler-exclusive flags + match family { + ToolFamily::Clang { .. } => { // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-fprofile-generate if let Some(value) = self.profile_generate { push_if_supported(format!("-fprofile-generate={value}").into()); @@ -202,79 +282,8 @@ impl<'this> RustcCodegenFlags<'this> { if let Some(value) = self.profile_use { push_if_supported(format!("-fprofile-use={value}").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-flto - if let Some(value) = self.lto { - let cc_val = match value { - "y" | "yes" | "on" | "true" | "fat" => Some("full"), - "thin" => Some("thin"), - _ => None, - }; - if let Some(cc_val) = cc_val { - push_if_supported(format!("-flto={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 - if let Some(value) = self.relocation_model { - let cc_flag = match value { - "pic" => Some("-fPIC"), - "pie" => Some("-fPIE"), - "dynamic-no-pic" => Some("-mdynamic-no-pic"), - _ => None, - }; - if let Some(cc_flag) = cc_flag { - push_if_supported(cc_flag.into()); - } - } - // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-fembed-bitcode - if let Some(value) = self.embed_bitcode { - let cc_val = if value { "all" } else { "off" }; - push_if_supported(format!("-fembed-bitcode={cc_val}").into()); - } - // 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 - if let Some(value) = self.force_frame_pointers { - let cc_flag = if value { - "-fno-omit-frame-pointer" - } else { - "-fomit-frame-pointer" - }; - 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 { - let cc_flag = if value { "-mno-red-zone" } else { "-mred-zone" }; - 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 - if let Some(value) = self.soft_float { - let cc_flag = if value { - "-msoft-float" - } else { - "-mno-soft-float" - }; - push_if_supported(cc_flag.into()); - } } + ToolFamily::Gnu { .. } => {} ToolFamily::Msvc { .. } => { // https://learn.microsoft.com/en-us/cpp/build/reference/guard-enable-control-flow-guard if let Some(value) = self.control_flow_guard {