Skip to content

Commit 4831fbe

Browse files
committed
---
yaml --- r: 11870 b: refs/heads/master c: e4cbd43 h: refs/heads/master v: v3
1 parent b6fa2cb commit 4831fbe

File tree

4 files changed

+54
-28
lines changed

4 files changed

+54
-28
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 9aa78e34e47074db22777c35bbf6cf2b3f973c40
2+
refs/heads/master: e4cbd43c430ef0d5f63ca7cb86a65a618521e175
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 4a81779abd786ff22d71434c6d9a5917ea4cdfff
55
refs/heads/try: 2898dcc5d97da9427ac367542382b6239d9c0bbf

trunk/src/rustc/middle/trans/base.rs

Lines changed: 50 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -865,7 +865,7 @@ fn get_res_dtor(ccx: @crate_ctxt, did: ast::def_id, substs: [ty::t])
865865
maybe_instantiate_inline(ccx, did)
866866
} else { did };
867867
assert did.crate == ast::local_crate;
868-
monomorphic_fn(ccx, did, substs, none)
868+
monomorphic_fn(ccx, did, substs, none).val
869869
}
870870

871871
fn trans_res_drop(bcx: block, rs: ValueRef, did: ast::def_id,
@@ -1951,7 +1951,9 @@ enum callee_env {
19511951
type lval_maybe_callee = {bcx: block,
19521952
val: ValueRef,
19531953
kind: lval_kind,
1954-
env: callee_env};
1954+
env: callee_env,
1955+
// Tydescs to pass. Only used to call intrinsics
1956+
tds: option<[ValueRef]>};
19551957

19561958
fn null_env_ptr(bcx: block) -> ValueRef {
19571959
C_null(T_opaque_box_ptr(bcx.ccx()))
@@ -1970,7 +1972,7 @@ fn lval_temp(bcx: block, val: ValueRef) -> lval_result {
19701972

19711973
fn lval_no_env(bcx: block, val: ValueRef, kind: lval_kind)
19721974
-> lval_maybe_callee {
1973-
ret {bcx: bcx, val: val, kind: kind, env: is_closure};
1975+
ret {bcx: bcx, val: val, kind: kind, env: is_closure, tds: none};
19741976
}
19751977

19761978
fn trans_external_path(ccx: @crate_ctxt, did: ast::def_id, t: ty::t)
@@ -1984,10 +1986,12 @@ fn trans_external_path(ccx: @crate_ctxt, did: ast::def_id, t: ty::t)
19841986
}
19851987

19861988
fn monomorphic_fn(ccx: @crate_ctxt, fn_id: ast::def_id, substs: [ty::t],
1987-
vtables: option<typeck::vtable_res>) -> ValueRef {
1989+
vtables: option<typeck::vtable_res>)
1990+
-> {val: ValueRef, must_cast: bool, intrinsic: bool} {
1991+
let mut must_cast = false;
19881992
let substs = vec::map(substs, {|t|
19891993
alt ty::get(t).struct {
1990-
ty::ty_box(mt) { ty::mk_opaque_box(ccx.tcx) }
1994+
ty::ty_box(mt) { must_cast = true; ty::mk_opaque_box(ccx.tcx) }
19911995
_ { t }
19921996
}
19931997
});
@@ -1996,7 +2000,7 @@ fn monomorphic_fn(ccx: @crate_ctxt, fn_id: ast::def_id, substs: [ty::t],
19962000
none { no_vts }
19972001
}};
19982002
alt ccx.monomorphized.find(hash_id) {
1999-
some(val) { ret val; }
2003+
some(val) { ret {val: val, must_cast: must_cast, intrinsic: false}; }
20002004
none {}
20012005
}
20022006

@@ -2017,9 +2021,11 @@ fn monomorphic_fn(ccx: @crate_ctxt, fn_id: ast::def_id, substs: [ty::t],
20172021
}
20182022
ast_map::node_variant(v, _, pt) { (pt, v.node.name) }
20192023
ast_map::node_method(m, _, pt) { (pt, m.ident) }
2020-
ast_map::node_native_item(_, _, _) {
2024+
ast_map::node_native_item(_, abi, _) {
20212025
// Natives don't have to be monomorphized.
2022-
ret get_item_val(ccx, fn_id.node);
2026+
ret {val: get_item_val(ccx, fn_id.node),
2027+
must_cast: true,
2028+
intrinsic: abi == ast::native_abi_rust_intrinsic};
20232029
}
20242030
ast_map::node_ctor(i) {
20252031
alt check ccx.tcx.items.get(i.id) {
@@ -2073,7 +2079,7 @@ fn monomorphic_fn(ccx: @crate_ctxt, fn_id: ast::def_id, substs: [ty::t],
20732079
}
20742080
}
20752081
}
2076-
lldecl
2082+
{val: lldecl, must_cast: must_cast, intrinsic: false}
20772083
}
20782084

20792085
fn maybe_instantiate_inline(ccx: @crate_ctxt, fn_id: ast::def_id)
@@ -2130,11 +2136,20 @@ fn maybe_instantiate_inline(ccx: @crate_ctxt, fn_id: ast::def_id)
21302136
}
21312137
}
21322138

