4 use rustc_middle::mir::mono::{Linkage, Visibility};
5 use rustc_middle::ty::layout::HasTyCtxt;
7 use rustc_middle::mir::mono::MonoItem;
9 pub trait MonoItemExt<'a, 'tcx> {
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) {
23 "BEGIN IMPLEMENTING '{} ({})' in cgu {}",
26 cx.codegen_unit().name()
30 MonoItem::Static(def_id) => {
31 cx.codegen_static(def_id, cx.tcx().is_mutable_static(def_id));
33 MonoItem::GlobalAsm(hir_id) => {
34 let item = cx.tcx().hir().expect_item(hir_id);
35 if let hir::ItemKind::GlobalAsm(ref ga) = item.kind {
36 cx.codegen_global_asm(ga);
38 span_bug!(item.span, "Mismatch between hir::Item type and MonoItem type")
41 MonoItem::Fn(instance) => {
42 base::codegen_instance::<Bx>(&cx, instance);
47 "END IMPLEMENTING '{} ({})' in cgu {}",
50 cx.codegen_unit().name()
54 fn predefine<Bx: BuilderMethods<'a, 'tcx>>(
56 cx: &'a Bx::CodegenCx,
58 visibility: Visibility,
61 "BEGIN PREDEFINING '{} ({})' in cgu {}",
64 cx.codegen_unit().name()
67 let symbol_name = self.symbol_name(cx.tcx()).name;
69 debug!("symbol {}", &symbol_name);
72 MonoItem::Static(def_id) => {
73 cx.predefine_static(def_id, linkage, visibility, &symbol_name);
75 MonoItem::Fn(instance) => {
76 cx.predefine_fn(instance, linkage, visibility, &symbol_name);
78 MonoItem::GlobalAsm(..) => {}
82 "END PREDEFINING '{} ({})' in cgu {}",
85 cx.codegen_unit().name()
89 fn to_raw_string(&self) -> String {
91 MonoItem::Fn(instance) => {
92 format!("Fn({:?}, {})", instance.def, instance.substs.as_ptr() as usize)
94 MonoItem::Static(id) => format!("Static({:?})", id),
95 MonoItem::GlobalAsm(id) => format!("GlobalAsm({:?})", id),