move codegenunitext to rustc::mir::mono
This commit is contained in:
@@ -3,9 +3,10 @@ use crate::hir::HirId;
|
|||||||
use syntax::symbol::InternedString;
|
use syntax::symbol::InternedString;
|
||||||
use syntax::attr::InlineAttr;
|
use syntax::attr::InlineAttr;
|
||||||
use syntax::source_map::Span;
|
use syntax::source_map::Span;
|
||||||
use crate::ty::{Instance, TyCtxt, SymbolName, subst::InternalSubsts};
|
use crate::ty::{Instance, InstanceDef, TyCtxt, SymbolName, subst::InternalSubsts};
|
||||||
use crate::util::nodemap::FxHashMap;
|
use crate::util::nodemap::FxHashMap;
|
||||||
use crate::ty::print::obsolete::DefPathBasedNames;
|
use crate::ty::print::obsolete::DefPathBasedNames;
|
||||||
|
use crate::dep_graph::{WorkProductId, DepNode, WorkProduct, DepConstructor};
|
||||||
use rustc_data_structures::base_n;
|
use rustc_data_structures::base_n;
|
||||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasherResult,
|
use rustc_data_structures::stable_hasher::{HashStable, StableHasherResult,
|
||||||
StableHasher};
|
StableHasher};
|
||||||
@@ -350,6 +351,73 @@ impl<'tcx> CodegenUnit<'tcx> {
|
|||||||
self.size_estimate = Some(size_estimate + delta);
|
self.size_estimate = Some(size_estimate + delta);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn contains_item(&self, item: &MonoItem<'tcx>) -> bool {
|
||||||
|
self.items().contains_key(item)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn work_product_id(&self) -> WorkProductId {
|
||||||
|
WorkProductId::from_cgu_name(&self.name().as_str())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn work_product(&self, tcx: TyCtxt<'_, '_, '_>) -> WorkProduct {
|
||||||
|
let work_product_id = self.work_product_id();
|
||||||
|
tcx.dep_graph
|
||||||
|
.previous_work_product(&work_product_id)
|
||||||
|
.unwrap_or_else(|| {
|
||||||
|
panic!("Could not find work-product for CGU `{}`", self.name())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn items_in_deterministic_order<'a>(&self,
|
||||||
|
tcx: TyCtxt<'a, 'tcx, 'tcx>)
|
||||||
|
-> Vec<(MonoItem<'tcx>,
|
||||||
|
(Linkage, Visibility))> {
|
||||||
|
// The codegen tests rely on items being process in the same order as
|
||||||
|
// they appear in the file, so for local items, we sort by node_id first
|
||||||
|
#[derive(PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
pub struct ItemSortKey(Option<HirId>, SymbolName);
|
||||||
|
|
||||||
|
fn item_sort_key<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||||
|
item: MonoItem<'tcx>) -> ItemSortKey {
|
||||||
|
ItemSortKey(match item {
|
||||||
|
MonoItem::Fn(ref instance) => {
|
||||||
|
match instance.def {
|
||||||
|
// We only want to take HirIds of user-defined
|
||||||
|
// instances into account. The others don't matter for
|
||||||
|
// the codegen tests and can even make item order
|
||||||
|
// unstable.
|
||||||
|
InstanceDef::Item(def_id) => {
|
||||||
|
tcx.hir().as_local_hir_id(def_id)
|
||||||
|
}
|
||||||
|
InstanceDef::VtableShim(..) |
|
||||||
|
InstanceDef::Intrinsic(..) |
|
||||||
|
InstanceDef::FnPtrShim(..) |
|
||||||
|
InstanceDef::Virtual(..) |
|
||||||
|
InstanceDef::ClosureOnceShim { .. } |
|
||||||
|
InstanceDef::DropGlue(..) |
|
||||||
|
InstanceDef::CloneShim(..) => {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MonoItem::Static(def_id) => {
|
||||||
|
tcx.hir().as_local_hir_id(def_id)
|
||||||
|
}
|
||||||
|
MonoItem::GlobalAsm(hir_id) => {
|
||||||
|
Some(hir_id)
|
||||||
|
}
|
||||||
|
}, item.symbol_name(tcx))
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut items: Vec<_> = self.items().iter().map(|(&i, &l)| (i, l)).collect();
|
||||||
|
items.sort_by_cached_key(|&(i, _)| item_sort_key(tcx, i));
|
||||||
|
items
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn codegen_dep_node(&self, tcx: TyCtxt<'_, 'tcx, 'tcx>) -> DepNode {
|
||||||
|
DepNode::new(tcx, DepConstructor::CompileCodegenUnit(self.name().clone()))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for CodegenUnit<'tcx> {
|
impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for CodegenUnit<'tcx> {
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ extern crate flate2;
|
|||||||
#[macro_use] extern crate bitflags;
|
#[macro_use] extern crate bitflags;
|
||||||
extern crate libc;
|
extern crate libc;
|
||||||
#[macro_use] extern crate rustc;
|
#[macro_use] extern crate rustc;
|
||||||
extern crate rustc_mir;
|
|
||||||
extern crate rustc_allocator;
|
extern crate rustc_allocator;
|
||||||
extern crate rustc_target;
|
extern crate rustc_target;
|
||||||
#[macro_use] extern crate rustc_data_structures;
|
#[macro_use] extern crate rustc_data_structures;
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ use rustc::middle::cstore::{self, LinkagePreference};
|
|||||||
use rustc::util::common::{time, print_time_passes_entry};
|
use rustc::util::common::{time, print_time_passes_entry};
|
||||||
use rustc::session::config::{self, EntryFnType, Lto};
|
use rustc::session::config::{self, EntryFnType, Lto};
|
||||||
use rustc::session::Session;
|
use rustc::session::Session;
|
||||||
use rustc_mir::monomorphize::partitioning::CodegenUnitExt;
|
|
||||||
use rustc::util::nodemap::FxHashMap;
|
use rustc::util::nodemap::FxHashMap;
|
||||||
use rustc_data_structures::indexed_vec::Idx;
|
use rustc_data_structures::indexed_vec::Idx;
|
||||||
use rustc_codegen_utils::{symbol_names_test, check_for_rustc_errors_attr};
|
use rustc_codegen_utils::{symbol_names_test, check_for_rustc_errors_attr};
|
||||||
|
|||||||
@@ -97,8 +97,7 @@ use std::cmp;
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use syntax::symbol::InternedString;
|
use syntax::symbol::InternedString;
|
||||||
use rustc::dep_graph::{WorkProductId, WorkProduct, DepNode, DepConstructor};
|
use rustc::hir::CodegenFnAttrFlags;
|
||||||
use rustc::hir::{CodegenFnAttrFlags, HirId};
|
|
||||||
use rustc::hir::def::DefKind;
|
use rustc::hir::def::DefKind;
|
||||||
use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE, CRATE_DEF_INDEX};
|
use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE, CRATE_DEF_INDEX};
|
||||||
use rustc::mir::mono::{Linkage, Visibility, CodegenUnitNameBuilder, CodegenUnit};
|
use rustc::mir::mono::{Linkage, Visibility, CodegenUnitNameBuilder, CodegenUnit};
|
||||||
@@ -121,93 +120,6 @@ pub enum PartitioningStrategy {
|
|||||||
FixedUnitCount(usize)
|
FixedUnitCount(usize)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait CodegenUnitExt<'tcx> {
|
|
||||||
fn as_codegen_unit(&self) -> &CodegenUnit<'tcx>;
|
|
||||||
|
|
||||||
fn contains_item(&self, item: &MonoItem<'tcx>) -> bool {
|
|
||||||
self.items().contains_key(item)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn name<'a>(&'a self) -> &'a InternedString
|
|
||||||
where 'tcx: 'a,
|
|
||||||
{
|
|
||||||
&self.as_codegen_unit().name()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn items(&self) -> &FxHashMap<MonoItem<'tcx>, (Linkage, Visibility)> {
|
|
||||||
&self.as_codegen_unit().items()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn work_product_id(&self) -> WorkProductId {
|
|
||||||
WorkProductId::from_cgu_name(&self.name().as_str())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn work_product(&self, tcx: TyCtxt<'_, '_, '_>) -> WorkProduct {
|
|
||||||
let work_product_id = self.work_product_id();
|
|
||||||
tcx.dep_graph
|
|
||||||
.previous_work_product(&work_product_id)
|
|
||||||
.unwrap_or_else(|| {
|
|
||||||
panic!("Could not find work-product for CGU `{}`", self.name())
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
fn items_in_deterministic_order<'a>(&self,
|
|
||||||
tcx: TyCtxt<'a, 'tcx, 'tcx>)
|
|
||||||
-> Vec<(MonoItem<'tcx>,
|
|
||||||
(Linkage, Visibility))> {
|
|
||||||
// The codegen tests rely on items being process in the same order as
|
|
||||||
// they appear in the file, so for local items, we sort by node_id first
|
|
||||||
#[derive(PartialEq, Eq, PartialOrd, Ord)]
|
|
||||||
pub struct ItemSortKey(Option<HirId>, ty::SymbolName);
|
|
||||||
|
|
||||||
fn item_sort_key<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
|
||||||
item: MonoItem<'tcx>) -> ItemSortKey {
|
|
||||||
ItemSortKey(match item {
|
|
||||||
MonoItem::Fn(ref instance) => {
|
|
||||||
match instance.def {
|
|
||||||
// We only want to take HirIds of user-defined
|
|
||||||
// instances into account. The others don't matter for
|
|
||||||
// the codegen tests and can even make item order
|
|
||||||
// unstable.
|
|
||||||
InstanceDef::Item(def_id) => {
|
|
||||||
tcx.hir().as_local_hir_id(def_id)
|
|
||||||
}
|
|
||||||
InstanceDef::VtableShim(..) |
|
|
||||||
InstanceDef::Intrinsic(..) |
|
|
||||||
InstanceDef::FnPtrShim(..) |
|
|
||||||
InstanceDef::Virtual(..) |
|
|
||||||
InstanceDef::ClosureOnceShim { .. } |
|
|
||||||
InstanceDef::DropGlue(..) |
|
|
||||||
InstanceDef::CloneShim(..) => {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MonoItem::Static(def_id) => {
|
|
||||||
tcx.hir().as_local_hir_id(def_id)
|
|
||||||
}
|
|
||||||
MonoItem::GlobalAsm(hir_id) => {
|
|
||||||
Some(hir_id)
|
|
||||||
}
|
|
||||||
}, item.symbol_name(tcx))
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut items: Vec<_> = self.items().iter().map(|(&i, &l)| (i, l)).collect();
|
|
||||||
items.sort_by_cached_key(|&(i, _)| item_sort_key(tcx, i));
|
|
||||||
items
|
|
||||||
}
|
|
||||||
|
|
||||||
fn codegen_dep_node(&self, tcx: TyCtxt<'_, 'tcx, 'tcx>) -> DepNode {
|
|
||||||
DepNode::new(tcx, DepConstructor::CompileCodegenUnit(self.name().clone()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'tcx> CodegenUnitExt<'tcx> for CodegenUnit<'tcx> {
|
|
||||||
fn as_codegen_unit(&self) -> &CodegenUnit<'tcx> {
|
|
||||||
self
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Anything we can't find a proper codegen unit for goes into this.
|
// Anything we can't find a proper codegen unit for goes into this.
|
||||||
fn fallback_cgu_name(name_builder: &mut CodegenUnitNameBuilder<'_, '_, '_>) -> InternedString {
|
fn fallback_cgu_name(name_builder: &mut CodegenUnitNameBuilder<'_, '_, '_>) -> InternedString {
|
||||||
name_builder.build_cgu_name(LOCAL_CRATE, &["fallback"], Some("cgu"))
|
name_builder.build_cgu_name(LOCAL_CRATE, &["fallback"], Some("cgu"))
|
||||||
|
|||||||
Reference in New Issue
Block a user