Rollup merge of #111382 - Zalathar:ffi, r=cuviper
Isolate coverage FFI type layouts from their underlying LLVM C++ types I noticed that several of the types used to send coverage information through FFI are not properly isolated from the layout of their corresponding C++ types in the LLVM API. This PR adds more explicitly-defined FFI struct/enum types in `CoverageMappingWrapper.cpp`, so that Rust source files in `rustc_codegen_ssa` and `rustc_codegen_llvm` aren't directly exposed to LLVM C++ types.
This commit is contained in:
commit
39761b0cf9
3 changed files with 118 additions and 17 deletions
|
@ -1,6 +1,6 @@
|
|||
use rustc_middle::mir::coverage::{CounterValueReference, MappedExpressionIndex};
|
||||
|
||||
/// Aligns with [llvm::coverage::Counter::CounterKind](https://github.com/rust-lang/llvm-project/blob/rustc/13.0-2021-09-30/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h#L95)
|
||||
/// Must match the layout of `LLVMRustCounterKind`.
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
#[repr(C)]
|
||||
pub enum CounterKind {
|
||||
|
@ -17,8 +17,10 @@ pub enum CounterKind {
|
|||
/// `instrprof.increment()`)
|
||||
/// * For `CounterKind::Expression`, `id` is the index into the coverage map's array of
|
||||
/// counter expressions.
|
||||
/// Aligns with [llvm::coverage::Counter](https://github.com/rust-lang/llvm-project/blob/rustc/13.0-2021-09-30/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h#L102-L103)
|
||||
/// Important: The Rust struct layout (order and types of fields) must match its C++ counterpart.
|
||||
///
|
||||
/// Corresponds to struct `llvm::coverage::Counter`.
|
||||
///
|
||||
/// Must match the layout of `LLVMRustCounter`.
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
#[repr(C)]
|
||||
pub struct Counter {
|
||||
|
@ -59,7 +61,9 @@ impl Counter {
|
|||
}
|
||||
}
|
||||
|
||||
/// Aligns with [llvm::coverage::CounterExpression::ExprKind](https://github.com/rust-lang/llvm-project/blob/rustc/13.0-2021-09-30/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h#L150)
|
||||
/// Corresponds to enum `llvm::coverage::CounterExpression::ExprKind`.
|
||||
///
|
||||
/// Must match the layout of `LLVMRustCounterExprKind`.
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
#[repr(C)]
|
||||
pub enum ExprKind {
|
||||
|
@ -67,9 +71,9 @@ pub enum ExprKind {
|
|||
Add = 1,
|
||||
}
|
||||
|
||||
/// Aligns with [llvm::coverage::CounterExpression](https://github.com/rust-lang/llvm-project/blob/rustc/13.0-2021-09-30/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h#L151-L152)
|
||||
/// Important: The Rust struct layout (order and types of fields) must match its C++
|
||||
/// counterpart.
|
||||
/// Corresponds to struct `llvm::coverage::CounterExpression`.
|
||||
///
|
||||
/// Must match the layout of `LLVMRustCounterExpression`.
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
#[repr(C)]
|
||||
pub struct CounterExpression {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue