Skip to content

Commit

Permalink
Generalized mono_item.rs and base.rs:codegen_instance
Browse files Browse the repository at this point in the history
  • Loading branch information
denismerigoux authored and eddyb committed Nov 16, 2018
1 parent 6a993fe commit 441a7c1
Show file tree
Hide file tree
Showing 6 changed files with 136 additions and 90 deletions.
38 changes: 22 additions & 16 deletions src/librustc_codegen_llvm/base.rs
Expand Up @@ -39,7 +39,7 @@ use rustc::middle::weak_lang_items;
use rustc::mir::mono::{Linkage, Visibility, Stats, CodegenUnitNameBuilder};
use rustc::middle::cstore::{EncodedMetadata};
use rustc::ty::{self, Ty, TyCtxt};
use rustc::ty::layout::{self, Align, TyLayout, LayoutOf, VariantIdx};
use rustc::ty::layout::{self, Align, TyLayout, LayoutOf, VariantIdx, HasTyCtxt};
use rustc::ty::query::Providers;
use rustc::middle::cstore::{self, LinkagePreference};
use rustc::middle::exported_symbols;
Expand Down Expand Up @@ -76,6 +76,7 @@ use interfaces::*;
use std::any::Any;
use std::cmp;
use std::ffi::CString;
use std::marker;
use std::ops::{Deref, DerefMut};
use std::sync::mpsc;
use std::time::{Instant, Duration};
Expand All @@ -90,27 +91,29 @@ use mir::operand::OperandValue;

use rustc_codegen_utils::check_for_rustc_errors_attr;

pub struct StatRecorder<'a, 'll: 'a, 'tcx: 'll> {
cx: &'a CodegenCx<'ll, 'tcx>,
pub struct StatRecorder<'a, 'tcx, Cx: 'a + CodegenMethods<'tcx>> {
cx: &'a Cx,
name: Option<String>,
istart: usize,
_marker: marker::PhantomData<&'tcx ()>,
}

impl StatRecorder<'a, 'll, 'tcx> {
pub fn new(cx: &'a CodegenCx<'ll, 'tcx>, name: String) -> Self {
let istart = cx.stats.borrow().n_llvm_insns;
impl<'a, 'tcx, Cx: CodegenMethods<'tcx>> StatRecorder<'a, 'tcx, Cx> {
pub fn new(cx: &'a Cx, name: String) -> Self {
let istart = cx.stats().borrow().n_llvm_insns;
StatRecorder {
cx,
name: Some(name),
istart,
_marker: marker::PhantomData,
}
}
}

