mirror of
https://github.com/rust-lang/rust
synced 2024-07-21 10:26:41 +00:00
Check whether a static is mutable instead of passing it down
This commit is contained in:
parent
f0fa06bb7a
commit
0ef52380a5
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in a new issue