提交 21deb18b 编写于 作者: S Simonas Kazlauskas

[MIR trans] Translate statics

Fixes #29578
上级 05b66b8a
...@@ -1214,3 +1214,13 @@ pub fn shift_mask_val<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, ...@@ -1214,3 +1214,13 @@ pub fn shift_mask_val<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
} }
} }
pub fn get_static_val<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
did: DefId,
ty: Ty<'tcx>)
-> ValueRef {
if let Some(node_id) = ccx.tcx().map.as_local_node_id(did) {
base::get_item_val(ccx, node_id)
} else {
base::trans_external_path(ccx, did, ty)
}
}
...@@ -29,8 +29,8 @@ ...@@ -29,8 +29,8 @@
use middle::def_id::DefId; use middle::def_id::DefId;
use trans::{adt, closure, debuginfo, expr, inline, machine}; use trans::{adt, closure, debuginfo, expr, inline, machine};
use trans::base::{self, push_ctxt}; use trans::base::{self, push_ctxt};
use trans::common::{self, type_is_sized, ExprOrMethodCall, node_id_substs, C_nil, const_get_elt};
use trans::common::{CrateContext, C_integral, C_floating, C_bool, C_str_slice, C_bytes, val_ty}; use trans::common::{CrateContext, C_integral, C_floating, C_bool, C_str_slice, C_bytes, val_ty};
use trans::common::{type_is_sized, ExprOrMethodCall, node_id_substs, C_nil, const_get_elt};
use trans::common::{C_struct, C_undef, const_to_opt_int, const_to_opt_uint, VariantInfo, C_uint}; use trans::common::{C_struct, C_undef, const_to_opt_int, const_to_opt_uint, VariantInfo, C_uint};
use trans::common::{type_is_fat_ptr, Field, C_vector, C_array, C_null, ExprId, MethodCallKey}; use trans::common::{type_is_fat_ptr, Field, C_vector, C_array, C_null, ExprId, MethodCallKey};
use trans::declare; use trans::declare;
...@@ -795,7 +795,7 @@ fn const_expr_unadjusted<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>, ...@@ -795,7 +795,7 @@ fn const_expr_unadjusted<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
} }
let opt_def = cx.tcx().def_map.borrow().get(&cur.id).map(|d| d.full_def()); let opt_def = cx.tcx().def_map.borrow().get(&cur.id).map(|d| d.full_def());
if let Some(def::DefStatic(def_id, _)) = opt_def { if let Some(def::DefStatic(def_id, _)) = opt_def {
get_static_val(cx, def_id, ety) common::get_static_val(cx, def_id, ety)
} else { } else {
// If this isn't the address of a static, then keep going through // If this isn't the address of a static, then keep going through
// normal constant evaluation. // normal constant evaluation.
...@@ -1075,15 +1075,3 @@ pub fn trans_static(ccx: &CrateContext, ...@@ -1075,15 +1075,3 @@ pub fn trans_static(ccx: &CrateContext,
Ok(g) Ok(g)
} }
} }
fn get_static_val<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
did: DefId,
ty: Ty<'tcx>)
-> ValueRef {
if let Some(node_id) = ccx.tcx().map.as_local_node_id(did) {
base::get_item_val(ccx, node_id)
} else {
base::trans_external_path(ccx, did, ty)
}
}
...@@ -65,7 +65,10 @@ pub fn trans_lvalue(&mut self, ...@@ -65,7 +65,10 @@ pub fn trans_lvalue(&mut self,
tcx.sess.bug(&format!("using operand temp {:?} as lvalue", lvalue)), tcx.sess.bug(&format!("using operand temp {:?} as lvalue", lvalue)),
}, },
mir::Lvalue::Arg(index) => self.args[index as usize], mir::Lvalue::Arg(index) => self.args[index as usize],
mir::Lvalue::Static(_def_id) => unimplemented!(), mir::Lvalue::Static(def_id) => {
let const_ty = self.mir.lvalue_ty(tcx, lvalue);
LvalueRef::new(common::get_static_val(ccx, def_id, const_ty.to_ty(tcx)), const_ty)
},
mir::Lvalue::ReturnPointer => { mir::Lvalue::ReturnPointer => {
let return_ty = bcx.monomorphize(&self.mir.return_ty); let return_ty = bcx.monomorphize(&self.mir.return_ty);
let llval = fcx.get_ret_slot(bcx, return_ty, "return"); let llval = fcx.get_ret_slot(bcx, return_ty, "return");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册