#![feature(box_patterns)]
#![feature(box_syntax)]
-#![feature(const_fn)]
#![feature(custom_attribute)]
#![allow(unused_attributes)]
#![feature(i128_type)]
#![feature(slice_patterns)]
#![feature(conservative_impl_trait)]
+#![cfg_attr(stage0, feature(const_fn))]
+#![cfg_attr(not(stage0), feature(const_atomic_bool_new))]
+#![cfg_attr(not(stage0), feature(const_once_new))]
+
use rustc::dep_graph::WorkProduct;
use syntax_pos::symbol::Symbol;
extern crate gcc; // Used to locate MSVC, not gcc :)
pub use base::trans_crate;
-pub use back::symbol_names::provide;
pub use metadata::LlvmMetadataLoader;
pub use llvm_util::{init, target_features, print_version, print_passes, print, enable_llvm_debug};
+use std::rc::Rc;
+use std::sync::Arc;
+
+use rustc::hir::def_id::{CrateNum, LOCAL_CRATE};
+use rustc::middle::cstore::{NativeLibrary, CrateSource, LibSource};
+use rustc::ty::maps::Providers;
+use rustc::util::nodemap::{FxHashSet, FxHashMap};
+
+mod diagnostics;
+
pub mod back {
mod archive;
+ mod command;
pub(crate) mod linker;
pub mod link;
mod lto;
mod rpath;
}
-mod diagnostics;
-
mod abi;
mod adt;
mod allocator;
pub link: rustc::middle::cstore::LinkMeta,
pub metadata: rustc::middle::cstore::EncodedMetadata,
windows_subsystem: Option<String>,
- linker_info: back::linker::LinkerInfo
+ linker_info: back::linker::LinkerInfo,
+ crate_info: CrateInfo,
+}
+
+// Misc info we load from metadata to persist beyond the tcx
+pub struct CrateInfo {
+ panic_runtime: Option<CrateNum>,
+ compiler_builtins: Option<CrateNum>,
+ profiler_runtime: Option<CrateNum>,
+ sanitizer_runtime: Option<CrateNum>,
+ is_no_builtins: FxHashSet<CrateNum>,
+ native_libraries: FxHashMap<CrateNum, Rc<Vec<NativeLibrary>>>,
+ crate_name: FxHashMap<CrateNum, String>,
+ used_libraries: Rc<Vec<NativeLibrary>>,
+ link_args: Rc<Vec<String>>,
+ used_crate_source: FxHashMap<CrateNum, Rc<CrateSource>>,
+ used_crates_static: Vec<(CrateNum, LibSource)>,
+ used_crates_dynamic: Vec<(CrateNum, LibSource)>,
}
__build_diagnostic_array! { librustc_trans, DIAGNOSTICS }
+
+pub fn provide_local(providers: &mut Providers) {
+ back::symbol_names::provide(providers);
+ base::provide(providers);
+ providers.exported_symbol_set = |tcx, cnum| {
+ assert_eq!(cnum, LOCAL_CRATE);
+ Arc::new(back::symbol_export::compute(tcx))
+ };
+}
+
+pub fn provide_extern(providers: &mut Providers) {
+ back::symbol_names::provide(providers);
+}