]>
Commit | Line | Data |
---|---|---|
9fa01778 XL |
1 | use crate::base; |
2 | use crate::traits::*; | |
dfeec247 | 3 | use rustc_hir as hir; |
ba9703b0 XL |
4 | use rustc_middle::mir::mono::{Linkage, Visibility}; |
5 | use rustc_middle::ty::layout::HasTyCtxt; | |
a1dfa0c6 | 6 | |
ba9703b0 | 7 | use rustc_middle::mir::mono::MonoItem; |
a1dfa0c6 | 8 | |
dc9dc135 XL |
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>>( | |
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 | 20 | impl<'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 | } |