Skip to content

Commit f42888e

Browse files
committed
Trace tcx.layout_of by overriding it in query providers
1 parent 5e10828 commit f42888e

File tree

3 files changed

+17
-2
lines changed

3 files changed

+17
-2
lines changed

compiler/rustc_ty_utils/src/layout.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ pub(crate) fn provide(providers: &mut Providers) {
3131
}
3232

3333
#[instrument(skip(tcx, query), level = "debug")]
34-
fn layout_of<'tcx>(
34+
pub fn layout_of<'tcx>(
3535
tcx: TyCtxt<'tcx>,
3636
query: ty::PseudoCanonicalInput<'tcx, Ty<'tcx>>,
3737
) -> Result<TyAndLayout<'tcx>, &'tcx LayoutError<'tcx>> {

compiler/rustc_ty_utils/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ pub mod sig_types;
3535
mod structural_match;
3636
mod ty;
3737

38+
pub use layout::layout_of;
39+
3840
rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
3941

4042
pub fn provide(providers: &mut Providers) {

src/tools/miri/src/bin/miri.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ extern crate rustc_metadata;
2323
extern crate rustc_middle;
2424
extern crate rustc_session;
2525
extern crate rustc_span;
26+
extern crate rustc_ty_utils;
2627

2728
use std::env::{self, VarError};
2829
use std::num::NonZero;
@@ -50,7 +51,8 @@ use rustc_middle::middle::exported_symbols::{
5051
};
5152
use rustc_middle::query::LocalCrate;
5253
use rustc_middle::traits::{ObligationCause, ObligationCauseCode};
53-
use rustc_middle::ty::{self, Ty, TyCtxt};
54+
use rustc_middle::ty::layout::{LayoutError, TyAndLayout};
55+
use rustc_middle::ty::{self, PseudoCanonicalInput, Ty, TyCtxt};
5456
use rustc_middle::util::Providers;
5557
use rustc_session::config::{CrateType, ErrorOutputType, OptLevel};
5658
use rustc_session::search_paths::PathKind;
@@ -143,6 +145,17 @@ impl rustc_driver::Callbacks for MiriCompilerCalls {
143145
Arc::make_mut(&mut crate_source).rlib = Some((PathBuf::new(), PathKind::All));
144146
crate_source
145147
};
148+
149+
// HACK: in order to trace how much time is spent in `layout_of` queries, we override
150+
// the query with a wrapper around the original `layout_of`. The `assert` is to ensure
151+
// we are really wrapping `rustc_ty_utils::layout_of`. Note that this required making
152+
// `rustc_ty_utils::layout_of` public.
153+
assert!(std::ptr::fn_addr_eq(providers.layout_of, rustc_ty_utils::layout_of as
154+
for<'tcx> fn(TyCtxt<'tcx>, PseudoCanonicalInput<'tcx, Ty<'tcx>>) -> Result<TyAndLayout<'tcx>, &'tcx LayoutError<'tcx>>));
155+
providers.layout_of = |tcx, query| {
156+
let _span = tracing::info_span!("tcx.layout_of", "query = {:?}", query.value.kind()).entered();
157+
rustc_ty_utils::layout_of(tcx, query)
158+
};
146159
});
147160
}
148161

0 commit comments

Comments
 (0)