Remove codegen_unit from MiscCodegenMethods
This commit is contained in:
parent
6f69710780
commit
c593c01703
7 changed files with 29 additions and 42 deletions
|
|
@ -219,17 +219,22 @@ pub fn compile_codegen_unit(
|
|||
|
||||
let mono_items = cgu.items_in_deterministic_order(tcx);
|
||||
for &(mono_item, data) in &mono_items {
|
||||
mono_item.predefine::<Builder<'_, '_, '_>>(&cx, data.linkage, data.visibility);
|
||||
mono_item.predefine::<Builder<'_, '_, '_>>(
|
||||
&cx,
|
||||
cgu_name.as_str(),
|
||||
data.linkage,
|
||||
data.visibility,
|
||||
);
|
||||
}
|
||||
|
||||
// ... and now that we have everything pre-defined, fill out those definitions.
|
||||
for &(mono_item, item_data) in &mono_items {
|
||||
mono_item.define::<Builder<'_, '_, '_>>(&mut cx, item_data);
|
||||
mono_item.define::<Builder<'_, '_, '_>>(&mut cx, cgu_name.as_str(), item_data);
|
||||
}
|
||||
|
||||
// If this codegen unit contains the main function, also create the
|
||||
// wrapper here
|
||||
maybe_create_entry_wrapper::<Builder<'_, '_, '_>>(&cx);
|
||||
maybe_create_entry_wrapper::<Builder<'_, '_, '_>>(&cx, cx.codegen_unit);
|
||||
|
||||
// Finalize debuginfo
|
||||
if cx.sess().opts.debuginfo != DebugInfo::None {
|
||||
|
|
|
|||
|
|
@ -470,10 +470,6 @@ impl<'gcc, 'tcx> MiscCodegenMethods<'tcx> for CodegenCx<'gcc, 'tcx> {
|
|||
self.tcx.sess
|
||||
}
|
||||
|
||||
fn codegen_unit(&self) -> &'tcx CodegenUnit<'tcx> {
|
||||
self.codegen_unit
|
||||
}
|
||||
|
||||
fn set_frame_pointer_type(&self, _llfn: RValue<'gcc>) {
|
||||
// TODO(antoyo)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -86,17 +86,24 @@ pub(crate) fn compile_codegen_unit(
|
|||
let mut cx = CodegenCx::new(tcx, cgu, &llvm_module);
|
||||
let mono_items = cx.codegen_unit.items_in_deterministic_order(cx.tcx);
|
||||
for &(mono_item, data) in &mono_items {
|
||||
mono_item.predefine::<Builder<'_, '_, '_>>(&cx, data.linkage, data.visibility);
|
||||
mono_item.predefine::<Builder<'_, '_, '_>>(
|
||||
&cx,
|
||||
cgu_name.as_str(),
|
||||
data.linkage,
|
||||
data.visibility,
|
||||
);
|
||||
}
|
||||
|
||||
// ... and now that we have everything pre-defined, fill out those definitions.
|
||||
for &(mono_item, item_data) in &mono_items {
|
||||
mono_item.define::<Builder<'_, '_, '_>>(&mut cx, item_data);
|
||||
mono_item.define::<Builder<'_, '_, '_>>(&mut cx, cgu_name.as_str(), item_data);
|
||||
}
|
||||
|
||||
// If this codegen unit contains the main function, also create the
|
||||
// wrapper here
|
||||
if let Some(entry) = maybe_create_entry_wrapper::<Builder<'_, '_, '_>>(&cx) {
|
||||
if let Some(entry) =
|
||||
maybe_create_entry_wrapper::<Builder<'_, '_, '_>>(&cx, cx.codegen_unit)
|
||||
{
|
||||
let attrs = attributes::sanitize_attrs(&cx, SanitizerSet::empty());
|
||||
attributes::apply_to_llfn(entry, llvm::AttributePlace::Function, &attrs);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -801,10 +801,6 @@ impl<'ll, 'tcx> MiscCodegenMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
|||
self.tcx.sess
|
||||
}
|
||||
|
||||
fn codegen_unit(&self) -> &'tcx CodegenUnit<'tcx> {
|
||||
self.codegen_unit
|
||||
}
|
||||
|
||||
fn set_frame_pointer_type(&self, llfn: &'ll Value) {
|
||||
if let Some(attr) = attributes::frame_pointer_type_attr(self) {
|
||||
attributes::apply_to_llfn(llfn, llvm::AttributePlace::Function, &[attr]);
|
||||
|
|
|
|||
|
|
@ -492,6 +492,7 @@ where
|
|||
/// users main function.
|
||||
pub fn maybe_create_entry_wrapper<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
||||
cx: &'a Bx::CodegenCx,
|
||||
cgu: &CodegenUnit<'tcx>,
|
||||
) -> Option<Bx::Function> {
|
||||
let (main_def_id, entry_type) = cx.tcx().entry_fn(())?;
|
||||
let main_is_local = main_def_id.is_local();
|
||||
|
|
@ -500,10 +501,10 @@ pub fn maybe_create_entry_wrapper<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
|||
if main_is_local {
|
||||
// We want to create the wrapper in the same codegen unit as Rust's main
|
||||
// function.
|
||||
if !cx.codegen_unit().contains_item(&MonoItem::Fn(instance)) {
|
||||
if !cgu.contains_item(&MonoItem::Fn(instance)) {
|
||||
return None;
|
||||
}
|
||||
} else if !cx.codegen_unit().is_primary() {
|
||||
} else if !cgu.is_primary() {
|
||||
// We want to create the wrapper only when the codegen unit is the primary one
|
||||
return None;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,11 +11,13 @@ pub trait MonoItemExt<'a, 'tcx> {
|
|||
fn define<Bx: BuilderMethods<'a, 'tcx>>(
|
||||
&self,
|
||||
cx: &'a mut Bx::CodegenCx,
|
||||
cgu_name: &str,
|
||||
item_data: MonoItemData,
|
||||
);
|
||||
fn predefine<Bx: BuilderMethods<'a, 'tcx>>(
|
||||
&self,
|
||||
cx: &'a Bx::CodegenCx,
|
||||
cgu_name: &str,
|
||||
linkage: Linkage,
|
||||
visibility: Visibility,
|
||||
);
|
||||
|
|
@ -26,14 +28,10 @@ impl<'a, 'tcx: 'a> MonoItemExt<'a, 'tcx> for MonoItem<'tcx> {
|
|||
fn define<Bx: BuilderMethods<'a, 'tcx>>(
|
||||
&self,
|
||||
cx: &'a mut Bx::CodegenCx,
|
||||
cgu_name: &str,
|
||||
item_data: MonoItemData,
|
||||
) {
|
||||
debug!(
|
||||
"BEGIN IMPLEMENTING '{} ({})' in cgu {}",
|
||||
self,
|
||||
self.to_raw_string(),
|
||||
cx.codegen_unit().name()
|
||||
);
|
||||
debug!("BEGIN IMPLEMENTING '{} ({})' in cgu {}", self, self.to_raw_string(), cgu_name);
|
||||
|
||||
match *self {
|
||||
MonoItem::Static(def_id) => {
|
||||
|
|
@ -56,26 +54,17 @@ impl<'a, 'tcx: 'a> MonoItemExt<'a, 'tcx> for MonoItem<'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
debug!(
|
||||
"END IMPLEMENTING '{} ({})' in cgu {}",
|
||||
self,
|
||||
self.to_raw_string(),
|
||||
cx.codegen_unit().name()
|
||||
);
|
||||
debug!("END IMPLEMENTING '{} ({})' in cgu {}", self, self.to_raw_string(), cgu_name);
|
||||
}
|
||||
|
||||
fn predefine<Bx: BuilderMethods<'a, 'tcx>>(
|
||||
&self,
|
||||
cx: &'a Bx::CodegenCx,
|
||||
cgu_name: &str,
|
||||
linkage: Linkage,
|
||||
visibility: Visibility,
|
||||
) {
|
||||
debug!(
|
||||
"BEGIN PREDEFINING '{} ({})' in cgu {}",
|
||||
self,
|
||||
self.to_raw_string(),
|
||||
cx.codegen_unit().name()
|
||||
);
|
||||
debug!("BEGIN PREDEFINING '{} ({})' in cgu {}", self, self.to_raw_string(), cgu_name);
|
||||
|
||||
let symbol_name = self.symbol_name(cx.tcx()).name;
|
||||
|
||||
|
|
@ -97,12 +86,7 @@ impl<'a, 'tcx: 'a> MonoItemExt<'a, 'tcx> for MonoItem<'tcx> {
|
|||
MonoItem::GlobalAsm(..) => {}
|
||||
}
|
||||
|
||||
debug!(
|
||||
"END PREDEFINING '{} ({})' in cgu {}",
|
||||
self,
|
||||
self.to_raw_string(),
|
||||
cx.codegen_unit().name()
|
||||
);
|
||||
debug!("END PREDEFINING '{} ({})' in cgu {}", self, self.to_raw_string(), cgu_name);
|
||||
}
|
||||
|
||||
fn to_raw_string(&self) -> String {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
use std::cell::RefCell;
|
||||
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_middle::mir::mono::CodegenUnit;
|
||||
use rustc_middle::ty::{self, Instance, Ty};
|
||||
use rustc_session::Session;
|
||||
|
||||
|
|
@ -22,7 +21,6 @@ pub trait MiscCodegenMethods<'tcx>: BackendTypes {
|
|||
fn get_fn_addr(&self, instance: Instance<'tcx>) -> Self::Value;
|
||||
fn eh_personality(&self) -> Self::Value;
|
||||
fn sess(&self) -> &Session;
|
||||
fn codegen_unit(&self) -> &'tcx CodegenUnit<'tcx>;
|
||||
fn set_frame_pointer_type(&self, llfn: Self::Function);
|
||||
fn apply_target_cpu_attr(&self, llfn: Self::Function);
|
||||
/// Declares the extern "C" main function for the entry point. Returns None if the symbol
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue