Skip to content

Commit 3707db9

Browse files
committed
Auto merge of #45944 - eddyb:provide, r=nikomatsakis
rustc_driver: expose a way to override query providers in CompileController. This API has been a long-time coming and will probably become the main method for custom drivers (that is, binaries other than `rustc` itself that use `librustc_driver`) to adapt the compiler's behavior.
2 parents f93a492 + 0ac6c3a commit 3707db9

File tree

11 files changed

+66
-81
lines changed

11 files changed

+66
-81
lines changed

src/librustc/traits/mod.rs

-11
Original file line numberDiff line numberDiff line change
@@ -842,14 +842,3 @@ pub fn provide(providers: &mut ty::maps::Providers) {
842842
..*providers
843843
};
844844
}
845-
846-
pub fn provide_extern(providers: &mut ty::maps::Providers) {
847-
*providers = ty::maps::Providers {
848-
is_object_safe: object_safety::is_object_safe_provider,
849-
specialization_graph_of: specialize::specialization_graph_provider,
850-
specializes: specialize::specializes,
851-
trans_fulfill_obligation: trans::trans_fulfill_obligation,
852-
vtable_methods,
853-
..*providers
854-
};
855-
}

src/librustc/ty/mod.rs

-11
Original file line numberDiff line numberDiff line change
@@ -2605,17 +2605,6 @@ pub fn provide(providers: &mut ty::maps::Providers) {
26052605
};
26062606
}
26072607

2608-
pub fn provide_extern(providers: &mut ty::maps::Providers) {
2609-
*providers = ty::maps::Providers {
2610-
adt_sized_constraint,
2611-
adt_dtorck_constraint,
2612-
trait_impls_of: trait_def::trait_impls_of_provider,
2613-
param_env,
2614-
..*providers
2615-
};
2616-
}
2617-
2618-
26192608
/// A map for the local crate mapping each type to a vector of its
26202609
/// inherent impls. This is not meant to be used outside of coherence;
26212610
/// rather, you should request the vector for a specific type via

src/librustc_driver/driver.rs

+41-24
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,8 @@ pub fn compile_input(sess: &Session,
206206
None
207207
};
208208

209-
phase_3_run_analysis_passes(sess,
209+
phase_3_run_analysis_passes(control,
210+
sess,
210211
cstore,
211212
hir_map,
212213
analysis,
@@ -347,6 +348,13 @@ pub struct CompileController<'a> {
347348
pub keep_ast: bool,
348349
// -Zcontinue-parse-after-error
349350
pub continue_parse_after_error: bool,
351+
352+
/// Allows overriding default rustc query providers,
353+
/// after `default_provide` has installed them.
354+
pub provide: Box<Fn(&mut ty::maps::Providers) + 'a>,
355+
/// Same as `provide`, but only for non-local crates,
356+
/// applied after `default_provide_extern`.
357+
pub provide_extern: Box<Fn(&mut ty::maps::Providers) + 'a>,
350358
}
351359

352360
impl<'a> CompileController<'a> {
@@ -361,6 +369,8 @@ impl<'a> CompileController<'a> {
361369
make_glob_map: MakeGlobMap::No,
362370
keep_ast: false,
363371
continue_parse_after_error: false,
372+
provide: box |_| {},
373+
provide_extern: box |_| {},
364374
}
365375
}
366376
}
@@ -906,10 +916,33 @@ pub fn phase_2_configure_and_expand<F>(sess: &Session,
906916
})
907917
}
908918

919+
pub fn default_provide(providers: &mut ty::maps::Providers) {
920+
borrowck::provide(providers);
921+
mir::provide(providers);
922+
reachable::provide(providers);
923+
rustc_privacy::provide(providers);
924+
DefaultTransCrate::provide(providers);
925+
typeck::provide(providers);
926+
ty::provide(providers);
927+
traits::provide(providers);
928+
reachable::provide(providers);
929+
rustc_const_eval::provide(providers);
930+
rustc_passes::provide(providers);
931+
middle::region::provide(providers);
932+
cstore::provide(providers);
933+
lint::provide(providers);
934+
}
935+
936+
pub fn default_provide_extern(providers: &mut ty::maps::Providers) {
937+
cstore::provide_extern(providers);
938+
DefaultTransCrate::provide_extern(providers);
939+
}
940+
909941
/// Run the resolution, typechecking, region checking and other
910942
/// miscellaneous analysis passes on the crate. Return various
911943
/// structures carrying the results of the analysis.
912-
pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
944+
pub fn phase_3_run_analysis_passes<'tcx, F, R>(control: &CompileController,
945+
sess: &'tcx Session,
913946
cstore: &'tcx CrateStore,
914947
hir_map: hir_map::Map<'tcx>,
915948
mut analysis: ty::CrateAnalysis,
@@ -965,28 +998,12 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
965998
|| static_recursion::check_crate(sess, &hir_map))?;
966999

9671000
let mut local_providers = ty::maps::Providers::default();
968-
borrowck::provide(&mut local_providers);
969-
mir::provide(&mut local_providers);
970-
reachable::provide(&mut local_providers);
971-
rustc_privacy::provide(&mut local_providers);
972-
DefaultTransCrate::provide_local(&mut local_providers);
973-
typeck::provide(&mut local_providers);
974-
ty::provide(&mut local_providers);
975-
traits::provide(&mut local_providers);
976-
reachable::provide(&mut local_providers);
977-
rustc_const_eval::provide(&mut local_providers);
978-
rustc_passes::provide(&mut local_providers);
979-
middle::region::provide(&mut local_providers);
980-
cstore::provide_local(&mut local_providers);
981-
lint::provide(&mut local_providers);
982-
983-
let mut extern_providers = ty::maps::Providers::default();
984-
cstore::provide(&mut extern_providers);
985-
DefaultTransCrate::provide_extern(&mut extern_providers);
986-
ty::provide_extern(&mut extern_providers);
987-
traits::provide_extern(&mut extern_providers);
988-
// FIXME(eddyb) get rid of this once we replace const_eval with miri.
989-
rustc_const_eval::provide(&mut extern_providers);
1001+
default_provide(&mut local_providers);
1002+
(control.provide)(&mut local_providers);
1003+
1004+
let mut extern_providers = local_providers;
1005+
default_provide_extern(&mut extern_providers);
1006+
(control.provide_extern)(&mut extern_providers);
9901007

9911008
let (tx, rx) = mpsc::channel();
9921009

src/librustc_driver/pretty.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,9 @@ impl PpSourceMode {
227227
f(&annotation, hir_map.forest.krate())
228228
}
229229
PpmTyped => {
230-
abort_on_err(driver::phase_3_run_analysis_passes(sess,
230+
let control = &driver::CompileController::basic();
231+
abort_on_err(driver::phase_3_run_analysis_passes(control,
232+
sess,
231233
cstore,
232234
hir_map.clone(),
233235
analysis.clone(),
@@ -1036,7 +1038,9 @@ fn print_with_analysis<'tcx, 'a: 'tcx>(sess: &'a Session,
10361038

10371039
let mut out = Vec::new();
10381040

1039-
abort_on_err(driver::phase_3_run_analysis_passes(sess,
1041+
let control = &driver::CompileController::basic();
1042+
abort_on_err(driver::phase_3_run_analysis_passes(control,
1043+
sess,
10401044
cstore,
10411045
hir_map.clone(),
10421046
analysis.clone(),

src/librustc_metadata/cstore.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ pub use rustc::middle::cstore::{NativeLibrary, NativeLibraryKind, LinkagePrefere
3434
pub use rustc::middle::cstore::NativeLibraryKind::*;
3535
pub use rustc::middle::cstore::{CrateSource, LibSource};
3636

37-
pub use cstore_impl::{provide, provide_local};
37+
pub use cstore_impl::{provide, provide_extern};
3838

3939
// A map from external crate numbers (as decoded from some crate file) to
4040
// local crate numbers (as generated during this session). Each external

src/librustc_metadata/cstore_impl.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ use rustc::hir;
4545
macro_rules! provide {
4646
(<$lt:tt> $tcx:ident, $def_id:ident, $other:ident, $cdata:ident,
4747
$($name:ident => $compute:block)*) => {
48-
pub fn provide<$lt>(providers: &mut Providers<$lt>) {
48+
pub fn provide_extern<$lt>(providers: &mut Providers<$lt>) {
4949
$(fn $name<'a, $lt:$lt, T>($tcx: TyCtxt<'a, $lt, $lt>, def_id_arg: T)
5050
-> <ty::queries::$name<$lt> as
5151
QueryConfig>::Value
@@ -243,7 +243,7 @@ provide! { <'tcx> tcx, def_id, other, cdata,
243243
has_clone_closures => { cdata.has_clone_closures(tcx.sess) }
244244
}
245245

246-
pub fn provide_local<'tcx>(providers: &mut Providers<'tcx>) {
246+
pub fn provide<'tcx>(providers: &mut Providers<'tcx>) {
247247
fn is_const_fn<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> bool {
248248
let node_id = tcx.hir.as_local_node_id(def_id)
249249
.expect("Non-local call to local provider is_const_fn");

src/librustc_trans/back/symbol_export.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ pub fn crates_export_threshold(crate_types: &[config::CrateType])
6060
}
6161
}
6262

63-
pub fn provide_local(providers: &mut Providers) {
63+
pub fn provide(providers: &mut Providers) {
6464
providers.exported_symbol_ids = |tcx, cnum| {
6565
let export_threshold = threshold(tcx);
6666
Rc::new(tcx.exported_symbols(cnum)

src/librustc_trans/base.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -1384,7 +1384,7 @@ fn compile_codegen_unit<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
13841384
}
13851385
}
13861386

1387-
pub fn provide_local(providers: &mut Providers) {
1387+
pub fn provide(providers: &mut Providers) {
13881388
providers.collect_and_partition_translation_items =
13891389
collect_and_partition_translation_items;
13901390

@@ -1400,10 +1400,6 @@ pub fn provide_local(providers: &mut Providers) {
14001400
providers.compile_codegen_unit = compile_codegen_unit;
14011401
}
14021402

1403-
pub fn provide_extern(providers: &mut Providers) {
1404-
providers.is_translated_function = is_translated_function;
1405-
}
1406-
14071403
pub fn linkage_to_llvm(linkage: Linkage) -> llvm::Linkage {
14081404
match linkage {
14091405
Linkage::External => llvm::Linkage::ExternalLinkage,

src/librustc_trans/lib.rs

+5-16
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ use rustc::middle::cstore::MetadataLoader;
8181
use rustc::middle::cstore::{NativeLibrary, CrateSource, LibSource};
8282
use rustc::session::Session;
8383
use rustc::session::config::{OutputFilenames, OutputType};
84-
use rustc::ty::maps::Providers;
8584
use rustc::ty::{self, TyCtxt};
8685
use rustc::util::nodemap::{FxHashSet, FxHashMap};
8786

@@ -167,12 +166,14 @@ impl rustc_trans_utils::trans_crate::TransCrate for LlvmTransCrate {
167166
box metadata::LlvmMetadataLoader
168167
}
169168

170-
fn provide_local(providers: &mut ty::maps::Providers) {
171-
provide_local(providers);
169+
fn provide(providers: &mut ty::maps::Providers) {
170+
back::symbol_names::provide(providers);
171+
back::symbol_export::provide(providers);
172+
base::provide(providers);
172173
}
173174

174175
fn provide_extern(providers: &mut ty::maps::Providers) {
175-
provide_extern(providers);
176+
back::symbol_export::provide_extern(providers);
176177
}
177178

178179
fn trans_crate<'a, 'tcx>(
@@ -332,15 +333,3 @@ pub struct CrateInfo {
332333
}
333334

334335
__build_diagnostic_array! { librustc_trans, DIAGNOSTICS }
335-
336-
pub fn provide_local(providers: &mut Providers) {
337-
back::symbol_names::provide(providers);
338-
back::symbol_export::provide_local(providers);
339-
base::provide_local(providers);
340-
}
341-
342-
pub fn provide_extern(providers: &mut Providers) {
343-
back::symbol_names::provide(providers);
344-
back::symbol_export::provide_extern(providers);
345-
base::provide_extern(providers);
346-
}

src/librustc_trans_utils/trans_crate.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ pub trait TransCrate {
5151
type TranslatedCrate;
5252

5353
fn metadata_loader() -> Box<MetadataLoaderTrait>;
54-
fn provide_local(_providers: &mut Providers);
54+
fn provide(_providers: &mut Providers);
5555
fn provide_extern(_providers: &mut Providers);
5656
fn trans_crate<'a, 'tcx>(
5757
tcx: TyCtxt<'a, 'tcx, 'tcx>,
@@ -77,8 +77,8 @@ impl TransCrate for DummyTransCrate {
7777
box DummyMetadataLoader(())
7878
}
7979

80-
fn provide_local(_providers: &mut Providers) {
81-
bug!("DummyTransCrate::provide_local");
80+
fn provide(_providers: &mut Providers) {
81+
bug!("DummyTransCrate::provide");
8282
}
8383

8484
fn provide_extern(_providers: &mut Providers) {
@@ -185,7 +185,7 @@ impl TransCrate for MetadataOnlyTransCrate {
185185
box NoLlvmMetadataLoader
186186
}
187187

188-
fn provide_local(_providers: &mut Providers) {}
188+
fn provide(_providers: &mut Providers) {}
189189
fn provide_extern(_providers: &mut Providers) {}
190190

191191
fn trans_crate<'a, 'tcx>(

src/librustdoc/core.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,9 @@ pub fn run_core(search_paths: SearchPaths,
154154
target_features::add_configuration(&mut cfg, &sess);
155155
sess.parse_sess.config = cfg;
156156

157-
let krate = panictry!(driver::phase_1_parse_input(&driver::CompileController::basic(),
158-
&sess,
159-
&input));
157+
let control = &driver::CompileController::basic();
158+
159+
let krate = panictry!(driver::phase_1_parse_input(control, &sess, &input));
160160
let krate = ReplaceBodyWithLoop::new().fold_crate(krate);
161161

162162
let name = link::find_crate_name(Some(&sess), &krate.attrs, &input);
@@ -182,7 +182,8 @@ pub fn run_core(search_paths: SearchPaths,
182182
&[],
183183
&sess);
184184

185-
abort_on_err(driver::phase_3_run_analysis_passes(&sess,
185+
abort_on_err(driver::phase_3_run_analysis_passes(control,
186+
&sess,
186187
&*cstore,
187188
hir_map,
188189
analysis,

0 commit comments

Comments
 (0)