2139+
fn add_tydesc_params(ccx: crate_ctxt, llfty: TypeRef, n: uint) -> TypeRef {
2140+
let out_ty = llvm::LLVMGetReturnType(llfty);
2141+
let n_args = llvm::LLVMCountParamTypes(llfty);
2142+
let args = vec::init_elt(n_args as uint, 0 as TypeRef);
2143+
unsafe { llvm::LLVMGetParamTypes(llfty, vec::unsafe::to_ptr(args)); }
2144+
T_fn(vec::slice(args, 0u, first_real_arg) +
2145+
vec::init_elt(n, T_ptr(ccx.tydesc_type)) +
2146+
vec::tail_n(args, first_real_arg), out_ty)
2147+
}
2148+
21332149
fn lval_static_fn(bcx: block, fn_id: ast::def_id, id: ast::node_id,
21342150
substs: option<([ty::t], typeck::vtable_res)>)
21352151
-> lval_maybe_callee {
2136-
let ccx = bcx.ccx();
2137-
let tcx = ccx.tcx;
2152+
let bcx = bcx, ccx = bcx.ccx(), tcx = ccx.tcx;
21382153
let tys = node_id_type_params(bcx, id);
21392154
let tpt = ty::lookup_item_type(tcx, fn_id);
21402155

@@ -2151,11 +2166,24 @@ fn lval_static_fn(bcx: block, fn_id: ast::def_id, id: ast::node_id,
21512166
impl::resolve_vtables_in_fn_ctxt(bcx.fcx, vts)})) }
21522167
};
21532168
if tys.len() > 0u {
2154-
let val = monomorphic_fn(ccx, fn_id, tys, vtables);
2155-
let cast = PointerCast(bcx, val, T_ptr(type_of_fn_from_ty(
2156-
ccx, node_id_type(bcx, id))));
2157-
ret {bcx: bcx, val: cast,
2158-
kind: owned, env: null_env};
2169+
let {val, must_cast, intrinsic} = monomorphic_fn(ccx, fn_id, tys,
2170+
vtables);
2171+
let tds = none;
2172+
if intrinsic {
2173+
tds = some(vec::map(tys, {|t|
2174+
let ti = none, td_res = get_tydesc(bcx, t, ti);
2175+
bcx = td_res.bcx;
2176+
lazily_emit_all_tydesc_glue(ccx, ti);
2177+
td_res.val
2178+
}));
2179+
let llfty = type_of_fn_from_ty(ccx, node_id_type(bcx, id));
2180+
val = PointerCast(bcx, val, T_ptr(add_tydesc_params(
2181+
ccx, llfty, tys.len())));
2182+
} else if must_cast {
2183+
val = PointerCast(bcx, val, T_ptr(type_of_fn_from_ty(
2184+
ccx, node_id_type(bcx, id))));
2185+
}
2186+
ret {bcx: bcx, val: val, kind: owned, env: null_env, tds: tds};
21592187
}
21602188
}
21612189

