Add new TransItem for global_asm trans
This commit is contained in:
parent
6bcd5b0980
commit
70fcff6318
5 changed files with 62 additions and 14 deletions
|
@ -124,3 +124,11 @@ pub fn trans_inline_asm<'a, 'tcx>(
|
||||||
llvm::LLVMMDNodeInContext(bcx.ccx.llcx(), &val, 1));
|
llvm::LLVMMDNodeInContext(bcx.ccx.llcx(), &val, 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn trans_global_asm<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
|
||||||
|
ga: &hir::GlobalAsm) {
|
||||||
|
let asm = CString::new(ga.asm.as_str().as_bytes()).unwrap();
|
||||||
|
unsafe {
|
||||||
|
llvm::LLVMSetModuleInlineAsm(ccx.llmod(), asm.as_ptr());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -349,6 +349,9 @@ fn collect_items_rec<'a, 'tcx: 'a>(scx: &SharedCrateContext<'a, 'tcx>,
|
||||||
|
|
||||||
collect_neighbours(scx, instance, &mut neighbors);
|
collect_neighbours(scx, instance, &mut neighbors);
|
||||||
}
|
}
|
||||||
|
TransItem::GlobalAsm(..) => {
|
||||||
|
recursion_depth_reset = None;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
record_inlining_canditates(scx.tcx(), starting_point, &neighbors[..], inlining_map);
|
record_inlining_canditates(scx.tcx(), starting_point, &neighbors[..], inlining_map);
|
||||||
|
@ -811,7 +814,6 @@ impl<'b, 'a, 'v> ItemLikeVisitor<'v> for RootCollector<'b, 'a, 'v> {
|
||||||
hir::ItemExternCrate(..) |
|
hir::ItemExternCrate(..) |
|
||||||
hir::ItemUse(..) |
|
hir::ItemUse(..) |
|
||||||
hir::ItemForeignMod(..) |
|
hir::ItemForeignMod(..) |
|
||||||
hir::ItemGlobalAsm(..) |
|
|
||||||
hir::ItemTy(..) |
|
hir::ItemTy(..) |
|
||||||
hir::ItemDefaultImpl(..) |
|
hir::ItemDefaultImpl(..) |
|
||||||
hir::ItemTrait(..) |
|
hir::ItemTrait(..) |
|
||||||
|
@ -841,6 +843,12 @@ impl<'b, 'a, 'v> ItemLikeVisitor<'v> for RootCollector<'b, 'a, 'v> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
hir::ItemGlobalAsm(..) => {
|
||||||
|
debug!("RootCollector: ItemGlobalAsm({})",
|
||||||
|
def_id_to_string(self.scx.tcx(),
|
||||||
|
self.scx.tcx().hir.local_def_id(item.id)));
|
||||||
|
self.output.push(TransItem::GlobalAsm(item.id));
|
||||||
|
}
|
||||||
hir::ItemStatic(..) => {
|
hir::ItemStatic(..) => {
|
||||||
debug!("RootCollector: ItemStatic({})",
|
debug!("RootCollector: ItemStatic({})",
|
||||||
def_id_to_string(self.scx.tcx(),
|
def_id_to_string(self.scx.tcx(),
|
||||||
|
|
|
@ -185,15 +185,16 @@ impl<'tcx> CodegenUnit<'tcx> {
|
||||||
symbol_name.len().hash(&mut state);
|
symbol_name.len().hash(&mut state);
|
||||||
symbol_name.hash(&mut state);
|
symbol_name.hash(&mut state);
|
||||||
let exported = match item {
|
let exported = match item {
|
||||||
TransItem::Fn(ref instance) => {
|
TransItem::Fn(ref instance) => {
|
||||||
let node_id =
|
let node_id =
|
||||||
scx.tcx().hir.as_local_node_id(instance.def_id());
|
scx.tcx().hir.as_local_node_id(instance.def_id());
|
||||||
node_id.map(|node_id| exported_symbols.contains(&node_id))
|
node_id.map(|node_id| exported_symbols.contains(&node_id))
|
||||||
.unwrap_or(false)
|
.unwrap_or(false)
|
||||||
}
|
}
|
||||||
TransItem::Static(node_id) => {
|
TransItem::Static(node_id) => {
|
||||||
exported_symbols.contains(&node_id)
|
exported_symbols.contains(&node_id)
|
||||||
}
|
}
|
||||||
|
TransItem::GlobalAsm(..) => true,
|
||||||
};
|
};
|
||||||
exported.hash(&mut state);
|
exported.hash(&mut state);
|
||||||
}
|
}
|
||||||
|
@ -243,7 +244,9 @@ impl<'tcx> CodegenUnit<'tcx> {
|
||||||
TransItem::Fn(instance) => {
|
TransItem::Fn(instance) => {
|
||||||
tcx.hir.as_local_node_id(instance.def_id())
|
tcx.hir.as_local_node_id(instance.def_id())
|
||||||
}
|
}
|
||||||
TransItem::Static(node_id) => Some(node_id),
|
TransItem::Static(node_id) | TransItem::GlobalAsm(node_id) => {
|
||||||
|
Some(node_id)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -338,7 +341,8 @@ fn place_root_translation_items<'a, 'tcx, I>(scx: &SharedCrateContext<'a, 'tcx>,
|
||||||
None => {
|
None => {
|
||||||
match trans_item {
|
match trans_item {
|
||||||
TransItem::Fn(..) |
|
TransItem::Fn(..) |
|
||||||
TransItem::Static(..) => llvm::ExternalLinkage,
|
TransItem::Static(..) |
|
||||||
|
TransItem::GlobalAsm(..) => llvm::ExternalLinkage,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -483,7 +487,8 @@ fn characteristic_def_id_of_trans_item<'a, 'tcx>(scx: &SharedCrateContext<'a, 't
|
||||||
|
|
||||||
Some(def_id)
|
Some(def_id)
|
||||||
}
|
}
|
||||||
TransItem::Static(node_id) => Some(tcx.hir.local_def_id(node_id)),
|
TransItem::Static(node_id) |
|
||||||
|
TransItem::GlobalAsm(node_id) => Some(tcx.hir.local_def_id(node_id)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -99,7 +99,10 @@ impl<'tcx> SymbolMap<'tcx> {
|
||||||
TransItem::Fn(Instance { def, .. }) => {
|
TransItem::Fn(Instance { def, .. }) => {
|
||||||
tcx.hir.as_local_node_id(def.def_id())
|
tcx.hir.as_local_node_id(def.def_id())
|
||||||
}
|
}
|
||||||
TransItem::Static(node_id) => Some(node_id),
|
TransItem::Static(node_id) |
|
||||||
|
TransItem::GlobalAsm(node_id) => {
|
||||||
|
Some(node_id)
|
||||||
|
}
|
||||||
}.map(|node_id| {
|
}.map(|node_id| {
|
||||||
tcx.hir.span(node_id)
|
tcx.hir.span(node_id)
|
||||||
})
|
})
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
//! item-path. This is used for unit testing the code that generates
|
//! item-path. This is used for unit testing the code that generates
|
||||||
//! paths etc in all kinds of annoying scenarios.
|
//! paths etc in all kinds of annoying scenarios.
|
||||||
|
|
||||||
|
use asm;
|
||||||
use attributes;
|
use attributes;
|
||||||
use base;
|
use base;
|
||||||
use consts;
|
use consts;
|
||||||
|
@ -38,7 +39,8 @@ use std::iter;
|
||||||
#[derive(PartialEq, Eq, Clone, Copy, Debug, Hash)]
|
#[derive(PartialEq, Eq, Clone, Copy, Debug, Hash)]
|
||||||
pub enum TransItem<'tcx> {
|
pub enum TransItem<'tcx> {
|
||||||
Fn(Instance<'tcx>),
|
Fn(Instance<'tcx>),
|
||||||
Static(NodeId)
|
Static(NodeId),
|
||||||
|
GlobalAsm(NodeId),
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Describes how a translation item will be instantiated in object files.
|
/// Describes how a translation item will be instantiated in object files.
|
||||||
|
@ -89,6 +91,14 @@ impl<'a, 'tcx> TransItem<'tcx> {
|
||||||
span_bug!(item.span, "Mismatch between hir::Item type and TransItem type")
|
span_bug!(item.span, "Mismatch between hir::Item type and TransItem type")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
TransItem::GlobalAsm(node_id) => {
|
||||||
|
let item = ccx.tcx().hir.expect_item(node_id);
|
||||||
|
if let hir::ItemGlobalAsm(ref ga) = item.node {
|
||||||
|
asm::trans_global_asm(ccx, ga);
|
||||||
|
} else {
|
||||||
|
span_bug!(item.span, "Mismatch between hir::Item type and TransItem type")
|
||||||
|
}
|
||||||
|
}
|
||||||
TransItem::Fn(instance) => {
|
TransItem::Fn(instance) => {
|
||||||
let _task = ccx.tcx().dep_graph.in_task(
|
let _task = ccx.tcx().dep_graph.in_task(
|
||||||
DepNode::TransCrateItem(instance.def_id())); // (*)
|
DepNode::TransCrateItem(instance.def_id())); // (*)
|
||||||
|
@ -123,6 +133,7 @@ impl<'a, 'tcx> TransItem<'tcx> {
|
||||||
TransItem::Fn(instance) => {
|
TransItem::Fn(instance) => {
|
||||||
TransItem::predefine_fn(ccx, instance, linkage, &symbol_name);
|
TransItem::predefine_fn(ccx, instance, linkage, &symbol_name);
|
||||||
}
|
}
|
||||||
|
TransItem::GlobalAsm(..) => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
debug!("END PREDEFINING '{} ({})' in cgu {}",
|
debug!("END PREDEFINING '{} ({})' in cgu {}",
|
||||||
|
@ -185,6 +196,10 @@ impl<'a, 'tcx> TransItem<'tcx> {
|
||||||
let def_id = scx.tcx().hir.local_def_id(node_id);
|
let def_id = scx.tcx().hir.local_def_id(node_id);
|
||||||
symbol_names::symbol_name(Instance::mono(scx.tcx(), def_id), scx)
|
symbol_names::symbol_name(Instance::mono(scx.tcx(), def_id), scx)
|
||||||
}
|
}
|
||||||
|
TransItem::GlobalAsm(node_id) => {
|
||||||
|
let def_id = scx.tcx().hir.local_def_id(node_id);
|
||||||
|
format!("global_asm_{:?}", def_id)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,6 +217,7 @@ impl<'a, 'tcx> TransItem<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TransItem::Static(..) => InstantiationMode::GloballyShared,
|
TransItem::Static(..) => InstantiationMode::GloballyShared,
|
||||||
|
TransItem::GlobalAsm(..) => InstantiationMode::GloballyShared,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,7 +226,8 @@ impl<'a, 'tcx> TransItem<'tcx> {
|
||||||
TransItem::Fn(ref instance) => {
|
TransItem::Fn(ref instance) => {
|
||||||
instance.substs.types().next().is_some()
|
instance.substs.types().next().is_some()
|
||||||
}
|
}
|
||||||
TransItem::Static(..) => false,
|
TransItem::Static(..) |
|
||||||
|
TransItem::GlobalAsm(..) => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -218,6 +235,7 @@ impl<'a, 'tcx> TransItem<'tcx> {
|
||||||
let def_id = match *self {
|
let def_id = match *self {
|
||||||
TransItem::Fn(ref instance) => instance.def_id(),
|
TransItem::Fn(ref instance) => instance.def_id(),
|
||||||
TransItem::Static(node_id) => tcx.hir.local_def_id(node_id),
|
TransItem::Static(node_id) => tcx.hir.local_def_id(node_id),
|
||||||
|
TransItem::GlobalAsm(..) => return None,
|
||||||
};
|
};
|
||||||
|
|
||||||
let attributes = tcx.get_attrs(def_id);
|
let attributes = tcx.get_attrs(def_id);
|
||||||
|
@ -249,6 +267,9 @@ impl<'a, 'tcx> TransItem<'tcx> {
|
||||||
let instance = Instance::new(def_id, tcx.intern_substs(&[]));
|
let instance = Instance::new(def_id, tcx.intern_substs(&[]));
|
||||||
to_string_internal(tcx, "static ", instance)
|
to_string_internal(tcx, "static ", instance)
|
||||||
},
|
},
|
||||||
|
TransItem::GlobalAsm(..) => {
|
||||||
|
"global_asm".to_string()
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
fn to_string_internal<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
fn to_string_internal<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||||
|
@ -273,6 +294,9 @@ impl<'a, 'tcx> TransItem<'tcx> {
|
||||||
TransItem::Static(id) => {
|
TransItem::Static(id) => {
|
||||||
format!("Static({:?})", id)
|
format!("Static({:?})", id)
|
||||||
}
|
}
|
||||||
|
TransItem::GlobalAsm(id) => {
|
||||||
|
format!("GlobalAsm({:?})", id)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue