Rollup merge of #119514 - Zalathar:query-stability, r=wesleywiser
coverage: Avoid a query stability hazard in `function_coverage_map` When #118865 started enforcing the `rustc::potential_query_instability` lint in `rustc_codegen_llvm`, it added an exemption for this site, arguing that the entries are only used to create a list of filenames that is later sorted. However, the list of entries also gets traversed when creating the function coverage records in LLVM IR, which may be sensitive to hash-based ordering. This patch therefore changes `function_coverage_map` to use `FxIndexMap`, which should avoid hash-based instability by iterating in insertion order. cc ``@Enselic``
This commit is contained in:
commit
ea39f19fab
@ -58,11 +58,6 @@ pub fn finalize(cx: &CodegenCx<'_, '_>) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The entries of the map are only used to get a list of all files with
|
|
||||||
// coverage info. In the end the list of files is passed into
|
|
||||||
// `GlobalFileTable::new()` which internally do `.sort_unstable_by()`, so
|
|
||||||
// the iteration order here does not matter.
|
|
||||||
#[allow(rustc::potential_query_instability)]
|
|
||||||
let function_coverage_entries = function_coverage_map
|
let function_coverage_entries = function_coverage_map
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(instance, function_coverage)| (instance, function_coverage.into_finished()))
|
.map(|(instance, function_coverage)| (instance, function_coverage.into_finished()))
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
BaseTypeMethods, BuilderMethods, ConstMethods, CoverageInfoBuilderMethods, MiscMethods,
|
BaseTypeMethods, BuilderMethods, ConstMethods, CoverageInfoBuilderMethods, MiscMethods,
|
||||||
StaticMethods,
|
StaticMethods,
|
||||||
};
|
};
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::{FxHashMap, FxIndexMap};
|
||||||
use rustc_llvm::RustString;
|
use rustc_llvm::RustString;
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
use rustc_middle::mir::coverage::CoverageKind;
|
use rustc_middle::mir::coverage::CoverageKind;
|
||||||
@ -30,7 +30,7 @@
|
|||||||
pub struct CrateCoverageContext<'ll, 'tcx> {
|
pub struct CrateCoverageContext<'ll, 'tcx> {
|
||||||
/// Coverage data for each instrumented function identified by DefId.
|
/// Coverage data for each instrumented function identified by DefId.
|
||||||
pub(crate) function_coverage_map:
|
pub(crate) function_coverage_map:
|
||||||
RefCell<FxHashMap<Instance<'tcx>, FunctionCoverageCollector<'tcx>>>,
|
RefCell<FxIndexMap<Instance<'tcx>, FunctionCoverageCollector<'tcx>>>,
|
||||||
pub(crate) pgo_func_name_var_map: RefCell<FxHashMap<Instance<'tcx>, &'ll llvm::Value>>,
|
pub(crate) pgo_func_name_var_map: RefCell<FxHashMap<Instance<'tcx>, &'ll llvm::Value>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,8 +44,8 @@ pub fn new() -> Self {
|
|||||||
|
|
||||||
pub fn take_function_coverage_map(
|
pub fn take_function_coverage_map(
|
||||||
&self,
|
&self,
|
||||||
) -> FxHashMap<Instance<'tcx>, FunctionCoverageCollector<'tcx>> {
|
) -> FxIndexMap<Instance<'tcx>, FunctionCoverageCollector<'tcx>> {
|
||||||
self.function_coverage_map.replace(FxHashMap::default())
|
self.function_coverage_map.replace(FxIndexMap::default())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user