Introduce CodegenCx

This commit is contained in:
bjorn3 2018-12-18 18:28:02 +01:00
parent 4f32e703a8
commit 6fa3140222
3 changed files with 47 additions and 29 deletions

View File

@ -9,13 +9,11 @@ impl<F: Fn() -> String> Drop for PrintOnPanic<F> {
}
}
pub fn trans_mono_item<'a, 'tcx: 'a>(
tcx: TyCtxt<'a, 'tcx, 'tcx>,
module: &mut Module<impl Backend>,
caches: &mut Caches<'tcx>,
ccx: &mut crate::constant::ConstantCx,
pub fn trans_mono_item<'a, 'clif, 'tcx: 'a, B: Backend + 'static>(
cx: &mut crate::CodegenCx<'a, 'clif, 'tcx, B>,
mono_item: MonoItem<'tcx>,
) {
let tcx = cx.tcx;
match mono_item {
MonoItem::Fn(inst) => {
let _inst_guard =
@ -44,10 +42,10 @@ pub fn trans_mono_item<'a, 'tcx: 'a>(
}
});
trans_fn(tcx, module, ccx, caches, inst);
trans_fn(cx, inst);
}
MonoItem::Static(def_id) => {
crate::constant::codegen_static(ccx, def_id);
crate::constant::codegen_static(&mut cx.ccx, def_id);
}
MonoItem::GlobalAsm(node_id) => tcx
.sess
@ -55,19 +53,18 @@ pub fn trans_mono_item<'a, 'tcx: 'a>(
}
}
fn trans_fn<'a, 'tcx: 'a>(
tcx: TyCtxt<'a, 'tcx, 'tcx>,
module: &mut Module<impl Backend>,
constants: &mut crate::constant::ConstantCx,
caches: &mut Caches<'tcx>,
fn trans_fn<'a, 'clif, 'tcx: 'a, B: Backend + 'static>(
cx: &mut crate::CodegenCx<'a, 'clif, 'tcx, B>,
instance: Instance<'tcx>,
) {
let tcx = cx.tcx;
// Step 1. Get mir
let mir = tcx.instance_mir(instance.def);
// Step 2. Declare function
let (name, sig) = get_function_name_and_sig(tcx, instance);
let func_id = module
let func_id = cx.module
.declare_function(&name, Linkage::Export, &sig)
.unwrap();
@ -84,10 +81,10 @@ fn trans_fn<'a, 'tcx: 'a>(
}
// Step 5. Make FunctionCx
let pointer_type = module.target_config().pointer_type();
let pointer_type = cx.module.target_config().pointer_type();
let mut fx = FunctionCx {
tcx,
module,
module: cx.module,
pointer_type,
instance,
@ -98,8 +95,8 @@ fn trans_fn<'a, 'tcx: 'a>(
local_map: HashMap::new(),
comments: HashMap::new(),
constants,
caches,
constants: &mut cx.ccx,
caches: &mut cx.caches,
top_nop: None,
};
@ -132,11 +129,11 @@ fn trans_fn<'a, 'tcx: 'a>(
verify_func(tcx, writer, &func);
// Step 9. Define function
caches.context.func = func;
module
.define_function(func_id, &mut caches.context)
cx.caches.context.func = func;
cx.module
.define_function(func_id, &mut cx.caches.context)
.unwrap();
caches.context.clear();
cx.caches.context.clear();
}
fn verify_func(tcx: TyCtxt, writer: crate::pretty_clif::CommentWriter, func: &Function) {

View File

@ -611,6 +611,7 @@ pub fn clif_intcast<'a, 'tcx: 'a>(
}
pub struct FunctionCx<'a, 'tcx: 'a, B: Backend> {
// FIXME use a reference to `CodegenCx` instead of `tcx`, `module` and `constants` and `caches`
pub tcx: TyCtxt<'a, 'tcx, 'tcx>,
pub module: &'a mut Module<B>,
pub pointer_type: Type, // Cached from module

View File

@ -97,7 +97,7 @@ mod prelude {
pub use crate::common::*;
pub use crate::trap::*;
pub use crate::unimpl::{unimpl, with_unimpl_span};
pub use crate::Caches;
pub use crate::{Caches, CodegenCx};
}
pub struct Caches<'tcx> {
@ -105,8 +105,8 @@ pub struct Caches<'tcx> {
pub vtables: HashMap<(Ty<'tcx>, ty::PolyExistentialTraitRef<'tcx>), DataId>,
}
impl<'tcx> Caches<'tcx> {
fn new() -> Self {
impl<'tcx> Default for Caches<'tcx> {
fn default() -> Self {
Caches {
context: Context::new(),
vtables: HashMap::new(),
@ -114,6 +114,28 @@ impl<'tcx> Caches<'tcx> {
}
}
pub struct CodegenCx<'a, 'clif, 'tcx, B: Backend + 'static> {
tcx: TyCtxt<'a, 'tcx, 'tcx>,
module: &'clif mut Module<B>,
ccx: ConstantCx,
caches: Caches<'tcx>,
}
impl<'a, 'clif, 'tcx, B: Backend + 'static> CodegenCx<'a, 'clif, 'tcx, B> {
fn new(tcx: TyCtxt<'a, 'tcx, 'tcx>, module: &'clif mut Module<B>) -> Self {
CodegenCx {
tcx,
module,
ccx: ConstantCx::default(),
caches: Caches::default(),
}
}
fn finalize(self) {
self.ccx.finalize(self.tcx, self.module);
}
}
struct CraneliftCodegenBackend;
impl CodegenBackend for CraneliftCodegenBackend {
@ -369,17 +391,15 @@ fn codegen_mono_items<'a, 'tcx: 'a>(
log: &mut Option<File>,
mono_items: FxHashMap<MonoItem<'tcx>, (RLinkage, Visibility)>,
) {
let mut cx = CodegenCx::new(tcx, module);
time("codegen mono items", move || {
let mut caches = Caches::new();
let mut ccx = ConstantCx::default();
for (mono_item, (_linkage, _vis)) in mono_items {
unimpl::try_unimpl(tcx, log, || {
base::trans_mono_item(tcx, module, &mut caches, &mut ccx, mono_item);
base::trans_mono_item(&mut cx, mono_item);
});
}
ccx.finalize(tcx, module);
cx.finalize();
});
}