@@ -2185,7 +2213,7 @@ fn lval_static_fn(bcx: block, fn_id: ast::def_id, id: ast::node_id,
21852213
}
21862214
}
21872215

2188-
ret {bcx: bcx, val: val, kind: owned, env: null_env};
2216+
ret {bcx: bcx, val: val, kind: owned, env: null_env, tds: none};
21892217
}
21902218

21912219
fn lookup_discriminant(ccx: @crate_ctxt, vid: ast::def_id) -> ValueRef {
@@ -2736,6 +2764,11 @@ fn trans_call_inner(in_cx: block, fn_expr_ty: ty::t,
27362764
let args_res = trans_args(bcx, llenv, args, fn_expr_ty, dest);
27372765
bcx = args_res.bcx;
27382766
let llargs = args_res.args;
2767+
option::may(f_res.tds) {|vals|
2768+
llargs = vec::slice(llargs, 0u, first_real_arg) + vals +
2769+
vec::tail_n(llargs, first_real_arg);
2770+
}
2771+
27392772
let llretslot = args_res.retslot;
27402773

27412774
/* If the block is terminated,

trunk/src/rustc/middle/trans/closure.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,7 @@ fn trans_bind_1(cx: block, outgoing_fty: ty::t,
446446
f_res: lval_maybe_callee,
447447
args: [option<@ast::expr>], pair_ty: ty::t,
448448
dest: dest) -> block {
449+
assert option::is_none(f_res.tds);
449450
let ccx = cx.ccx();
450451
let bound: [@ast::expr] = [];
451452
for argopt: option<@ast::expr> in args {

trunk/src/rustc/middle/trans/impl.rs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ fn trans_vtable_callee(bcx: block, env: callee_env, vtable: ValueRef,
8383
let vtable = PointerCast(bcx, vtable,
8484
T_ptr(T_array(T_ptr(llfty), n_method + 1u)));
8585
let mptr = Load(bcx, GEPi(bcx, vtable, [0, n_method as int]));
86-
{bcx: bcx, val: mptr, kind: owned, env: env}
86+
{bcx: bcx, val: mptr, kind: owned, env: env, tds: none}
8787
}
8888

8989
fn method_with_name(ccx: @crate_ctxt, impl_id: ast::def_id,
@@ -148,14 +148,6 @@ fn trans_iface_callee(bcx: block, base: @ast::expr,
148148
callee_id, n_method)
149149
}
150150

151-
fn llfn_arg_tys(ft: TypeRef) -> {inputs: [TypeRef], output: TypeRef} {
152-
let out_ty = llvm::LLVMGetReturnType(ft);
153-
let n_args = llvm::LLVMCountParamTypes(ft);
154-
let args = vec::from_elem(n_args as uint, 0 as TypeRef);
155-
unsafe { llvm::LLVMGetParamTypes(ft, vec::unsafe::to_ptr(args)); }
156-
{inputs: args, output: out_ty}
157-
}
158-
159151
fn find_vtable_in_fn_ctxt(ps: param_substs, n_param: uint, n_bound: uint)
160152
-> typeck::vtable_origin {
161153
let vtable_off = n_bound, i = 0u;
@@ -251,7 +243,7 @@ fn make_impl_vtable(ccx: @crate_ctxt, impl_id: ast::def_id, substs: [ty::t],
251243
C_null(type_of_fn_from_ty(ccx, fty))
252244
} else {
253245
let m_id = method_with_name(ccx, impl_id, im.ident);
254-
monomorphic_fn(ccx, m_id, substs, some(vtables))
246+
monomorphic_fn(ccx, m_id, substs, some(vtables)).val
255247
}
256248
}))
257249
}

0 commit comments

Comments
 (0)