Skip to content

Commit 34106f8

Browse files
committed
Stabilize -Z instrument-coverage as -C instrument-coverage
Continue supporting -Z instrument-coverage for compatibility for now, but show a deprecation warning for it. Update uses and documentation to use the -C option. Move the documentation from the unstable book to stable rustc documentation.
1 parent ff94b3b commit 34106f8

File tree

23 files changed

+102
-79
lines changed

23 files changed

+102
-79
lines changed

compiler/rustc_codegen_llvm/src/coverageinfo/mapgen.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ pub fn finalize<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>) {
3737
// LLVM 12.
3838
let version = coverageinfo::mapping_version();
3939
if version < 4 {
40-
tcx.sess.fatal("rustc option `-Z instrument-coverage` requires LLVM 12 or higher.");
40+
tcx.sess.fatal("rustc option `-C instrument-coverage` requires LLVM 12 or higher.");
4141
}
4242

4343
debug!("Generating coverage map for CodegenUnit: `{}`", cx.codegen_unit.name());
@@ -264,7 +264,7 @@ fn save_function_record(
264264
/// (functions referenced by other "used" or public items). Any other functions considered unused,
265265
/// or "Unreachable", were still parsed and processed through the MIR stage, but were not
266266
/// codegenned. (Note that `-Clink-dead-code` can force some unused code to be codegenned, but
267-
/// that flag is known to cause other errors, when combined with `-Z instrument-coverage`; and
267+
/// that flag is known to cause other errors, when combined with `-C instrument-coverage`; and
268268
/// `-Clink-dead-code` will not generate code for unused generic functions.)
269269
///
270270
/// We can find the unused functions (including generic functions) by the set difference of all MIR

compiler/rustc_codegen_ssa/src/traits/coverageinfo.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@ pub trait CoverageInfoMethods<'tcx>: BackendTypes {
2222

2323
pub trait CoverageInfoBuilderMethods<'tcx>: BackendTypes {
2424
/// Returns true if the function source hash was added to the coverage map (even if it had
25-
/// already been added, for this instance). Returns false *only* if `-Z instrument-coverage` is
25+
/// already been added, for this instance). Returns false *only* if `-C instrument-coverage` is
2626
/// not enabled (a coverage map is not being generated).
2727
fn set_function_source_hash(
2828
&mut self,
2929
instance: Instance<'tcx>,
3030
function_source_hash: u64,
3131
) -> bool;
3232

33-
/// Returns true if the counter was added to the coverage map; false if `-Z instrument-coverage`
33+
/// Returns true if the counter was added to the coverage map; false if `-C instrument-coverage`
3434
/// is not enabled (a coverage map is not being generated).
3535
fn add_coverage_counter(
3636
&mut self,
@@ -40,7 +40,7 @@ pub trait CoverageInfoBuilderMethods<'tcx>: BackendTypes {
4040
) -> bool;
4141

4242
/// Returns true if the expression was added to the coverage map; false if
43-
/// `-Z instrument-coverage` is not enabled (a coverage map is not being generated).
43+
/// `-C instrument-coverage` is not enabled (a coverage map is not being generated).
4444
fn add_coverage_counter_expression(
4545
&mut self,
4646
instance: Instance<'tcx>,
@@ -51,7 +51,7 @@ pub trait CoverageInfoBuilderMethods<'tcx>: BackendTypes {
5151
region: Option<CodeRegion>,
5252
) -> bool;
5353

54-
/// Returns true if the region was added to the coverage map; false if `-Z instrument-coverage`
54+
/// Returns true if the region was added to the coverage map; false if `-C instrument-coverage`
5555
/// is not enabled (a coverage map is not being generated).
5656
fn add_coverage_unreachable(&mut self, instance: Instance<'tcx>, region: CodeRegion) -> bool;
5757
}

compiler/rustc_interface/src/tests.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,7 @@ fn test_codegen_options_tracking_hash() {
575575
tracked!(force_frame_pointers, Some(false));
576576
tracked!(force_unwind_tables, Some(true));
577577
tracked!(inline_threshold, Some(0xf007ba11));
578+
tracked!(instrument_coverage, Some(InstrumentCoverage::All));
578579
tracked!(linker_plugin_lto, LinkerPluginLto::LinkerPluginAuto);
579580
tracked!(link_dead_code, Some(true));
580581
tracked!(llvm_args, vec![String::from("1"), String::from("2")]);

compiler/rustc_middle/src/mir/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1590,7 +1590,7 @@ pub enum StatementKind<'tcx> {
15901590
/// - `Bivariant` -- no effect
15911591
AscribeUserType(Box<(Place<'tcx>, UserTypeProjection)>, ty::Variance),
15921592

1593-
/// Marks the start of a "coverage region", injected with '-Zinstrument-coverage'. A
1593+
/// Marks the start of a "coverage region", injected with '-Cinstrument-coverage'. A
15941594
/// `Coverage` statement carries metadata about the coverage region, used to inject a coverage
15951595
/// map into the binary. If `Coverage::kind` is a `Counter`, the statement also generates
15961596
/// executable code, to increment a counter variable at runtime, each time the code region is

compiler/rustc_middle/src/mir/query.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ pub struct DestructuredConst<'tcx> {
390390
}
391391

392392
/// Coverage information summarized from a MIR if instrumented for source code coverage (see
393-
/// compiler option `-Zinstrument-coverage`). This information is generated by the
393+
/// compiler option `-Cinstrument-coverage`). This information is generated by the
394394
/// `InstrumentCoverage` MIR pass and can be retrieved via the `coverageinfo` query.
395395
#[derive(Clone, TyEncodable, TyDecodable, Debug, HashStable)]
396396
pub struct CoverageInfo {

compiler/rustc_middle/src/query/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ rustc_queries! {
380380
}
381381

382382
/// Returns coverage summary info for a function, after executing the `InstrumentCoverage`
383-
/// MIR pass (assuming the -Zinstrument-coverage option is enabled).
383+
/// MIR pass (assuming the -Cinstrument-coverage option is enabled).
384384
query coverageinfo(key: ty::InstanceDef<'tcx>) -> mir::CoverageInfo {
385385
desc { |tcx| "retrieving coverage info from MIR for `{}`", tcx.def_path_str(key.def_id()) }
386386
storage(ArenaCacheSelector<'tcx>)

compiler/rustc_mir_transform/src/coverage/debug.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
//!
44
//! To enable coverage, include the rustc command line option:
55
//!
6-
//! * `-Z instrument-coverage`
6+
//! * `-C instrument-coverage`
77
//!
88
//! MIR Dump Files, with additional `CoverageGraph` graphviz and `CoverageSpan` spanview
99
//! ------------------------------------------------------------------------------------

compiler/rustc_mir_transform/src/simplify.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ pub fn remove_dead_blocks<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
303303
/// evaluation: `if false { ... }`.
304304
///
305305
/// Those statements are bypassed by redirecting paths in the CFG around the
306-
/// `dead blocks`; but with `-Z instrument-coverage`, the dead blocks usually
306+
/// `dead blocks`; but with `-C instrument-coverage`, the dead blocks usually
307307
/// include `Coverage` statements representing the Rust source code regions to
308308
/// be counted at runtime. Without these `Coverage` statements, the regions are
309309
/// lost, and the Rust source code will show no coverage information.

compiler/rustc_session/src/config.rs

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -127,15 +127,15 @@ pub enum MirSpanview {
127127
Block,
128128
}
129129

130-
/// The different settings that the `-Z instrument-coverage` flag can have.
130+
/// The different settings that the `-C instrument-coverage` flag can have.
131131
///
132-
/// Coverage instrumentation now supports combining `-Z instrument-coverage`
132+
/// Coverage instrumentation now supports combining `-C instrument-coverage`
133133
/// with compiler and linker optimization (enabled with `-O` or `-C opt-level=1`
134134
/// and higher). Nevertheless, there are many variables, depending on options
135135
/// selected, code structure, and enabled attributes. If errors are encountered,
136136
/// either while compiling or when generating `llvm-cov show` reports, consider
137137
/// lowering the optimization level, including or excluding `-C link-dead-code`,
138-
/// or using `-Z instrument-coverage=except-unused-functions` or `-Z
138+
/// or using `-C instrument-coverage=except-unused-functions` or `-C
139139
/// instrument-coverage=except-unused-generics`.
140140
///
141141
/// Note that `ExceptUnusedFunctions` means: When `mapgen.rs` generates the
@@ -148,13 +148,13 @@ pub enum MirSpanview {
148148
/// unless the function has type parameters.
149149
#[derive(Clone, Copy, PartialEq, Hash, Debug)]
150150
pub enum InstrumentCoverage {
151-
/// Default `-Z instrument-coverage` or `-Z instrument-coverage=statement`
151+
/// Default `-C instrument-coverage` or `-C instrument-coverage=statement`
152152
All,
153-
/// `-Z instrument-coverage=except-unused-generics`
153+
/// `-C instrument-coverage=except-unused-generics`
154154
ExceptUnusedGenerics,
155-
/// `-Z instrument-coverage=except-unused-functions`
155+
/// `-C instrument-coverage=except-unused-functions`
156156
ExceptUnusedFunctions,
157-
/// `-Z instrument-coverage=off` (or `no`, etc.)
157+
/// `-C instrument-coverage=off` (or `no`, etc.)
158158
Off,
159159
}
160160

@@ -2144,18 +2144,37 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
21442144
_ => {}
21452145
}
21462146

2147-
if debugging_opts.instrument_coverage.is_some()
2148-
&& debugging_opts.instrument_coverage != Some(InstrumentCoverage::Off)
2149-
{
2147+
// Handle both `-Z instrument-coverage` and `-C instrument-coverage`; the latter takes
2148+
// precedence.
2149+
match (cg.instrument_coverage, debugging_opts.instrument_coverage) {
2150+
(Some(ic_c), Some(ic_z)) if ic_c != ic_z => {
2151+
early_error(
2152+
error_format,
2153+
"incompatible values passed for `-C instrument-coverage` \
2154+
and `-Z instrument-coverage`",
2155+
);
2156+
}
2157+
(None, None) => {}
2158+
(None, ic) => {
2159+
early_warn(
2160+
error_format,
2161+
"`-Z instrument-coverage` is deprecated; use `-C instrument-coverage`",
2162+
);
2163+
cg.instrument_coverage = ic;
2164+
}
2165+
_ => {}
2166+
}
2167+
2168+
if cg.instrument_coverage.is_some() && cg.instrument_coverage != Some(InstrumentCoverage::Off) {
21502169
if cg.profile_generate.enabled() || cg.profile_use.is_some() {
21512170
early_error(
21522171
error_format,
2153-
"option `-Z instrument-coverage` is not compatible with either `-C profile-use` \
2172+
"option `-C instrument-coverage` is not compatible with either `-C profile-use` \
21542173
or `-C profile-generate`",
21552174
);
21562175
}
21572176

2158-
// `-Z instrument-coverage` implies `-C symbol-mangling-version=v0` - to ensure consistent
2177+
// `-C instrument-coverage` implies `-C symbol-mangling-version=v0` - to ensure consistent
21592178
// and reversible name mangling. Note, LLVM coverage tools can analyze coverage over
21602179
// multiple runs, including some changes to source code; so mangled names must be consistent
21612180
// across compilations.
@@ -2164,7 +2183,7 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
21642183
Some(SymbolManglingVersion::Legacy) => {
21652184
early_warn(
21662185
error_format,
2167-
"-Z instrument-coverage requires symbol mangling version `v0`, \
2186+
"-C instrument-coverage requires symbol mangling version `v0`, \
21682187
but `-C symbol-mangling-version=legacy` was specified",
21692188
);
21702189
}

compiler/rustc_session/src/options.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,17 +109,16 @@ impl Options {
109109
}
110110

111111
pub fn instrument_coverage(&self) -> bool {
112-
self.debugging_opts.instrument_coverage.unwrap_or(InstrumentCoverage::Off)
113-
!= InstrumentCoverage::Off
112+
self.cg.instrument_coverage.unwrap_or(InstrumentCoverage::Off) != InstrumentCoverage::Off
114113
}
115114

116115
pub fn instrument_coverage_except_unused_generics(&self) -> bool {
117-
self.debugging_opts.instrument_coverage.unwrap_or(InstrumentCoverage::Off)
116+
self.cg.instrument_coverage.unwrap_or(InstrumentCoverage::Off)
118117
== InstrumentCoverage::ExceptUnusedGenerics
119118
}
120119

121120
pub fn instrument_coverage_except_unused_functions(&self) -> bool {
122-
self.debugging_opts.instrument_coverage.unwrap_or(InstrumentCoverage::Off)
121+
self.cg.instrument_coverage.unwrap_or(InstrumentCoverage::Off)
123122
== InstrumentCoverage::ExceptUnusedFunctions
124123
}
125124
}
@@ -1021,6 +1020,14 @@ options! {
10211020
"enable incremental compilation"),
10221021
inline_threshold: Option<u32> = (None, parse_opt_number, [TRACKED],
10231022
"set the threshold for inlining a function"),
1023+
instrument_coverage: Option<InstrumentCoverage> = (None, parse_instrument_coverage, [TRACKED],
1024+
"instrument the generated code to support LLVM source-based code coverage \
1025+
reports (note, the compiler build config must include `profiler = true`); \
1026+
implies `-C symbol-mangling-version=v0`. Optional values are:
1027+
`=all` (implicit value)
1028+
`=except-unused-generics`
1029+
`=except-unused-functions`
1030+
`=off` (default)"),
10241031
link_arg: (/* redirected to link_args */) = ((), parse_string_push, [UNTRACKED],
10251032
"a single extra argument to append to the linker invocation (can be used several times)"),
10261033
link_args: Vec<String> = (Vec::new(), parse_list, [UNTRACKED],

config.toml.example

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ changelog-seen = 2
289289
#sanitizers = false
290290

291291
# Build the profiler runtime (required when compiling with options that depend
292-
# on this runtime, such as `-C profile-generate` or `-Z instrument-coverage`).
292+
# on this runtime, such as `-C profile-generate` or `-C instrument-coverage`).
293293
#profiler = false
294294

295295
# Indicates whether the native libraries linked into Cargo will be statically
@@ -671,7 +671,7 @@ changelog-seen = 2
671671
#sanitizers = build.sanitizers (bool)
672672

673673
# Build the profiler runtime for this target(required when compiling with options that depend
674-
# on this runtime, such as `-C profile-generate` or `-Z instrument-coverage`).
674+
# on this runtime, such as `-C profile-generate` or `-C instrument-coverage`).
675675
# This option will override the same option under [build] section.
676676
#profiler = build.profiler (bool)
677677

src/doc/rustc/src/SUMMARY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
- [Custom Targets](targets/custom.md)
2424
- [Known Issues](targets/known-issues.md)
2525
- [Profile-guided Optimization](profile-guided-optimization.md)
26+
- [Instrumentation-based Code Coverage](instrument-coverage.md)
2627
- [Linker-plugin based LTO](linker-plugin-lto.md)
2728
- [Exploit Mitigations](exploit-mitigations.md)
2829
- [Contributing to `rustc`](contributing.md)

src/doc/rustc/src/codegen-options/index.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,11 @@ The default depends on the [opt-level](#opt-level):
177177
| s | 75 |
178178
| z | 25 |
179179

180+
## instrument-coverage
181+
182+
This option enables instrumentation-based code coverage support. See the
183+
chapter on [instrumentation-based code coverage] for more information.
184+
180185
## link-arg
181186

182187
This flag lets you append a single extra argument to the linker invocation.
@@ -597,5 +602,6 @@ effective only for x86 targets.
597602

598603
[option-emit]: ../command-line-arguments.md#option-emit
599604
[option-o-optimize]: ../command-line-arguments.md#option-o-optimize
605+
[instrumentation-based code coverage]: ../instrument-coverage.md
600606
[profile-guided optimization]: ../profile-guided-optimization.md
601607
[option-g-debug]: ../command-line-arguments.md#option-g-debug

0 commit comments

Comments
 (0)