Skip to content

Commit 7a0c975

Browse files
pcwaltonmarijnh
authored andcommitted
rustc: Make unique pointers no longer immediates.
1 parent 9946e46 commit 7a0c975

File tree

3 files changed

+88
-70
lines changed

3 files changed

+88
-70
lines changed

src/comp/middle/trans.rs

Lines changed: 42 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2088,12 +2088,13 @@ fn memmove_ty(cx: &@block_ctxt, dst: ValueRef, src: ValueRef, t: ty::t) ->
20882088
let sp = cx.sp;
20892089
let llsz = llsize_of(type_of(ccx, sp, t));
20902090
ret call_memmove(cx, dst, src, llsz);
2091-
} else { ret rslt(cx, Store(cx, Load(cx, src), dst)); }
2092-
}
2093-
else {
2094-
let llsz = size_of(cx, t);
2095-
ret call_memmove(llsz.bcx, dst, src, llsz.val);
2091+
}
2092+
2093+
ret rslt(cx, Store(cx, Load(cx, src), dst));
20962094
}
2095+
2096+
let llsz = size_of(cx, t);
2097+
ret call_memmove(llsz.bcx, dst, src, llsz.val);
20972098
}
20982099

20992100
tag copy_action { INIT; DROP_EXISTING; }
@@ -2136,17 +2137,18 @@ fn copy_val_no_check(cx: &@block_ctxt, action: copy_action, dst: ValueRef,
21362137
if ty::type_is_scalar(ccx.tcx, t) || ty::type_is_native(ccx.tcx, t) {
21372138
Store(cx, src, dst);
21382139
ret cx;
2139-
} else if ty::type_is_nil(ccx.tcx, t) || ty::type_is_bot(ccx.tcx, t) {
2140-
ret cx;
2141-
} else if ty::type_is_boxed(ccx.tcx, t) || ty::type_is_vec(ccx.tcx, t) {
2142-
let bcx =
2143-
if action == DROP_EXISTING { drop_ty(cx, dst, t) } else { cx };
2140+
}
2141+
if ty::type_is_nil(ccx.tcx, t) || ty::type_is_bot(ccx.tcx, t) { ret cx; }
2142+
if ty::type_is_boxed(ccx.tcx, t) {
2143+
let bcx = cx;
2144+
if action == DROP_EXISTING { bcx = drop_ty(cx, dst, t); }
21442145
Store(bcx, src, dst);
2145-
bcx = take_ty(bcx, dst, t);
2146-
ret bcx;
2147-
} else if type_is_structural_or_param(ccx.tcx, t) {
2148-
let bcx =
2149-
if action == DROP_EXISTING { drop_ty(cx, dst, t) } else { cx };
2146+
ret take_ty(bcx, dst, t);
2147+
}
2148+
if type_is_structural_or_param(ccx.tcx, t) ||
2149+
ty::type_is_vec(ccx.tcx, t) {
2150+
let bcx = cx;
2151+
if action == DROP_EXISTING { bcx = drop_ty(cx, dst, t); }
21502152
bcx = memmove_ty(bcx, dst, src, t).bcx;
21512153
ret take_ty(bcx, dst, t);
21522154
}
@@ -2170,7 +2172,7 @@ fn move_val(cx: @block_ctxt, action: copy_action, dst: ValueRef,
21702172
ret cx;
21712173
} else if ty::type_is_nil(tcx, t) || ty::type_is_bot(tcx, t) {
21722174
ret cx;
2173-
} else if ty::type_is_unique(tcx, t) || ty::type_is_boxed(tcx, t) {
2175+
} else if ty::type_is_boxed(tcx, t) {
21742176
if src.is_mem { src_val = Load(cx, src_val); }
21752177
if action == DROP_EXISTING { cx = drop_ty(cx, dst, t); }
21762178
Store(cx, src_val, dst);
@@ -2179,7 +2181,8 @@ fn move_val(cx: @block_ctxt, action: copy_action, dst: ValueRef,
21792181
// If we're here, it must be a temporary.
21802182
revoke_clean(cx, src_val);
21812183
ret cx;
2182-
} else if type_is_structural_or_param(tcx, t) {
2184+
} else if ty::type_is_unique(tcx, t) ||
2185+
type_is_structural_or_param(tcx, t) {
21832186
if action == DROP_EXISTING { cx = drop_ty(cx, dst, t); }
21842187
cx = memmove_ty(cx, dst, src_val, t).bcx;
21852188
if src.is_mem {
@@ -3496,7 +3499,8 @@ fn trans_bind_thunk(cx: &@local_ctxt, sp: &span, incoming_fty: ty::t,
34963499
if is_val { T_ptr(llout_arg_ty) } else { llout_arg_ty };
34973500
val = PointerCast(bcx, val, ty);
34983501
}
3499-
if is_val && type_is_immediate(cx.ccx, e_ty) {
3502+
if is_val && (type_is_immediate(cx.ccx, e_ty) ||
3503+
ty::type_is_unique(cx.ccx.tcx, e_ty)) {
35003504
val = Load(bcx, val);
35013505
}
35023506
llargs += [val];
@@ -3529,6 +3533,7 @@ fn trans_bind_thunk(cx: &@local_ctxt, sp: &span, incoming_fty: ty::t,
35293533
type_of_fn_from_ty(bcx_ccx(bcx), sp, outgoing_fty, ty_param_count);
35303534
lltargetfn = PointerCast(bcx, lltargetfn, T_ptr(T_ptr(lltargetty)));
35313535
lltargetfn = Load(bcx, lltargetfn);
3536+
35323537
FastCall(bcx, lltargetfn, llargs);
35333538
build_return(bcx);
35343539
finish_fn(fcx, lltop);
@@ -3629,25 +3634,25 @@ fn trans_arg_expr(cx: &@block_ctxt, arg: &ty::arg, lldestty0: TypeRef,
36293634
// to have type lldestty0 (the callee's expected type).
36303635
val = llvm::LLVMGetUndef(lldestty0);
36313636
} else if arg.mode == ty::mo_val {
3632-
if !lv.is_mem {
3633-
// Do nothing for temporaries, just give them to callee
3637+
if ty::type_is_vec(ccx.tcx, e_ty) {
3638+
let r = do_spill(bcx, Load(bcx, val), e_ty);
3639+
bcx = r.bcx;
3640+
let arg_copy = r.val;
3641+
3642+
bcx = take_ty(bcx, arg_copy, e_ty);
3643+
val = Load(bcx, arg_copy);
3644+
add_clean_temp(bcx, arg_copy, e_ty);
3645+
} else if !lv.is_mem {
3646+
// Do nothing for non-vector temporaries; just give them to the
3647+
// callee.
36343648
} else if type_is_structural_or_param(ccx.tcx, e_ty) {
36353649
let dst = alloc_ty(bcx, e_ty);
36363650
bcx = copy_val(dst.bcx, INIT, dst.val, val, e_ty);
36373651
val = dst.val;
36383652
add_clean_temp(bcx, val, e_ty);
36393653
} else {
3640-
if ty::type_is_vec(ccx.tcx, e_ty) {
3641-
let r = do_spill(bcx, Load(bcx, val), e_ty);
3642-
bcx = r.bcx;
3643-
let arg_copy = r.val;
3644-
3645-
bcx = take_ty(bcx, arg_copy, e_ty);
3646-
val = Load(bcx, arg_copy);
3647-
} else {
3648-
bcx = take_ty(bcx, val, e_ty);
3649-
val = load_if_immediate(bcx, val, e_ty);
3650-
}
3654+
bcx = take_ty(bcx, val, e_ty);
3655+
val = load_if_immediate(bcx, val, e_ty);
36513656
add_clean_temp(bcx, val, e_ty);
36523657
}
36533658
} else if type_is_immediate(ccx, e_ty) && !lv.is_mem {
@@ -4185,7 +4190,7 @@ fn with_out_method(work: fn(&out_method) -> result, cx: @block_ctxt,
41854190
// immediate-ness of the type.
41864191
fn type_is_immediate(ccx: &@crate_ctxt, t: ty::t) -> bool {
41874192
ret ty::type_is_scalar(ccx.tcx, t) || ty::type_is_boxed(ccx.tcx, t) ||
4188-
ty::type_is_native(ccx.tcx, t) || ty::type_is_vec(ccx.tcx, t);
4193+
ty::type_is_native(ccx.tcx, t);
41894194
}
41904195

41914196
fn do_spill(cx: &@block_ctxt, v: ValueRef, t: ty::t) -> result {
@@ -5305,9 +5310,12 @@ fn trans_tag_variant(cx: @local_ctxt, tag_id: ast::node_id,
53055310
let arg_ty = arg_tys[i].ty;
53065311
let llargval;
53075312
if ty::type_is_structural(cx.ccx.tcx, arg_ty) ||
5308-
ty::type_has_dynamic_size(cx.ccx.tcx, arg_ty) {
5313+
ty::type_has_dynamic_size(cx.ccx.tcx, arg_ty) ||
5314+
ty::type_is_unique(cx.ccx.tcx, arg_ty) {
53095315
llargval = llargptr;
5310-
} else { llargval = Load(bcx, llargptr); }
5316+
} else {
5317+
llargval = Load(bcx, llargptr);
5318+
}
53115319
bcx = copy_val(bcx, INIT, lldestptr, llargval, arg_ty);
53125320
i += 1u;
53135321
}

src/comp/middle/trans_alt.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -407,8 +407,10 @@ fn compile_submatch(bcx: @block_ctxt, m: &match, vals: [ValueRef],
407407
}
408408
}
409409
lit(l) {
410-
test_val = Load(bcx, val);
411-
kind = alt l.node { ast::lit_str(_) { compare } _ { switch } };
410+
kind = alt l.node {
411+
ast::lit_str(_) { compare }
412+
_ { test_val = Load(bcx, val); switch }
413+
};
412414
}
413415
}
414416
}

src/comp/middle/trans_vec.rs

Lines changed: 42 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,20 @@ import trans::{call_memmove, trans_shared_malloc, llsize_of, type_of_or_i8,
77
incr_ptr, INIT, copy_val, load_if_immediate, alloca, size_of,
88
llderivedtydescs_block_ctxt, lazily_emit_tydesc_glue,
99
get_tydesc, load_inbounds, move_val_if_temp, trans_lval,
10-
node_id_type, new_sub_block_ctxt, tps_normal, do_spill_noroot};
10+
node_id_type, new_sub_block_ctxt, tps_normal, do_spill_noroot,
11+
GEPi, alloc_ty};
1112
import trans_build::*;
1213
import trans_common::*;
1314

14-
fn get_fill(bcx: &@block_ctxt, vptr: ValueRef) -> ValueRef {
15-
Load(bcx, InBoundsGEP(bcx, vptr, [C_int(0), C_uint(abi::vec_elt_fill)]))
15+
fn get_fill(bcx: &@block_ctxt, vptrptr: ValueRef) -> ValueRef {
16+
Load(bcx, GEPi(bcx, Load(bcx, vptrptr), [0, abi::vec_elt_fill as int]))
1617
}
17-
fn get_alloc(bcx: &@block_ctxt, vptr: ValueRef) -> ValueRef {
18-
Load(bcx, InBoundsGEP(bcx, vptr, [C_int(0), C_uint(abi::vec_elt_alloc)]))
18+
fn get_alloc(bcx: &@block_ctxt, vptrptr: ValueRef) -> ValueRef {
19+
Load(bcx, GEPi(bcx, Load(bcx, vptrptr), [0, abi::vec_elt_alloc as int]))
1920
}
20-
fn get_dataptr(bcx: &@block_ctxt, vpt: ValueRef, unit_ty: TypeRef) ->
21+
fn get_dataptr(bcx: &@block_ctxt, vptrptr: ValueRef, unit_ty: TypeRef) ->
2122
ValueRef {
22-
let ptr = InBoundsGEP(bcx, vpt, [C_int(0), C_uint(abi::vec_elt_elems)]);
23+
let ptr = GEPi(bcx, Load(bcx, vptrptr), [0, abi::vec_elt_elems as int]);
2324
PointerCast(bcx, ptr, T_ptr(unit_ty))
2425
}
2526

@@ -59,17 +60,22 @@ fn alloc(bcx: &@block_ctxt, vec_ty: &ty::t, elts: uint) -> alloc_result {
5960
let alloc = if elts < 4u { Mul(bcx, C_int(4), unit_sz) } else { fill };
6061
let {bcx: bcx, val: vptr} = alloc_raw(bcx, fill, alloc);
6162
let vptr = PointerCast(bcx, vptr, T_ptr(llvecty));
62-
add_clean_temp(bcx, vptr, vec_ty);
63+
64+
let r = alloc_ty(bcx, vec_ty);
65+
let vptrptr = r.val; bcx = r.bcx;
66+
67+
Store(bcx, vptr, vptrptr);
68+
add_clean_temp(bcx, vptrptr, vec_ty);
6369
ret {bcx: bcx,
64-
val: vptr,
70+
val: vptrptr,
6571
unit_ty: unit_ty,
6672
llunitsz: unit_sz,
6773
llunitty: llunitty};
6874
}
6975

7076
fn duplicate(bcx: &@block_ctxt, vptrptr: ValueRef) -> @block_ctxt {
77+
let fill = get_fill(bcx, vptrptr);
7178
let vptr = Load(bcx, vptrptr);
72-
let fill = get_fill(bcx, vptr);
7379
let size = Add(bcx, fill, llsize_of(T_opaque_vec()));
7480
let {bcx: bcx, val: newptr} =
7581
trans_shared_malloc(bcx, val_ty(vptr), size);
@@ -135,13 +141,13 @@ fn trans_str(bcx: &@block_ctxt, s: str) -> result {
135141
}
136142

137143
fn trans_append(cx: &@block_ctxt, vec_ty: ty::t, lhsptr: ValueRef,
138-
rhs: ValueRef) -> result {
144+
rhsptr: ValueRef) -> result {
139145
// Cast to opaque interior vector types if necessary.
140146
let unit_ty = ty::sequence_element_type(bcx_tcx(cx), vec_ty);
141147
let dynamic = ty::type_has_dynamic_size(bcx_tcx(cx), unit_ty);
142148
if dynamic {
143149
lhsptr = PointerCast(cx, lhsptr, T_ptr(T_ptr(T_opaque_vec())));
144-
rhs = PointerCast(cx, rhs, T_ptr(T_opaque_vec()));
150+
rhsptr = PointerCast(cx, rhsptr, T_ptr(T_ptr(T_opaque_vec())));
145151
}
146152
let strings =
147153
alt ty::struct(bcx_tcx(cx), vec_ty) {
@@ -152,26 +158,26 @@ fn trans_append(cx: &@block_ctxt, vec_ty: ty::t, lhsptr: ValueRef,
152158
let {bcx: bcx, val: unit_sz} = size_of(cx, unit_ty);
153159
let llunitty = type_of_or_i8(cx, unit_ty);
154160

161+
let rhs = Load(bcx, rhsptr);
155162
let lhs = Load(bcx, lhsptr);
156163
let self_append = ICmp(bcx, lib::llvm::LLVMIntEQ, lhs, rhs);
157-
let lfill = get_fill(bcx, lhs);
158-
let rfill = get_fill(bcx, rhs);
164+
let lfill = get_fill(bcx, lhsptr);
165+
let rfill = get_fill(bcx, rhsptr);
159166
let new_fill = Add(bcx, lfill, rfill);
160167
if strings { new_fill = Sub(bcx, new_fill, C_int(1)); }
161168
let opaque_lhs = PointerCast(bcx, lhsptr, T_ptr(T_ptr(T_opaque_vec())));
162169
Call(bcx, bcx_ccx(cx).upcalls.vec_grow,
163170
[cx.fcx.lltaskptr, opaque_lhs, new_fill]);
164171
// Was overwritten if we resized
165-
let lhs = Load(bcx, lhsptr);
166-
let rhs = Select(bcx, self_append, lhs, rhs);
172+
rhsptr = Select(bcx, self_append, lhsptr, rhsptr);
167173

168-
let lhs_data = get_dataptr(bcx, lhs, llunitty);
174+
let lhs_data = get_dataptr(bcx, lhsptr, llunitty);
169175
let lhs_off = lfill;
170176
if strings { lhs_off = Sub(bcx, lhs_off, C_int(1)); }
171177
let write_ptr = pointer_add(bcx, lhs_data, lhs_off);
172178
let write_ptr_ptr = do_spill_noroot(bcx, write_ptr);
173179
let bcx =
174-
iter_vec_raw(bcx, rhs, vec_ty, rfill,
180+
iter_vec_raw(bcx, rhsptr, vec_ty, rfill,
175181
// We have to increment by the dynamically-computed size.
176182
{|&bcx, addr, _ty|
177183
let write_ptr = Load(bcx, write_ptr_ptr);
@@ -211,7 +217,8 @@ fn trans_append_literal(bcx: &@block_ctxt, vptrptr: ValueRef, vec_ty: ty::t,
211217
ret bcx;
212218
}
213219

214-
fn trans_add(bcx: &@block_ctxt, vec_ty: ty::t, lhs: ValueRef, rhs: ValueRef)
220+
fn trans_add(bcx: &@block_ctxt, vec_ty: ty::t, lhsptr: ValueRef,
221+
rhsptr: ValueRef)
215222
-> result {
216223
let strings =
217224
alt ty::struct(bcx_tcx(bcx), vec_ty) {
@@ -222,16 +229,18 @@ fn trans_add(bcx: &@block_ctxt, vec_ty: ty::t, lhs: ValueRef, rhs: ValueRef)
222229
let llunitty = type_of_or_i8(bcx, unit_ty);
223230
let {bcx: bcx, val: llunitsz} = size_of(bcx, unit_ty);
224231

225-
let lhs_fill = get_fill(bcx, lhs);
232+
let lhs_fill = get_fill(bcx, lhsptr);
226233
if strings { lhs_fill = Sub(bcx, lhs_fill, C_int(1)); }
227-
let rhs_fill = get_fill(bcx, rhs);
234+
let rhs_fill = get_fill(bcx, rhsptr);
228235
let new_fill = Add(bcx, lhs_fill, rhs_fill);
229-
let {bcx: bcx, val: new_vec} = alloc_raw(bcx, new_fill, new_fill);
230-
let new_vec = PointerCast(bcx, new_vec, T_ptr(T_vec(llunitty)));
231-
add_clean_temp(bcx, new_vec, vec_ty);
236+
let {bcx: bcx, val: new_vec_ptr} = alloc_raw(bcx, new_fill, new_fill);
237+
new_vec_ptr = PointerCast(bcx, new_vec_ptr, T_ptr(T_vec(llunitty)));
238+
let {bcx: bcx, val: new_vec_ptr_ptr} = alloc_ty(bcx, vec_ty);
239+
Store(bcx, new_vec_ptr, new_vec_ptr_ptr);
240+
add_clean_temp(bcx, new_vec_ptr_ptr, vec_ty);
232241

233242
let write_ptr_ptr =
234-
do_spill_noroot(bcx, get_dataptr(bcx, new_vec, llunitty));
243+
do_spill_noroot(bcx, get_dataptr(bcx, new_vec_ptr_ptr, llunitty));
235244
let copy_fn =
236245
bind fn (bcx: &@block_ctxt, addr: ValueRef, _ty: ty::t,
237246
write_ptr_ptr: ValueRef, unit_ty: ty::t, llunitsz: ValueRef)
@@ -247,22 +256,22 @@ fn trans_add(bcx: &@block_ctxt, vec_ty: ty::t, lhs: ValueRef, rhs: ValueRef)
247256
ret bcx;
248257
}(_, _, _, write_ptr_ptr, unit_ty, llunitsz);
249258

250-
let bcx = iter_vec_raw(bcx, lhs, vec_ty, lhs_fill, copy_fn);
251-
let bcx = iter_vec_raw(bcx, rhs, vec_ty, rhs_fill, copy_fn);
252-
ret rslt(bcx, new_vec);
259+
let bcx = iter_vec_raw(bcx, lhsptr, vec_ty, lhs_fill, copy_fn);
260+
let bcx = iter_vec_raw(bcx, rhsptr, vec_ty, rhs_fill, copy_fn);
261+
ret rslt(bcx, new_vec_ptr_ptr);
253262
}
254263

255264
type val_and_ty_fn = fn(&@block_ctxt, ValueRef, ty::t) -> result;
256265

257266
type iter_vec_block = block(&@block_ctxt, ValueRef, ty::t) -> @block_ctxt;
258267

259-
fn iter_vec_raw(bcx: &@block_ctxt, vptr: ValueRef, vec_ty: ty::t,
268+
fn iter_vec_raw(bcx: &@block_ctxt, vptrptr: ValueRef, vec_ty: ty::t,
260269
fill: ValueRef, f: &iter_vec_block) -> @block_ctxt {
261270
let unit_ty = ty::sequence_element_type(bcx_tcx(bcx), vec_ty);
262271
let llunitty = type_of_or_i8(bcx, unit_ty);
263272
let {bcx: bcx, val: unit_sz} = size_of(bcx, unit_ty);
264-
let vptr = PointerCast(bcx, vptr, T_ptr(T_vec(llunitty)));
265-
let data_ptr = get_dataptr(bcx, vptr, llunitty);
273+
vptrptr = PointerCast(bcx, vptrptr, T_ptr(T_ptr(T_vec(llunitty))));
274+
let data_ptr = get_dataptr(bcx, vptrptr, llunitty);
266275

267276
// Calculate the last pointer address we want to handle.
268277
// TODO: Optimize this when the size of the unit type is statically
@@ -292,9 +301,8 @@ fn iter_vec_raw(bcx: &@block_ctxt, vptr: ValueRef, vec_ty: ty::t,
292301

293302
fn iter_vec(bcx: &@block_ctxt, vptrptr: ValueRef, vec_ty: ty::t,
294303
f: &iter_vec_block) -> @block_ctxt {
295-
let vptr =
296-
Load(bcx, PointerCast(bcx, vptrptr, T_ptr(T_ptr(T_opaque_vec()))));
297-
ret iter_vec_raw(bcx, vptr, vec_ty, get_fill(bcx, vptr), f);
304+
vptrptr = PointerCast(bcx, vptrptr, T_ptr(T_ptr(T_opaque_vec())));
305+
ret iter_vec_raw(bcx, vptrptr, vec_ty, get_fill(bcx, vptrptr), f);
298306
}
299307

300308
//

0 commit comments

Comments
 (0)