Set dso_local for more items · rust-lang/rust@f7ed4a7 (original) (raw)

4 files changed

lines changed

Original file line number Diff line number Diff line change
@@ -204,3 +204,27 @@ pub fn visibility_to_llvm(linkage: Visibility) -> llvm::Visibility {
204 204 Visibility::Protected => llvm::Visibility::Protected,
205 205 }
206 206 }
207 +
208 +pub fn linkage_from_llvm(linkage: llvm::Linkage) -> Linkage {
209 +match linkage {
210 + llvm::Linkage::ExternalLinkage => Linkage::External,
211 + llvm::Linkage::AvailableExternallyLinkage => Linkage::AvailableExternally,
212 + llvm::Linkage::LinkOnceAnyLinkage => Linkage::LinkOnceAny,
213 + llvm::Linkage::LinkOnceODRLinkage => Linkage::LinkOnceODR,
214 + llvm::Linkage::WeakAnyLinkage => Linkage::WeakAny,
215 + llvm::Linkage::WeakODRLinkage => Linkage::WeakODR,
216 + llvm::Linkage::AppendingLinkage => Linkage::Appending,
217 + llvm::Linkage::InternalLinkage => Linkage::Internal,
218 + llvm::Linkage::PrivateLinkage => Linkage::Private,
219 + llvm::Linkage::ExternalWeakLinkage => Linkage::ExternalWeak,
220 + llvm::Linkage::CommonLinkage => Linkage::Common,
221 +}
222 +}
223 +
224 +pub fn visibility_from_llvm(linkage: llvm::Visibility) -> Visibility {
225 +match linkage {
226 + llvm::Visibility::Default => Visibility::Default,
227 + llvm::Visibility::Hidden => Visibility::Hidden,
228 + llvm::Visibility::Protected => Visibility::Protected,
229 +}
230 +}
Original file line number Diff line number Diff line change
@@ -17,6 +17,7 @@ use rustc_middle::mir::mono::MonoItem;
17 17 use rustc_middle::ty::{self, Instance, Ty};
18 18 use rustc_middle::{bug, span_bug};
19 19 use rustc_target::abi::{AddressSpace, Align, HasDataLayout, LayoutOf, Primitive, Scalar, Size};
20 +use rustc_target::spec::RelocModel;
20 21 use tracing::debug;
21 22
22 23 pub fn const_alloc_to_llvm(cx: &CodegenCx<'ll, '_>, alloc: &Allocation) -> &'ll Value {
@@ -282,6 +283,12 @@ impl CodegenCx<'ll, 'tcx> {
282 283 }
283 284 }
284 285
286 +if self.tcx.sess.relocation_model() == RelocModel::Static {
287 +unsafe {
288 + llvm::LLVMRustSetDSOLocal(g, true);
289 +}
290 +}
291 +
285 292 self.instances.borrow_mut().insert(instance, g);
286 293 g
287 294 }
@@ -363,6 +370,12 @@ impl StaticMethods for CodegenCx<'ll, 'tcx> {
363 370 set_global_alignment(&self, g, self.align_of(ty));
364 371 llvm::LLVMSetInitializer(g, v);
365 372
373 +let linkage = base::linkage_from_llvm(llvm::LLVMRustGetLinkage(g));
374 +let visibility = base::visibility_from_llvm(llvm::LLVMRustGetVisibility(g));
375 +if self.should_assume_dso_local(linkage, visibility) {
376 + llvm::LLVMRustSetDSOLocal(g, true);
377 +}
378 +
366 379 // As an optimization, all shared statics which do not have interior
367 380 // mutability are placed into read-only memory.
368 381 if !is_mutable && self.type_is_freeze(ty) {
Original file line number Diff line number Diff line change
@@ -54,7 +54,7 @@ pub enum CallConv {
54 54 }
55 55
56 56 /// LLVMRustLinkage
57 -#[derive(PartialEq)]
57 +#[derive(Copy, Clone, PartialEq)]
58 58 #[repr(C)]
59 59 pub enum Linkage {
60 60 ExternalLinkage = 0,
@@ -72,6 +72,7 @@ pub enum Linkage {
72 72
73 73 // LLVMRustVisibility
74 74 #[repr(C)]
75 +#[derive(Copy, Clone)]
75 76 pub enum Visibility {
76 77 Default = 0,
77 78 Hidden = 1,
Original file line number Diff line number Diff line change
@@ -15,9 +15,21 @@ trait Sized {}
15 15 #[lang="copy"]
16 16 trait Copy {}
17 17
18 +#[lang="sync"]
19 +trait Sync {}
20 +
21 +#[lang = "drop_in_place"]
22 +fn drop_in_place<T>(_: *mut T) {}
23 +
18 24 impl Copy for u8 {}
25 +impl Sync for u8 {}
26 +
27 +#[no_mangle]
28 +pub static PIERIS: u8 = 42;
19 29
20 30 extern "C" {
31 +static EXOCHORDA: *mut u8;
32 +
21 33 fn chaenomeles();
22 34 }
23 35
@@ -42,3 +54,24 @@ pub fn peach() -> u8 {
42 54 *(banana as *mut u8)
43 55 }
44 56 }
57 +
58 +// CHECK-LABEL: mango:
59 +// x64: movq EXOCHORDA{{(\(%[a-z0-9]+\))?}}, %[[REG:[a-z0-9]+]]
60 +// x64-NEXT: movb (%[[REG]]), %{{[a-z0-9]+}}
61 +// A64: adrp [[REG2:[a-z0-9]+]], EXOCHORDA
62 +// A64-NEXT: ldr {{[a-z0-9]+}}, {{\[}}[[REG2]], :lo12:EXOCHORDA]
63 +#[no_mangle]
64 +pub fn mango() -> u8 {
65 +unsafe {
66 +*EXOCHORDA
67 +}
68 +}
69 +
70 +// CHECK-LABEL: orange:
71 +// x64: mov{{l|absq}} $PIERIS, %{{[a-z0-9]+}}
72 +// A64: adrp [[REG2:[a-z0-9]+]], PIERIS
73 +// A64-NEXT: add {{[a-z0-9]+}}, [[REG2]], :lo12:PIERIS
74 +#[no_mangle]
75 +pub fn orange() -> &'static u8 {
76 +&PIERIS
77 +}