Skip to content

Commit 08f0d64

Browse files
committed
coverage. Fix that instances with no mcdc statements still initialize mcdc parameters
1 parent a772336 commit 08f0d64

File tree

1 file changed

+16
-3
lines changed
  • compiler/rustc_codegen_llvm/src/coverageinfo

1 file changed

+16
-3
lines changed

Diff for: compiler/rustc_codegen_llvm/src/coverageinfo/mod.rs

+16-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use rustc_data_structures::fx::{FxHashMap, FxIndexMap};
99
use rustc_llvm::RustString;
1010
use rustc_middle::bug;
1111
use rustc_middle::mir::coverage::CoverageKind;
12+
use rustc_middle::mir::{Statement, StatementKind};
1213
use rustc_middle::ty::Instance;
1314
use rustc_middle::ty::layout::HasTyCtxt;
1415
use rustc_target::abi::{Align, Size};
@@ -91,9 +92,8 @@ impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> {
9192

9293
impl<'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'_, '_, 'tcx> {
9394
fn init_coverage(&mut self, instance: Instance<'tcx>) {
94-
let Some(function_coverage_info) =
95-
self.tcx.instance_mir(instance.def).function_coverage_info.as_deref()
96-
else {
95+
let mir_body = self.tcx.instance_mir(instance.def);
96+
let Some(function_coverage_info) = mir_body.function_coverage_info.as_deref() else {
9797
return;
9898
};
9999

@@ -102,6 +102,19 @@ impl<'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'_, '_, 'tcx> {
102102
return;
103103
}
104104

105+
let is_mcdc_statement = |statement: &Statement<'_>| {
106+
let StatementKind::Coverage(cov_kind) = &statement.kind else {
107+
return false;
108+
};
109+
matches!(cov_kind, CoverageKind::CounterIncrement { .. })
110+
};
111+
// Some instances like `DropGlue` clone mir body from others and modified the basic blocks after coverage pass.
112+
// Such instances might have same `function_coverage_info` as the primary but have no associated coverage statement.
113+
// Ignore these instances here.
114+
if !mir_body.basic_blocks.iter().map(|bb| &bb.statements).flatten().any(is_mcdc_statement) {
115+
return;
116+
}
117+
105118
let fn_name = self.get_pgo_func_name_var(instance);
106119
let hash = self.const_u64(function_coverage_info.function_source_hash);
107120
let bitmap_bytes = self.const_u32(function_coverage_info.mcdc_bitmap_bytes);

0 commit comments

Comments
 (0)