2019-05-04 09:54:25 -05:00
|
|
|
use std::any::Any;
|
|
|
|
|
2020-03-31 06:20:19 -05:00
|
|
|
use rustc_middle::middle::cstore::EncodedMetadata;
|
|
|
|
use rustc_middle::mir::mono::{Linkage as RLinkage, MonoItem, Visibility};
|
2019-05-04 09:54:25 -05:00
|
|
|
|
|
|
|
use crate::prelude::*;
|
|
|
|
|
2020-03-12 05:48:17 -05:00
|
|
|
mod aot;
|
2020-03-12 05:44:27 -05:00
|
|
|
#[cfg(not(target_arch = "wasm32"))]
|
|
|
|
mod jit;
|
|
|
|
|
2020-03-27 06:14:45 -05:00
|
|
|
pub(crate) fn codegen_crate(
|
2019-06-16 04:13:49 -05:00
|
|
|
tcx: TyCtxt<'_>,
|
2019-05-04 09:54:25 -05:00
|
|
|
metadata: EncodedMetadata,
|
2019-05-11 05:23:40 -05:00
|
|
|
need_metadata_module: bool,
|
2019-05-04 09:54:25 -05:00
|
|
|
) -> Box<dyn Any> {
|
|
|
|
tcx.sess.abort_if_errors();
|
|
|
|
|
2020-03-12 05:17:19 -05:00
|
|
|
if std::env::var("CG_CLIF_JIT").is_ok()
|
2020-05-18 04:35:23 -05:00
|
|
|
&& tcx.sess.crate_types().contains(&rustc_session::config::CrateType::Executable)
|
2019-08-11 10:33:52 -05:00
|
|
|
{
|
2019-05-11 05:23:40 -05:00
|
|
|
#[cfg(not(target_arch = "wasm32"))]
|
2020-03-12 05:44:27 -05:00
|
|
|
let _: ! = jit::run_jit(tcx);
|
2019-05-11 05:23:40 -05:00
|
|
|
|
|
|
|
#[cfg(target_arch = "wasm32")]
|
|
|
|
panic!("jit not supported on wasm");
|
|
|
|
}
|
|
|
|
|
2020-03-12 05:48:17 -05:00
|
|
|
aot::run_aot(tcx, metadata, need_metadata_module)
|
2019-05-04 09:54:25 -05:00
|
|
|
}
|
|
|
|
|
2019-06-16 04:13:49 -05:00
|
|
|
fn codegen_mono_items<'tcx>(
|
2020-06-20 11:44:49 -05:00
|
|
|
cx: &mut crate::CodegenCx<'tcx, impl Backend + 'static>,
|
2020-03-09 05:21:40 -05:00
|
|
|
mono_items: Vec<(MonoItem<'tcx>, (RLinkage, Visibility))>,
|
2019-05-04 09:54:25 -05:00
|
|
|
) {
|
2020-06-12 14:15:13 -05:00
|
|
|
cx.tcx.sess.time("predefine functions", || {
|
2020-03-09 05:21:40 -05:00
|
|
|
for &(mono_item, (linkage, visibility)) in &mono_items {
|
2020-03-07 05:16:32 -06:00
|
|
|
match mono_item {
|
|
|
|
MonoItem::Fn(instance) => {
|
|
|
|
let (name, sig) =
|
2020-06-12 14:15:13 -05:00
|
|
|
get_function_name_and_sig(cx.tcx, cx.module.isa().triple(), instance, false);
|
2020-03-07 05:16:32 -06:00
|
|
|
let linkage = crate::linkage::get_clif_linkage(mono_item, linkage, visibility);
|
|
|
|
cx.module.declare_function(&name, linkage, &sig).unwrap();
|
2019-10-04 07:39:14 -05:00
|
|
|
}
|
2020-03-07 05:16:32 -06:00
|
|
|
MonoItem::Static(_) | MonoItem::GlobalAsm(_) => {}
|
2019-10-04 07:39:14 -05:00
|
|
|
}
|
2019-05-04 09:54:25 -05:00
|
|
|
}
|
|
|
|
});
|
2020-03-07 05:16:32 -06:00
|
|
|
|
|
|
|
for (mono_item, (linkage, visibility)) in mono_items {
|
2020-03-17 10:26:56 -05:00
|
|
|
let linkage = crate::linkage::get_clif_linkage(mono_item, linkage, visibility);
|
2020-06-12 14:15:13 -05:00
|
|
|
trans_mono_item(cx, mono_item, linkage);
|
2020-03-07 05:16:32 -06:00
|
|
|
}
|
2019-05-04 09:54:25 -05:00
|
|
|
}
|
|
|
|
|
2020-06-12 14:15:13 -05:00
|
|
|
fn trans_mono_item<'tcx, B: Backend + 'static>(
|
|
|
|
cx: &mut crate::CodegenCx<'tcx, B>,
|
2019-05-04 09:54:25 -05:00
|
|
|
mono_item: MonoItem<'tcx>,
|
|
|
|
linkage: Linkage,
|
|
|
|
) {
|
|
|
|
let tcx = cx.tcx;
|
|
|
|
match mono_item {
|
|
|
|
MonoItem::Fn(inst) => {
|
|
|
|
let _inst_guard =
|
2020-06-20 11:44:49 -05:00
|
|
|
crate::PrintOnPanic(|| format!("{:?} {}", inst, tcx.symbol_name(inst).name.as_str()));
|
2019-05-04 09:54:25 -05:00
|
|
|
debug_assert!(!inst.substs.needs_infer());
|
2020-06-20 11:44:49 -05:00
|
|
|
let _mir_guard = crate::PrintOnPanic(|| {
|
2019-05-04 09:54:25 -05:00
|
|
|
match inst.def {
|
|
|
|
InstanceDef::Item(_)
|
|
|
|
| InstanceDef::DropGlue(_, _)
|
2019-06-08 13:41:15 -05:00
|
|
|
| InstanceDef::Virtual(_, _) => {
|
2019-05-04 09:54:25 -05:00
|
|
|
let mut mir = ::std::io::Cursor::new(Vec::new());
|
|
|
|
crate::rustc_mir::util::write_mir_pretty(
|
|
|
|
tcx,
|
|
|
|
Some(inst.def_id()),
|
|
|
|
&mut mir,
|
|
|
|
)
|
|
|
|
.unwrap();
|
|
|
|
String::from_utf8(mir.into_inner()).unwrap()
|
|
|
|
}
|
|
|
|
_ => {
|
|
|
|
// FIXME fix write_mir_pretty for these instances
|
|
|
|
format!("{:#?}", tcx.instance_mir(inst.def))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2020-01-10 07:15:14 -06:00
|
|
|
cx.tcx.sess.time("codegen fn", || crate::base::trans_fn(cx, inst, linkage));
|
2019-05-04 09:54:25 -05:00
|
|
|
}
|
|
|
|
MonoItem::Static(def_id) => {
|
2019-08-18 09:52:07 -05:00
|
|
|
crate::constant::codegen_static(&mut cx.constants_cx, def_id);
|
2019-05-04 09:54:25 -05:00
|
|
|
}
|
2020-01-25 10:24:45 -06:00
|
|
|
MonoItem::GlobalAsm(hir_id) => {
|
|
|
|
let item = tcx.hir().expect_item(hir_id);
|
|
|
|
if let rustc_hir::ItemKind::GlobalAsm(rustc_hir::GlobalAsm { asm }) = item.kind {
|
|
|
|
// FIXME implement global asm using an external assembler
|
|
|
|
if asm.as_str().contains("__rust_probestack") {
|
|
|
|
return;
|
|
|
|
} else {
|
|
|
|
tcx
|
|
|
|
.sess
|
|
|
|
.fatal(&format!("Unimplemented global asm mono item \"{}\"", asm));
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
bug!("Expected GlobalAsm found {:?}", item);
|
|
|
|
}
|
|
|
|
}
|
2019-05-04 09:54:25 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-12 05:40:42 -05:00
|
|
|
fn time<R>(tcx: TyCtxt<'_>, name: &'static str, f: impl FnOnce() -> R) -> R {
|
2020-07-03 09:43:26 -05:00
|
|
|
if std::env::var("CG_CLIF_DISPLAY_CG_TIME").as_ref().map(|val| &**val) == Ok("1") {
|
2020-03-12 05:40:42 -05:00
|
|
|
println!("[{:<30}: {}] start", tcx.crate_name(LOCAL_CRATE), name);
|
2020-03-12 05:17:19 -05:00
|
|
|
let before = std::time::Instant::now();
|
2020-03-12 05:40:42 -05:00
|
|
|
let res = tcx.sess.time(name, f);
|
2020-03-12 05:17:19 -05:00
|
|
|
let after = std::time::Instant::now();
|
2020-03-12 05:40:42 -05:00
|
|
|
println!("[{:<30}: {}] end time: {:?}", tcx.crate_name(LOCAL_CRATE), name, after - before);
|
2020-03-12 05:17:19 -05:00
|
|
|
res
|
|
|
|
} else {
|
2020-03-12 05:40:42 -05:00
|
|
|
tcx.sess.time(name, f)
|
2020-03-12 05:17:19 -05:00
|
|
|
}
|
2019-05-04 09:54:25 -05:00
|
|
|
}
|