1
Fork 0

Add new TransItem for global_asm trans

This commit is contained in:
A.J. Gardner 2017-03-21 10:03:52 -05:00
parent 6bcd5b0980
commit 70fcff6318
5 changed files with 62 additions and 14 deletions

View file

@ -124,3 +124,11 @@ pub fn trans_inline_asm<'a, 'tcx>(
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());
}
}

View file

@ -349,6 +349,9 @@ fn collect_items_rec<'a, 'tcx: 'a>(scx: &SharedCrateContext<'a, 'tcx>,
collect_neighbours(scx, instance, &mut neighbors);
}
TransItem::GlobalAsm(..) => {
recursion_depth_reset = None;
}
}
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::ItemUse(..) |
hir::ItemForeignMod(..) |
hir::ItemGlobalAsm(..) |
hir::ItemTy(..) |
hir::ItemDefaultImpl(..) |
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(..) => {
debug!("RootCollector: ItemStatic({})",
def_id_to_string(self.scx.tcx(),

View file

@ -194,6 +194,7 @@ impl<'tcx> CodegenUnit<'tcx> {
TransItem::Static(node_id) => {
exported_symbols.contains(&node_id)
}
TransItem::GlobalAsm(..) => true,
};
exported.hash(&mut state);
}
@ -243,7 +244,9 @@ impl<'tcx> CodegenUnit<'tcx> {
TransItem::Fn(instance) => {
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 => {
match trans_item {
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)
}
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)),
}
}

View file

@ -99,7 +99,10 @@ impl<'tcx> SymbolMap<'tcx> {
TransItem::Fn(Instance { def, .. }) => {
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| {
tcx.hir.span(node_id)
})

View file

@ -14,6 +14,7 @@
//! item-path. This is used for unit testing the code that generates
//! paths etc in all kinds of annoying scenarios.
use asm;
use attributes;
use base;
use consts;
@ -38,7 +39,8 @@ use std::iter;
#[derive(PartialEq, Eq, Clone, Copy, Debug, Hash)]
pub enum TransItem<'tcx> {
Fn(Instance<'tcx>),
Static(NodeId)
Static(NodeId),
GlobalAsm(NodeId),
}
/// 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")
}
}
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) => {
let _task = ccx.tcx().dep_graph.in_task(
DepNode::TransCrateItem(instance.def_id())); // (*)
@ -123,6 +133,7 @@ impl<'a, 'tcx> TransItem<'tcx> {
TransItem::Fn(instance) => {
TransItem::predefine_fn(ccx, instance, linkage, &symbol_name);
}
TransItem::GlobalAsm(..) => {}
}
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);
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::GlobalAsm(..) => InstantiationMode::GloballyShared,
}
}
@ -210,7 +226,8 @@ impl<'a, 'tcx> TransItem<'tcx> {
TransItem::Fn(ref instance) => {
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 {
TransItem::Fn(ref instance) => instance.def_id(),
TransItem::Static(node_id) => tcx.hir.local_def_id(node_id),
TransItem::GlobalAsm(..) => return None,
};
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(&[]));
to_string_internal(tcx, "static ", instance)
},
TransItem::GlobalAsm(..) => {
"global_asm".to_string()
}
};
fn to_string_internal<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
@ -273,6 +294,9 @@ impl<'a, 'tcx> TransItem<'tcx> {
TransItem::Static(id) => {
format!("Static({:?})", id)
}
TransItem::GlobalAsm(id) => {
format!("GlobalAsm({:?})", id)
}
}
}
}