From f9f5a88bc4d2e62ea325be8a37e5811a951f234c Mon Sep 17 00:00:00 2001 From: Vytautas Astrauskas Date: Mon, 11 Nov 2019 16:09:03 +0100 Subject: Add a callback that allows compiler consumers to override queries. --- src/librustc_interface/interface.rs | 11 +++++++++++ src/librustc_interface/passes.rs | 5 +++++ 2 files changed, 16 insertions(+) (limited to 'src/librustc_interface') diff --git a/src/librustc_interface/interface.rs b/src/librustc_interface/interface.rs index 02068b2ce38..fae4eb48c4a 100644 --- a/src/librustc_interface/interface.rs +++ b/src/librustc_interface/interface.rs @@ -12,6 +12,7 @@ use rustc_data_structures::OnDrop; use rustc_data_structures::sync::Lrc; use rustc_data_structures::fx::{FxHashSet, FxHashMap}; use rustc_parse::new_parser_from_source_str; +use rustc::ty; use std::path::PathBuf; use std::result; use std::sync::{Arc, Mutex}; @@ -38,6 +39,8 @@ pub struct Compiler { pub(crate) queries: Queries, pub(crate) crate_name: Option, pub(crate) register_lints: Option>, + pub(crate) override_queries: + Option, &mut ty::query::Providers<'_>)>, } impl Compiler { @@ -131,6 +134,13 @@ pub struct Config { /// Note that if you find a Some here you probably want to call that function in the new /// function being registered. pub register_lints: Option>, + + /// This is a callback from the driver that is called just after we have populated + /// the list of queries. + /// + /// The second parameter is local providers and the third parameter is external providers. + pub override_queries: + Option, &mut ty::query::Providers<'_>)>, } pub fn run_compiler_in_existing_thread_pool(config: Config, f: F) -> R @@ -157,6 +167,7 @@ where queries: Default::default(), crate_name: config.crate_name, register_lints: config.register_lints, + override_queries: config.override_queries, }; let _sess_abort_error = OnDrop(|| { diff --git a/src/librustc_interface/passes.rs b/src/librustc_interface/passes.rs index 453007c5642..c57622b8b8f 100644 --- a/src/librustc_interface/passes.rs +++ b/src/librustc_interface/passes.rs @@ -786,6 +786,7 @@ pub fn create_global_ctxt( let codegen_backend = compiler.codegen_backend().clone(); let crate_name = crate_name.to_string(); let defs = mem::take(&mut resolver_outputs.definitions); + let override_queries = compiler.override_queries; let ((), result) = BoxedGlobalCtxt::new(static move || { let sess = &*sess; @@ -810,6 +811,10 @@ pub fn create_global_ctxt( default_provide_extern(&mut extern_providers); codegen_backend.provide_extern(&mut extern_providers); + if let Some(callback) = override_queries { + callback(sess, &mut local_providers, &mut extern_providers); + } + let gcx = TyCtxt::create_global_ctxt( sess, lint_store, -- cgit 1.4.1-3-g733a5