Skip to content

Commit

Permalink
Add new TransItem for global_asm trans
Browse files Browse the repository at this point in the history
  • Loading branch information
mrhota committed Mar 21, 2017
1 parent 9ffc347 commit f40985b
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 15 deletions.
8 changes: 8 additions & 0 deletions src/librustc_trans/asm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
}
10 changes: 9 additions & 1 deletion src/librustc_trans/collector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,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);
Expand Down Expand Up @@ -1157,7 +1160,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(..) |
Expand Down Expand Up @@ -1188,6 +1190,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(),
Expand Down
23 changes: 14 additions & 9 deletions src/librustc_trans/partitioning.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
TransItem::Fn(ref instance) => {
let node_id = scx.tcx().hir.as_local_node_id(instance.def);
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::DropGlue(..) => false,
}
TransItem::DropGlue(..) => false,
TransItem::GlobalAsm(..) => true,
};
exported.hash(&mut state);
}
Expand Down Expand Up @@ -243,7 +244,9 @@ impl<'tcx> CodegenUnit<'tcx> {
TransItem::Fn(instance) => {
tcx.hir.as_local_node_id(instance.def)
}
TransItem::Static(node_id) => Some(node_id),
TransItem::Static(node_id) | TransItem::GlobalAsm(node_id) => {
Some(node_id)
}
TransItem::DropGlue(_) => None,
}
}
Expand Down Expand Up @@ -339,7 +342,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,
TransItem::DropGlue(..) => unreachable!(),
}
}
Expand Down Expand Up @@ -477,7 +481,8 @@ fn characteristic_def_id_of_trans_item<'a, 'tcx>(scx: &SharedCrateContext<'a, 't
Some(instance.def)
}
TransItem::DropGlue(dg) => characteristic_def_id_of_type(dg.ty()),
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)),
}
}

Expand Down
5 changes: 4 additions & 1 deletion src/librustc_trans/symbol_map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,10 @@ impl<'tcx> SymbolMap<'tcx> {
TransItem::Fn(Instance { def, .. }) => {
tcx.hir.as_local_node_id(def)
}
TransItem::Static(node_id) => Some(node_id),
TransItem::Static(node_id) |
TransItem::GlobalAsm(node_id) => {
Some(node_id)
}
TransItem::DropGlue(_) => None,
}.map(|node_id| {
tcx.hir.span(node_id)
Expand Down
32 changes: 28 additions & 4 deletions src/librustc_trans/trans_item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -42,7 +43,8 @@ use std::iter;
pub enum TransItem<'tcx> {
DropGlue(DropGlueKind<'tcx>),
Fn(Instance<'tcx>),
Static(NodeId)
Static(NodeId),
GlobalAsm(NodeId),
}

/// Describes how a translation item will be instantiated in object files.
Expand Down Expand Up @@ -93,6 +95,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)); // (*)
Expand Down Expand Up @@ -133,6 +143,7 @@ impl<'a, 'tcx> TransItem<'tcx> {
TransItem::DropGlue(dg) => {
TransItem::predefine_drop_glue(ccx, dg, linkage, &symbol_name);
}
TransItem::GlobalAsm(..) => {}
}

debug!("END PREDEFINING '{} ({})' in cgu {}",
Expand Down Expand Up @@ -235,14 +246,19 @@ impl<'a, 'tcx> TransItem<'tcx> {
};
symbol_names::exported_name_from_type_and_prefix(scx, dg.ty(), prefix)
}
TransItem::GlobalAsm(node_id) => {
let def_id = scx.tcx().hir.local_def_id(node_id);
format!("global_asm_{:?}", def_id)
}
}
}

pub fn is_from_extern_crate(&self) -> bool {
match *self {
TransItem::Fn(ref instance) => !instance.def.is_local(),
TransItem::DropGlue(..) |
TransItem::Static(..) => false,
TransItem::Static(..) |
TransItem::GlobalAsm(..) => false,
}
}

Expand All @@ -261,6 +277,7 @@ impl<'a, 'tcx> TransItem<'tcx> {
}
TransItem::DropGlue(..) => InstantiationMode::LocalCopy,
TransItem::Static(..) => InstantiationMode::GloballyShared,
TransItem::GlobalAsm(..) => InstantiationMode::GloballyShared,
}
}

Expand All @@ -270,15 +287,16 @@ impl<'a, 'tcx> TransItem<'tcx> {
instance.substs.types().next().is_some()
}
TransItem::DropGlue(..) |
TransItem::Static(..) => false,
TransItem::Static(..) |
TransItem::GlobalAsm(..) => false,
}
}

pub fn explicit_linkage(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>) -> Option<llvm::Linkage> {
let def_id = match *self {
TransItem::Fn(ref instance) => instance.def,
TransItem::Static(node_id) => tcx.hir.local_def_id(node_id),
TransItem::DropGlue(..) => return None,
TransItem::DropGlue(..) | TransItem::GlobalAsm(..) => return None,
};

let attributes = tcx.get_attrs(def_id);
Expand Down Expand Up @@ -320,6 +338,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>,
Expand Down Expand Up @@ -351,6 +372,9 @@ impl<'a, 'tcx> TransItem<'tcx> {
TransItem::Static(id) => {
format!("Static({:?})", id)
}
TransItem::GlobalAsm(id) => {
format!("GlobalAsm({:?})", id)
}
}
}
}
Expand Down

0 comments on commit f40985b

Please sign in to comment.