impl Drop for StatRecorder<'a, 'll, 'tcx> {
impl<'a, 'tcx, Cx: CodegenMethods<'tcx>> Drop for StatRecorder<'a, 'tcx, Cx> {
fn drop(&mut self) {
if self.cx.sess().codegen_stats() {
let mut stats = self.cx.stats.borrow_mut();
let mut stats = self.cx.stats().borrow_mut();
let iend = stats.n_llvm_insns;
stats.fn_stats.push((self.name.take().unwrap(), iend - self.istart));
stats.n_fns += 1;
Expand Down Expand Up @@ -449,10 +452,13 @@ pub fn memcpy_ty<'a, 'tcx: 'a, Builder: BuilderMethods<'a, 'tcx>>(
bx.memcpy(dst, dst_align, src, src_align, bx.cx().const_usize(size), flags);
}

pub fn codegen_instance(cx: &CodegenCx<'_, 'tcx>, instance: Instance<'tcx>) {
pub fn codegen_instance<'a, 'tcx: 'a, Bx: BuilderMethods<'a, 'tcx>>(
cx: &'a Bx::CodegenCx,
instance: Instance<'tcx>,
) {
let _s = if cx.sess().codegen_stats() {
let mut instance_name = String::new();
DefPathBasedNames::new(cx.tcx, true, true)
DefPathBasedNames::new(cx.tcx(), true, true)
.push_def_path(instance.def_id(), &mut instance_name);
Some(StatRecorder::new(cx, instance_name))
} else {
Expand All @@ -464,16 +470,16 @@ pub fn codegen_instance(cx: &CodegenCx<'_, 'tcx>, instance: Instance<'tcx>) {
// release builds.
info!("codegen_instance({})", instance);

let sig = instance.fn_sig(cx.tcx);
let sig = cx.tcx.normalize_erasing_late_bound_regions(ty::ParamEnv::reveal_all(), &sig);
let sig = instance.fn_sig(cx.tcx());
let sig = cx.tcx().normalize_erasing_late_bound_regions(ty::ParamEnv::reveal_all(), &sig);

let lldecl = cx.instances.borrow().get(&instance).cloned().unwrap_or_else(||
let lldecl = cx.instances().borrow().get(&instance).cloned().unwrap_or_else(||
bug!("Instance `{:?}` not already declared", instance));

cx.stats.borrow_mut().n_closures += 1;
cx.stats().borrow_mut().n_closures += 1;

let mir = cx.tcx.instance_mir(instance.def);
mir::codegen_mir::<Builder>(cx, lldecl, &mir, instance, sig);
let mir = cx.tcx().instance_mir(instance.def);
mir::codegen_mir::<Bx>(cx, lldecl, &mir, instance, sig);
}

pub fn set_link_section(llval: &Value, attrs: &CodegenFnAttrs) {
Expand Down
8 changes: 8 additions & 0 deletions src/librustc_codegen_llvm/context.rs
Expand Up @@ -417,6 +417,14 @@ impl MiscMethods<'tcx> for CodegenCx<'ll, 'tcx> {
fn check_overflow(&self) -> bool {
self.check_overflow
}

fn stats(&self) -> &RefCell<Stats> {
&self.stats
}

fn codegen_unit(&self) -> &Arc<CodegenUnit<'tcx>> {
&self.codegen_unit
}
}

impl IntrinsicDeclarationMethods<'tcx> for CodegenCx<'b, 'tcx> {
Expand Down
20 changes: 20 additions & 0 deletions src/librustc_codegen_llvm/interfaces/declare.rs
Expand Up @@ -9,6 +9,9 @@
// except according to those terms.

use super::backend::Backend;
use monomorphize::Instance;
use rustc::hir::def_id::DefId;
use rustc::mir::mono::{Linkage, Visibility};
use rustc::ty;

pub trait DeclareMethods<'tcx>: Backend<'tcx> {
Expand All @@ -22,3 +25,20 @@ pub trait DeclareMethods<'tcx>: Backend<'tcx> {
fn get_declared_value(&self, name: &str) -> Option<Self::Value>;
fn get_defined_value(&self, name: &str) -> Option<Self::Value>;
}

pub trait PreDefineMethods<'tcx>: Backend<'tcx> {
fn predefine_static(
&self,
def_id: DefId,
linkage: Linkage,
visibility: Visibility,
symbol_name: &str,
);
fn predefine_fn(
&self,
instance: Instance<'tcx>,
linkage: Linkage,
visibility: Visibility,
symbol_name: &str,
);
}
5 changes: 5 additions & 0 deletions src/librustc_codegen_llvm/interfaces/misc.rs
Expand Up @@ -10,10 +10,13 @@

use super::backend::Backend;
use libc::c_uint;
use monomorphize::partitioning::CodegenUnit;
use rustc::mir::mono::Stats;
use rustc::session::Session;
use rustc::ty::{self, Instance, Ty};
use rustc::util::nodemap::FxHashMap;
use std::cell::RefCell;
use std::sync::Arc;

pub trait MiscMethods<'tcx>: Backend<'tcx> {
fn vtables(
Expand All @@ -26,4 +29,6 @@ pub trait MiscMethods<'tcx>: Backend<'tcx> {
fn eh_personality(&self) -> Self::Value;
fn eh_unwind_resume(&self) -> Self::Value;
fn sess(&self) -> &Session;
fn stats(&self) -> &RefCell<Stats>;
fn codegen_unit(&self) -> &Arc<CodegenUnit<'tcx>>;
}
4 changes: 3 additions & 1 deletion src/librustc_codegen_llvm/interfaces/mod.rs
Expand Up @@ -26,7 +26,7 @@ pub use self::backend::{Backend, BackendTypes};
pub use self::builder::BuilderMethods;
pub use self::consts::ConstMethods;
pub use self::debuginfo::{DebugInfoBuilderMethods, DebugInfoMethods};
pub use self::declare::DeclareMethods;
pub use self::declare::{DeclareMethods, PreDefineMethods};
pub use self::intrinsic::{IntrinsicCallMethods, IntrinsicDeclarationMethods};
pub use self::misc::MiscMethods;
pub use self::statics::StaticMethods;
Expand All @@ -47,6 +47,7 @@ pub trait CodegenMethods<'tcx>:
+ IntrinsicDeclarationMethods<'tcx>
+ DeclareMethods<'tcx>
+ AsmMethods<'tcx>
+ PreDefineMethods<'tcx>
{
}

Expand All @@ -61,6 +62,7 @@ impl<'tcx, T> CodegenMethods<'tcx> for T where
+ IntrinsicDeclarationMethods<'tcx>
+ DeclareMethods<'tcx>
+ AsmMethods<'tcx>
+ PreDefineMethods<'tcx>
{}

pub trait HasCodegen<'tcx>: Backend<'tcx> {
Expand Down

0 comments on commit 441a7c1

Please sign in to comment.