Check whether a static is mutable instead of passing it down
This commit is contained in:
parent
f0fa06bb7a
commit
0ef52380a5
4 changed files with 9 additions and 9 deletions
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue