Next step in the type system change. Add task_type to the context.
This commit is contained in:
parent
2a3ab10f20
commit
9036758191
2 changed files with 43 additions and 37 deletions
|
@ -16,7 +16,6 @@ import trans::T_opaque_vec_ptr;
|
||||||
import trans::T_ptr;
|
import trans::T_ptr;
|
||||||
import trans::T_size_t;
|
import trans::T_size_t;
|
||||||
import trans::T_str;
|
import trans::T_str;
|
||||||
import trans::T_taskptr;
|
|
||||||
import trans::T_void;
|
import trans::T_void;
|
||||||
import lib::llvm::type_names;
|
import lib::llvm::type_names;
|
||||||
import lib::llvm::llvm::ModuleRef;
|
import lib::llvm::llvm::ModuleRef;
|
||||||
|
@ -61,17 +60,19 @@ type upcalls =
|
||||||
ValueRef ivec_resize_shared,
|
ValueRef ivec_resize_shared,
|
||||||
ValueRef ivec_spill_shared);
|
ValueRef ivec_spill_shared);
|
||||||
|
|
||||||
fn declare_upcalls(type_names tn, TypeRef tydesc_type, ModuleRef llmod)
|
fn declare_upcalls(type_names tn, TypeRef tydesc_type, TypeRef taskptr_type,
|
||||||
|
ModuleRef llmod)
|
||||||
-> @upcalls {
|
-> @upcalls {
|
||||||
fn decl(type_names tn, TypeRef tydesc_type, ModuleRef llmod, str name,
|
fn decl(type_names tn, TypeRef tydesc_type, TypeRef taskptr_type,
|
||||||
vec[TypeRef] tys, TypeRef rv) -> ValueRef {
|
ModuleRef llmod, str name, vec[TypeRef] tys,
|
||||||
let TypeRef[] arg_tys = ~[T_taskptr(tn)];
|
TypeRef rv) -> ValueRef {
|
||||||
|
let TypeRef[] arg_tys = ~[taskptr_type];
|
||||||
for (TypeRef t in tys) { arg_tys += ~[t]; }
|
for (TypeRef t in tys) { arg_tys += ~[t]; }
|
||||||
auto fn_ty = T_fn(arg_tys, rv);
|
auto fn_ty = T_fn(arg_tys, rv);
|
||||||
ret trans::decl_cdecl_fn(llmod, "upcall_" + name, fn_ty);
|
ret trans::decl_cdecl_fn(llmod, "upcall_" + name, fn_ty);
|
||||||
}
|
}
|
||||||
auto dv = bind decl(tn, tydesc_type, llmod, _, _, T_void());
|
auto dv = bind decl(tn, tydesc_type, taskptr_type, llmod, _, _, T_void());
|
||||||
auto d = bind decl(tn, tydesc_type, llmod, _, _, _);
|
auto d = bind decl(tn, tydesc_type, taskptr_type, llmod, _, _, _);
|
||||||
// FIXME: Sigh:.. remove this when I fix the typechecker pushdown.
|
// FIXME: Sigh:.. remove this when I fix the typechecker pushdown.
|
||||||
// --pcwalton
|
// --pcwalton
|
||||||
|
|
||||||
|
@ -89,14 +90,14 @@ fn declare_upcalls(type_names tn, TypeRef tydesc_type, ModuleRef llmod)
|
||||||
T_opaque_chan_ptr()),
|
T_opaque_chan_ptr()),
|
||||||
flush_chan=dv("flush_chan", [T_opaque_chan_ptr()]),
|
flush_chan=dv("flush_chan", [T_opaque_chan_ptr()]),
|
||||||
del_chan=dv("del_chan", [T_opaque_chan_ptr()]),
|
del_chan=dv("del_chan", [T_opaque_chan_ptr()]),
|
||||||
clone_chan=d("clone_chan", [T_taskptr(tn), T_opaque_chan_ptr()],
|
clone_chan=d("clone_chan", [taskptr_type, T_opaque_chan_ptr()],
|
||||||
T_opaque_chan_ptr()),
|
T_opaque_chan_ptr()),
|
||||||
_yield=dv("yield", empty_vec),
|
_yield=dv("yield", empty_vec),
|
||||||
sleep=dv("sleep", [T_size_t()]),
|
sleep=dv("sleep", [T_size_t()]),
|
||||||
send=dv("send", [T_opaque_chan_ptr(), T_ptr(T_i8())]),
|
send=dv("send", [T_opaque_chan_ptr(), T_ptr(T_i8())]),
|
||||||
recv=dv("recv", [T_ptr(T_ptr(T_i8())), T_opaque_port_ptr()]),
|
recv=dv("recv", [T_ptr(T_ptr(T_i8())), T_opaque_port_ptr()]),
|
||||||
_fail=dv("fail", [T_ptr(T_i8()), T_ptr(T_i8()), T_size_t()]),
|
_fail=dv("fail", [T_ptr(T_i8()), T_ptr(T_i8()), T_size_t()]),
|
||||||
kill=dv("kill", [T_taskptr(tn)]),
|
kill=dv("kill", [taskptr_type]),
|
||||||
exit=dv("exit", empty_vec),
|
exit=dv("exit", empty_vec),
|
||||||
malloc=d("malloc", [T_size_t(), T_ptr(tydesc_type)],
|
malloc=d("malloc", [T_size_t(), T_ptr(tydesc_type)],
|
||||||
T_ptr(T_i8())),
|
T_ptr(T_i8())),
|
||||||
|
@ -107,7 +108,7 @@ fn declare_upcalls(type_names tn, TypeRef tydesc_type, ModuleRef llmod)
|
||||||
mark=d("mark", [T_ptr(T_i8())], T_int()),
|
mark=d("mark", [T_ptr(T_i8())], T_int()),
|
||||||
new_str=d("new_str", [T_ptr(T_i8()), T_size_t()],
|
new_str=d("new_str", [T_ptr(T_i8()), T_size_t()],
|
||||||
T_ptr(T_str())),
|
T_ptr(T_str())),
|
||||||
dup_str=d("dup_str", [T_taskptr(tn), T_ptr(T_str())],
|
dup_str=d("dup_str", [taskptr_type, T_ptr(T_str())],
|
||||||
T_ptr(T_str())),
|
T_ptr(T_str())),
|
||||||
new_vec=d("new_vec", [T_size_t(), T_ptr(tydesc_type)],
|
new_vec=d("new_vec", [T_size_t(), T_ptr(tydesc_type)],
|
||||||
T_opaque_vec_ptr()),
|
T_opaque_vec_ptr()),
|
||||||
|
@ -119,10 +120,10 @@ fn declare_upcalls(type_names tn, TypeRef tydesc_type, ModuleRef llmod)
|
||||||
[T_ptr(T_nil()), T_size_t(), T_size_t(),
|
[T_ptr(T_nil()), T_size_t(), T_size_t(),
|
||||||
T_size_t(), T_ptr(T_ptr(tydesc_type))],
|
T_size_t(), T_ptr(T_ptr(tydesc_type))],
|
||||||
T_ptr(tydesc_type)),
|
T_ptr(tydesc_type)),
|
||||||
new_task=d("new_task", [T_ptr(T_str())], T_taskptr(tn)),
|
new_task=d("new_task", [T_ptr(T_str())], taskptr_type),
|
||||||
start_task=d("start_task",
|
start_task=d("start_task",
|
||||||
[T_taskptr(tn), T_int(), T_int(), T_size_t()],
|
[taskptr_type, T_int(), T_int(), T_size_t()],
|
||||||
T_taskptr(tn)),
|
taskptr_type),
|
||||||
ivec_resize=d("ivec_resize", [T_ptr(T_opaque_ivec()), T_int()],
|
ivec_resize=d("ivec_resize", [T_ptr(T_opaque_ivec()), T_int()],
|
||||||
T_void()),
|
T_void()),
|
||||||
ivec_spill=d("ivec_spill", [T_ptr(T_opaque_ivec()), T_int()],
|
ivec_spill=d("ivec_spill", [T_ptr(T_opaque_ivec()), T_int()],
|
||||||
|
|
|
@ -147,7 +147,8 @@ type crate_ctxt =
|
||||||
ty::ctxt tcx,
|
ty::ctxt tcx,
|
||||||
stats stats,
|
stats stats,
|
||||||
@upcall::upcalls upcalls,
|
@upcall::upcalls upcalls,
|
||||||
TypeRef tydesc_type);
|
TypeRef tydesc_type,
|
||||||
|
TypeRef task_type);
|
||||||
|
|
||||||
type local_ctxt =
|
type local_ctxt =
|
||||||
rec(str[] path,
|
rec(str[] path,
|
||||||
|
@ -477,9 +478,8 @@ fn T_struct(&TypeRef[] elts) -> TypeRef {
|
||||||
|
|
||||||
fn T_opaque() -> TypeRef { ret llvm::LLVMOpaqueType(); }
|
fn T_opaque() -> TypeRef { ret llvm::LLVMOpaqueType(); }
|
||||||
|
|
||||||
fn T_task(&type_names tn) -> TypeRef {
|
fn T_task2() -> TypeRef {
|
||||||
auto s = "task";
|
auto s = "task";
|
||||||
if (tn.name_has_type(s)) { ret tn.get_type(s); }
|
|
||||||
auto t =
|
auto t =
|
||||||
T_struct(~[T_int(), // Refcount
|
T_struct(~[T_int(), // Refcount
|
||||||
T_int(), // Delegate pointer
|
T_int(), // Delegate pointer
|
||||||
|
@ -491,7 +491,6 @@ fn T_task(&type_names tn) -> TypeRef {
|
||||||
T_int(), // Domain pointer
|
T_int(), // Domain pointer
|
||||||
// Crate cache pointer
|
// Crate cache pointer
|
||||||
T_int()]);
|
T_int()]);
|
||||||
tn.associate(s, t);
|
|
||||||
ret t;
|
ret t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -527,16 +526,16 @@ fn T_cmp_glue_fn(&crate_ctxt cx) -> TypeRef {
|
||||||
ret t;
|
ret t;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn T_tydesc(&type_names tn) -> TypeRef {
|
fn T_tydesc(TypeRef taskptr_type) -> TypeRef {
|
||||||
auto th = mk_type_handle();
|
auto th = mk_type_handle();
|
||||||
auto abs_tydesc = llvm::LLVMResolveTypeHandle(th.llth);
|
auto abs_tydesc = llvm::LLVMResolveTypeHandle(th.llth);
|
||||||
auto tydescpp = T_ptr(T_ptr(abs_tydesc));
|
auto tydescpp = T_ptr(T_ptr(abs_tydesc));
|
||||||
auto pvoid = T_ptr(T_i8());
|
auto pvoid = T_ptr(T_i8());
|
||||||
auto glue_fn_ty =
|
auto glue_fn_ty =
|
||||||
T_ptr(T_fn(~[T_ptr(T_nil()), T_taskptr(tn), T_ptr(T_nil()), tydescpp,
|
T_ptr(T_fn(~[T_ptr(T_nil()), taskptr_type, T_ptr(T_nil()), tydescpp,
|
||||||
pvoid], T_void()));
|
pvoid], T_void()));
|
||||||
auto cmp_glue_fn_ty =
|
auto cmp_glue_fn_ty =
|
||||||
T_ptr(T_fn(~[T_ptr(T_i1()), T_taskptr(tn), T_ptr(T_nil()), tydescpp,
|
T_ptr(T_fn(~[T_ptr(T_i1()), taskptr_type, T_ptr(T_nil()), tydescpp,
|
||||||
pvoid, pvoid, T_i8()], T_void()));
|
pvoid, pvoid, T_i8()], T_void()));
|
||||||
auto tydesc =
|
auto tydesc =
|
||||||
T_struct(~[tydescpp, // first_param
|
T_struct(~[tydescpp, // first_param
|
||||||
|
@ -633,7 +632,7 @@ fn T_chan(TypeRef t) -> TypeRef {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn T_taskptr(&type_names tn) -> TypeRef { ret T_ptr(T_task(tn)); }
|
fn T_taskptr(&crate_ctxt cx) -> TypeRef { ret T_ptr(cx.task_type); }
|
||||||
|
|
||||||
|
|
||||||
// This type must never be used directly; it must always be cast away.
|
// This type must never be used directly; it must always be cast away.
|
||||||
|
@ -766,7 +765,7 @@ fn type_of_fn_full(&@crate_ctxt cx, &span sp, ast::proto proto,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Arg 1: task pointer.
|
// Arg 1: task pointer.
|
||||||
atys += ~[T_taskptr(cx.tn)];
|
atys += ~[T_taskptr(*cx)];
|
||||||
|
|
||||||
// Arg 2: Env (closure-bindings / self-obj)
|
// Arg 2: Env (closure-bindings / self-obj)
|
||||||
alt (obj_self) {
|
alt (obj_self) {
|
||||||
|
@ -811,7 +810,7 @@ fn type_of_native_fn(&@crate_ctxt cx, &span sp, ast::native_abi abi,
|
||||||
-> TypeRef {
|
-> TypeRef {
|
||||||
let TypeRef[] atys = ~[];
|
let TypeRef[] atys = ~[];
|
||||||
if (abi == ast::native_abi_rust) {
|
if (abi == ast::native_abi_rust) {
|
||||||
atys += ~[T_taskptr(cx.tn)];
|
atys += ~[T_taskptr(*cx)];
|
||||||
auto i = 0u;
|
auto i = 0u;
|
||||||
while (i < ty_param_count) {
|
while (i < ty_param_count) {
|
||||||
atys += ~[T_ptr(cx.tydesc_type)];
|
atys += ~[T_ptr(cx.tydesc_type)];
|
||||||
|
@ -874,7 +873,7 @@ fn type_of_inner(&@crate_ctxt cx, &span sp, &ty::t t) -> TypeRef {
|
||||||
case (ty::ty_chan(?t)) {
|
case (ty::ty_chan(?t)) {
|
||||||
llty = T_ptr(T_chan(type_of_inner(cx, sp, t)));
|
llty = T_ptr(T_chan(type_of_inner(cx, sp, t)));
|
||||||
}
|
}
|
||||||
case (ty::ty_task) { llty = T_taskptr(cx.tn); }
|
case (ty::ty_task) { llty = T_taskptr(*cx); }
|
||||||
case (ty::ty_tup(?elts)) {
|
case (ty::ty_tup(?elts)) {
|
||||||
let TypeRef[] tys = ~[];
|
let TypeRef[] tys = ~[];
|
||||||
for (ty::mt elt in elts) {
|
for (ty::mt elt in elts) {
|
||||||
|
@ -1136,8 +1135,8 @@ fn decl_internal_fastcall_fn(ModuleRef llmod, &str name, TypeRef llty) ->
|
||||||
ret llfn;
|
ret llfn;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn decl_glue(ModuleRef llmod, type_names tn, &str s) -> ValueRef {
|
fn decl_glue(ModuleRef llmod, &crate_ctxt cx, &str s) -> ValueRef {
|
||||||
ret decl_cdecl_fn(llmod, s, T_fn(~[T_taskptr(tn)], T_void()));
|
ret decl_cdecl_fn(llmod, s, T_fn(~[T_taskptr(cx)], T_void()));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_extern_fn(&hashmap[str, ValueRef] externs, ModuleRef llmod, &str name,
|
fn get_extern_fn(&hashmap[str, ValueRef] externs, ModuleRef llmod, &str name,
|
||||||
|
@ -8999,7 +8998,7 @@ fn i2p(ValueRef v, TypeRef t) -> ValueRef {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_typedefs(&@crate_ctxt cx) {
|
fn create_typedefs(&@crate_ctxt cx) {
|
||||||
llvm::LLVMAddTypeName(cx.llmod, str::buf("task"), T_task(cx.tn));
|
llvm::LLVMAddTypeName(cx.llmod, str::buf("task"), cx.task_type);
|
||||||
llvm::LLVMAddTypeName(cx.llmod, str::buf("tydesc"), cx.tydesc_type);
|
llvm::LLVMAddTypeName(cx.llmod, str::buf("tydesc"), cx.tydesc_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9057,8 +9056,8 @@ fn trap(&@block_ctxt bcx) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn decl_no_op_type_glue(ModuleRef llmod, type_names tn) -> ValueRef {
|
fn decl_no_op_type_glue(ModuleRef llmod, TypeRef taskptr_type) -> ValueRef {
|
||||||
auto ty = T_fn(~[T_taskptr(tn), T_ptr(T_i8())], T_void());
|
auto ty = T_fn(~[taskptr_type, T_ptr(T_i8())], T_void());
|
||||||
ret decl_fastcall_fn(llmod, abi::no_op_type_glue_name(), ty);
|
ret decl_fastcall_fn(llmod, abi::no_op_type_glue_name(), ty);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9078,24 +9077,26 @@ fn vec_p0(&@block_ctxt bcx, ValueRef v) -> ValueRef {
|
||||||
ret bcx.build.PointerCast(p, T_ptr(T_i8()));
|
ret bcx.build.PointerCast(p, T_ptr(T_i8()));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_glues(ModuleRef llmod, &type_names tn) -> @glue_fns {
|
fn make_glues(ModuleRef llmod, TypeRef taskptr_type) -> @glue_fns {
|
||||||
ret @rec(no_op_type_glue=decl_no_op_type_glue(llmod, tn));
|
ret @rec(no_op_type_glue=decl_no_op_type_glue(llmod, taskptr_type));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_common_glue(&session::session sess, &str output) {
|
fn make_common_glue(&session::session sess, &str output) {
|
||||||
// FIXME: part of this is repetitive and is probably a good idea
|
// FIXME: part of this is repetitive and is probably a good idea
|
||||||
// to autogen it.
|
// to autogen it.
|
||||||
|
|
||||||
|
auto task_type = T_task2();
|
||||||
|
auto taskptr_type = T_ptr(task_type);
|
||||||
|
|
||||||
auto llmod =
|
auto llmod =
|
||||||
llvm::LLVMModuleCreateWithNameInContext(str::buf("rust_out"),
|
llvm::LLVMModuleCreateWithNameInContext(str::buf("rust_out"),
|
||||||
llvm::LLVMGetGlobalContext());
|
llvm::LLVMGetGlobalContext());
|
||||||
llvm::LLVMSetDataLayout(llmod, str::buf(x86::get_data_layout()));
|
llvm::LLVMSetDataLayout(llmod, str::buf(x86::get_data_layout()));
|
||||||
llvm::LLVMSetTarget(llmod, str::buf(x86::get_target_triple()));
|
llvm::LLVMSetTarget(llmod, str::buf(x86::get_target_triple()));
|
||||||
mk_target_data(x86::get_data_layout());
|
mk_target_data(x86::get_data_layout());
|
||||||
auto tn = mk_type_names();
|
|
||||||
declare_intrinsics(llmod);
|
declare_intrinsics(llmod);
|
||||||
llvm::LLVMSetModuleInlineAsm(llmod, str::buf(x86::get_module_asm()));
|
llvm::LLVMSetModuleInlineAsm(llmod, str::buf(x86::get_module_asm()));
|
||||||
make_glues(llmod, tn);
|
make_glues(llmod, taskptr_type);
|
||||||
link::write::run_passes(sess, llmod, output);
|
link::write::run_passes(sess, llmod, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9170,7 +9171,10 @@ fn trans_crate(&session::session sess, &@ast::crate crate, &ty::ctxt tcx,
|
||||||
auto td = mk_target_data(x86::get_data_layout());
|
auto td = mk_target_data(x86::get_data_layout());
|
||||||
auto tn = mk_type_names();
|
auto tn = mk_type_names();
|
||||||
auto intrinsics = declare_intrinsics(llmod);
|
auto intrinsics = declare_intrinsics(llmod);
|
||||||
auto glues = make_glues(llmod, tn);
|
auto task_type = T_task2();
|
||||||
|
auto taskptr_type = T_ptr(task_type);
|
||||||
|
auto tydesc_type = T_tydesc(taskptr_type);
|
||||||
|
auto glues = make_glues(llmod, taskptr_type);
|
||||||
auto hasher = ty::hash_ty;
|
auto hasher = ty::hash_ty;
|
||||||
auto eqer = ty::eq_ty;
|
auto eqer = ty::eq_ty;
|
||||||
auto tag_sizes = map::mk_hashmap[ty::t, uint](hasher, eqer);
|
auto tag_sizes = map::mk_hashmap[ty::t, uint](hasher, eqer);
|
||||||
|
@ -9179,7 +9183,6 @@ fn trans_crate(&session::session sess, &@ast::crate crate, &ty::ctxt tcx,
|
||||||
auto sha1s = map::mk_hashmap[ty::t, str](hasher, eqer);
|
auto sha1s = map::mk_hashmap[ty::t, str](hasher, eqer);
|
||||||
auto short_names = map::mk_hashmap[ty::t, str](hasher, eqer);
|
auto short_names = map::mk_hashmap[ty::t, str](hasher, eqer);
|
||||||
auto sha = std::sha1::mk_sha1();
|
auto sha = std::sha1::mk_sha1();
|
||||||
auto tydesc_type = T_tydesc(tn);
|
|
||||||
auto ccx =
|
auto ccx =
|
||||||
@rec(sess=sess,
|
@rec(sess=sess,
|
||||||
llmod=llmod,
|
llmod=llmod,
|
||||||
|
@ -9212,8 +9215,10 @@ fn trans_crate(&session::session sess, &@ast::crate crate, &ty::ctxt tcx,
|
||||||
mutable n_glues_created=0u,
|
mutable n_glues_created=0u,
|
||||||
mutable n_null_glues=0u,
|
mutable n_null_glues=0u,
|
||||||
mutable n_real_glues=0u),
|
mutable n_real_glues=0u),
|
||||||
upcalls=upcall::declare_upcalls(tn, tydesc_type, llmod),
|
upcalls=upcall::declare_upcalls(tn, tydesc_type, taskptr_type,
|
||||||
tydesc_type=tydesc_type);
|
llmod),
|
||||||
|
tydesc_type=tydesc_type,
|
||||||
|
task_type=task_type);
|
||||||
auto cx = new_local_ctxt(ccx);
|
auto cx = new_local_ctxt(ccx);
|
||||||
create_typedefs(ccx);
|
create_typedefs(ccx);
|
||||||
collect_items(ccx, crate);
|
collect_items(ccx, crate);
|
||||||
|
|
Loading…
Reference in a new issue