Skip to content

Commit 1d280b0

Browse files
committed
Don't directly expose coverage::CounterMappingRegion via FFI
The definition of this struct changes in LLVM 12 due to the addition of branch coverage support. To avoid future mismatches, declare our own struct and then convert between them.
1 parent b763d9a commit 1d280b0

File tree

3 files changed

+26
-8
lines changed

3 files changed

+26
-8
lines changed

compiler/rustc_codegen_llvm/src/coverageinfo/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ pub(crate) fn write_filenames_section_to_buffer<'a>(
162162
pub(crate) fn write_mapping_to_buffer(
163163
virtual_file_mapping: Vec<u32>,
164164
expressions: Vec<CounterExpression>,
165-
mut mapping_regions: Vec<CounterMappingRegion>,
165+
mapping_regions: Vec<CounterMappingRegion>,
166166
buffer: &RustString,
167167
) {
168168
unsafe {
@@ -171,7 +171,7 @@ pub(crate) fn write_mapping_to_buffer(
171171
virtual_file_mapping.len() as c_uint,
172172
expressions.as_ptr(),
173173
expressions.len() as c_uint,
174-
mapping_regions.as_mut_ptr(),
174+
mapping_regions.as_ptr(),
175175
mapping_regions.len() as c_uint,
176176
buffer,
177177
);

compiler/rustc_codegen_llvm/src/llvm/ffi.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -676,9 +676,7 @@ pub mod coverageinfo {
676676
/// array", encoded separately), and source location (start and end positions of the represented
677677
/// code region).
678678
///
679-
/// Aligns with [llvm::coverage::CounterMappingRegion](https://github.com/rust-lang/llvm-project/blob/rustc/11.0-2020-10-12/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h#L224-L227)
680-
/// Important: The Rust struct layout (order and types of fields) must match its C++
681-
/// counterpart.
679+
/// Matches LLVMRustCounterMappingRegion.
682680
#[derive(Copy, Clone, Debug)]
683681
#[repr(C)]
684682
pub struct CounterMappingRegion {
@@ -1796,7 +1794,7 @@ extern "C" {
17961794
NumVirtualFileMappingIDs: c_uint,
17971795
Expressions: *const coverage_map::CounterExpression,
17981796
NumExpressions: c_uint,
1799-
MappingRegions: *mut coverageinfo::CounterMappingRegion,
1797+
MappingRegions: *const coverageinfo::CounterMappingRegion,
18001798
NumMappingRegions: c_uint,
18011799
BufferOut: &RustString,
18021800
);

compiler/rustc_llvm/llvm-wrapper/CoverageMappingWrapper.cpp

+22-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,17 @@
88

99
using namespace llvm;
1010

11+
struct LLVMRustCounterMappingRegion {
12+
coverage::Counter Count;
13+
uint32_t FileID;
14+
uint32_t ExpandedFileID;
15+
uint32_t LineStart;
16+
uint32_t ColumnStart;
17+
uint32_t LineEnd;
18+
uint32_t ColumnEnd;
19+
coverage::CounterMappingRegion::RegionKind Kind;
20+
};
21+
1122
extern "C" void LLVMRustCoverageWriteFilenamesSectionToBuffer(
1223
const char* const Filenames[],
1324
size_t FilenamesLen,
@@ -27,13 +38,22 @@ extern "C" void LLVMRustCoverageWriteMappingToBuffer(
2738
unsigned NumVirtualFileMappingIDs,
2839
const coverage::CounterExpression *Expressions,
2940
unsigned NumExpressions,
30-
coverage::CounterMappingRegion *MappingRegions,
41+
LLVMRustCounterMappingRegion *RustMappingRegions,
3142
unsigned NumMappingRegions,
3243
RustStringRef BufferOut) {
44+
// Convert from FFI representation to LLVM representation.
45+
SmallVector<coverage::CounterMappingRegion, 0> MappingRegions;
46+
MappingRegions.reserve(NumMappingRegions);
47+
for (const auto &Region : makeArrayRef(RustMappingRegions, NumMappingRegions)) {
48+
MappingRegions.emplace_back(
49+
Region.Count, Region.FileID, Region.ExpandedFileID,
50+
Region.LineStart, Region.ColumnStart, Region.LineEnd, Region.ColumnEnd,
51+
Region.Kind);
52+
}
3353
auto CoverageMappingWriter = coverage::CoverageMappingWriter(
3454
makeArrayRef(VirtualFileMappingIDs, NumVirtualFileMappingIDs),
3555
makeArrayRef(Expressions, NumExpressions),
36-
makeMutableArrayRef(MappingRegions, NumMappingRegions));
56+
MappingRegions);
3757
RawRustStringOstream OS(BufferOut);
3858
CoverageMappingWriter.write(OS);
3959
}

0 commit comments

Comments
 (0)