Make all allocas named so we can see where they originate
in the generated LLVM code.
This commit is contained in:
parent
90843b6f58
commit
41efcdf299
14 changed files with 60 additions and 46 deletions
|
@ -268,7 +268,7 @@ pub fn trans_opt(bcx: block, o: &Opt) -> opt_result {
|
||||||
}
|
}
|
||||||
lit(UnitLikeStructLit(pat_id)) => {
|
lit(UnitLikeStructLit(pat_id)) => {
|
||||||
let struct_ty = ty::node_id_to_type(bcx.tcx(), pat_id);
|
let struct_ty = ty::node_id_to_type(bcx.tcx(), pat_id);
|
||||||
let datumblock = datum::scratch_datum(bcx, struct_ty, true);
|
let datumblock = datum::scratch_datum(bcx, struct_ty, "", true);
|
||||||
return single_result(datumblock.to_result(bcx));
|
return single_result(datumblock.to_result(bcx));
|
||||||
}
|
}
|
||||||
lit(ConstLit(lit_id)) => {
|
lit(ConstLit(lit_id)) => {
|
||||||
|
@ -927,7 +927,7 @@ pub fn extract_vec_elems(bcx: block,
|
||||||
ty::mt {ty: vt.unit_ty, mutbl: ast::m_imm},
|
ty::mt {ty: vt.unit_ty, mutbl: ast::m_imm},
|
||||||
ty::vstore_slice(ty::re_static)
|
ty::vstore_slice(ty::re_static)
|
||||||
);
|
);
|
||||||
let scratch = scratch_datum(bcx, slice_ty, false);
|
let scratch = scratch_datum(bcx, slice_ty, "", false);
|
||||||
Store(bcx, slice_begin,
|
Store(bcx, slice_begin,
|
||||||
GEPi(bcx, scratch.val, [0u, abi::slice_elt_base])
|
GEPi(bcx, scratch.val, [0u, abi::slice_elt_base])
|
||||||
);
|
);
|
||||||
|
@ -1095,9 +1095,9 @@ pub fn compare_values(cx: block,
|
||||||
|
|
||||||
match ty::get(rhs_t).sty {
|
match ty::get(rhs_t).sty {
|
||||||
ty::ty_estr(ty::vstore_uniq) => {
|
ty::ty_estr(ty::vstore_uniq) => {
|
||||||
let scratch_lhs = alloca(cx, val_ty(lhs));
|
let scratch_lhs = alloca(cx, val_ty(lhs), "__lhs");
|
||||||
Store(cx, lhs, scratch_lhs);
|
Store(cx, lhs, scratch_lhs);
|
||||||
let scratch_rhs = alloca(cx, val_ty(rhs));
|
let scratch_rhs = alloca(cx, val_ty(rhs), "__rhs");
|
||||||
Store(cx, rhs, scratch_rhs);
|
Store(cx, rhs, scratch_rhs);
|
||||||
let did = cx.tcx().lang_items.uniq_str_eq_fn();
|
let did = cx.tcx().lang_items.uniq_str_eq_fn();
|
||||||
let result = callee::trans_lang_call(cx, did, [scratch_lhs, scratch_rhs], None);
|
let result = callee::trans_lang_call(cx, did, [scratch_lhs, scratch_rhs], None);
|
||||||
|
@ -1636,12 +1636,12 @@ fn create_bindings_map(bcx: block, pat: @ast::pat) -> BindingsMap {
|
||||||
// in this case, the final type of the variable will be T,
|
// in this case, the final type of the variable will be T,
|
||||||
// but during matching we need to store a *T as explained
|
// but during matching we need to store a *T as explained
|
||||||
// above
|
// above
|
||||||
let is_move = ccx.maps.moves_map.contains(&p_id);
|
llmatch = alloca(bcx, llvariable_ty.ptr_to(), "__llmatch");
|
||||||
llmatch = alloca(bcx, llvariable_ty.ptr_to());
|
trmode = TrByValue(alloca(bcx, llvariable_ty,
|
||||||
trmode = TrByValue(is_move, alloca(bcx, llvariable_ty));
|
bcx.ident(ident)));
|
||||||
}
|
}
|
||||||
ast::bind_by_ref(_) => {
|
ast::bind_by_ref(_) => {
|
||||||
llmatch = alloca(bcx, llvariable_ty);
|
llmatch = alloca(bcx, llvariable_ty, bcx.ident(ident));
|
||||||
trmode = TrByRef;
|
trmode = TrByRef;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -1012,7 +1012,7 @@ pub fn get_landing_pad(bcx: block) -> BasicBlockRef {
|
||||||
match bcx.fcx.personality {
|
match bcx.fcx.personality {
|
||||||
Some(addr) => Store(pad_bcx, llretval, addr),
|
Some(addr) => Store(pad_bcx, llretval, addr),
|
||||||
None => {
|
None => {
|
||||||
let addr = alloca(pad_bcx, val_ty(llretval));
|
let addr = alloca(pad_bcx, val_ty(llretval), "");
|
||||||
bcx.fcx.personality = Some(addr);
|
bcx.fcx.personality = Some(addr);
|
||||||
Store(pad_bcx, llretval, addr);
|
Store(pad_bcx, llretval, addr);
|
||||||
}
|
}
|
||||||
|
@ -1056,7 +1056,7 @@ pub fn do_spill(bcx: block, v: ValueRef, t: ty::t) -> ValueRef {
|
||||||
if ty::type_is_bot(t) {
|
if ty::type_is_bot(t) {
|
||||||
return C_null(Type::i8p());
|
return C_null(Type::i8p());
|
||||||
}
|
}
|
||||||
let llptr = alloc_ty(bcx, t);
|
let llptr = alloc_ty(bcx, t, "");
|
||||||
Store(bcx, v, llptr);
|
Store(bcx, v, llptr);
|
||||||
return llptr;
|
return llptr;
|
||||||
}
|
}
|
||||||
|
@ -1064,7 +1064,7 @@ pub fn do_spill(bcx: block, v: ValueRef, t: ty::t) -> ValueRef {
|
||||||
// Since this function does *not* root, it is the caller's responsibility to
|
// Since this function does *not* root, it is the caller's responsibility to
|
||||||
// ensure that the referent is pointed to by a root.
|
// ensure that the referent is pointed to by a root.
|
||||||
pub fn do_spill_noroot(cx: block, v: ValueRef) -> ValueRef {
|
pub fn do_spill_noroot(cx: block, v: ValueRef) -> ValueRef {
|
||||||
let llptr = alloca(cx, val_ty(v));
|
let llptr = alloca(cx, val_ty(v), "");
|
||||||
Store(cx, v, llptr);
|
Store(cx, v, llptr);
|
||||||
return llptr;
|
return llptr;
|
||||||
}
|
}
|
||||||
|
@ -1561,20 +1561,20 @@ pub fn memzero(cx: block, llptr: ValueRef, ty: Type) {
|
||||||
Call(cx, llintrinsicfn, [llptr, llzeroval, size, align, volatile]);
|
Call(cx, llintrinsicfn, [llptr, llzeroval, size, align, volatile]);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn alloc_ty(bcx: block, t: ty::t) -> ValueRef {
|
pub fn alloc_ty(bcx: block, t: ty::t, name: &str) -> ValueRef {
|
||||||
let _icx = push_ctxt("alloc_ty");
|
let _icx = push_ctxt("alloc_ty");
|
||||||
let ccx = bcx.ccx();
|
let ccx = bcx.ccx();
|
||||||
let ty = type_of::type_of(ccx, t);
|
let ty = type_of::type_of(ccx, t);
|
||||||
assert!(!ty::type_has_params(t), "Type has params: %s", ty_to_str(ccx.tcx, t));
|
assert!(!ty::type_has_params(t), "Type has params: %s", ty_to_str(ccx.tcx, t));
|
||||||
let val = alloca(bcx, ty);
|
let val = alloca(bcx, ty, name);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn alloca(cx: block, ty: Type) -> ValueRef {
|
pub fn alloca(cx: block, ty: Type, name: &str) -> ValueRef {
|
||||||
alloca_maybe_zeroed(cx, ty, false)
|
alloca_maybe_zeroed(cx, ty, name, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn alloca_maybe_zeroed(cx: block, ty: Type, zero: bool) -> ValueRef {
|
pub fn alloca_maybe_zeroed(cx: block, ty: Type, name: &str, zero: bool) -> ValueRef {
|
||||||
let _icx = push_ctxt("alloca");
|
let _icx = push_ctxt("alloca");
|
||||||
if cx.unreachable {
|
if cx.unreachable {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
@ -1582,7 +1582,7 @@ pub fn alloca_maybe_zeroed(cx: block, ty: Type, zero: bool) -> ValueRef {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let initcx = base::raw_block(cx.fcx, false, cx.fcx.llstaticallocas);
|
let initcx = base::raw_block(cx.fcx, false, cx.fcx.llstaticallocas);
|
||||||
let p = Alloca(initcx, ty);
|
let p = Alloca(initcx, ty, name);
|
||||||
if zero { memzero(initcx, p, ty); }
|
if zero { memzero(initcx, p, ty); }
|
||||||
p
|
p
|
||||||
}
|
}
|
||||||
|
@ -1623,7 +1623,8 @@ pub fn make_return_pointer(fcx: fn_ctxt, output_type: ty::t) -> ValueRef {
|
||||||
llvm::LLVMGetParam(fcx.llfn, 0)
|
llvm::LLVMGetParam(fcx.llfn, 0)
|
||||||
} else {
|
} else {
|
||||||
let lloutputtype = type_of::type_of(fcx.ccx, output_type);
|
let lloutputtype = type_of::type_of(fcx.ccx, output_type);
|
||||||
alloca(raw_block(fcx, false, fcx.llstaticallocas), lloutputtype)
|
alloca(raw_block(fcx, false, fcx.llstaticallocas), lloutputtype,
|
||||||
|
"__make_return_pointer")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -505,11 +505,17 @@ pub fn ArrayMalloc(cx: block, Ty: Type, Val: ValueRef) -> ValueRef {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn Alloca(cx: block, Ty: Type) -> ValueRef {
|
pub fn Alloca(cx: block, Ty: Type, name: &str) -> ValueRef {
|
||||||
unsafe {
|
unsafe {
|
||||||
if cx.unreachable { return llvm::LLVMGetUndef(Ty.ptr_to().to_ref()); }
|
if cx.unreachable { return llvm::LLVMGetUndef(Ty.ptr_to().to_ref()); }
|
||||||
count_insn(cx, "alloca");
|
count_insn(cx, "alloca");
|
||||||
return llvm::LLVMBuildAlloca(B(cx), Ty.to_ref(), noname());
|
if name.is_empty() {
|
||||||
|
llvm::LLVMBuildAlloca(B(cx), Ty.to_ref(), noname())
|
||||||
|
} else {
|
||||||
|
str::as_c_str(
|
||||||
|
name,
|
||||||
|
|c| llvm::LLVMBuildAlloca(B(cx), Ty.to_ref(), c))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -130,10 +130,10 @@ impl FnType {
|
||||||
j = 1u;
|
j = 1u;
|
||||||
get_param(llwrapfn, 0u)
|
get_param(llwrapfn, 0u)
|
||||||
} else if self.ret_ty.cast {
|
} else if self.ret_ty.cast {
|
||||||
let retptr = alloca(bcx, self.ret_ty.ty);
|
let retptr = alloca(bcx, self.ret_ty.ty, "");
|
||||||
BitCast(bcx, retptr, ret_ty.ptr_to())
|
BitCast(bcx, retptr, ret_ty.ptr_to())
|
||||||
} else {
|
} else {
|
||||||
alloca(bcx, ret_ty)
|
alloca(bcx, ret_ty, "")
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut i = 0u;
|
let mut i = 0u;
|
||||||
|
|
|
@ -600,7 +600,7 @@ pub fn trans_call_inner(in_cx: block,
|
||||||
let mut bcx = callee.bcx;
|
let mut bcx = callee.bcx;
|
||||||
let ccx = cx.ccx();
|
let ccx = cx.ccx();
|
||||||
let ret_flag = if ret_in_loop {
|
let ret_flag = if ret_in_loop {
|
||||||
let flag = alloca(bcx, Type::bool());
|
let flag = alloca(bcx, Type::bool(), "__ret_flag");
|
||||||
Store(bcx, C_bool(false), flag);
|
Store(bcx, C_bool(false), flag);
|
||||||
Some(flag)
|
Some(flag)
|
||||||
} else {
|
} else {
|
||||||
|
@ -675,7 +675,7 @@ pub fn trans_call_inner(in_cx: block,
|
||||||
unsafe {
|
unsafe {
|
||||||
if ty::type_needs_drop(bcx.tcx(), ret_ty) {
|
if ty::type_needs_drop(bcx.tcx(), ret_ty) {
|
||||||
if ty::type_is_immediate(bcx.tcx(), ret_ty) {
|
if ty::type_is_immediate(bcx.tcx(), ret_ty) {
|
||||||
let llscratchptr = alloc_ty(bcx, ret_ty);
|
let llscratchptr = alloc_ty(bcx, ret_ty, "__ret");
|
||||||
Store(bcx, llresult, llscratchptr);
|
Store(bcx, llresult, llscratchptr);
|
||||||
bcx = glue::drop_ty(bcx, llscratchptr, ret_ty);
|
bcx = glue::drop_ty(bcx, llscratchptr, ret_ty);
|
||||||
} else {
|
} else {
|
||||||
|
@ -733,7 +733,7 @@ pub fn trans_ret_slot(bcx: block, fn_ty: ty::t, dest: Option<expr::Dest>)
|
||||||
llvm::LLVMGetUndef(Type::nil().ptr_to().to_ref())
|
llvm::LLVMGetUndef(Type::nil().ptr_to().to_ref())
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
alloc_ty(bcx, retty)
|
alloc_ty(bcx, retty, "__trans_ret_slot")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -823,7 +823,7 @@ pub fn trans_arg_expr(bcx: block,
|
||||||
_
|
_
|
||||||
}) => {
|
}) => {
|
||||||
let scratch_ty = expr_ty(bcx, arg_expr);
|
let scratch_ty = expr_ty(bcx, arg_expr);
|
||||||
let scratch = alloc_ty(bcx, scratch_ty);
|
let scratch = alloc_ty(bcx, scratch_ty, "__ret_flag");
|
||||||
let arg_ty = expr_ty(bcx, arg_expr);
|
let arg_ty = expr_ty(bcx, arg_expr);
|
||||||
let sigil = ty::ty_closure_sigil(arg_ty);
|
let sigil = ty::ty_closure_sigil(arg_ty);
|
||||||
let bcx = closure::trans_expr_fn(
|
let bcx = closure::trans_expr_fn(
|
||||||
|
@ -895,7 +895,8 @@ pub fn trans_arg_expr(bcx: block,
|
||||||
arg_datum.appropriate_mode(bcx.tcx()).is_by_ref() {
|
arg_datum.appropriate_mode(bcx.tcx()).is_by_ref() {
|
||||||
debug!("by copy arg with type %s, storing to scratch",
|
debug!("by copy arg with type %s, storing to scratch",
|
||||||
bcx.ty_to_str(arg_datum.ty));
|
bcx.ty_to_str(arg_datum.ty));
|
||||||
let scratch = scratch_datum(bcx, arg_datum.ty, false);
|
let scratch = scratch_datum(bcx, arg_datum.ty,
|
||||||
|
"__arg", false);
|
||||||
|
|
||||||
arg_datum.store_to_datum(bcx,
|
arg_datum.store_to_datum(bcx,
|
||||||
arg_expr.id,
|
arg_expr.id,
|
||||||
|
|
|
@ -193,7 +193,7 @@ pub fn allocate_cbox(bcx: block, sigil: ast::Sigil, cdata_ty: ty::t)
|
||||||
}
|
}
|
||||||
ast::BorrowedSigil => {
|
ast::BorrowedSigil => {
|
||||||
let cbox_ty = tuplify_box_ty(tcx, cdata_ty);
|
let cbox_ty = tuplify_box_ty(tcx, cdata_ty);
|
||||||
let llbox = alloc_ty(bcx, cbox_ty);
|
let llbox = alloc_ty(bcx, cbox_ty, "__closure");
|
||||||
nuke_ref_count(bcx, llbox);
|
nuke_ref_count(bcx, llbox);
|
||||||
rslt(bcx, llbox)
|
rslt(bcx, llbox)
|
||||||
}
|
}
|
||||||
|
|
|
@ -608,6 +608,10 @@ impl block_ {
|
||||||
pub fn tcx(&self) -> ty::ctxt { self.fcx.ccx.tcx }
|
pub fn tcx(&self) -> ty::ctxt { self.fcx.ccx.tcx }
|
||||||
pub fn sess(&self) -> Session { self.fcx.ccx.sess }
|
pub fn sess(&self) -> Session { self.fcx.ccx.sess }
|
||||||
|
|
||||||
|
pub fn ident(&self, ident: ident) -> @str {
|
||||||
|
token::ident_to_str(&ident)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn node_id_to_str(&self, id: ast::node_id) -> ~str {
|
pub fn node_id_to_str(&self, id: ast::node_id) -> ~str {
|
||||||
ast_map::node_id_to_str(self.tcx().items, id, self.sess().intr())
|
ast_map::node_id_to_str(self.tcx().items, id, self.sess().intr())
|
||||||
}
|
}
|
||||||
|
|
|
@ -173,19 +173,19 @@ pub fn immediate_rvalue_bcx(bcx: block,
|
||||||
return DatumBlock {bcx: bcx, datum: immediate_rvalue(val, ty)};
|
return DatumBlock {bcx: bcx, datum: immediate_rvalue(val, ty)};
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn scratch_datum(bcx: block, ty: ty::t, zero: bool) -> Datum {
|
pub fn scratch_datum(bcx: block, ty: ty::t, name: &str, zero: bool) -> Datum {
|
||||||
/*!
|
/*!
|
||||||
*
|
|
||||||
* Allocates temporary space on the stack using alloca() and
|
* Allocates temporary space on the stack using alloca() and
|
||||||
* returns a by-ref Datum pointing to it. If `zero` is true, the
|
* returns a by-ref Datum pointing to it. If `zero` is true, the
|
||||||
* space will be zeroed when it is allocated; this is normally not
|
* space will be zeroed when it is allocated; this is normally not
|
||||||
* necessary, but in the case of automatic rooting in match
|
* necessary, but in the case of automatic rooting in match
|
||||||
* statements it is possible to have temporaries that may not get
|
* statements it is possible to have temporaries that may not get
|
||||||
* initialized if a certain arm is not taken, so we must zero
|
* initialized if a certain arm is not taken, so we must zero
|
||||||
* them. You must arrange any cleanups etc yourself! */
|
* them. You must arrange any cleanups etc yourself!
|
||||||
|
*/
|
||||||
|
|
||||||
let llty = type_of::type_of(bcx.ccx(), ty);
|
let llty = type_of::type_of(bcx.ccx(), ty);
|
||||||
let scratch = alloca_maybe_zeroed(bcx, llty, zero);
|
let scratch = alloca_maybe_zeroed(bcx, llty, name, zero);
|
||||||
Datum { val: scratch, ty: ty, mode: ByRef(RevokeClean) }
|
Datum { val: scratch, ty: ty, mode: ByRef(RevokeClean) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -476,7 +476,7 @@ impl Datum {
|
||||||
if ty::type_is_nil(self.ty) || ty::type_is_bot(self.ty) {
|
if ty::type_is_nil(self.ty) || ty::type_is_bot(self.ty) {
|
||||||
C_null(type_of::type_of(bcx.ccx(), self.ty).ptr_to())
|
C_null(type_of::type_of(bcx.ccx(), self.ty).ptr_to())
|
||||||
} else {
|
} else {
|
||||||
let slot = alloc_ty(bcx, self.ty);
|
let slot = alloc_ty(bcx, self.ty, "");
|
||||||
Store(bcx, self.val, slot);
|
Store(bcx, self.val, slot);
|
||||||
slot
|
slot
|
||||||
}
|
}
|
||||||
|
|
|
@ -274,7 +274,7 @@ pub fn trans_to_datum(bcx: block, expr: @ast::expr) -> DatumBlock {
|
||||||
ty::mt { ty: unit_ty, mutbl: ast::m_imm },
|
ty::mt { ty: unit_ty, mutbl: ast::m_imm },
|
||||||
ty::vstore_slice(ty::re_static));
|
ty::vstore_slice(ty::re_static));
|
||||||
|
|
||||||
let scratch = scratch_datum(bcx, slice_ty, false);
|
let scratch = scratch_datum(bcx, slice_ty, "__adjust", false);
|
||||||
Store(bcx, base, GEPi(bcx, scratch.val, [0u, abi::slice_elt_base]));
|
Store(bcx, base, GEPi(bcx, scratch.val, [0u, abi::slice_elt_base]));
|
||||||
Store(bcx, len, GEPi(bcx, scratch.val, [0u, abi::slice_elt_len]));
|
Store(bcx, len, GEPi(bcx, scratch.val, [0u, abi::slice_elt_len]));
|
||||||
DatumBlock {bcx: bcx, datum: scratch}
|
DatumBlock {bcx: bcx, datum: scratch}
|
||||||
|
@ -290,7 +290,7 @@ pub fn trans_to_datum(bcx: block, expr: @ast::expr) -> DatumBlock {
|
||||||
let tcx = bcx.tcx();
|
let tcx = bcx.tcx();
|
||||||
let closure_ty = expr_ty_adjusted(bcx, expr);
|
let closure_ty = expr_ty_adjusted(bcx, expr);
|
||||||
debug!("add_env(closure_ty=%s)", closure_ty.repr(tcx));
|
debug!("add_env(closure_ty=%s)", closure_ty.repr(tcx));
|
||||||
let scratch = scratch_datum(bcx, closure_ty, false);
|
let scratch = scratch_datum(bcx, closure_ty, "__adjust", false);
|
||||||
let llfn = GEPi(bcx, scratch.val, [0u, abi::fn_field_code]);
|
let llfn = GEPi(bcx, scratch.val, [0u, abi::fn_field_code]);
|
||||||
assert_eq!(datum.appropriate_mode(tcx), ByValue);
|
assert_eq!(datum.appropriate_mode(tcx), ByValue);
|
||||||
Store(bcx, datum.to_appropriate_llval(bcx), llfn);
|
Store(bcx, datum.to_appropriate_llval(bcx), llfn);
|
||||||
|
@ -423,7 +423,7 @@ fn trans_to_datum_unadjusted(bcx: block, expr: @ast::expr) -> DatumBlock {
|
||||||
bcx = trans_rvalue_dps_unadjusted(bcx, expr, Ignore);
|
bcx = trans_rvalue_dps_unadjusted(bcx, expr, Ignore);
|
||||||
return nil(bcx, ty);
|
return nil(bcx, ty);
|
||||||
} else {
|
} else {
|
||||||
let scratch = scratch_datum(bcx, ty, false);
|
let scratch = scratch_datum(bcx, ty, "", false);
|
||||||
bcx = trans_rvalue_dps_unadjusted(
|
bcx = trans_rvalue_dps_unadjusted(
|
||||||
bcx, expr, SaveIn(scratch.val));
|
bcx, expr, SaveIn(scratch.val));
|
||||||
|
|
||||||
|
@ -1687,7 +1687,7 @@ fn trans_assign_op(bcx: block,
|
||||||
// A user-defined operator method
|
// A user-defined operator method
|
||||||
if bcx.ccx().maps.method_map.find(&expr.id).is_some() {
|
if bcx.ccx().maps.method_map.find(&expr.id).is_some() {
|
||||||
// FIXME(#2528) evaluates the receiver twice!!
|
// FIXME(#2528) evaluates the receiver twice!!
|
||||||
let scratch = scratch_datum(bcx, dst_datum.ty, false);
|
let scratch = scratch_datum(bcx, dst_datum.ty, "__assign_op", false);
|
||||||
let bcx = trans_overloaded_op(bcx,
|
let bcx = trans_overloaded_op(bcx,
|
||||||
expr,
|
expr,
|
||||||
callee_id,
|
callee_id,
|
||||||
|
|
|
@ -195,14 +195,15 @@ fn build_wrap_fn_(ccx: @mut CrateContext,
|
||||||
if needs_c_return && !ty::type_is_immediate(ccx.tcx, tys.fn_sig.output) {
|
if needs_c_return && !ty::type_is_immediate(ccx.tcx, tys.fn_sig.output) {
|
||||||
let lloutputtype = type_of::type_of(fcx.ccx, tys.fn_sig.output);
|
let lloutputtype = type_of::type_of(fcx.ccx, tys.fn_sig.output);
|
||||||
fcx.llretptr = Some(alloca(raw_block(fcx, false, fcx.llstaticallocas),
|
fcx.llretptr = Some(alloca(raw_block(fcx, false, fcx.llstaticallocas),
|
||||||
lloutputtype));
|
lloutputtype,
|
||||||
|
""));
|
||||||
}
|
}
|
||||||
|
|
||||||
let bcx = top_scope_block(fcx, None);
|
let bcx = top_scope_block(fcx, None);
|
||||||
let lltop = bcx.llbb;
|
let lltop = bcx.llbb;
|
||||||
|
|
||||||
// Allocate the struct and write the arguments into it.
|
// Allocate the struct and write the arguments into it.
|
||||||
let llargbundle = alloca(bcx, tys.bundle_ty);
|
let llargbundle = alloca(bcx, tys.bundle_ty, "__llargbundle");
|
||||||
arg_builder(bcx, tys, llwrapfn, llargbundle);
|
arg_builder(bcx, tys, llwrapfn, llargbundle);
|
||||||
|
|
||||||
// Create call itself.
|
// Create call itself.
|
||||||
|
@ -732,7 +733,7 @@ pub fn trans_intrinsic(ccx: @mut CrateContext,
|
||||||
|
|
||||||
let llsrcval = get_param(decl, first_real_arg);
|
let llsrcval = get_param(decl, first_real_arg);
|
||||||
let llsrcptr = if ty::type_is_immediate(ccx.tcx, in_type) {
|
let llsrcptr = if ty::type_is_immediate(ccx.tcx, in_type) {
|
||||||
let llsrcptr = alloca(bcx, llintype);
|
let llsrcptr = alloca(bcx, llintype, "__llsrcptr");
|
||||||
Store(bcx, llsrcval, llsrcptr);
|
Store(bcx, llsrcval, llsrcptr);
|
||||||
llsrcptr
|
llsrcptr
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -132,7 +132,7 @@ pub fn free_ty_immediate(bcx: block, v: ValueRef, t: ty::t) -> block {
|
||||||
ty::ty_evec(_, ty::vstore_box) |
|
ty::ty_evec(_, ty::vstore_box) |
|
||||||
ty::ty_estr(ty::vstore_box) |
|
ty::ty_estr(ty::vstore_box) |
|
||||||
ty::ty_opaque_closure_ptr(_) => {
|
ty::ty_opaque_closure_ptr(_) => {
|
||||||
let vp = alloca(bcx, type_of(bcx.ccx(), t));
|
let vp = alloca(bcx, type_of(bcx.ccx(), t), "");
|
||||||
Store(bcx, v, vp);
|
Store(bcx, v, vp);
|
||||||
free_ty(bcx, vp, t)
|
free_ty(bcx, vp, t)
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,7 +57,7 @@ impl Reflector {
|
||||||
let bcx = self.bcx;
|
let bcx = self.bcx;
|
||||||
let str_vstore = ty::vstore_slice(ty::re_static);
|
let str_vstore = ty::vstore_slice(ty::re_static);
|
||||||
let str_ty = ty::mk_estr(bcx.tcx(), str_vstore);
|
let str_ty = ty::mk_estr(bcx.tcx(), str_vstore);
|
||||||
let scratch = scratch_datum(bcx, str_ty, false);
|
let scratch = scratch_datum(bcx, str_ty, "", false);
|
||||||
let len = C_uint(bcx.ccx(), s.len() + 1);
|
let len = C_uint(bcx.ccx(), s.len() + 1);
|
||||||
let c_str = PointerCast(bcx, C_cstr(bcx.ccx(), s), Type::i8p());
|
let c_str = PointerCast(bcx, C_cstr(bcx.ccx(), s), Type::i8p());
|
||||||
Store(bcx, c_str, GEPi(bcx, scratch.val, [ 0, 0 ]));
|
Store(bcx, c_str, GEPi(bcx, scratch.val, [ 0, 0 ]));
|
||||||
|
|
|
@ -332,7 +332,7 @@ pub fn trans_uniq_or_managed_vstore(bcx: block, heap: heap, vstore_expr: @ast::e
|
||||||
let llptrval = PointerCast(bcx, llptrval, Type::i8p());
|
let llptrval = PointerCast(bcx, llptrval, Type::i8p());
|
||||||
let llsizeval = C_uint(bcx.ccx(), s.len());
|
let llsizeval = C_uint(bcx.ccx(), s.len());
|
||||||
let typ = ty::mk_estr(bcx.tcx(), ty::vstore_uniq);
|
let typ = ty::mk_estr(bcx.tcx(), ty::vstore_uniq);
|
||||||
let lldestval = scratch_datum(bcx, typ, false);
|
let lldestval = scratch_datum(bcx, typ, "", false);
|
||||||
let bcx = callee::trans_lang_call(
|
let bcx = callee::trans_lang_call(
|
||||||
bcx,
|
bcx,
|
||||||
bcx.tcx().lang_items.strdup_uniq_fn(),
|
bcx.tcx().lang_items.strdup_uniq_fn(),
|
||||||
|
@ -454,7 +454,7 @@ pub fn write_content(bcx: block,
|
||||||
|
|
||||||
let loop_counter = {
|
let loop_counter = {
|
||||||
// i = 0
|
// i = 0
|
||||||
let i = alloca(loop_bcx, bcx.ccx().int_type);
|
let i = alloca(loop_bcx, bcx.ccx().int_type, "__i");
|
||||||
Store(loop_bcx, C_uint(bcx.ccx(), 0), i);
|
Store(loop_bcx, C_uint(bcx.ccx(), 0), i);
|
||||||
|
|
||||||
Br(loop_bcx, cond_bcx.llbb);
|
Br(loop_bcx, cond_bcx.llbb);
|
||||||
|
|
|
@ -120,7 +120,7 @@ fn root(datum: &Datum,
|
||||||
// First, root the datum. Note that we must zero this value,
|
// First, root the datum. Note that we must zero this value,
|
||||||
// because sometimes we root on one path but not another.
|
// because sometimes we root on one path but not another.
|
||||||
// See e.g. #4904.
|
// See e.g. #4904.
|
||||||
let scratch = scratch_datum(bcx, datum.ty, true);
|
let scratch = scratch_datum(bcx, datum.ty, "__write_guard", true);
|
||||||
datum.copy_to_datum(bcx, INIT, scratch);
|
datum.copy_to_datum(bcx, INIT, scratch);
|
||||||
let cleanup_bcx = find_bcx_for_scope(bcx, root_info.scope);
|
let cleanup_bcx = find_bcx_for_scope(bcx, root_info.scope);
|
||||||
add_clean_temp_mem_in_scope(cleanup_bcx, root_info.scope, scratch.val, scratch.ty);
|
add_clean_temp_mem_in_scope(cleanup_bcx, root_info.scope, scratch.val, scratch.ty);
|
||||||
|
@ -135,7 +135,8 @@ fn root(datum: &Datum,
|
||||||
// scratch.val will be NULL should the cleanup get
|
// scratch.val will be NULL should the cleanup get
|
||||||
// called without the freezing actually occurring, and
|
// called without the freezing actually occurring, and
|
||||||
// return_to_mut checks for this condition.
|
// return_to_mut checks for this condition.
|
||||||
let scratch_bits = scratch_datum(bcx, ty::mk_uint(), false);
|
let scratch_bits = scratch_datum(bcx, ty::mk_uint(),
|
||||||
|
"__write_guard_bits", false);
|
||||||
|
|
||||||
let freeze_did = match freeze_kind {
|
let freeze_did = match freeze_kind {
|
||||||
DynaImm => bcx.tcx().lang_items.borrow_as_imm_fn(),
|
DynaImm => bcx.tcx().lang_items.borrow_as_imm_fn(),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue