Skip to content

Commit 6dda56a

Browse files
author
zhuyunxing
committed
coverage. MCDC ConditionId start from 0 to keep with llvm 19
1 parent 91e0d6d commit 6dda56a

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
@@ -76,7 +76,7 @@ rustc_index::newtype_index! {
7676
}
7777

7878
impl ConditionId {
79-
pub const NONE: Self = Self::from_u32(0);
79+
pub const START: Self = Self::from_usize(0);
8080
}
8181

8282
/// Enum that can hold a constant zero value, the ID of an physical coverage
@@ -315,18 +315,8 @@ pub struct BranchSpan {
315315
#[derive(TyEncodable, TyDecodable, Hash, HashStable, TypeFoldable, TypeVisitable)]
316316
pub struct ConditionInfo {
317317
pub condition_id: ConditionId,
318-
pub true_next_id: ConditionId,
319-
pub false_next_id: ConditionId,
320-
}
321-
322-
impl Default for ConditionInfo {
323-
fn default() -> Self {
324-
Self {
325-
condition_id: ConditionId::NONE,
326-
true_next_id: ConditionId::NONE,
327-
false_next_id: ConditionId::NONE,
328-
}
329-
}
318+
pub true_next_id: Option<ConditionId>,
319+
pub false_next_id: Option<ConditionId>,
330320
}
331321

332322
#[derive(Clone, Debug)]

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

+20-15
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,9 @@ impl BooleanDecisionCtx {
4646
}
4747

4848
fn next_condition_id(&mut self) -> ConditionId {
49+
let id = ConditionId::from_usize(self.condition_id_counter);
4950
self.condition_id_counter += 1;
50-
ConditionId::from_usize(self.condition_id_counter)
51+
id
5152
}
5253

5354
// At first we assign ConditionIds for each sub expression.
@@ -91,20 +92,23 @@ impl BooleanDecisionCtx {
9192
// - 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".
9293
// - 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".
9394
fn record_conditions(&mut self, op: LogicalOp) {
94-
let parent_condition = self.decision_stack.pop_back().unwrap_or_default();
95-
let lhs_id = if parent_condition.condition_id == ConditionId::NONE {
96-
ConditionId::from(self.next_condition_id())
97-
} else {
98-
parent_condition.condition_id
95+
let parent_condition = match self.decision_stack.pop_back() {
96+
Some(info) => info,
97+
None => ConditionInfo {
98+
condition_id: self.next_condition_id(),
99+
true_next_id: None,
100+
false_next_id: None,
101+
},
99102
};
103+
let lhs_id = parent_condition.condition_id;
100104

101105
let rhs_condition_id = self.next_condition_id();
102106

103107
let (lhs, rhs) = match op {
104108
LogicalOp::And => {
105109
let lhs = ConditionInfo {
106110
condition_id: lhs_id,
107-
true_next_id: rhs_condition_id,
111+
true_next_id: Some(rhs_condition_id),
108112
false_next_id: parent_condition.false_next_id,
109113
};
110114
let rhs = ConditionInfo {
@@ -118,7 +122,7 @@ impl BooleanDecisionCtx {
118122
let lhs = ConditionInfo {
119123
condition_id: lhs_id,
120124
true_next_id: parent_condition.true_next_id,
121-
false_next_id: rhs_condition_id,
125+
false_next_id: Some(rhs_condition_id),
122126
};
123127
let rhs = ConditionInfo {
124128
condition_id: rhs_condition_id,
@@ -139,11 +143,15 @@ impl BooleanDecisionCtx {
139143
true_marker: BlockMarkerId,
140144
false_marker: BlockMarkerId,
141145
) {
142-
let condition_info = self.decision_stack.pop_back().unwrap_or_default();
143-
if condition_info.true_next_id == ConditionId::NONE {
146+
let condition_info = self.decision_stack.pop_back().unwrap_or(ConditionInfo {
147+
condition_id: ConditionId::START,
148+
true_next_id: None,
149+
false_next_id: None,
150+
});
151+
if condition_info.true_next_id.is_none() {
144152
self.decision_info.end_markers.push(true_marker);
145153
}
146-
if condition_info.false_next_id == ConditionId::NONE {
154+
if condition_info.false_next_id.is_none() {
147155
self.decision_info.end_markers.push(false_marker);
148156
}
149157

@@ -338,10 +346,7 @@ impl MCDCInfoBuilder {
338346
ctx
339347
}
340348

341-
fn append_normal_branches(&mut self, mut branches: Vec<MCDCBranchSpan>) {
342-
branches
343-
.iter_mut()
344-
.for_each(|branch| branch.condition_info.condition_id = ConditionId::NONE);
349+
fn append_normal_branches(&mut self, branches: Vec<MCDCBranchSpan>) {
345350
self.normal_branch_spans.extend(branches);
346351
}
347352

0 commit comments

Comments
 (0)