Improve warnings on incompatible options involving -Zinstrument-coverage
Adds checks for: * `no_core` attribute * explicitly-enabled `legacy` symbol mangling * mir_opt_level > 1 (which enables inlining) I removed code from the `Inline` MIR pass that forcibly disabled inlining if `-Zinstrument-coverage` was set. The default `mir_opt_level` does not enable inlining anyway. But if the level is explicitly set and is greater than 1, I issue a warning. The new warnings show up in tests, which is much better for diagnosing potential option conflicts in these cases.
This commit is contained in:
parent
eb963ffe45
commit
4f550f1f93
16 changed files with 103 additions and 49 deletions
|
@ -174,6 +174,8 @@ pub enum MirSpanview {
|
|||
Block,
|
||||
}
|
||||
|
||||
pub const MIR_OPT_LEVEL_DEFAULT: usize = 1;
|
||||
|
||||
#[derive(Clone, PartialEq, Hash)]
|
||||
pub enum LinkerPluginLto {
|
||||
LinkerPlugin(PathBuf),
|
||||
|
@ -212,6 +214,12 @@ pub enum SymbolManglingVersion {
|
|||
V0,
|
||||
}
|
||||
|
||||
impl SymbolManglingVersion {
|
||||
pub fn default() -> Self {
|
||||
SymbolManglingVersion::Legacy
|
||||
}
|
||||
}
|
||||
|
||||
impl_stable_hash_via_hash!(SymbolManglingVersion);
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Hash)]
|
||||
|
@ -1757,7 +1765,33 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
|
|||
// and reversible name mangling. Note, LLVM coverage tools can analyze coverage over
|
||||
// multiple runs, including some changes to source code; so mangled names must be consistent
|
||||
// across compilations.
|
||||
debugging_opts.symbol_mangling_version = SymbolManglingVersion::V0;
|
||||
match debugging_opts.symbol_mangling_version {
|
||||
None => {
|
||||
debugging_opts.symbol_mangling_version = Some(SymbolManglingVersion::V0);
|
||||
}
|
||||
Some(SymbolManglingVersion::Legacy) => {
|
||||
early_warn(
|
||||
error_format,
|
||||
"-Z instrument-coverage requires symbol mangling version `v0`, \
|
||||
but `-Z symbol-mangling-version=legacy` was specified",
|
||||
);
|
||||
}
|
||||
Some(SymbolManglingVersion::V0) => {}
|
||||
}
|
||||
|
||||
match debugging_opts.mir_opt_level {
|
||||
Some(level) if level > 1 => {
|
||||
early_warn(
|
||||
error_format,
|
||||
&format!(
|
||||
"`-Z mir-opt-level={}` (any level > 1) enables function inlining, which \
|
||||
limits the effectiveness of `-Z instrument-coverage`.",
|
||||
level,
|
||||
),
|
||||
);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
if let Ok(graphviz_font) = std::env::var("RUSTC_GRAPHVIZ_FONT") {
|
||||
|
@ -2162,7 +2196,7 @@ crate mod dep_tracking {
|
|||
impl_dep_tracking_hash_via_hash!(Edition);
|
||||
impl_dep_tracking_hash_via_hash!(LinkerPluginLto);
|
||||
impl_dep_tracking_hash_via_hash!(SwitchWithOptPath);
|
||||
impl_dep_tracking_hash_via_hash!(SymbolManglingVersion);
|
||||
impl_dep_tracking_hash_via_hash!(Option<SymbolManglingVersion>);
|
||||
impl_dep_tracking_hash_via_hash!(Option<SourceFileHashAlgorithm>);
|
||||
impl_dep_tracking_hash_via_hash!(TrimmedDefPaths);
|
||||
|
||||
|
|
|
@ -677,12 +677,12 @@ macro_rules! options {
|
|||
}
|
||||
|
||||
fn parse_symbol_mangling_version(
|
||||
slot: &mut SymbolManglingVersion,
|
||||
slot: &mut Option<SymbolManglingVersion>,
|
||||
v: Option<&str>,
|
||||
) -> bool {
|
||||
*slot = match v {
|
||||
Some("legacy") => SymbolManglingVersion::Legacy,
|
||||
Some("v0") => SymbolManglingVersion::V0,
|
||||
Some("legacy") => Some(SymbolManglingVersion::Legacy),
|
||||
Some("v0") => Some(SymbolManglingVersion::V0),
|
||||
_ => return false,
|
||||
};
|
||||
true
|
||||
|
@ -970,7 +970,7 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
|
|||
mir_emit_retag: bool = (false, parse_bool, [TRACKED],
|
||||
"emit Retagging MIR statements, interpreted e.g., by miri; implies -Zmir-opt-level=0 \
|
||||
(default: no)"),
|
||||
mir_opt_level: usize = (1, parse_uint, [TRACKED],
|
||||
mir_opt_level: Option<usize> = (None, parse_opt_uint, [TRACKED],
|
||||
"MIR optimization level (0-3; default: 1)"),
|
||||
mutable_noalias: bool = (false, parse_bool, [TRACKED],
|
||||
"emit noalias metadata for mutable references (default: no)"),
|
||||
|
@ -1088,9 +1088,9 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
|
|||
"hash algorithm of source files in debug info (`md5`, `sha1`, or `sha256`)"),
|
||||
strip: Strip = (Strip::None, parse_strip, [UNTRACKED],
|
||||
"tell the linker which information to strip (`none` (default), `debuginfo` or `symbols`)"),
|
||||
symbol_mangling_version: SymbolManglingVersion = (SymbolManglingVersion::Legacy,
|
||||
symbol_mangling_version: Option<SymbolManglingVersion> = (None,
|
||||
parse_symbol_mangling_version, [TRACKED],
|
||||
"which mangling version to use for symbol names"),
|
||||
"which mangling version to use for symbol names ('legacy' (default) or 'v0')"),
|
||||
teach: bool = (false, parse_bool, [TRACKED],
|
||||
"show extended diagnostic help (default: no)"),
|
||||
terminal_width: Option<usize> = (None, parse_opt_uint, [UNTRACKED],
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue