Skip to content

Commit 7382526

Browse files
committed
Add local version of is_dllimport_foreign_item
1 parent 51b4db7 commit 7382526

File tree

6 files changed

+23
-15
lines changed

6 files changed

+23
-15
lines changed

src/doc/nomicon

src/librustc_driver/driver.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -895,9 +895,10 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
895895
reachable::provide(&mut local_providers);
896896
rustc_const_eval::provide(&mut local_providers);
897897
middle::region::provide(&mut local_providers);
898+
cstore::provide_local(&mut local_providers);
898899

899900
let mut extern_providers = ty::maps::Providers::default();
900-
cstore::provide(&mut extern_providers);
901+
cstore::provide_extern(&mut extern_providers);
901902
trans::provide(&mut extern_providers);
902903
ty::provide_extern(&mut extern_providers);
903904
// FIXME(eddyb) get rid of this once we replace const_eval with miri.

src/librustc_metadata/cstore_impl.rs

+17-10
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ use std::collections::BTreeMap;
4545

4646
macro_rules! provide {
4747
(<$lt:tt> $tcx:ident, $def_id:ident, $cdata:ident $($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>($tcx: TyCtxt<'a, $lt, $lt>, $def_id: DefId)
5050
-> <ty::queries::$name<$lt> as
5151
DepTrackingMapConfig>::Value {
@@ -136,10 +136,26 @@ provide! { <'tcx> tcx, def_id, cdata
136136
}
137137
}
138138
is_dllimport_foreign_item => {
139+
// extern case
139140
cdata.dllimport_foreign_items.contains(&def_id.index)
140141
}
141142
}
142143

144+
pub fn provide_local(providers: &mut ty::maps::Providers) {
145+
providers.is_dllimport_foreign_item = is_dllimport_foreign_item;
146+
}
147+
148+
fn is_dllimport_foreign_item_local<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> bool {
149+
tcx.dep_graph.read(DepNode::MetaData(def_id));
150+
151+
let cdata = tcx.sess.cstore.crate_data_as_rc_any(def_id.krate);
152+
let cdata = cdata.downcast_ref::<cstore::CrateMetadata>()
153+
.expect("CrateStore crated ata is not a CrateMetadata");
154+
155+
cdata.get_crate_data(def_id.krate)
156+
.is_dllimport_foreign_item(def_id.index, &cdata.dep_graph)
157+
}
158+
143159
impl CrateStore for cstore::CStore {
144160
fn crate_data_as_rc_any(&self, krate: CrateNum) -> Rc<Any> {
145161
self.get_crate_data(krate)
@@ -222,15 +238,6 @@ impl CrateStore for cstore::CStore {
222238
.contains(&def_id.index)
223239
}
224240

225-
fn is_dllimport_foreign_item(&self, def_id: DefId) -> bool {
226-
if def_id.krate == LOCAL_CRATE {
227-
self.dllimport_foreign_items.borrow().contains(&def_id.index)
228-
} else {
229-
self.get_crate_data(def_id.krate)
230-
.is_dllimport_foreign_item(def_id.index, &self.dep_graph)
231-
}
232-
}
233-
234241
fn dylib_dependency_formats(&self, cnum: CrateNum)
235242
-> Vec<(CrateNum, LinkagePreference)>
236243
{

0 commit comments

Comments
 (0)