coverage: Move unused-function helpers closer to where they are used
This commit is contained in:
parent
e964ea5bf5
commit
cdeeffde64
2 changed files with 39 additions and 43 deletions
|
@ -10,6 +10,7 @@ use rustc_hir::def::DefKind;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_index::IndexVec;
|
use rustc_index::IndexVec;
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
|
use rustc_middle::mir;
|
||||||
use rustc_middle::mir::coverage::CodeRegion;
|
use rustc_middle::mir::coverage::CodeRegion;
|
||||||
use rustc_middle::ty::{self, TyCtxt};
|
use rustc_middle::ty::{self, TyCtxt};
|
||||||
use rustc_span::Symbol;
|
use rustc_span::Symbol;
|
||||||
|
@ -351,17 +352,47 @@ fn add_unused_functions(cx: &CodegenCx<'_, '_>) {
|
||||||
|
|
||||||
let codegenned_def_ids = tcx.codegened_and_inlined_items(());
|
let codegenned_def_ids = tcx.codegened_and_inlined_items(());
|
||||||
|
|
||||||
for non_codegenned_def_id in
|
// For each `DefId` that should have coverage instrumentation but wasn't
|
||||||
eligible_def_ids.into_iter().filter(|id| !codegenned_def_ids.contains(id))
|
// codegenned, add it to the function coverage map as an unused function.
|
||||||
{
|
for def_id in eligible_def_ids.into_iter().filter(|id| !codegenned_def_ids.contains(id)) {
|
||||||
// Skip any function that didn't have coverage data added to it by the
|
// Skip any function that didn't have coverage data added to it by the
|
||||||
// coverage instrumentor.
|
// coverage instrumentor.
|
||||||
let body = tcx.instance_mir(ty::InstanceDef::Item(non_codegenned_def_id));
|
let body = tcx.instance_mir(ty::InstanceDef::Item(def_id));
|
||||||
let Some(function_coverage_info) = body.function_coverage_info.as_deref() else {
|
let Some(function_coverage_info) = body.function_coverage_info.as_deref() else {
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
|
|
||||||
debug!("generating unused fn: {:?}", non_codegenned_def_id);
|
debug!("generating unused fn: {def_id:?}");
|
||||||
cx.define_unused_fn(non_codegenned_def_id, function_coverage_info);
|
let instance = declare_unused_fn(tcx, def_id);
|
||||||
|
add_unused_function_coverage(cx, instance, function_coverage_info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn declare_unused_fn<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> ty::Instance<'tcx> {
|
||||||
|
ty::Instance::new(
|
||||||
|
def_id,
|
||||||
|
ty::GenericArgs::for_item(tcx, def_id, |param, _| {
|
||||||
|
if let ty::GenericParamDefKind::Lifetime = param.kind {
|
||||||
|
tcx.lifetimes.re_erased.into()
|
||||||
|
} else {
|
||||||
|
tcx.mk_param_from_def(param)
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add_unused_function_coverage<'tcx>(
|
||||||
|
cx: &CodegenCx<'_, 'tcx>,
|
||||||
|
instance: ty::Instance<'tcx>,
|
||||||
|
function_coverage_info: &'tcx mir::coverage::FunctionCoverageInfo,
|
||||||
|
) {
|
||||||
|
// An unused function's mappings will automatically be rewritten to map to
|
||||||
|
// zero, because none of its counters/expressions are marked as seen.
|
||||||
|
let function_coverage = FunctionCoverage::unused(instance, function_coverage_info);
|
||||||
|
|
||||||
|
if let Some(coverage_context) = cx.coverage_context() {
|
||||||
|
coverage_context.function_coverage_map.borrow_mut().insert(instance, function_coverage);
|
||||||
|
} else {
|
||||||
|
bug!("Could not get the `coverage_context`");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,13 +11,12 @@ use rustc_codegen_ssa::traits::{
|
||||||
StaticMethods,
|
StaticMethods,
|
||||||
};
|
};
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_hir::def_id::DefId;
|
|
||||||
use rustc_llvm::RustString;
|
use rustc_llvm::RustString;
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
use rustc_middle::mir::coverage::{CoverageKind, FunctionCoverageInfo};
|
use rustc_middle::mir::coverage::CoverageKind;
|
||||||
use rustc_middle::mir::Coverage;
|
use rustc_middle::mir::Coverage;
|
||||||
use rustc_middle::ty::layout::HasTyCtxt;
|
use rustc_middle::ty::layout::HasTyCtxt;
|
||||||
use rustc_middle::ty::{self, GenericArgs, Instance, TyCtxt};
|
use rustc_middle::ty::Instance;
|
||||||
|
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
|
|
||||||
|
@ -69,11 +68,6 @@ impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> {
|
||||||
bug!("Could not get the `coverage_context`");
|
bug!("Could not get the `coverage_context`");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn define_unused_fn(&self, def_id: DefId, function_coverage_info: &'tcx FunctionCoverageInfo) {
|
|
||||||
let instance = declare_unused_fn(self.tcx, def_id);
|
|
||||||
add_unused_function_coverage(self, instance, function_coverage_info);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'_, '_, 'tcx> {
|
impl<'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'_, '_, 'tcx> {
|
||||||
|
@ -138,35 +132,6 @@ impl<'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'_, '_, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn declare_unused_fn<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> Instance<'tcx> {
|
|
||||||
Instance::new(
|
|
||||||
def_id,
|
|
||||||
GenericArgs::for_item(tcx, def_id, |param, _| {
|
|
||||||
if let ty::GenericParamDefKind::Lifetime = param.kind {
|
|
||||||
tcx.lifetimes.re_erased.into()
|
|
||||||
} else {
|
|
||||||
tcx.mk_param_from_def(param)
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn add_unused_function_coverage<'tcx>(
|
|
||||||
cx: &CodegenCx<'_, 'tcx>,
|
|
||||||
instance: Instance<'tcx>,
|
|
||||||
function_coverage_info: &'tcx FunctionCoverageInfo,
|
|
||||||
) {
|
|
||||||
// An unused function's mappings will automatically be rewritten to map to
|
|
||||||
// zero, because none of its counters/expressions are marked as seen.
|
|
||||||
let function_coverage = FunctionCoverage::unused(instance, function_coverage_info);
|
|
||||||
|
|
||||||
if let Some(coverage_context) = cx.coverage_context() {
|
|
||||||
coverage_context.function_coverage_map.borrow_mut().insert(instance, function_coverage);
|
|
||||||
} else {
|
|
||||||
bug!("Could not get the `coverage_context`");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Calls llvm::createPGOFuncNameVar() with the given function instance's
|
/// Calls llvm::createPGOFuncNameVar() with the given function instance's
|
||||||
/// mangled function name. The LLVM API returns an llvm::GlobalVariable
|
/// mangled function name. The LLVM API returns an llvm::GlobalVariable
|
||||||
/// containing the function name, with the specific variable name and linkage
|
/// containing the function name, with the specific variable name and linkage
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue