]>
Commit | Line | Data |
---|---|---|
92a42be0 SL |
1 | // Copyright 2015 The Rust Project Developers. See the COPYRIGHT |
2 | // file at the top-level directory of this distribution and at | |
3 | // http://rust-lang.org/COPYRIGHT. | |
4 | // | |
5 | // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | |
6 | // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | |
7 | // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | |
8 | // option. This file may not be copied, modified, or distributed | |
9 | // except according to those terms. | |
10 | ||
92a42be0 | 11 | use cstore; |
92a42be0 | 12 | use encoder; |
c30ab7b3 | 13 | use locator; |
9e0c209e | 14 | use schema; |
92a42be0 | 15 | |
8bb4bdeb | 16 | use rustc::dep_graph::DepTrackingMapConfig; |
32a655c1 | 17 | use rustc::middle::cstore::{CrateStore, CrateSource, LibSource, DepKind, ExternCrate}; |
476ff2be | 18 | use rustc::middle::cstore::{NativeLibrary, LinkMeta, LinkagePreference, LoadedMacro}; |
9e0c209e SL |
19 | use rustc::hir::def::{self, Def}; |
20 | use rustc::middle::lang_items; | |
476ff2be | 21 | use rustc::session::Session; |
8bb4bdeb XL |
22 | use rustc::ty::{self, TyCtxt}; |
23 | use rustc::ty::maps::Providers; | |
476ff2be | 24 | use rustc::hir::def_id::{CrateNum, DefId, DefIndex, CRATE_DEF_INDEX, LOCAL_CRATE}; |
92a42be0 | 25 | |
a7813a04 | 26 | use rustc::dep_graph::DepNode; |
32a655c1 | 27 | use rustc::hir::map::{DefKey, DefPath, DisambiguatedDefPathData}; |
9e0c209e | 28 | use rustc::util::nodemap::{NodeSet, DefIdMap}; |
c30ab7b3 | 29 | use rustc_back::PanicStrategy; |
92a42be0 | 30 | |
8bb4bdeb XL |
31 | use std::any::Any; |
32 | use std::mem; | |
33 | use std::rc::Rc; | |
34 | ||
92a42be0 SL |
35 | use syntax::ast; |
36 | use syntax::attr; | |
8bb4bdeb | 37 | use syntax::parse::filemap_to_stream; |
476ff2be SL |
38 | use syntax::symbol::Symbol; |
39 | use syntax_pos::{mk_sp, Span}; | |
54a0048b | 40 | use rustc::hir::svh::Svh; |
92a42be0 | 41 | use rustc_back::target::Target; |
54a0048b | 42 | use rustc::hir; |
92a42be0 | 43 | |
32a655c1 SL |
44 | use std::collections::BTreeMap; |
45 | ||
8bb4bdeb XL |
46 | macro_rules! provide { |
47 | (<$lt:tt> $tcx:ident, $def_id:ident, $cdata:ident $($name:ident => $compute:block)*) => { | |
48 | pub fn provide<$lt>(providers: &mut Providers<$lt>) { | |
49 | $(fn $name<'a, $lt:$lt>($tcx: TyCtxt<'a, $lt, $lt>, $def_id: DefId) | |
50 | -> <ty::queries::$name<$lt> as | |
51 | DepTrackingMapConfig>::Value { | |
52 | assert!(!$def_id.is_local()); | |
53 | ||
54 | $tcx.dep_graph.read(DepNode::MetaData($def_id)); | |
55 | ||
56 | let $cdata = $tcx.sess.cstore.crate_data_as_rc_any($def_id.krate); | |
57 | let $cdata = $cdata.downcast_ref::<cstore::CrateMetadata>() | |
58 | .expect("CrateStore crated ata is not a CrateMetadata"); | |
59 | $compute | |
60 | })* | |
61 | ||
62 | *providers = Providers { | |
63 | $($name,)* | |
64 | ..*providers | |
65 | }; | |
66 | } | |
9e0c209e | 67 | } |
8bb4bdeb | 68 | } |
9e0c209e | 69 | |
8bb4bdeb XL |
70 | provide! { <'tcx> tcx, def_id, cdata |
71 | ty => { cdata.get_type(def_id.index, tcx) } | |
72 | generics => { tcx.alloc_generics(cdata.get_generics(def_id.index)) } | |
73 | predicates => { cdata.get_predicates(def_id.index, tcx) } | |
74 | super_predicates => { cdata.get_super_predicates(def_id.index, tcx) } | |
75 | trait_def => { | |
76 | tcx.alloc_trait_def(cdata.get_trait_def(def_id.index, tcx)) | |
476ff2be | 77 | } |
8bb4bdeb XL |
78 | adt_def => { cdata.get_adt_def(def_id.index, tcx) } |
79 | adt_destructor => { | |
80 | let _ = cdata; | |
81 | tcx.calculate_dtor(def_id, &mut |_,_| Ok(())) | |
92a42be0 | 82 | } |
8bb4bdeb XL |
83 | variances => { Rc::new(cdata.get_item_variances(def_id.index)) } |
84 | associated_item_def_ids => { | |
85 | let mut result = vec![]; | |
86 | cdata.each_child_of_item(def_id.index, |child| result.push(child.def.def_id())); | |
87 | Rc::new(result) | |
88 | } | |
89 | associated_item => { cdata.get_associated_item(def_id.index) } | |
90 | impl_trait_ref => { cdata.get_impl_trait(def_id.index, tcx) } | |
91 | custom_coerce_unsized_kind => { | |
92 | cdata.get_custom_coerce_unsized_kind(def_id.index).unwrap_or_else(|| { | |
93 | bug!("custom_coerce_unsized_kind: `{:?}` is missing its kind", def_id); | |
94 | }) | |
9cc50fc6 | 95 | } |
8bb4bdeb XL |
96 | mir => { |
97 | let mir = cdata.maybe_get_item_mir(tcx, def_id.index).unwrap_or_else(|| { | |
98 | bug!("get_item_mir: missing MIR for `{:?}`", def_id) | |
99 | }); | |
9cc50fc6 | 100 | |
8bb4bdeb | 101 | let mir = tcx.alloc_mir(mir); |
54a0048b | 102 | |
8bb4bdeb XL |
103 | // Perma-borrow MIR from extern crates to prevent mutation. |
104 | mem::forget(mir.borrow()); | |
92a42be0 | 105 | |
8bb4bdeb | 106 | mir |
92a42be0 | 107 | } |
8bb4bdeb XL |
108 | mir_const_qualif => { cdata.mir_const_qualif(def_id.index) } |
109 | typeck_tables => { cdata.item_body_tables(def_id.index, tcx) } | |
110 | closure_kind => { cdata.closure_kind(def_id.index) } | |
111 | closure_type => { cdata.closure_ty(def_id.index, tcx) } | |
112 | } | |
92a42be0 | 113 | |
8bb4bdeb XL |
114 | impl CrateStore for cstore::CStore { |
115 | fn crate_data_as_rc_any(&self, krate: CrateNum) -> Rc<Any> { | |
116 | self.get_crate_data(krate) | |
92a42be0 SL |
117 | } |
118 | ||
8bb4bdeb | 119 | fn describe_def(&self, def: DefId) -> Option<Def> { |
a7813a04 | 120 | self.dep_graph.read(DepNode::MetaData(def)); |
8bb4bdeb | 121 | self.get_crate_data(def.krate).get_def(def.index) |
92a42be0 SL |
122 | } |
123 | ||
8bb4bdeb | 124 | fn def_span(&self, sess: &Session, def: DefId) -> Span { |
a7813a04 | 125 | self.dep_graph.read(DepNode::MetaData(def)); |
8bb4bdeb | 126 | self.get_crate_data(def.krate).get_span(def.index, sess) |
92a42be0 SL |
127 | } |
128 | ||
8bb4bdeb | 129 | fn stability(&self, def: DefId) -> Option<attr::Stability> { |
a7813a04 | 130 | self.dep_graph.read(DepNode::MetaData(def)); |
8bb4bdeb | 131 | self.get_crate_data(def.krate).get_stability(def.index) |
9e0c209e SL |
132 | } |
133 | ||
8bb4bdeb | 134 | fn deprecation(&self, def: DefId) -> Option<attr::Deprecation> { |
9e0c209e | 135 | self.dep_graph.read(DepNode::MetaData(def)); |
8bb4bdeb | 136 | self.get_crate_data(def.krate).get_deprecation(def.index) |
92a42be0 SL |
137 | } |
138 | ||
8bb4bdeb | 139 | fn visibility(&self, def: DefId) -> ty::Visibility { |
32a655c1 | 140 | self.dep_graph.read(DepNode::MetaData(def)); |
8bb4bdeb | 141 | self.get_crate_data(def.krate).get_visibility(def.index) |
32a655c1 SL |
142 | } |
143 | ||
8bb4bdeb | 144 | fn item_generics_cloned(&self, def: DefId) -> ty::Generics { |
32a655c1 | 145 | self.dep_graph.read(DepNode::MetaData(def)); |
8bb4bdeb | 146 | self.get_crate_data(def.krate).get_generics(def.index) |
32a655c1 SL |
147 | } |
148 | ||
92a42be0 SL |
149 | fn item_attrs(&self, def_id: DefId) -> Vec<ast::Attribute> |
150 | { | |
a7813a04 | 151 | self.dep_graph.read(DepNode::MetaData(def_id)); |
9e0c209e | 152 | self.get_crate_data(def_id.krate).get_item_attrs(def_id.index) |
92a42be0 SL |
153 | } |
154 | ||
9e0c209e | 155 | fn fn_arg_names(&self, did: DefId) -> Vec<ast::Name> |
92a42be0 | 156 | { |
32a655c1 SL |
157 | // FIXME(#38501) We've skipped a `read` on the `HirBody` of |
158 | // a `fn` when encoding, so the dep-tracking wouldn't work. | |
159 | // This is only used by rustdoc anyway, which shouldn't have | |
160 | // incremental recompilation ever enabled. | |
161 | assert!(!self.dep_graph.is_fully_enabled()); | |
9e0c209e | 162 | self.get_crate_data(did.krate).get_fn_arg_names(did.index) |
3157f602 | 163 | } |
92a42be0 SL |
164 | |
165 | fn inherent_implementations_for_type(&self, def_id: DefId) -> Vec<DefId> | |
166 | { | |
a7813a04 | 167 | self.dep_graph.read(DepNode::MetaData(def_id)); |
9e0c209e | 168 | self.get_crate_data(def_id.krate).get_inherent_implementations_for_type(def_id.index) |
92a42be0 SL |
169 | } |
170 | ||
9e0c209e | 171 | fn implementations_of_trait(&self, filter: Option<DefId>) -> Vec<DefId> |
92a42be0 | 172 | { |
9e0c209e SL |
173 | if let Some(def_id) = filter { |
174 | self.dep_graph.read(DepNode::MetaData(def_id)); | |
175 | } | |
92a42be0 SL |
176 | let mut result = vec![]; |
177 | self.iter_crate_data(|_, cdata| { | |
9e0c209e | 178 | cdata.get_implementations_for_trait(filter, &mut result) |
92a42be0 SL |
179 | }); |
180 | result | |
181 | } | |
182 | ||
9e0c209e | 183 | fn impl_polarity(&self, def: DefId) -> hir::ImplPolarity |
92a42be0 | 184 | { |
a7813a04 | 185 | self.dep_graph.read(DepNode::MetaData(def)); |
9e0c209e | 186 | self.get_crate_data(def.krate).get_impl_polarity(def.index) |
92a42be0 SL |
187 | } |
188 | ||
54a0048b | 189 | fn impl_parent(&self, impl_def: DefId) -> Option<DefId> { |
a7813a04 | 190 | self.dep_graph.read(DepNode::MetaData(impl_def)); |
9e0c209e | 191 | self.get_crate_data(impl_def.krate).get_parent_impl(impl_def.index) |
54a0048b SL |
192 | } |
193 | ||
9e0c209e | 194 | fn trait_of_item(&self, def_id: DefId) -> Option<DefId> { |
a7813a04 | 195 | self.dep_graph.read(DepNode::MetaData(def_id)); |
9e0c209e | 196 | self.get_crate_data(def_id.krate).get_trait_of_item(def_id.index) |
92a42be0 SL |
197 | } |
198 | ||
8bb4bdeb | 199 | fn associated_item_cloned(&self, def: DefId) -> ty::AssociatedItem |
92a42be0 | 200 | { |
a7813a04 | 201 | self.dep_graph.read(DepNode::MetaData(def)); |
476ff2be | 202 | self.get_crate_data(def.krate).get_associated_item(def.index) |
92a42be0 SL |
203 | } |
204 | ||
205 | fn is_const_fn(&self, did: DefId) -> bool | |
206 | { | |
a7813a04 | 207 | self.dep_graph.read(DepNode::MetaData(did)); |
9e0c209e | 208 | self.get_crate_data(did.krate).is_const_fn(did.index) |
92a42be0 SL |
209 | } |
210 | ||
92a42be0 | 211 | fn is_default_impl(&self, impl_did: DefId) -> bool { |
a7813a04 | 212 | self.dep_graph.read(DepNode::MetaData(impl_did)); |
9e0c209e | 213 | self.get_crate_data(impl_did.krate).is_default_impl(impl_did.index) |
92a42be0 SL |
214 | } |
215 | ||
3157f602 | 216 | fn is_foreign_item(&self, did: DefId) -> bool { |
9e0c209e | 217 | self.get_crate_data(did.krate).is_foreign_item(did.index) |
92a42be0 SL |
218 | } |
219 | ||
476ff2be | 220 | fn is_statically_included_foreign_item(&self, def_id: DefId) -> bool |
92a42be0 | 221 | { |
476ff2be SL |
222 | self.do_is_statically_included_foreign_item(def_id) |
223 | } | |
224 | ||
32a655c1 SL |
225 | fn is_exported_symbol(&self, def_id: DefId) -> bool { |
226 | self.get_crate_data(def_id.krate).exported_symbols.contains(&def_id.index) | |
227 | } | |
228 | ||
476ff2be SL |
229 | fn is_dllimport_foreign_item(&self, def_id: DefId) -> bool { |
230 | if def_id.krate == LOCAL_CRATE { | |
231 | self.dllimport_foreign_items.borrow().contains(&def_id.index) | |
232 | } else { | |
233 | self.get_crate_data(def_id.krate).is_dllimport_foreign_item(def_id.index) | |
234 | } | |
92a42be0 SL |
235 | } |
236 | ||
9e0c209e SL |
237 | fn dylib_dependency_formats(&self, cnum: CrateNum) |
238 | -> Vec<(CrateNum, LinkagePreference)> | |
92a42be0 | 239 | { |
9e0c209e | 240 | self.get_crate_data(cnum).get_dylib_dependency_formats() |
92a42be0 SL |
241 | } |
242 | ||
476ff2be SL |
243 | fn dep_kind(&self, cnum: CrateNum) -> DepKind |
244 | { | |
245 | self.get_crate_data(cnum).dep_kind.get() | |
246 | } | |
247 | ||
248 | fn export_macros(&self, cnum: CrateNum) { | |
249 | if self.get_crate_data(cnum).dep_kind.get() == DepKind::UnexportedMacrosOnly { | |
250 | self.get_crate_data(cnum).dep_kind.set(DepKind::MacrosOnly) | |
251 | } | |
252 | } | |
253 | ||
9e0c209e | 254 | fn lang_items(&self, cnum: CrateNum) -> Vec<(DefIndex, usize)> |
92a42be0 | 255 | { |
9e0c209e | 256 | self.get_crate_data(cnum).get_lang_items() |
92a42be0 SL |
257 | } |
258 | ||
9e0c209e | 259 | fn missing_lang_items(&self, cnum: CrateNum) |
92a42be0 SL |
260 | -> Vec<lang_items::LangItem> |
261 | { | |
9e0c209e | 262 | self.get_crate_data(cnum).get_missing_lang_items() |
92a42be0 SL |
263 | } |
264 | ||
9e0c209e | 265 | fn is_staged_api(&self, cnum: CrateNum) -> bool |
92a42be0 | 266 | { |
9e0c209e | 267 | self.get_crate_data(cnum).is_staged_api() |
92a42be0 SL |
268 | } |
269 | ||
9e0c209e | 270 | fn is_allocator(&self, cnum: CrateNum) -> bool |
92a42be0 SL |
271 | { |
272 | self.get_crate_data(cnum).is_allocator() | |
273 | } | |
274 | ||
9e0c209e | 275 | fn is_panic_runtime(&self, cnum: CrateNum) -> bool |
a7813a04 XL |
276 | { |
277 | self.get_crate_data(cnum).is_panic_runtime() | |
278 | } | |
279 | ||
9e0c209e SL |
280 | fn is_compiler_builtins(&self, cnum: CrateNum) -> bool { |
281 | self.get_crate_data(cnum).is_compiler_builtins() | |
a7813a04 XL |
282 | } |
283 | ||
8bb4bdeb XL |
284 | fn is_sanitizer_runtime(&self, cnum: CrateNum) -> bool { |
285 | self.get_crate_data(cnum).is_sanitizer_runtime() | |
286 | } | |
287 | ||
9e0c209e SL |
288 | fn panic_strategy(&self, cnum: CrateNum) -> PanicStrategy { |
289 | self.get_crate_data(cnum).panic_strategy() | |
92a42be0 SL |
290 | } |
291 | ||
476ff2be | 292 | fn crate_name(&self, cnum: CrateNum) -> Symbol |
92a42be0 | 293 | { |
476ff2be | 294 | self.get_crate_data(cnum).name |
54a0048b SL |
295 | } |
296 | ||
476ff2be | 297 | fn original_crate_name(&self, cnum: CrateNum) -> Symbol |
54a0048b | 298 | { |
476ff2be | 299 | self.get_crate_data(cnum).name() |
54a0048b SL |
300 | } |
301 | ||
9e0c209e | 302 | fn extern_crate(&self, cnum: CrateNum) -> Option<ExternCrate> |
54a0048b SL |
303 | { |
304 | self.get_crate_data(cnum).extern_crate.get() | |
92a42be0 SL |
305 | } |
306 | ||
9e0c209e | 307 | fn crate_hash(&self, cnum: CrateNum) -> Svh |
92a42be0 | 308 | { |
9e0c209e | 309 | self.get_crate_hash(cnum) |
92a42be0 SL |
310 | } |
311 | ||
476ff2be | 312 | fn crate_disambiguator(&self, cnum: CrateNum) -> Symbol |
54a0048b | 313 | { |
476ff2be | 314 | self.get_crate_data(cnum).disambiguator() |
54a0048b SL |
315 | } |
316 | ||
9e0c209e | 317 | fn plugin_registrar_fn(&self, cnum: CrateNum) -> Option<DefId> |
92a42be0 | 318 | { |
9e0c209e | 319 | self.get_crate_data(cnum).root.plugin_registrar_fn.map(|index| DefId { |
92a42be0 SL |
320 | krate: cnum, |
321 | index: index | |
322 | }) | |
323 | } | |
324 | ||
476ff2be SL |
325 | fn derive_registrar_fn(&self, cnum: CrateNum) -> Option<DefId> |
326 | { | |
327 | self.get_crate_data(cnum).root.macro_derive_registrar.map(|index| DefId { | |
328 | krate: cnum, | |
329 | index: index | |
330 | }) | |
331 | } | |
332 | ||
333 | fn native_libraries(&self, cnum: CrateNum) -> Vec<NativeLibrary> | |
92a42be0 | 334 | { |
9e0c209e | 335 | self.get_crate_data(cnum).get_native_libraries() |
92a42be0 SL |
336 | } |
337 | ||
476ff2be | 338 | fn exported_symbols(&self, cnum: CrateNum) -> Vec<DefId> |
92a42be0 | 339 | { |
476ff2be | 340 | self.get_crate_data(cnum).get_exported_symbols() |
9e0c209e SL |
341 | } |
342 | ||
343 | fn is_no_builtins(&self, cnum: CrateNum) -> bool { | |
344 | self.get_crate_data(cnum).is_no_builtins() | |
92a42be0 SL |
345 | } |
346 | ||
32a655c1 SL |
347 | fn retrace_path(&self, |
348 | cnum: CrateNum, | |
349 | path: &[DisambiguatedDefPathData]) | |
350 | -> Option<DefId> { | |
a7813a04 | 351 | let cdata = self.get_crate_data(cnum); |
32a655c1 SL |
352 | cdata.def_path_table |
353 | .retrace_path(&path) | |
354 | .map(|index| DefId { krate: cnum, index: index }) | |
a7813a04 XL |
355 | } |
356 | ||
54a0048b SL |
357 | /// Returns the `DefKey` for a given `DefId`. This indicates the |
358 | /// parent `DefId` as well as some idea of what kind of data the | |
359 | /// `DefId` refers to. | |
32a655c1 | 360 | fn def_key(&self, def: DefId) -> DefKey { |
9e0c209e SL |
361 | // Note: loading the def-key (or def-path) for a def-id is not |
362 | // a *read* of its metadata. This is because the def-id is | |
363 | // really just an interned shorthand for a def-path, which is the | |
364 | // canonical name for an item. | |
365 | // | |
366 | // self.dep_graph.read(DepNode::MetaData(def)); | |
367 | self.get_crate_data(def.krate).def_key(def.index) | |
54a0048b SL |
368 | } |
369 | ||
32a655c1 | 370 | fn def_path(&self, def: DefId) -> DefPath { |
9e0c209e SL |
371 | // See `Note` above in `def_key()` for why this read is |
372 | // commented out: | |
373 | // | |
374 | // self.dep_graph.read(DepNode::MetaData(def)); | |
375 | self.get_crate_data(def.krate).def_path(def.index) | |
92a42be0 SL |
376 | } |
377 | ||
92a42be0 SL |
378 | fn struct_field_names(&self, def: DefId) -> Vec<ast::Name> |
379 | { | |
a7813a04 | 380 | self.dep_graph.read(DepNode::MetaData(def)); |
9e0c209e | 381 | self.get_crate_data(def.krate).get_struct_field_names(def.index) |
92a42be0 SL |
382 | } |
383 | ||
9e0c209e | 384 | fn item_children(&self, def_id: DefId) -> Vec<def::Export> |
92a42be0 | 385 | { |
a7813a04 | 386 | self.dep_graph.read(DepNode::MetaData(def_id)); |
92a42be0 | 387 | let mut result = vec![]; |
9e0c209e SL |
388 | self.get_crate_data(def_id.krate) |
389 | .each_child_of_item(def_id.index, |child| result.push(child)); | |
92a42be0 SL |
390 | result |
391 | } | |
392 | ||
476ff2be SL |
393 | fn load_macro(&self, id: DefId, sess: &Session) -> LoadedMacro { |
394 | let data = self.get_crate_data(id.krate); | |
395 | if let Some(ref proc_macros) = data.proc_macros { | |
396 | return LoadedMacro::ProcMacro(proc_macros[id.index.as_usize() - 1].1.clone()); | |
397 | } | |
398 | ||
399 | let (name, def) = data.get_macro(id.index); | |
400 | let source_name = format!("<{} macros>", name); | |
401 | ||
32a655c1 SL |
402 | let filemap = sess.parse_sess.codemap().new_filemap(source_name, None, def.body); |
403 | let local_span = mk_sp(filemap.start_pos, filemap.end_pos); | |
8bb4bdeb | 404 | let body = filemap_to_stream(&sess.parse_sess, filemap); |
476ff2be SL |
405 | |
406 | // Mark the attrs as used | |
407 | let attrs = data.get_item_attrs(id.index); | |
408 | for attr in &attrs { | |
409 | attr::mark_used(attr); | |
410 | } | |
411 | ||
412 | let name = data.def_key(id.index).disambiguated_data.data | |
413 | .get_opt_name().expect("no name in load_macro"); | |
414 | sess.imported_macro_spans.borrow_mut() | |
415 | .insert(local_span, (name.to_string(), data.get_span(id.index, sess))); | |
416 | ||
8bb4bdeb | 417 | LoadedMacro::MacroDef(ast::Item { |
476ff2be SL |
418 | ident: ast::Ident::with_empty_ctxt(name), |
419 | id: ast::DUMMY_NODE_ID, | |
420 | span: local_span, | |
476ff2be | 421 | attrs: attrs, |
8bb4bdeb XL |
422 | node: ast::ItemKind::MacroDef(body.into()), |
423 | vis: ast::Visibility::Inherited, | |
476ff2be SL |
424 | }) |
425 | } | |
426 | ||
8bb4bdeb XL |
427 | fn maybe_get_item_body<'a, 'tcx>(&self, |
428 | tcx: TyCtxt<'a, 'tcx, 'tcx>, | |
429 | def_id: DefId) | |
430 | -> Option<&'tcx hir::Body> | |
92a42be0 | 431 | { |
32a655c1 SL |
432 | if let Some(cached) = tcx.hir.get_inlined_body(def_id) { |
433 | return Some(cached); | |
5bcae85e SL |
434 | } |
435 | ||
32a655c1 SL |
436 | self.dep_graph.read(DepNode::MetaData(def_id)); |
437 | debug!("maybe_get_item_body({}): inlining item", tcx.item_path_str(def_id)); | |
5bcae85e | 438 | |
32a655c1 | 439 | self.get_crate_data(def_id.krate).maybe_get_item_body(tcx, def_id.index) |
5bcae85e SL |
440 | } |
441 | ||
32a655c1 SL |
442 | fn item_body_nested_bodies(&self, def: DefId) -> BTreeMap<hir::BodyId, hir::Body> { |
443 | self.dep_graph.read(DepNode::MetaData(def)); | |
444 | self.get_crate_data(def.krate).item_body_nested_bodies(def.index) | |
5bcae85e SL |
445 | } |
446 | ||
32a655c1 SL |
447 | fn const_is_rvalue_promotable_to_static(&self, def: DefId) -> bool { |
448 | self.dep_graph.read(DepNode::MetaData(def)); | |
449 | self.get_crate_data(def.krate).const_is_rvalue_promotable_to_static(def.index) | |
92a42be0 SL |
450 | } |
451 | ||
7453a54e | 452 | fn is_item_mir_available(&self, def: DefId) -> bool { |
a7813a04 | 453 | self.dep_graph.read(DepNode::MetaData(def)); |
9e0c209e | 454 | self.get_crate_data(def.krate).is_item_mir_available(def.index) |
9cc50fc6 SL |
455 | } |
456 | ||
9e0c209e | 457 | fn crates(&self) -> Vec<CrateNum> |
92a42be0 SL |
458 | { |
459 | let mut result = vec![]; | |
460 | self.iter_crate_data(|cnum, _| result.push(cnum)); | |
461 | result | |
462 | } | |
463 | ||
476ff2be | 464 | fn used_libraries(&self) -> Vec<NativeLibrary> |
92a42be0 SL |
465 | { |
466 | self.get_used_libraries().borrow().clone() | |
467 | } | |
468 | ||
469 | fn used_link_args(&self) -> Vec<String> | |
470 | { | |
471 | self.get_used_link_args().borrow().clone() | |
472 | } | |
473 | ||
474 | fn metadata_filename(&self) -> &str | |
475 | { | |
c30ab7b3 | 476 | locator::METADATA_FILENAME |
92a42be0 SL |
477 | } |
478 | ||
479 | fn metadata_section_name(&self, target: &Target) -> &str | |
480 | { | |
c30ab7b3 | 481 | locator::meta_section_name(target) |
92a42be0 | 482 | } |
92a42be0 | 483 | |
476ff2be | 484 | fn used_crates(&self, prefer: LinkagePreference) -> Vec<(CrateNum, LibSource)> |
92a42be0 SL |
485 | { |
486 | self.do_get_used_crates(prefer) | |
487 | } | |
488 | ||
9e0c209e | 489 | fn used_crate_source(&self, cnum: CrateNum) -> CrateSource |
92a42be0 | 490 | { |
476ff2be | 491 | self.get_crate_data(cnum).source.clone() |
92a42be0 SL |
492 | } |
493 | ||
9e0c209e | 494 | fn extern_mod_stmt_cnum(&self, emod_id: ast::NodeId) -> Option<CrateNum> |
92a42be0 SL |
495 | { |
496 | self.do_extern_mod_stmt_cnum(emod_id) | |
497 | } | |
498 | ||
8bb4bdeb XL |
499 | fn encode_metadata<'a, 'tcx>(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>, |
500 | reexports: &def::ExportMap, | |
501 | link_meta: &LinkMeta, | |
502 | reachable: &NodeSet) -> Vec<u8> | |
9e0c209e | 503 | { |
c30ab7b3 | 504 | encoder::encode_metadata(tcx, self, reexports, link_meta, reachable) |
92a42be0 SL |
505 | } |
506 | ||
507 | fn metadata_encoding_version(&self) -> &[u8] | |
508 | { | |
9e0c209e | 509 | schema::METADATA_HEADER |
92a42be0 | 510 | } |
54a0048b SL |
511 | |
512 | /// Returns a map from a sufficiently visible external item (i.e. an external item that is | |
513 | /// visible from at least one local module) to a sufficiently visible parent (considering | |
514 | /// modules that re-export the external item to be parents). | |
515 | fn visible_parent_map<'a>(&'a self) -> ::std::cell::RefMut<'a, DefIdMap<DefId>> { | |
516 | let mut visible_parent_map = self.visible_parent_map.borrow_mut(); | |
517 | if !visible_parent_map.is_empty() { return visible_parent_map; } | |
518 | ||
54a0048b SL |
519 | use std::collections::vec_deque::VecDeque; |
520 | use std::collections::hash_map::Entry; | |
9e0c209e | 521 | for cnum in (1 .. self.next_crate_num().as_usize()).map(CrateNum::new) { |
54a0048b SL |
522 | let cdata = self.get_crate_data(cnum); |
523 | ||
524 | match cdata.extern_crate.get() { | |
525 | // Ignore crates without a corresponding local `extern crate` item. | |
526 | Some(extern_crate) if !extern_crate.direct => continue, | |
527 | _ => {}, | |
528 | } | |
529 | ||
530 | let mut bfs_queue = &mut VecDeque::new(); | |
9e0c209e | 531 | let mut add_child = |bfs_queue: &mut VecDeque<_>, child: def::Export, parent: DefId| { |
c30ab7b3 | 532 | let child = child.def.def_id(); |
9e0c209e SL |
533 | |
534 | if self.visibility(child) != ty::Visibility::Public { | |
535 | return; | |
536 | } | |
54a0048b SL |
537 | |
538 | match visible_parent_map.entry(child) { | |
539 | Entry::Occupied(mut entry) => { | |
540 | // If `child` is defined in crate `cnum`, ensure | |
541 | // that it is mapped to a parent in `cnum`. | |
542 | if child.krate == cnum && entry.get().krate != cnum { | |
543 | entry.insert(parent); | |
544 | } | |
545 | } | |
546 | Entry::Vacant(entry) => { | |
547 | entry.insert(parent); | |
548 | bfs_queue.push_back(child); | |
549 | } | |
550 | } | |
551 | }; | |
552 | ||
9e0c209e SL |
553 | bfs_queue.push_back(DefId { |
554 | krate: cnum, | |
555 | index: CRATE_DEF_INDEX | |
556 | }); | |
54a0048b SL |
557 | while let Some(def) = bfs_queue.pop_front() { |
558 | for child in self.item_children(def) { | |
559 | add_child(bfs_queue, child, def); | |
560 | } | |
561 | } | |
562 | } | |
563 | ||
564 | visible_parent_map | |
565 | } | |
92a42be0 | 566 | } |