Remove trait CoverageInfoMethods
, since non-LLVM backends don't need it
These methods are only ever called from within `rustc_codegen_llvm`, so they can just be declared there as well.
This commit is contained in:
parent
4169d0f756
commit
9c430d38cf
5 changed files with 13 additions and 60 deletions
|
@ -1,44 +1,11 @@
|
||||||
use gccjit::RValue;
|
use rustc_codegen_ssa::traits::CoverageInfoBuilderMethods;
|
||||||
use rustc_codegen_ssa::traits::{CoverageInfoBuilderMethods, CoverageInfoMethods};
|
|
||||||
use rustc_hir::def_id::DefId;
|
|
||||||
use rustc_middle::mir::Coverage;
|
use rustc_middle::mir::Coverage;
|
||||||
use rustc_middle::ty::Instance;
|
use rustc_middle::ty::Instance;
|
||||||
|
|
||||||
use crate::builder::Builder;
|
use crate::builder::Builder;
|
||||||
use crate::context::CodegenCx;
|
|
||||||
|
|
||||||
impl<'a, 'gcc, 'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tcx> {
|
impl<'a, 'gcc, 'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tcx> {
|
||||||
fn add_coverage(&mut self, _instance: Instance<'tcx>, _coverage: &Coverage) {
|
fn add_coverage(&mut self, _instance: Instance<'tcx>, _coverage: &Coverage) {
|
||||||
// TODO(antoyo)
|
// TODO(antoyo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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!();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ use crate::llvm;
|
||||||
|
|
||||||
use llvm::coverageinfo::CounterMappingRegion;
|
use llvm::coverageinfo::CounterMappingRegion;
|
||||||
use rustc_codegen_ssa::coverageinfo::map::{Counter, CounterExpression};
|
use rustc_codegen_ssa::coverageinfo::map::{Counter, CounterExpression};
|
||||||
use rustc_codegen_ssa::traits::{ConstMethods, CoverageInfoMethods};
|
use rustc_codegen_ssa::traits::ConstMethods;
|
||||||
use rustc_data_structures::fx::FxIndexSet;
|
use rustc_data_structures::fx::FxIndexSet;
|
||||||
use rustc_hir::def::DefKind;
|
use rustc_hir::def::DefKind;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
|
|
|
@ -8,8 +8,8 @@ use libc::c_uint;
|
||||||
use llvm::coverageinfo::CounterMappingRegion;
|
use llvm::coverageinfo::CounterMappingRegion;
|
||||||
use rustc_codegen_ssa::coverageinfo::map::{CounterExpression, FunctionCoverage};
|
use rustc_codegen_ssa::coverageinfo::map::{CounterExpression, FunctionCoverage};
|
||||||
use rustc_codegen_ssa::traits::{
|
use rustc_codegen_ssa::traits::{
|
||||||
BaseTypeMethods, BuilderMethods, ConstMethods, CoverageInfoBuilderMethods, CoverageInfoMethods,
|
BaseTypeMethods, BuilderMethods, ConstMethods, CoverageInfoBuilderMethods, MiscMethods,
|
||||||
MiscMethods, StaticMethods,
|
StaticMethods,
|
||||||
};
|
};
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
|
@ -54,11 +54,17 @@ impl<'ll, 'tcx> CrateCoverageContext<'ll, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'ll, 'tcx> CoverageInfoMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
// These methods used to be part of trait `CoverageInfoMethods`, which no longer
|
||||||
fn coverageinfo_finalize(&self) {
|
// exists after most coverage code was moved out of SSA.
|
||||||
|
impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> {
|
||||||
|
pub(crate) fn coverageinfo_finalize(&self) {
|
||||||
mapgen::finalize(self)
|
mapgen::finalize(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// For LLVM codegen, returns a function-specific `Value` for a global
|
||||||
|
/// string, to hold the function name passed to LLVM intrinsic
|
||||||
|
/// `instrprof.increment()`. The `Value` is only created once per instance.
|
||||||
|
/// Multiple invocations with the same instance return the same `Value`.
|
||||||
fn get_pgo_func_name_var(&self, instance: Instance<'tcx>) -> &'ll llvm::Value {
|
fn get_pgo_func_name_var(&self, instance: Instance<'tcx>) -> &'ll llvm::Value {
|
||||||
if let Some(coverage_context) = self.coverage_context() {
|
if let Some(coverage_context) = self.coverage_context() {
|
||||||
debug!("getting pgo_func_name_var for instance={:?}", instance);
|
debug!("getting pgo_func_name_var for instance={:?}", instance);
|
||||||
|
|
|
@ -1,25 +1,7 @@
|
||||||
use super::BackendTypes;
|
use super::BackendTypes;
|
||||||
use rustc_hir::def_id::DefId;
|
|
||||||
use rustc_middle::mir::Coverage;
|
use rustc_middle::mir::Coverage;
|
||||||
use rustc_middle::ty::Instance;
|
use rustc_middle::ty::Instance;
|
||||||
|
|
||||||
pub trait CoverageInfoMethods<'tcx>: BackendTypes {
|
|
||||||
fn coverageinfo_finalize(&self);
|
|
||||||
|
|
||||||
/// Codegen a small function that will never be called, with one counter
|
|
||||||
/// that will never be incremented, that gives LLVM coverage tools a
|
|
||||||
/// function definition it needs in order to resolve coverage map references
|
|
||||||
/// to unused functions. This is necessary so unused functions will appear
|
|
||||||
/// as uncovered (coverage execution count `0`) in LLVM coverage reports.
|
|
||||||
fn define_unused_fn(&self, def_id: DefId);
|
|
||||||
|
|
||||||
/// For LLVM codegen, returns a function-specific `Value` for a global
|
|
||||||
/// string, to hold the function name passed to LLVM intrinsic
|
|
||||||
/// `instrprof.increment()`. The `Value` is only created once per instance.
|
|
||||||
/// Multiple invocations with the same instance return the same `Value`.
|
|
||||||
fn get_pgo_func_name_var(&self, instance: Instance<'tcx>) -> Self::Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait CoverageInfoBuilderMethods<'tcx>: BackendTypes {
|
pub trait CoverageInfoBuilderMethods<'tcx>: BackendTypes {
|
||||||
/// Handle the MIR coverage info in a backend-specific way.
|
/// Handle the MIR coverage info in a backend-specific way.
|
||||||
///
|
///
|
||||||
|
|
|
@ -33,7 +33,7 @@ pub use self::asm::{AsmBuilderMethods, AsmMethods, GlobalAsmOperandRef, InlineAs
|
||||||
pub use self::backend::{Backend, BackendTypes, CodegenBackend, ExtraBackendMethods};
|
pub use self::backend::{Backend, BackendTypes, CodegenBackend, ExtraBackendMethods};
|
||||||
pub use self::builder::{BuilderMethods, OverflowOp};
|
pub use self::builder::{BuilderMethods, OverflowOp};
|
||||||
pub use self::consts::ConstMethods;
|
pub use self::consts::ConstMethods;
|
||||||
pub use self::coverageinfo::{CoverageInfoBuilderMethods, CoverageInfoMethods};
|
pub use self::coverageinfo::CoverageInfoBuilderMethods;
|
||||||
pub use self::debuginfo::{DebugInfoBuilderMethods, DebugInfoMethods};
|
pub use self::debuginfo::{DebugInfoBuilderMethods, DebugInfoMethods};
|
||||||
pub use self::declare::PreDefineMethods;
|
pub use self::declare::PreDefineMethods;
|
||||||
pub use self::intrinsic::IntrinsicCallMethods;
|
pub use self::intrinsic::IntrinsicCallMethods;
|
||||||
|
@ -59,7 +59,6 @@ pub trait CodegenMethods<'tcx>:
|
||||||
+ MiscMethods<'tcx>
|
+ MiscMethods<'tcx>
|
||||||
+ ConstMethods<'tcx>
|
+ ConstMethods<'tcx>
|
||||||
+ StaticMethods
|
+ StaticMethods
|
||||||
+ CoverageInfoMethods<'tcx>
|
|
||||||
+ DebugInfoMethods<'tcx>
|
+ DebugInfoMethods<'tcx>
|
||||||
+ AsmMethods<'tcx>
|
+ AsmMethods<'tcx>
|
||||||
+ PreDefineMethods<'tcx>
|
+ PreDefineMethods<'tcx>
|
||||||
|
@ -75,7 +74,6 @@ impl<'tcx, T> CodegenMethods<'tcx> for T where
|
||||||
+ MiscMethods<'tcx>
|
+ MiscMethods<'tcx>
|
||||||
+ ConstMethods<'tcx>
|
+ ConstMethods<'tcx>
|
||||||
+ StaticMethods
|
+ StaticMethods
|
||||||
+ CoverageInfoMethods<'tcx>
|
|
||||||
+ DebugInfoMethods<'tcx>
|
+ DebugInfoMethods<'tcx>
|
||||||
+ AsmMethods<'tcx>
|
+ AsmMethods<'tcx>
|
||||||
+ PreDefineMethods<'tcx>
|
+ PreDefineMethods<'tcx>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue