Skip to content

Commit c1bb8fd

Browse files
author
zhuyunxing
committed
coverage. Let MCDC ConditionId start from 0 to keep with llvm 19
1 parent 89b8017 commit c1bb8fd

File tree

3 files changed

+30
-34
lines changed
  • compiler

3 files changed

+30
-34
lines changed

compiler/rustc_codegen_llvm/src/coverageinfo/ffi.rs

+7-6
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ pub enum RegionKind {
111111
}
112112

113113
pub mod mcdc {
114-
use rustc_middle::mir::coverage::{ConditionInfo, DecisionInfo};
114+
use rustc_middle::mir::coverage::{ConditionId, ConditionInfo, DecisionInfo};
115115

116116
/// Must match the layout of `LLVMRustMCDCDecisionParameters`.
117117
#[repr(C)]
@@ -166,12 +166,13 @@ pub mod mcdc {
166166

167167
impl From<ConditionInfo> for BranchParameters {
168168
fn from(value: ConditionInfo) -> Self {
169+
let to_llvm_cond_id = |cond_id: Option<ConditionId>| {
170+
cond_id.and_then(|id| LLVMConditionId::try_from(id.as_usize()).ok()).unwrap_or(-1)
171+
};
172+
let ConditionInfo { condition_id, true_next_id, false_next_id } = value;
169173
Self {
170-
condition_id: value.condition_id.as_u32() as LLVMConditionId,
171-
condition_ids: [
172-
value.false_next_id.as_u32() as LLVMConditionId,
173-
value.true_next_id.as_u32() as LLVMConditionId,
174-
],
174+
condition_id: to_llvm_cond_id(Some(condition_id)),
175+
condition_ids: [to_llvm_cond_id(false_next_id), to_llvm_cond_id(true_next_id)],
175176
}
176177
}
177178
}

compiler/rustc_middle/src/mir/coverage.rs

+3-13
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ rustc_index::newtype_index! {
7575
}
7676

7777
impl ConditionId {
78-
pub const NONE: Self = Self::from_u32(0);
78+
pub const START: Self = Self::from_usize(0);
7979
}
8080

8181
/// Enum that can hold a constant zero value, the ID of an physical coverage
@@ -307,18 +307,8 @@ pub struct BranchSpan {
307307
#[derive(TyEncodable, TyDecodable, Hash, HashStable, TypeFoldable, TypeVisitable)]
308308
pub struct ConditionInfo {
309309
pub condition_id: ConditionId,
310-
pub true_next_id: ConditionId,
311-
pub false_next_id: ConditionId,
312-
}
313-
314-
impl Default for ConditionInfo {
315-
fn default() -> Self {
316-
Self {
317-
condition_id: ConditionId::NONE,
318-
true_next_id: ConditionId::NONE,
319-
false_next_id: ConditionId::NONE,
320-
}
321-
}
310+
pub true_next_id: Option<ConditionId>,
311+
pub false_next_id: Option<ConditionId>,
322312
}
323313

324314
#[derive(Clone, Debug)]

compiler/rustc_mir_build/src/build/coverageinfo/mcdc.rs

+20-15
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,9 @@ impl BooleanDecisionCtx {
4949
}
5050

5151
fn next_condition_id(&mut self) -> ConditionId {
52+
let id = ConditionId::from_usize(self.condition_id_counter);
5253
self.condition_id_counter += 1;
53-
ConditionId::from_usize(self.condition_id_counter)
54+
id
5455
}
5556

5657
// At first we assign ConditionIds for each sub expression.
@@ -94,20 +95,23 @@ impl BooleanDecisionCtx {
9495
// - If the op is AND, the "false_next" of LHS and RHS should be the parent's "false_next". While "true_next" of the LHS is the RHS, the "true next" of RHS is the parent's "true_next".
9596
// - If the op is OR, the "true_next" of LHS and RHS should be the parent's "true_next". While "false_next" of the LHS is the RHS, the "false next" of RHS is the parent's "false_next".
9697
fn record_conditions(&mut self, op: LogicalOp) {
97-
let parent_condition = self.decision_stack.pop_back().unwrap_or_default();
98-
let lhs_id = if parent_condition.condition_id == ConditionId::NONE {
99-
ConditionId::from(self.next_condition_id())
100-
} else {
101-
parent_condition.condition_id
98+
let parent_condition = match self.decision_stack.pop_back() {
99+
Some(info) => info,
100+
None => ConditionInfo {
101+
condition_id: self.next_condition_id(),
102+
true_next_id: None,
103+
false_next_id: None,
104+
},
102105
};
106+
let lhs_id = parent_condition.condition_id;
103107

104108
let rhs_condition_id = self.next_condition_id();
105109

106110
let (lhs, rhs) = match op {
107111
LogicalOp::And => {
108112
let lhs = ConditionInfo {
109113
condition_id: lhs_id,
110-
true_next_id: rhs_condition_id,
114+
true_next_id: Some(rhs_condition_id),
111115
false_next_id: parent_condition.false_next_id,
112116
};
113117
let rhs = ConditionInfo {
@@ -121,7 +125,7 @@ impl BooleanDecisionCtx {
121125
let lhs = ConditionInfo {
122126
condition_id: lhs_id,
123127
true_next_id: parent_condition.true_next_id,
124-
false_next_id: rhs_condition_id,
128+
false_next_id: Some(rhs_condition_id),
125129
};
126130
let rhs = ConditionInfo {
127131
condition_id: rhs_condition_id,
@@ -142,11 +146,15 @@ impl BooleanDecisionCtx {
142146
true_marker: BlockMarkerId,
143147
false_marker: BlockMarkerId,
144148
) {
145-
let condition_info = self.decision_stack.pop_back().unwrap_or_default();
146-
if condition_info.true_next_id == ConditionId::NONE {
149+
let condition_info = self.decision_stack.pop_back().unwrap_or(ConditionInfo {
150+
condition_id: ConditionId::START,
151+
true_next_id: None,
152+
false_next_id: None,
153+
});
154+
if condition_info.true_next_id.is_none() {
147155
self.decision_info.end_markers.push(true_marker);
148156
}
149-
if condition_info.false_next_id == ConditionId::NONE {
157+
if condition_info.false_next_id.is_none() {
150158
self.decision_info.end_markers.push(false_marker);
151159
}
152160

@@ -297,10 +305,7 @@ impl MCDCInfoBuilder {
297305
ctx
298306
}
299307

300-
fn append_normal_branches(&mut self, mut branches: Vec<MCDCBranchSpan>) {
301-
branches
302-
.iter_mut()
303-
.for_each(|branch| branch.condition_info.condition_id = ConditionId::NONE);
308+
fn append_normal_branches(&mut self, branches: Vec<MCDCBranchSpan>) {
304309
self.normal_branch_spans.extend(branches);
305310
}
306311

0 commit comments

Comments
 (0)