Skip to content

Commit cfa18e5

Browse files
committed
Avoid code generation for ThinVec<Diagnostic>'s destructor in the query system
1 parent 34e6673 commit cfa18e5

File tree

3 files changed

+9
-6
lines changed

3 files changed

+9
-6
lines changed

compiler/rustc_query_impl/src/on_disk_cache.rs

-4
Original file line numberDiff line numberDiff line change
@@ -380,8 +380,6 @@ impl<'sess> OnDiskCache<'sess> {
380380
/// Stores a `QuerySideEffects` emitted during the current compilation session.
381381
/// Anything stored like this will be available via `load_side_effects` in
382382
/// the next compilation session.
383-
#[inline(never)]
384-
#[cold]
385383
pub fn store_side_effects(&self, dep_node_index: DepNodeIndex, side_effects: QuerySideEffects) {
386384
let mut current_side_effects = self.current_side_effects.borrow_mut();
387385
let prev = current_side_effects.insert(dep_node_index, side_effects);
@@ -405,8 +403,6 @@ impl<'sess> OnDiskCache<'sess> {
405403
/// Since many anonymous queries can share the same `DepNode`, we aggregate
406404
/// them -- as opposed to regular queries where we assume that there is a
407405
/// 1:1 relationship between query-key and `DepNode`.
408-
#[inline(never)]
409-
#[cold]
410406
pub fn store_side_effects_for_anon_node(
411407
&self,
412408
dep_node_index: DepNodeIndex,

compiler/rustc_query_impl/src/plumbing.rs

+4
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,16 @@ impl QueryContext for QueryCtxt<'_> {
7979
.unwrap_or_default()
8080
}
8181

82+
#[inline(never)]
83+
#[cold]
8284
fn store_side_effects(self, dep_node_index: DepNodeIndex, side_effects: QuerySideEffects) {
8385
if let Some(c) = self.queries.on_disk_cache.as_ref() {
8486
c.store_side_effects(dep_node_index, side_effects)
8587
}
8688
}
8789

90+
#[inline(never)]
91+
#[cold]
8892
fn store_side_effects_for_anon_node(
8993
self,
9094
dep_node_index: DepNodeIndex,

compiler/rustc_query_system/src/query/plumbing.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -464,15 +464,18 @@ where
464464

465465
prof_timer.finish_with_query_invocation_id(dep_node_index.into());
466466

467-
let diagnostics = diagnostics.into_inner();
468-
let side_effects = QuerySideEffects { diagnostics };
467+
let side_effects = QuerySideEffects { diagnostics: diagnostics.into_inner() };
469468

470469
if std::intrinsics::unlikely(!side_effects.is_empty()) {
471470
if Q::ANON {
472471
qcx.store_side_effects_for_anon_node(dep_node_index, side_effects);
473472
} else {
474473
qcx.store_side_effects(dep_node_index, side_effects);
475474
}
475+
} else {
476+
// Avoid generating code for the destructor here. This does not leak memory since
477+
// `QuerySideEffects` only owns memory if it's non-empty.
478+
mem::forget(side_effects);
476479
}
477480

478481
(result, dep_node_index)

0 commit comments

Comments
 (0)