1
Fork 0

Check whether a static is mutable instead of passing it down

This commit is contained in:
Oli Scherer 2023-10-06 15:00:44 +00:00
parent f0fa06bb7a
commit 0ef52380a5
4 changed files with 9 additions and 9 deletions

View file

@ -63,7 +63,7 @@ impl<'gcc, 'tcx> StaticMethods for CodegenCx<'gcc, 'tcx> {
global_value global_value
} }
fn codegen_static(&self, def_id: DefId, is_mutable: bool) { fn codegen_static(&self, def_id: DefId) {
let attrs = self.tcx.codegen_fn_attrs(def_id); let attrs = self.tcx.codegen_fn_attrs(def_id);
let value = match codegen_static_initializer(&self, def_id) { let value = match codegen_static_initializer(&self, def_id) {
@ -92,7 +92,7 @@ impl<'gcc, 'tcx> StaticMethods for CodegenCx<'gcc, 'tcx> {
// As an optimization, all shared statics which do not have interior // As an optimization, all shared statics which do not have interior
// mutability are placed into read-only memory. // mutability are placed into read-only memory.
if !is_mutable && self.type_is_freeze(ty) { if !self.tcx.static_mutability(def_id).unwrap().is_mut() && self.type_is_freeze(ty) {
#[cfg(feature = "master")] #[cfg(feature = "master")]
global.global_set_readonly(); global.global_set_readonly();
} }

View file

@ -344,7 +344,7 @@ impl<'ll> CodegenCx<'ll, '_> {
g g
} }
fn codegen_static_item(&self, def_id: DefId, is_mutable: bool) { fn codegen_static_item(&self, def_id: DefId) {
unsafe { unsafe {
let attrs = self.tcx.codegen_fn_attrs(def_id); let attrs = self.tcx.codegen_fn_attrs(def_id);
@ -356,7 +356,7 @@ impl<'ll> CodegenCx<'ll, '_> {
let instance = Instance::mono(self.tcx, def_id); let instance = Instance::mono(self.tcx, def_id);
let ty = instance.ty(self.tcx, ty::ParamEnv::reveal_all()); let ty = instance.ty(self.tcx, ty::ParamEnv::reveal_all());
if !is_mutable { if !self.tcx.is_mutable_static(def_id) {
debug_assert_eq!(alloc.mutability.is_not(), self.type_is_freeze(ty)); debug_assert_eq!(alloc.mutability.is_not(), self.type_is_freeze(ty));
} }
debug_assert_eq!(alloc.align, self.align_of(ty)); debug_assert_eq!(alloc.align, self.align_of(ty));
@ -409,7 +409,7 @@ impl<'ll> CodegenCx<'ll, '_> {
// As an optimization, all shared statics which do not have interior // As an optimization, all shared statics which do not have interior
// mutability are placed into read-only memory. // mutability are placed into read-only memory.
if !is_mutable && alloc.mutability.is_not() { if alloc.mutability.is_not() {
llvm::LLVMSetGlobalConstant(g, llvm::True); llvm::LLVMSetGlobalConstant(g, llvm::True);
} }
@ -555,8 +555,8 @@ impl<'ll> StaticMethods for CodegenCx<'ll, '_> {
gv gv
} }
fn codegen_static(&self, def_id: DefId, is_mutable: bool) { fn codegen_static(&self, def_id: DefId) {
self.codegen_static_item(def_id, is_mutable) self.codegen_static_item(def_id)
} }
/// Add a global value to a list to be stored in the `llvm.used` variable, an array of ptr. /// Add a global value to a list to be stored in the `llvm.used` variable, an array of ptr.

View file

@ -30,7 +30,7 @@ impl<'a, 'tcx: 'a> MonoItemExt<'a, 'tcx> for MonoItem<'tcx> {
match *self { match *self {
MonoItem::Static(def_id) => { MonoItem::Static(def_id) => {
cx.codegen_static(def_id, cx.tcx().is_mutable_static(def_id)); cx.codegen_static(def_id);
} }
MonoItem::GlobalAsm(item_id) => { MonoItem::GlobalAsm(item_id) => {
let item = cx.tcx().hir().item(item_id); let item = cx.tcx().hir().item(item_id);

View file

@ -4,7 +4,7 @@ use rustc_target::abi::Align;
pub trait StaticMethods: BackendTypes { pub trait StaticMethods: BackendTypes {
fn static_addr_of(&self, cv: Self::Value, align: Align, kind: Option<&str>) -> Self::Value; fn static_addr_of(&self, cv: Self::Value, align: Align, kind: Option<&str>) -> Self::Value;
fn codegen_static(&self, def_id: DefId, is_mutable: bool); fn codegen_static(&self, def_id: DefId);
/// Mark the given global value as "used", to prevent the compiler and linker from potentially /// Mark the given global value as "used", to prevent the compiler and linker from potentially
/// removing a static variable that may otherwise appear unused. /// removing a static variable that may otherwise appear unused.