about summary refs log tree commit diff
path: root/compiler/rustc_codegen_ssa/src/mir/coverageinfo.rs
blob: a2ad27b925c3472de89a43b9b2e074572842b51a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use crate::traits::*;

use rustc_middle::mir::coverage::*;
use rustc_middle::mir::Coverage;

use super::FunctionCx;

impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
    pub fn codegen_coverage(&self, bx: &mut Bx, coverage: Coverage) {
        let Coverage { kind, code_region } = coverage;
        match kind {
            CoverageKind::Counter { function_source_hash, id } => {
                bx.add_counter_region(self.instance, function_source_hash, id, code_region);

                let coverageinfo = bx.tcx().coverageinfo(self.instance.def_id());

                let fn_name = bx.create_pgo_func_name_var(self.instance);
                let hash = bx.const_u64(function_source_hash);
                let num_counters = bx.const_u32(coverageinfo.num_counters);
                let id = bx.const_u32(u32::from(id));
                debug!(
                    "codegen intrinsic instrprof.increment(fn_name={:?}, hash={:?}, num_counters={:?}, index={:?})",
                    fn_name, hash, num_counters, id,
                );
                bx.instrprof_increment(fn_name, hash, num_counters, id);
            }
            CoverageKind::Expression { id, lhs, op, rhs } => {
                bx.add_counter_expression_region(self.instance, id, lhs, op, rhs, code_region);
            }
            CoverageKind::Unreachable => {
                bx.add_unreachable_region(self.instance, code_region);
            }
        }
    }
}