]> git.proxmox.com Git - rustc.git/blame - compiler/rustc_codegen_ssa/src/mono_item.rs
New upstream version 1.52.0~beta.3+dfsg1
[rustc.git] / compiler / rustc_codegen_ssa / src / mono_item.rs
CommitLineData
9fa01778
XL
1use crate::base;
2use crate::traits::*;
dfeec247 3use rustc_hir as hir;
ba9703b0
XL
4use rustc_middle::mir::mono::{Linkage, Visibility};
5use rustc_middle::ty::layout::HasTyCtxt;
a1dfa0c6 6
ba9703b0 7use rustc_middle::mir::mono::MonoItem;
a1dfa0c6 8
dc9dc135
XL
9pub trait MonoItemExt<'a, 'tcx> {
10 fn define<Bx: BuilderMethods<'a, 'tcx>>(&self, cx: &'a Bx::CodegenCx);
11 fn predefine<Bx: BuilderMethods<'a, 'tcx>>(
12 &self,
13 cx: &'a Bx::CodegenCx,
14 linkage: Linkage,
dfeec247 15 visibility: Visibility,
dc9dc135
XL
16 );
17 fn to_raw_string(&self) -> String;
18}
a1dfa0c6 19
dc9dc135 20impl<'a, 'tcx: 'a> MonoItemExt<'a, 'tcx> for MonoItem<'tcx> {
a1dfa0c6 21 fn define<Bx: BuilderMethods<'a, 'tcx>>(&self, cx: &'a Bx::CodegenCx) {
dfeec247
XL
22 debug!(
23 "BEGIN IMPLEMENTING '{} ({})' in cgu {}",
1b1a35ee 24 self,
dfeec247
XL
25 self.to_raw_string(),
26 cx.codegen_unit().name()
27 );
a1dfa0c6 28
dc9dc135 29 match *self {
a1dfa0c6 30 MonoItem::Static(def_id) => {
48663c56 31 cx.codegen_static(def_id, cx.tcx().is_mutable_static(def_id));
a1dfa0c6 32 }
6a06907d
XL
33 MonoItem::GlobalAsm(item_id) => {
34 let item = cx.tcx().hir().item(item_id);
e74abb32 35 if let hir::ItemKind::GlobalAsm(ref ga) = item.kind {
a1dfa0c6
XL
36 cx.codegen_global_asm(ga);
37 } else {
38 span_bug!(item.span, "Mismatch between hir::Item type and MonoItem type")
39 }
40 }
41 MonoItem::Fn(instance) => {
42 base::codegen_instance::<Bx>(&cx, instance);
43 }
44 }
45
dfeec247
XL
46 debug!(
47 "END IMPLEMENTING '{} ({})' in cgu {}",
1b1a35ee 48 self,
dfeec247
XL
49 self.to_raw_string(),
50 cx.codegen_unit().name()
51 );
a1dfa0c6
XL
52 }
53
54 fn predefine<Bx: BuilderMethods<'a, 'tcx>>(
55 &self,
56 cx: &'a Bx::CodegenCx,
57 linkage: Linkage,
dfeec247 58 visibility: Visibility,
a1dfa0c6 59 ) {
dfeec247
XL
60 debug!(
61 "BEGIN PREDEFINING '{} ({})' in cgu {}",
1b1a35ee 62 self,
dfeec247
XL
63 self.to_raw_string(),
64 cx.codegen_unit().name()
65 );
a1dfa0c6 66
3dfed10e 67 let symbol_name = self.symbol_name(cx.tcx()).name;
a1dfa0c6
XL
68
69 debug!("symbol {}", &symbol_name);
70
dc9dc135 71 match *self {
a1dfa0c6
XL
72 MonoItem::Static(def_id) => {
73 cx.predefine_static(def_id, linkage, visibility, &symbol_name);
74 }
75 MonoItem::Fn(instance) => {
76 cx.predefine_fn(instance, linkage, visibility, &symbol_name);
77 }
78 MonoItem::GlobalAsm(..) => {}
79 }
80
dfeec247
XL
81 debug!(
82 "END PREDEFINING '{} ({})' in cgu {}",
1b1a35ee 83 self,
dfeec247
XL
84 self.to_raw_string(),
85 cx.codegen_unit().name()
86 );
a1dfa0c6
XL
87 }
88
89 fn to_raw_string(&self) -> String {
dc9dc135 90 match *self {
a1dfa0c6 91 MonoItem::Fn(instance) => {
dfeec247 92 format!("Fn({:?}, {})", instance.def, instance.substs.as_ptr() as usize)
a1dfa0c6 93 }
dfeec247
XL
94 MonoItem::Static(id) => format!("Static({:?})", id),
95 MonoItem::GlobalAsm(id) => format!("GlobalAsm({:?})", id),
a1dfa0c6
XL
96 }
97 }
98}