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 | +} |