|
| 1 | +import middle.trans; |
| 2 | + |
| 3 | +import trans.decl_cdecl_fn; |
| 4 | +import trans.type_names; |
| 5 | +import trans.ModuleRef; |
| 6 | +import trans.TypeRef; |
| 7 | +import trans.ValueRef; |
| 8 | + |
| 9 | +import trans.T_crate; |
| 10 | +import trans.T_f32; |
| 11 | +import trans.T_f64; |
| 12 | +import trans.T_fn; |
| 13 | +import trans.T_i8; |
| 14 | +import trans.T_i32; |
| 15 | +import trans.T_int; |
| 16 | +import trans.T_opaque_chan_ptr; |
| 17 | +import trans.T_opaque_port_ptr; |
| 18 | +import trans.T_opaque_vec_ptr; |
| 19 | +import trans.T_ptr; |
| 20 | +import trans.T_size_t; |
| 21 | +import trans.T_str; |
| 22 | +import trans.T_taskptr; |
| 23 | +import trans.T_tydesc; |
| 24 | +import trans.T_void; |
| 25 | + |
| 26 | +type upcalls = rec( |
| 27 | + ValueRef grow_task, |
| 28 | + ValueRef log_int, |
| 29 | + ValueRef log_float, |
| 30 | + ValueRef log_double, |
| 31 | + ValueRef log_str, |
| 32 | + ValueRef trace_word, |
| 33 | + ValueRef trace_str, |
| 34 | + ValueRef new_port, |
| 35 | + ValueRef del_port, |
| 36 | + ValueRef new_chan, |
| 37 | + ValueRef flush_chan, |
| 38 | + ValueRef del_chan, |
| 39 | + ValueRef clone_chan, |
| 40 | + ValueRef _yield, |
| 41 | + ValueRef sleep, |
| 42 | + ValueRef _join, |
| 43 | + ValueRef send, |
| 44 | + ValueRef recv, |
| 45 | + ValueRef _fail, |
| 46 | + ValueRef kill, |
| 47 | + ValueRef exit, |
| 48 | + ValueRef malloc, |
| 49 | + ValueRef free, |
| 50 | + ValueRef mark, |
| 51 | + ValueRef new_str, |
| 52 | + ValueRef new_vec, |
| 53 | + ValueRef vec_grow, |
| 54 | + ValueRef require_rust_sym, |
| 55 | + ValueRef require_c_sym, |
| 56 | + ValueRef get_type_desc, |
| 57 | + ValueRef new_task, |
| 58 | + ValueRef start_task, |
| 59 | + ValueRef new_thread, |
| 60 | + ValueRef start_thread |
| 61 | +); |
| 62 | + |
| 63 | +fn declare_upcalls(type_names tn, ModuleRef llmod) -> upcalls { |
| 64 | + fn decl(type_names tn, ModuleRef llmod, str name, vec[TypeRef] tys) |
| 65 | + -> ValueRef { |
| 66 | + let vec[TypeRef] arg_tys = vec(T_taskptr(tn)); |
| 67 | + for (TypeRef t in tys) { arg_tys += vec(t); } |
| 68 | + auto fn_ty = T_fn(arg_tys, T_void()); |
| 69 | + ret trans.decl_cdecl_fn(llmod, "upcall_" + name, fn_ty); |
| 70 | + } |
| 71 | + |
| 72 | + auto d = bind decl(tn, llmod, _, _); |
| 73 | + |
| 74 | + // FIXME: Sigh... remove this when I fix the typechecker pushdown. |
| 75 | + // --pcwalton |
| 76 | + let vec[TypeRef] empty_vec = vec(); |
| 77 | + |
| 78 | + ret rec( |
| 79 | + grow_task=d("grow_task", vec(T_size_t())), |
| 80 | + log_int=d("log_int", vec(T_i32(), T_i32())), |
| 81 | + log_float=d("log_float", vec(T_i32(), T_f32())), |
| 82 | + log_double=d("log_double", vec(T_i32(), T_ptr(T_f64()))), |
| 83 | + log_str=d("log_str", vec(T_i32(), T_ptr(T_str()))), |
| 84 | + trace_word=d("trace_word", vec(T_int())), |
| 85 | + trace_str=d("trace_str", vec(T_ptr(T_i8()))), |
| 86 | + new_port=d("new_port", vec(T_size_t())), |
| 87 | + del_port=d("del_port", vec(T_opaque_port_ptr(tn))), |
| 88 | + new_chan=d("new_chan", vec(T_opaque_port_ptr(tn))), |
| 89 | + flush_chan=d("flush_chan", vec(T_opaque_chan_ptr(tn))), |
| 90 | + del_chan=d("del_chan", vec(T_opaque_chan_ptr(tn))), |
| 91 | + clone_chan=d("clone_chan", vec(T_taskptr(tn), T_opaque_chan_ptr(tn))), |
| 92 | + _yield=d("yield", empty_vec), |
| 93 | + sleep=d("sleep", vec(T_size_t())), |
| 94 | + _join=d("join", vec(T_taskptr(tn))), |
| 95 | + send=d("send", vec(T_opaque_chan_ptr(tn), T_ptr(T_i8()))), |
| 96 | + recv=d("recv", vec(T_ptr(T_int()), T_opaque_port_ptr(tn))), |
| 97 | + _fail=d("fail", vec(T_ptr(T_i8()), T_ptr(T_i8()), T_size_t())), |
| 98 | + kill=d("kill", vec(T_taskptr(tn))), |
| 99 | + exit=d("exit", empty_vec), |
| 100 | + malloc=d("malloc", vec(T_size_t(), T_ptr(T_tydesc(tn)))), |
| 101 | + free=d("free", vec(T_ptr(T_i8()), T_int())), |
| 102 | + mark=d("mark", vec(T_ptr(T_i8()))), |
| 103 | + new_str=d("new_str", vec(T_ptr(T_i8()), T_size_t())), |
| 104 | + new_vec=d("new_vec", vec(T_size_t(), T_ptr(T_tydesc(tn)))), |
| 105 | + vec_grow=d("vec_grow", vec(T_opaque_vec_ptr(), T_size_t(), |
| 106 | + T_ptr(T_int()), T_ptr(T_tydesc(tn)))), |
| 107 | + require_rust_sym=d("require_rust_sym", |
| 108 | + vec(T_ptr(T_crate(tn)), T_size_t(), T_size_t(), |
| 109 | + T_size_t(), T_ptr(T_i8()), |
| 110 | + T_ptr(T_ptr(T_i8())))), |
| 111 | + require_c_sym=d("require_c_sym", |
| 112 | + vec(T_ptr(T_crate(tn)), T_size_t(), T_size_t(), |
| 113 | + T_ptr(T_i8()), T_ptr(T_i8()))), |
| 114 | + get_type_desc=d("get_type_desc", |
| 115 | + vec(T_ptr(T_crate(tn)), T_size_t(), T_size_t(), |
| 116 | + T_size_t(), T_ptr(T_ptr(T_tydesc(tn))))), |
| 117 | + new_task=d("new_task", vec(T_ptr(T_i8()))), |
| 118 | + start_task=d("start_task", vec(T_taskptr(tn), T_int(), T_int(), |
| 119 | + T_int(), T_size_t())), |
| 120 | + new_thread=d("new_thread", vec(T_ptr(T_i8()))), |
| 121 | + start_thread=d("start_thread", vec(T_taskptr(tn), T_int(), T_int(), |
| 122 | + T_int(), T_size_t())) |
| 123 | + ); |
| 124 | +} |
| 125 | + |
0 commit comments