about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBoris-Chengbiao Zhou <bobo1239@web.de>2021-05-14 03:47:41 +0200
committerBoris-Chengbiao Zhou <bobo1239@web.de>2021-05-18 20:13:24 +0200
commitf7ed4a799ad2a128ede21eff62f95562a4e528e3 (patch)
tree006fdc04a8963232ab96decd4d4d51797c1cef78
parent46985d5d913f7e7621183f69cdbc5b65c5ce1fc7 (diff)
downloadrust-f7ed4a799ad2a128ede21eff62f95562a4e528e3.tar.gz
rust-f7ed4a799ad2a128ede21eff62f95562a4e528e3.zip
Set dso_local for more items
-rw-r--r--compiler/rustc_codegen_llvm/src/base.rs24
-rw-r--r--compiler/rustc_codegen_llvm/src/consts.rs13
-rw-r--r--compiler/rustc_codegen_llvm/src/llvm/ffi.rs3
-rw-r--r--src/test/assembly/static-relocation-model.rs33
4 files changed, 72 insertions, 1 deletions
diff --git a/compiler/rustc_codegen_llvm/src/base.rs b/compiler/rustc_codegen_llvm/src/base.rs
index 6f6c649bb0b..a48ec1136dd 100644
--- a/compiler/rustc_codegen_llvm/src/base.rs
+++ b/compiler/rustc_codegen_llvm/src/base.rs
@@ -204,3 +204,27 @@ pub fn visibility_to_llvm(linkage: Visibility) -> llvm::Visibility {
         Visibility::Protected => llvm::Visibility::Protected,
     }
 }
+
+pub fn linkage_from_llvm(linkage: llvm::Linkage) -> Linkage {
+    match linkage {
+        llvm::Linkage::ExternalLinkage => Linkage::External,
+        llvm::Linkage::AvailableExternallyLinkage => Linkage::AvailableExternally,
+        llvm::Linkage::LinkOnceAnyLinkage => Linkage::LinkOnceAny,
+        llvm::Linkage::LinkOnceODRLinkage => Linkage::LinkOnceODR,
+        llvm::Linkage::WeakAnyLinkage => Linkage::WeakAny,
+        llvm::Linkage::WeakODRLinkage => Linkage::WeakODR,
+        llvm::Linkage::AppendingLinkage => Linkage::Appending,
+        llvm::Linkage::InternalLinkage => Linkage::Internal,
+        llvm::Linkage::PrivateLinkage => Linkage::Private,
+        llvm::Linkage::ExternalWeakLinkage => Linkage::ExternalWeak,
+        llvm::Linkage::CommonLinkage => Linkage::Common,
+    }
+}
+
+pub fn visibility_from_llvm(linkage: llvm::Visibility) -> Visibility {
+    match linkage {
+        llvm::Visibility::Default => Visibility::Default,
+        llvm::Visibility::Hidden => Visibility::Hidden,
+        llvm::Visibility::Protected => Visibility::Protected,
+    }
+}
diff --git a/compiler/rustc_codegen_llvm/src/consts.rs b/compiler/rustc_codegen_llvm/src/consts.rs
index 99046839973..245842df1b0 100644
--- a/compiler/rustc_codegen_llvm/src/consts.rs
+++ b/compiler/rustc_codegen_llvm/src/consts.rs
@@ -17,6 +17,7 @@ use rustc_middle::mir::mono::MonoItem;
 use rustc_middle::ty::{self, Instance, Ty};
 use rustc_middle::{bug, span_bug};
 use rustc_target::abi::{AddressSpace, Align, HasDataLayout, LayoutOf, Primitive, Scalar, Size};
+use rustc_target::spec::RelocModel;
 use tracing::debug;
 
 pub fn const_alloc_to_llvm(cx: &CodegenCx<'ll, '_>, alloc: &Allocation) -> &'ll Value {
@@ -282,6 +283,12 @@ impl CodegenCx<'ll, 'tcx> {
             }
         }
 
+        if self.tcx.sess.relocation_model() == RelocModel::Static {
+            unsafe {
+                llvm::LLVMRustSetDSOLocal(g, true);
+            }
+        }
+
         self.instances.borrow_mut().insert(instance, g);
         g
     }
@@ -363,6 +370,12 @@ impl StaticMethods for CodegenCx<'ll, 'tcx> {
             set_global_alignment(&self, g, self.align_of(ty));
             llvm::LLVMSetInitializer(g, v);
 
+            let linkage = base::linkage_from_llvm(llvm::LLVMRustGetLinkage(g));
+            let visibility = base::visibility_from_llvm(llvm::LLVMRustGetVisibility(g));
+            if self.should_assume_dso_local(linkage, visibility) {
+                llvm::LLVMRustSetDSOLocal(g, true);
+            }
+
             // As an optimization, all shared statics which do not have interior
             // mutability are placed into read-only memory.
             if !is_mutable && self.type_is_freeze(ty) {
diff --git a/compiler/rustc_codegen_llvm/src/llvm/ffi.rs b/compiler/rustc_codegen_llvm/src/llvm/ffi.rs
index 32fdde9b42e..7fb978d61dc 100644
--- a/compiler/rustc_codegen_llvm/src/llvm/ffi.rs
+++ b/compiler/rustc_codegen_llvm/src/llvm/ffi.rs
@@ -54,7 +54,7 @@ pub enum CallConv {
 }
 
 /// LLVMRustLinkage
-#[derive(PartialEq)]
+#[derive(Copy, Clone, PartialEq)]
 #[repr(C)]
 pub enum Linkage {
     ExternalLinkage = 0,
@@ -72,6 +72,7 @@ pub enum Linkage {
 
 // LLVMRustVisibility
 #[repr(C)]
+#[derive(Copy, Clone)]
 pub enum Visibility {
     Default = 0,
     Hidden = 1,
diff --git a/src/test/assembly/static-relocation-model.rs b/src/test/assembly/static-relocation-model.rs
index 2ee63ddd379..ce2b3b1cfa4 100644
--- a/src/test/assembly/static-relocation-model.rs
+++ b/src/test/assembly/static-relocation-model.rs
@@ -15,9 +15,21 @@ trait Sized {}
 #[lang="copy"]
 trait Copy {}
 
+#[lang="sync"]
+trait Sync {}
+
+#[lang = "drop_in_place"]
+fn drop_in_place<T>(_: *mut T) {}
+
 impl Copy for u8 {}
+impl Sync for u8 {}
+
+#[no_mangle]
+pub static PIERIS: u8 = 42;
 
 extern "C" {
+    static EXOCHORDA: *mut u8;
+
     fn chaenomeles();
 }
 
@@ -42,3 +54,24 @@ pub fn peach() -> u8 {
         *(banana as *mut u8)
     }
 }
+
+// CHECK-LABEL: mango:
+// x64:      movq    EXOCHORDA{{(\(%[a-z0-9]+\))?}}, %[[REG:[a-z0-9]+]]
+// x64-NEXT: movb    (%[[REG]]), %{{[a-z0-9]+}}
+// A64:      adrp    [[REG2:[a-z0-9]+]], EXOCHORDA
+// A64-NEXT: ldr     {{[a-z0-9]+}}, {{\[}}[[REG2]], :lo12:EXOCHORDA]
+#[no_mangle]
+pub fn mango() -> u8 {
+    unsafe {
+        *EXOCHORDA
+    }
+}
+
+// CHECK-LABEL: orange:
+// x64: mov{{l|absq}}    $PIERIS, %{{[a-z0-9]+}}
+// A64:      adrp    [[REG2:[a-z0-9]+]], PIERIS
+// A64-NEXT: add     {{[a-z0-9]+}}, [[REG2]], :lo12:PIERIS
+#[no_mangle]
+pub fn orange() -> &'static u8 {
+    &PIERIS
+}