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 @@ fn static_addr_of(&self, cv: RValue<'gcc>, align: Align, kind: Option<&str>) ->
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 value = match codegen_static_initializer(&self, def_id) {
@ -92,7 +92,7 @@ fn codegen_static(&self, def_id: DefId, is_mutable: bool) {
// 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) {
if !self.tcx.static_mutability(def_id).unwrap().is_mut() && self.type_is_freeze(ty) {
#[cfg(feature = "master")]
global.global_set_readonly();
}

View file

@ -344,7 +344,7 @@ pub(crate) fn get_static_inner(&self, def_id: DefId, llty: &'ll Type) -> &'ll Va
g
}
fn codegen_static_item(&self, def_id: DefId, is_mutable: bool) {
fn codegen_static_item(&self, def_id: DefId) {
unsafe {
let attrs = self.tcx.codegen_fn_attrs(def_id);
@ -356,7 +356,7 @@ fn codegen_static_item(&self, def_id: DefId, is_mutable: bool) {
let instance = Instance::mono(self.tcx, def_id);
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.align, self.align_of(ty));
@ -409,7 +409,7 @@ fn codegen_static_item(&self, def_id: DefId, is_mutable: bool) {
// As an optimization, all shared statics which do not have interior
// mutability are placed into read-only memory.
if !is_mutable && alloc.mutability.is_not() {
if alloc.mutability.is_not() {
llvm::LLVMSetGlobalConstant(g, llvm::True);
}
@ -555,8 +555,8 @@ fn static_addr_of(&self, cv: &'ll Value, align: Align, kind: Option<&str>) -> &'
gv
}
fn codegen_static(&self, def_id: DefId, is_mutable: bool) {
self.codegen_static_item(def_id, is_mutable)
fn codegen_static(&self, def_id: DefId) {
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.

View file

@ -30,7 +30,7 @@ fn define<Bx: BuilderMethods<'a, 'tcx>>(&self, cx: &'a Bx::CodegenCx) {
match *self {
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) => {
let item = cx.tcx().hir().item(item_id);

View file

@ -4,7 +4,7 @@
pub trait StaticMethods: BackendTypes {
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
/// removing a static variable that may otherwise appear unused.