2 use rustc::mir::mono::{Linkage, Visibility};
3 use rustc::ty::layout::HasTyCtxt;
7 use rustc::mir::mono::MonoItem;
9 pub trait MonoItemExt<'a, 'tcx: 'a> {
10 fn define<Bx: BuilderMethods<'a, 'tcx>>(&self, cx: &'a Bx::CodegenCx);
11 fn predefine<Bx: BuilderMethods<'a, 'tcx>>(
13 cx: &'a Bx::CodegenCx,
15 visibility: Visibility
17 fn to_raw_string(&self) -> String;
20 impl<'a, 'tcx: 'a> MonoItemExt<'a, 'tcx> for MonoItem<'tcx> {
21 fn define<Bx: BuilderMethods<'a, 'tcx>>(&self, cx: &'a Bx::CodegenCx) {
22 debug!("BEGIN IMPLEMENTING '{} ({})' in cgu {}",
23 self.to_string(cx.tcx(), true),
25 cx.codegen_unit().name());
28 MonoItem::Static(def_id) => {
29 cx.codegen_static(def_id, cx.tcx().is_mutable_static(def_id));
31 MonoItem::GlobalAsm(hir_id) => {
32 let item = cx.tcx().hir().expect_item(hir_id);
33 if let hir::ItemKind::GlobalAsm(ref ga) = item.node {
34 cx.codegen_global_asm(ga);
36 span_bug!(item.span, "Mismatch between hir::Item type and MonoItem type")
39 MonoItem::Fn(instance) => {
40 base::codegen_instance::<Bx>(&cx, instance);
44 debug!("END IMPLEMENTING '{} ({})' in cgu {}",
45 self.to_string(cx.tcx(), true),
47 cx.codegen_unit().name());
50 fn predefine<Bx: BuilderMethods<'a, 'tcx>>(
52 cx: &'a Bx::CodegenCx,
54 visibility: Visibility
56 debug!("BEGIN PREDEFINING '{} ({})' in cgu {}",
57 self.to_string(cx.tcx(), true),
59 cx.codegen_unit().name());
61 let symbol_name = self.symbol_name(cx.tcx()).as_str();
63 debug!("symbol {}", &symbol_name);
66 MonoItem::Static(def_id) => {
67 cx.predefine_static(def_id, linkage, visibility, &symbol_name);
69 MonoItem::Fn(instance) => {
70 cx.predefine_fn(instance, linkage, visibility, &symbol_name);
72 MonoItem::GlobalAsm(..) => {}
75 debug!("END PREDEFINING '{} ({})' in cgu {}",
76 self.to_string(cx.tcx(), true),
78 cx.codegen_unit().name());
81 fn to_raw_string(&self) -> String {
83 MonoItem::Fn(instance) => {
84 format!("Fn({:?}, {})",
86 instance.substs.as_ptr() as usize)
88 MonoItem::Static(id) => {
89 format!("Static({:?})", id)
91 MonoItem::GlobalAsm(id) => {
92 format!("GlobalAsm({:?})", id)