From f7ed4a799ad2a128ede21eff62f95562a4e528e3 Mon Sep 17 00:00:00 2001 From: Boris-Chengbiao Zhou Date: Fri, 14 May 2021 03:47:41 +0200 Subject: [PATCH] Set dso_local for more items --- compiler/rustc_codegen_llvm/src/base.rs | 24 ++++++++++++++ compiler/rustc_codegen_llvm/src/consts.rs | 13 ++++++++ compiler/rustc_codegen_llvm/src/llvm/ffi.rs | 3 +- src/test/assembly/static-relocation-model.rs | 33 ++++++++++++++++++++ 4 files changed, 72 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_codegen_llvm/src/base.rs b/compiler/rustc_codegen_llvm/src/base.rs index 6f6c649bb0b18..a48ec1136dd00 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 99046839973d5..245842df1b060 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 32fdde9b42e5f..7fb978d61dc3f 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 2ee63ddd379f3..ce2b3b1cfa414 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(_: *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 +}