introduce LinkerFeatures

They are a flexible complementary mechanism to linker flavors,
that also avoid the combinatorial explosion of mapping linking features
to actual linker flavors.
This commit is contained in:
Rémy Rakic 2024-04-08 21:35:29 +00:00
parent c39929ce18
commit 695aac2c02

View File

@ -698,6 +698,58 @@ fn to_json(&self) -> Json {
}
}
bitflags::bitflags! {
/// The `-Z linker-features` components that can individually be enabled or disabled.
///
/// They are feature flags intended to be a more flexible mechanism than linker flavors, and
/// also to prevent a combinatorial explosion of flavors whenever a new linker feature is
/// required. These flags are "generic", in the sense that they can work on multiple targets on
/// the CLI. Otherwise, one would have to select different linkers flavors for each target.
///
/// Here are some examples of the advantages they offer:
/// - default feature sets for principal flavors, or for specific targets.
/// - flavor-specific features: for example, clang offers automatic cross-linking with
/// `--target`, which gcc-style compilers don't support. The *flavor* is still a C/C++
/// compiler, and we don't need to multiply the number of flavors for this use-case. Instead,
/// we can have a single `+target` feature.
/// - umbrella features: for example if clang accumulates more features in the future than just
/// the `+target` above. That could be modeled as `+clang`.
/// - niche features for resolving specific issues: for example, on Apple targets the linker
/// flag implementing the `as-needed` native link modifier (#99424) is only possible on
/// sufficiently recent linker versions.
/// - still allows for discovery and automation, for example via feature detection. This can be
/// useful in exotic environments/build systems.
#[derive(Clone, Copy, PartialEq, Eq, Default)]
pub struct LinkerFeatures: u8 {
/// Invoke the linker via a C/C++ compiler (e.g. on most unix targets).
const CC = 1 << 0;
/// Use the lld linker, either the system lld or the self-contained linker `rust-lld`.
const LLD = 1 << 1;
}
}
rustc_data_structures::external_bitflags_debug! { LinkerFeatures }
impl LinkerFeatures {
/// Parses a single `-Z linker-features` well-known feature, not a set of flags.
pub fn from_str(s: &str) -> Option<LinkerFeatures> {
Some(match s {
"cc" => LinkerFeatures::CC,
"lld" => LinkerFeatures::LLD,
_ => return None,
})
}
/// Returns whether the `lld` linker feature is enabled.
pub fn is_lld_enabled(self) -> bool {
self.contains(LinkerFeatures::LLD)
}
/// Returns whether the `cc` linker feature is enabled.
pub fn is_cc_enabled(self) -> bool {
self.contains(LinkerFeatures::CC)
}
}
#[derive(Clone, Copy, Debug, PartialEq, Hash, Encodable, Decodable, HashStable_Generic)]
pub enum PanicStrategy {
Unwind,