Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit eda7820

Browse files
committedMar 20, 2025
Auto merge of rust-lang#138747 - matthiaskrgr:rollup-68x44rw, r=matthiaskrgr
Rollup of 8 pull requests Successful merges: - rust-lang#138435 (Add support for postfix yield expressions) - rust-lang#138685 (Use `Option<Ident>` for lowered param names.) - rust-lang#138700 (Suggest `-Whelp` when pass `--print lints` to rustc) - rust-lang#138727 (Do not rely on `type_var_origin` in `OrphanCheckErr::NonLocalInputType`) - rust-lang#138729 (Clean up `FnCtxt::resolve_coroutine_interiors`) - rust-lang#138731 (coverage: Add LLVM plumbing for expansion regions) - rust-lang#138732 (Use `def_path_str` for def id arg in `UnsupportedOpInfo`) - rust-lang#138735 (Remove `llvm` and `llvms` triagebot ping aliases for `icebreakers-llvm` ping group) r? `@ghost` `@rustbot` modify labels: rollup
2 parents 78948ac + b79f816 commit eda7820

File tree

62 files changed

+499
-240
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+499
-240
lines changed
 

‎compiler/rustc_codegen_llvm/src/coverageinfo/llvm_cov.rs

+14-2
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,18 @@ pub(crate) fn write_function_mappings_to_buffer(
6363
expressions: &[ffi::CounterExpression],
6464
regions: &ffi::Regions,
6565
) -> Vec<u8> {
66-
let ffi::Regions { code_regions, branch_regions, mcdc_branch_regions, mcdc_decision_regions } =
67-
regions;
66+
let ffi::Regions {
67+
code_regions,
68+
expansion_regions,
69+
branch_regions,
70+
mcdc_branch_regions,
71+
mcdc_decision_regions,
72+
} = regions;
73+
74+
// SAFETY:
75+
// - All types are FFI-compatible and have matching representations in Rust/C++.
76+
// - For pointer/length pairs, the pointer and length come from the same vector or slice.
77+
// - C++ code does not retain any pointers after the call returns.
6878
llvm::build_byte_buffer(|buffer| unsafe {
6979
llvm::LLVMRustCoverageWriteFunctionMappingsToBuffer(
7080
virtual_file_mapping.as_ptr(),
@@ -73,6 +83,8 @@ pub(crate) fn write_function_mappings_to_buffer(
7383
expressions.len(),
7484
code_regions.as_ptr(),
7585
code_regions.len(),
86+
expansion_regions.as_ptr(),
87+
expansion_regions.len(),
7688
branch_regions.as_ptr(),
7789
branch_regions.len(),
7890
mcdc_branch_regions.as_ptr(),

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

+17-16
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,22 @@ fn fill_region_tables<'tcx>(
120120
// Associate that global file ID with a local file ID for this function.
121121
let local_file_id = covfun.virtual_file_mapping.local_id_for_global(global_file_id);
122122

123-
let ffi::Regions { code_regions, branch_regions, mcdc_branch_regions, mcdc_decision_regions } =
124-
&mut covfun.regions;
125-
126-
let make_cov_span =
127-
|span: Span| spans::make_coverage_span(local_file_id, source_map, &source_file, span);
123+
// In rare cases, _all_ of a function's spans are discarded, and coverage
124+
// codegen needs to handle that gracefully to avoid #133606.
125+
// It's hard for tests to trigger this organically, so instead we set
126+
// `-Zcoverage-options=discard-all-spans-in-codegen` to force it to occur.
128127
let discard_all = tcx.sess.coverage_discard_all_spans_in_codegen();
128+
let make_coords = |span: Span| {
129+
if discard_all { None } else { spans::make_coords(source_map, &source_file, span) }
130+
};
131+
132+
let ffi::Regions {
133+
code_regions,
134+
expansion_regions: _, // FIXME(Zalathar): Fill out support for expansion regions
135+
branch_regions,
136+
mcdc_branch_regions,
137+
mcdc_decision_regions,
138+
} = &mut covfun.regions;
129139

130140
// For each counter/region pair in this function+file, convert it to a
131141
// form suitable for FFI.
@@ -140,17 +150,8 @@ fn fill_region_tables<'tcx>(
140150
ffi::Counter::from_term(term)
141151
};
142152

143-
// Convert the `Span` into coordinates that we can pass to LLVM, or
144-
// discard the span if conversion fails. In rare, cases _all_ of a
145-
// function's spans are discarded, and the rest of coverage codegen
146-
// needs to handle that gracefully to avoid a repeat of #133606.
147-
// We don't have a good test case for triggering that organically, so
148-
// instead we set `-Zcoverage-options=discard-all-spans-in-codegen`
149-
// to force it to occur.
150-
let Some(cov_span) = make_cov_span(span) else { continue };
151-
if discard_all {
152-
continue;
153-
}
153+
let Some(coords) = make_coords(span) else { continue };
154+
let cov_span = coords.make_coverage_span(local_file_id);
154155

155156
match *kind {
156157
MappingKind::Code { bcb } => {
There was a problem loading the remainder of the diff.

0 commit comments

Comments
 (0)
Failed to load comments.