Skip to content

Commit cd2b978

Browse files
committed
coverage: Don't refer to the body span when enlarging empty spans
Given that we now only enlarge empty spans to "{" or "}", there shouldn't be any danger of enlarging beyond a function body.
1 parent 259fdb5 commit cd2b978

File tree

2 files changed

+9
-26
lines changed

2 files changed

+9
-26
lines changed

compiler/rustc_codegen_llvm/src/coverageinfo/mapgen/covfun.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,8 @@ fn fill_region_tables<'tcx>(
118118
let ffi::Regions { code_regions, branch_regions, mcdc_branch_regions, mcdc_decision_regions } =
119119
&mut covfun.regions;
120120

121-
let make_cov_span = |span: Span| {
122-
spans::make_coverage_span(local_file_id, source_map, fn_cov_info, &source_file, span)
123-
};
121+
let make_cov_span =
122+
|span: Span| spans::make_coverage_span(local_file_id, source_map, &source_file, span);
124123
let discard_all = tcx.sess.coverage_discard_all_spans_in_codegen();
125124

126125
// For each counter/region pair in this function+file, convert it to a

compiler/rustc_codegen_llvm/src/coverageinfo/mapgen/spans.rs

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use rustc_middle::mir::coverage::FunctionCoverageInfo;
21
use rustc_span::source_map::SourceMap;
32
use rustc_span::{BytePos, Pos, SourceFile, Span};
43
use tracing::debug;
@@ -19,11 +18,10 @@ use crate::coverageinfo::mapgen::LocalFileId;
1918
pub(crate) fn make_coverage_span(
2019
file_id: LocalFileId,
2120
source_map: &SourceMap,
22-
fn_cov_info: &FunctionCoverageInfo,
2321
file: &SourceFile,
2422
span: Span,
2523
) -> Option<ffi::CoverageSpan> {
26-
let span = ensure_non_empty_span(source_map, fn_cov_info, span)?;
24+
let span = ensure_non_empty_span(source_map, span)?;
2725

2826
let lo = span.lo();
2927
let hi = span.hi();
@@ -55,36 +53,22 @@ pub(crate) fn make_coverage_span(
5553
})
5654
}
5755

58-
fn ensure_non_empty_span(
59-
source_map: &SourceMap,
60-
fn_cov_info: &FunctionCoverageInfo,
61-
span: Span,
62-
) -> Option<Span> {
56+
fn ensure_non_empty_span(source_map: &SourceMap, span: Span) -> Option<Span> {
6357
if !span.is_empty() {
6458
return Some(span);
6559
}
6660

67-
let lo = span.lo();
68-
let hi = span.hi();
69-
70-
// The span is empty, so try to expand it to cover an adjacent '{' or '}',
71-
// but only within the bounds of the body span.
72-
let try_next = hi < fn_cov_info.body_span.hi();
73-
let try_prev = fn_cov_info.body_span.lo() < lo;
74-
if !(try_next || try_prev) {
75-
return None;
76-
}
77-
61+
// The span is empty, so try to enlarge it to cover an adjacent '{' or '}'.
7862
source_map
7963
.span_to_source(span, |src, start, end| try {
8064
// Adjusting span endpoints by `BytePos(1)` is normally a bug,
8165
// but in this case we have specifically checked that the character
8266
// we're skipping over is one of two specific ASCII characters, so
8367
// adjusting by exactly 1 byte is correct.
84-
if try_next && src.as_bytes()[end] == b'{' {
85-
Some(span.with_hi(hi + BytePos(1)))
86-
} else if try_prev && src.as_bytes()[start - 1] == b'}' {
87-
Some(span.with_lo(lo - BytePos(1)))
68+
if src.as_bytes().get(end).copied() == Some(b'{') {
69+
Some(span.with_hi(span.hi() + BytePos(1)))
70+
} else if start > 0 && src.as_bytes()[start - 1] == b'}' {
71+
Some(span.with_lo(span.lo() - BytePos(1)))
8872
} else {
8973
None
9074
}

0 commit comments

Comments
 (0)