Skip to content

Commit f7ed4a7

Browse files
committed
Set dso_local for more items
1 parent 46985d5 commit f7ed4a7

File tree

4 files changed

+72
-1
lines changed

4 files changed

+72
-1
lines changed

compiler/rustc_codegen_llvm/src/base.rs

+24
Original file line numberDiff line numberDiff line change
@@ -204,3 +204,27 @@ pub fn visibility_to_llvm(linkage: Visibility) -> llvm::Visibility {
204204
Visibility::Protected => llvm::Visibility::Protected,
205205
}
206206
}
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+
}

compiler/rustc_codegen_llvm/src/consts.rs

+13
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use rustc_middle::mir::mono::MonoItem;
1717
use rustc_middle::ty::{self, Instance, Ty};
1818
use rustc_middle::{bug, span_bug};
1919
use rustc_target::abi::{AddressSpace, Align, HasDataLayout, LayoutOf, Primitive, Scalar, Size};
20+
use rustc_target::spec::RelocModel;
2021
use tracing::debug;
2122

2223
pub fn const_alloc_to_llvm(cx: &CodegenCx<'ll, '_>, alloc: &Allocation) -> &'ll Value {
@@ -282,6 +283,12 @@ impl CodegenCx<'ll, 'tcx> {
282283
}
283284
}
284285

286+
if self.tcx.sess.relocation_model() == RelocModel::Static {
287+
unsafe {
288+
llvm::LLVMRustSetDSOLocal(g, true);
289+
}
290+
}
291+
285292
self.instances.borrow_mut().insert(instance, g);
286293
g
287294
}
@@ -363,6 +370,12 @@ impl StaticMethods for CodegenCx<'ll, 'tcx> {
363370
set_global_alignment(&self, g, self.align_of(ty));
364371
llvm::LLVMSetInitializer(g, v);
365372

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+
366379
// As an optimization, all shared statics which do not have interior
367380
// mutability are placed into read-only memory.
368381
if !is_mutable && self.type_is_freeze(ty) {

compiler/rustc_codegen_llvm/src/llvm/ffi.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ pub enum CallConv {
5454
}
5555

5656
/// LLVMRustLinkage
57-
#[derive(PartialEq)]
57+
#[derive(Copy, Clone, PartialEq)]
5858
#[repr(C)]
5959
pub enum Linkage {
6060
ExternalLinkage = 0,
@@ -72,6 +72,7 @@ pub enum Linkage {
7272

7373
// LLVMRustVisibility
7474
#[repr(C)]
75+
#[derive(Copy, Clone)]
7576
pub enum Visibility {
7677
Default = 0,
7778
Hidden = 1,

src/test/assembly/static-relocation-model.rs

+33
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,21 @@ trait Sized {}
1515
#[lang="copy"]
1616
trait Copy {}
1717

18+
#[lang="sync"]
19+
trait Sync {}
20+
21+
#[lang = "drop_in_place"]
22+
fn drop_in_place<T>(_: *mut T) {}
23+
1824
impl Copy for u8 {}
25+
impl Sync for u8 {}
26+
27+
#[no_mangle]
28+
pub static PIERIS: u8 = 42;
1929

2030
extern "C" {
31+
static EXOCHORDA: *mut u8;
32+
2133
fn chaenomeles();
2234
}
2335

@@ -42,3 +54,24 @@ pub fn peach() -> u8 {
4254
*(banana as *mut u8)
4355
}
4456
}
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+
}

0 commit comments

Comments
 (0)