Skip to content

Commit 57e0220

Browse files
authored
Rollup merge of rust-lang#66297 - vakaras:edit-queries, r=oli-obk
Add a callback that allows compiler consumers to override queries. This pull request adds an additional callback that allows compiler consumers such as Prusti and MIRAI to override queries. My hope is that in this way it will be possible to get access to the internal compiler information (e.g. borrow checker) without major changes to the compiler. This pull request is work in progress because I am still testing if I can get the information which I need. cc @nikomatsakis r? @oli-obk
2 parents 64e8cfa + f9f5a88 commit 57e0220

File tree

6 files changed

+21
-0
lines changed

6 files changed

+21
-0
lines changed

src/librustc_driver/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ pub fn run_compiler(
181181
crate_name: None,
182182
lint_caps: Default::default(),
183183
register_lints: None,
184+
override_queries: None,
184185
};
185186
callbacks.config(&mut config);
186187
config
@@ -259,6 +260,7 @@ pub fn run_compiler(
259260
crate_name: None,
260261
lint_caps: Default::default(),
261262
register_lints: None,
263+
override_queries: None,
262264
};
263265

264266
callbacks.config(&mut config);

src/librustc_interface/interface.rs

+11
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use rustc_data_structures::OnDrop;
1212
use rustc_data_structures::sync::Lrc;
1313
use rustc_data_structures::fx::{FxHashSet, FxHashMap};
1414
use rustc_parse::new_parser_from_source_str;
15+
use rustc::ty;
1516
use std::path::PathBuf;
1617
use std::result;
1718
use std::sync::{Arc, Mutex};
@@ -38,6 +39,8 @@ pub struct Compiler {
3839
pub(crate) queries: Queries,
3940
pub(crate) crate_name: Option<String>,
4041
pub(crate) register_lints: Option<Box<dyn Fn(&Session, &mut lint::LintStore) + Send + Sync>>,
42+
pub(crate) override_queries:
43+
Option<fn(&Session, &mut ty::query::Providers<'_>, &mut ty::query::Providers<'_>)>,
4144
}
4245

4346
impl Compiler {
@@ -131,6 +134,13 @@ pub struct Config {
131134
/// Note that if you find a Some here you probably want to call that function in the new
132135
/// function being registered.
133136
pub register_lints: Option<Box<dyn Fn(&Session, &mut lint::LintStore) + Send + Sync>>,
137+
138+
/// This is a callback from the driver that is called just after we have populated
139+
/// the list of queries.
140+
///
141+
/// The second parameter is local providers and the third parameter is external providers.
142+
pub override_queries:
143+
Option<fn(&Session, &mut ty::query::Providers<'_>, &mut ty::query::Providers<'_>)>,
134144
}
135145

136146
pub fn run_compiler_in_existing_thread_pool<F, R>(config: Config, f: F) -> R
@@ -157,6 +167,7 @@ where
157167
queries: Default::default(),
158168
crate_name: config.crate_name,
159169
register_lints: config.register_lints,
170+
override_queries: config.override_queries,
160171
};
161172

162173
let _sess_abort_error = OnDrop(|| {

src/librustc_interface/passes.rs

+5
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,7 @@ pub fn create_global_ctxt(
786786
let codegen_backend = compiler.codegen_backend().clone();
787787
let crate_name = crate_name.to_string();
788788
let defs = mem::take(&mut resolver_outputs.definitions);
789+
let override_queries = compiler.override_queries;
789790

790791
let ((), result) = BoxedGlobalCtxt::new(static move || {
791792
let sess = &*sess;
@@ -810,6 +811,10 @@ pub fn create_global_ctxt(
810811
default_provide_extern(&mut extern_providers);
811812
codegen_backend.provide_extern(&mut extern_providers);
812813

814+
if let Some(callback) = override_queries {
815+
callback(sess, &mut local_providers, &mut extern_providers);
816+
}
817+
813818
let gcx = TyCtxt::create_global_ctxt(
814819
sess,
815820
lint_store,

src/librustdoc/core.rs

+1
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,7 @@ pub fn run_core(options: RustdocOptions) -> (clean::Crate, RenderInfo, RenderOpt
335335
crate_name,
336336
lint_caps,
337337
register_lints: None,
338+
override_queries: None,
338339
};
339340

340341
interface::run_compiler_in_existing_thread_pool(config, |compiler| {

src/librustdoc/test.rs

+1
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ pub fn run(options: Options) -> i32 {
7979
crate_name: options.crate_name.clone(),
8080
lint_caps: Default::default(),
8181
register_lints: None,
82+
override_queries: None,
8283
};
8384

8485
let mut test_args = options.test_args.clone();

src/test/run-make-fulldeps/issue-19371/foo.rs

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ fn compile(code: String, output: PathBuf, sysroot: PathBuf) {
6060
crate_name: None,
6161
lint_caps: Default::default(),
6262
register_lints: None,
63+
override_queries: None,
6364
};
6465

6566
interface::run_compiler(config, |compiler| {

0 commit comments

Comments
 (0)