| /// Must match the layout of `LLVMRustCounterKind`. | |
| #[derive(Copy, Clone, Debug)] | |
| #[repr(C)] | |
| pub(crate) enum CounterKind { | |
| Zero = 0, | |
| CounterValueReference = 1, | |
| Expression = 2, | |
| } | |
| /// A reference to an instance of an abstract "counter" that will yield a value in a coverage | |
| /// report. Note that `id` has different interpretations, depending on the `kind`: | |
| /// * For `CounterKind::Zero`, `id` is assumed to be `0` | |
| /// * For `CounterKind::CounterValueReference`, `id` matches the `counter_id` of the injected | |
| /// instrumentation counter (the `index` argument to the LLVM intrinsic | |
| /// `instrprof.increment()`) | |
| /// * For `CounterKind::Expression`, `id` is the index into the coverage map's array of | |
| /// counter expressions. | |
| /// | |
| /// Corresponds to struct `llvm::coverage::Counter`. | |
| /// | |
| /// Must match the layout of `LLVMRustCounter`. | |
| #[derive(Copy, Clone, Debug)] | |
| #[repr(C)] | |
| pub(crate) struct Counter { | |
| // Important: The layout (order and types of fields) must match its C++ counterpart. | |
| pub(crate) kind: CounterKind, | |
| pub(crate) id: u32, | |
| } | |
| impl Counter { | |
| /// A `Counter` of kind `Zero`. For this counter kind, the `id` is not used. | |
| pub(crate) const ZERO: Self = Self { kind: CounterKind::Zero, id: 0 }; | |
| } | |
| /// Corresponds to enum `llvm::coverage::CounterExpression::ExprKind`. | |
| /// | |
| /// Must match the layout of `LLVMRustCounterExprKind`. | |
| #[derive(Copy, Clone, Debug)] | |
| #[repr(C)] | |
| pub(crate) enum ExprKind { | |
| Subtract = 0, | |
| Add = 1, | |
| } | |
| /// Corresponds to struct `llvm::coverage::CounterExpression`. | |
| /// | |
| /// Must match the layout of `LLVMRustCounterExpression`. | |
| #[derive(Copy, Clone, Debug)] | |
| #[repr(C)] | |
| pub(crate) struct CounterExpression { | |
| pub(crate) kind: ExprKind, | |
| pub(crate) lhs: Counter, | |
| pub(crate) rhs: Counter, | |
| } | |
| /// A span of source code coordinates to be embedded in coverage metadata. | |
| /// | |
| /// Must match the layout of `LLVMRustCoverageSpan`. | |
| #[derive(Clone, Debug)] | |
| #[repr(C)] | |
| pub(crate) struct CoverageSpan { | |
| /// Local index into the function's local-to-global file ID table. | |
| /// The value at that index is itself an index into the coverage filename | |
| /// table in the CGU's `__llvm_covmap` section. | |
| pub(crate) file_id: u32, | |
| /// 1-based starting line of the source code span. | |
| pub(crate) start_line: u32, | |
| /// 1-based starting column of the source code span. | |
| pub(crate) start_col: u32, | |
| /// 1-based ending line of the source code span. | |
| pub(crate) end_line: u32, | |
| /// 1-based ending column of the source code span. High bit must be unset. | |
| pub(crate) end_col: u32, | |
| } | |
| /// Must match the layout of `LLVMRustCoverageCodeRegion`. | |
| #[derive(Clone, Debug)] | |
| #[repr(C)] | |
| pub(crate) struct CodeRegion { | |
| pub(crate) cov_span: CoverageSpan, | |
| pub(crate) counter: Counter, | |
| } | |
| /// Must match the layout of `LLVMRustCoverageExpansionRegion`. | |
| #[derive(Clone, Debug)] | |
| #[repr(C)] | |
| pub(crate) struct ExpansionRegion { | |
| pub(crate) cov_span: CoverageSpan, | |
| pub(crate) expanded_file_id: u32, | |
| } | |
| /// Must match the layout of `LLVMRustCoverageBranchRegion`. | |
| #[derive(Clone, Debug)] | |
| #[repr(C)] | |
| pub(crate) struct BranchRegion { | |
| pub(crate) cov_span: CoverageSpan, | |
| pub(crate) true_counter: Counter, | |
| pub(crate) false_counter: Counter, | |
| } |