use gccjit::RValue; use rustc_codegen_ssa::traits::{CoverageInfoBuilderMethods, CoverageInfoMethods}; use rustc_hir::def_id::DefId; use rustc_middle::mir::coverage::{ CodeRegion, CounterValueReference, ExpressionOperandId, InjectedExpressionId, Op, }; use rustc_middle::ty::Instance; use crate::builder::Builder; use crate::context::CodegenCx; impl<'a, 'gcc, 'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tcx> { fn set_function_source_hash( &mut self, _instance: Instance<'tcx>, _function_source_hash: u64, ) -> bool { unimplemented!(); } fn add_coverage_counter(&mut self, _instance: Instance<'tcx>, _id: CounterValueReference, _region: CodeRegion) -> bool { // TODO(antoyo) false } fn add_coverage_counter_expression(&mut self, _instance: Instance<'tcx>, _id: InjectedExpressionId, _lhs: ExpressionOperandId, _op: Op, _rhs: ExpressionOperandId, _region: Option) -> bool { // TODO(antoyo) false } fn add_coverage_unreachable(&mut self, _instance: Instance<'tcx>, _region: CodeRegion) -> bool { // TODO(antoyo) false } } impl<'gcc, 'tcx> CoverageInfoMethods<'tcx> for CodegenCx<'gcc, 'tcx> { fn coverageinfo_finalize(&self) { // TODO(antoyo) } fn get_pgo_func_name_var(&self, _instance: Instance<'tcx>) -> RValue<'gcc> { unimplemented!(); } /// Functions with MIR-based coverage are normally codegenned _only_ if /// called. LLVM coverage tools typically expect every function to be /// defined (even if unused), with at least one call to LLVM intrinsic /// `instrprof.increment`. /// /// Codegen a small function that will never be called, with one counter /// that will never be incremented. /// /// For used/called functions, the coverageinfo was already added to the /// `function_coverage_map` (keyed by function `Instance`) during codegen. /// But in this case, since the unused function was _not_ previously /// codegenned, collect the coverage `CodeRegion`s from the MIR and add /// them. The first `CodeRegion` is used to add a single counter, with the /// same counter ID used in the injected `instrprof.increment` intrinsic /// call. Since the function is never called, all other `CodeRegion`s can be /// added as `unreachable_region`s. fn define_unused_fn(&self, _def_id: DefId) { unimplemented!(); } }