|
2 | 2 | use gccjit::FnAttribute; |
3 | 3 | use gccjit::{Function, GlobalKind, LValue, RValue, ToRValue, Type}; |
4 | 4 | use rustc_codegen_ssa::traits::{BaseTypeMethods, ConstMethods, DerivedTypeMethods, StaticMethods}; |
5 | | -use rustc_hir as hir; |
6 | | -use rustc_hir::Node; |
7 | | -use rustc_middle::{bug, span_bug}; |
| 5 | +use rustc_middle::span_bug; |
8 | 6 | use rustc_middle::middle::codegen_fn_attrs::{CodegenFnAttrFlags, CodegenFnAttrs}; |
9 | 7 | use rustc_middle::mir::mono::MonoItem; |
10 | 8 | use rustc_middle::ty::{self, Instance, Ty}; |
@@ -217,84 +215,59 @@ impl<'gcc, 'tcx> CodegenCx<'gcc, 'tcx> { |
217 | 215 | let ty = instance.ty(self.tcx, ty::ParamEnv::reveal_all()); |
218 | 216 | let sym = self.tcx.symbol_name(instance).name; |
219 | 217 |
|
220 | | - let global = |
221 | | - if let Some(def_id) = def_id.as_local() { |
222 | | - let id = self.tcx.hir().local_def_id_to_hir_id(def_id); |
223 | | - let llty = self.layout_of(ty).gcc_type(self); |
224 | | - // FIXME: refactor this to work without accessing the HIR |
225 | | - let global = match self.tcx.hir().get(id) { |
226 | | - Node::Item(&hir::Item { span, kind: hir::ItemKind::Static(..), .. }) => { |
227 | | - if let Some(global) = self.get_declared_value(&sym) { |
228 | | - if self.val_ty(global) != self.type_ptr_to(llty) { |
229 | | - span_bug!(span, "Conflicting types for static"); |
230 | | - } |
231 | | - } |
232 | | - |
233 | | - let is_tls = fn_attrs.flags.contains(CodegenFnAttrFlags::THREAD_LOCAL); |
234 | | - let global = self.declare_global( |
235 | | - &sym, |
236 | | - llty, |
237 | | - GlobalKind::Exported, |
238 | | - is_tls, |
239 | | - fn_attrs.link_section, |
240 | | - ); |
241 | | - |
242 | | - if !self.tcx.is_reachable_non_generic(def_id) { |
243 | | - // TODO(antoyo): set visibility. |
244 | | - } |
245 | | - |
246 | | - global |
247 | | - } |
248 | | - |
249 | | - Node::ForeignItem(&hir::ForeignItem { |
250 | | - span, |
251 | | - kind: hir::ForeignItemKind::Static(..), |
252 | | - .. |
253 | | - }) => { |
254 | | - let fn_attrs = self.tcx.codegen_fn_attrs(def_id); |
255 | | - check_and_apply_linkage(&self, &fn_attrs, ty, sym, span) |
256 | | - } |
257 | | - |
258 | | - item => bug!("get_static: expected static, found {:?}", item), |
259 | | - }; |
| 218 | + let global = if def_id.is_local() && !self.tcx.is_foreign_item(def_id) { |
| 219 | + let llty = self.layout_of(ty).gcc_type(self); |
| 220 | + if let Some(global) = self.get_declared_value(sym) { |
| 221 | + if self.val_ty(global) != self.type_ptr_to(llty) { |
| 222 | + span_bug!(self.tcx.def_span(def_id), "Conflicting types for static"); |
| 223 | + } |
| 224 | + } |
260 | 225 |
|
261 | | - global |
| 226 | + let is_tls = fn_attrs.flags.contains(CodegenFnAttrFlags::THREAD_LOCAL); |
| 227 | + let global = self.declare_global( |
| 228 | + &sym, |
| 229 | + llty, |
| 230 | + GlobalKind::Exported, |
| 231 | + is_tls, |
| 232 | + fn_attrs.link_section, |
| 233 | + ); |
| 234 | + |
| 235 | + if !self.tcx.is_reachable_non_generic(def_id) { |
| 236 | + // TODO(antoyo): set visibility. |
262 | 237 | } |
263 | | - else { |
264 | | - // FIXME(nagisa): perhaps the map of externs could be offloaded to llvm somehow? |
265 | | - //debug!("get_static: sym={} item_attr={:?}", sym, self.tcx.item_attrs(def_id)); |
266 | | - |
267 | | - let attrs = self.tcx.codegen_fn_attrs(def_id); |
268 | | - let span = self.tcx.def_span(def_id); |
269 | | - let global = check_and_apply_linkage(&self, &attrs, ty, sym, span); |
270 | | - |
271 | | - let needs_dll_storage_attr = false; // TODO(antoyo) |
272 | | - |
273 | | - // If this assertion triggers, there's something wrong with commandline |
274 | | - // argument validation. |
275 | | - debug_assert!( |
276 | | - !(self.tcx.sess.opts.cg.linker_plugin_lto.enabled() |
277 | | - && self.tcx.sess.target.options.is_like_msvc |
278 | | - && self.tcx.sess.opts.cg.prefer_dynamic) |
279 | | - ); |
280 | | - |
281 | | - if needs_dll_storage_attr { |
282 | | - // This item is external but not foreign, i.e., it originates from an external Rust |
283 | | - // crate. Since we don't know whether this crate will be linked dynamically or |
284 | | - // statically in the final application, we always mark such symbols as 'dllimport'. |
285 | | - // If final linkage happens to be static, we rely on compiler-emitted __imp_ stubs |
286 | | - // to make things work. |
287 | | - // |
288 | | - // However, in some scenarios we defer emission of statics to downstream |
289 | | - // crates, so there are cases where a static with an upstream DefId |
290 | | - // is actually present in the current crate. We can find out via the |
291 | | - // is_codegened_item query. |
292 | | - if !self.tcx.is_codegened_item(def_id) { |
293 | | - unimplemented!(); |
294 | | - } |
| 238 | + |
| 239 | + global |
| 240 | + } else { |
| 241 | + check_and_apply_linkage(&self, &fn_attrs, ty, sym, self.tcx.def_span(def_id)) |
| 242 | + }; |
| 243 | + |
| 244 | + if !def_id.is_local() { |
| 245 | + let needs_dll_storage_attr = false; // TODO(antoyo) |
| 246 | + |
| 247 | + // If this assertion triggers, there's something wrong with commandline |
| 248 | + // argument validation. |
| 249 | + debug_assert!( |
| 250 | + !(self.tcx.sess.opts.cg.linker_plugin_lto.enabled() |
| 251 | + && self.tcx.sess.target.options.is_like_msvc |
| 252 | + && self.tcx.sess.opts.cg.prefer_dynamic) |
| 253 | + ); |
| 254 | + |
| 255 | + if needs_dll_storage_attr { |
| 256 | + // This item is external but not foreign, i.e., it originates from an external Rust |
| 257 | + // crate. Since we don't know whether this crate will be linked dynamically or |
| 258 | + // statically in the final application, we always mark such symbols as 'dllimport'. |
| 259 | + // If final linkage happens to be static, we rely on compiler-emitted __imp_ stubs |
| 260 | + // to make things work. |
| 261 | + // |
| 262 | + // However, in some scenarios we defer emission of statics to downstream |
| 263 | + // crates, so there are cases where a static with an upstream DefId |
| 264 | + // is actually present in the current crate. We can find out via the |
| 265 | + // is_codegened_item query. |
| 266 | + if !self.tcx.is_codegened_item(def_id) { |
| 267 | + unimplemented!(); |
295 | 268 | } |
296 | | - global |
297 | | - }; |
| 269 | + } |
| 270 | + } |
298 | 271 |
|
299 | 272 | // TODO(antoyo): set dll storage class. |
300 | 273 |
|
|
0 commit comments