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));
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
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(),
|
||||
|
|
|
@ -185,15 +185,16 @@ impl<'tcx> CodegenUnit<'tcx> {
|
|||
symbol_name.len().hash(&mut state);
|
||||
symbol_name.hash(&mut state);
|
||||
let exported = match item {
|
||||
TransItem::Fn(ref instance) => {
|
||||
let node_id =
|
||||
scx.tcx().hir.as_local_node_id(instance.def_id());
|
||||
TransItem::Fn(ref instance) => {
|
||||
let node_id =
|
||||
scx.tcx().hir.as_local_node_id(instance.def_id());
|
||||
node_id.map(|node_id| exported_symbols.contains(&node_id))
|
||||
.unwrap_or(false)
|
||||
}
|
||||
TransItem::Static(node_id) => {
|
||||
.unwrap_or(false)
|
||||
}
|
||||
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)),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
})
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue