Remove spawn_wrap and main_wrap kludges
This isn't needed now that our functions are cdecl (and was apparently only still working by accident). Issue #992
This commit is contained in:
parent
243c5c3479
commit
e927df17f7
@ -5662,7 +5662,7 @@ fn create_main(ccx: @crate_ctxt, sp: span, main_llfn: ValueRef,
|
||||
let llfty = type_of_fn(ccx, sp, ast::proto_fn, false, false,
|
||||
[vecarg_ty], nt, 0u);
|
||||
let llfdecl = decl_fn(ccx.llmod, "_rust_main",
|
||||
lib::llvm::LLVMFastCallConv, llfty);
|
||||
lib::llvm::LLVMCCallConv, llfty);
|
||||
|
||||
let fcx = new_fn_ctxt(new_local_ctxt(ccx), sp, llfdecl);
|
||||
|
||||
|
@ -16,28 +16,9 @@
|
||||
|
||||
declare i32 @rust_start(i32, i32, i32, i32)
|
||||
|
||||
declare external fastcc void @_rust_main(i1* nocapture, %task*, %2* nocapture, %vec*)
|
||||
|
||||
define void @_rust_main_wrap(i1* nocapture, %task *, %2* nocapture, %vec *)
|
||||
{
|
||||
tail call fastcc void @_rust_main(i1* %0, %task *%1, %2* nocapture %2, %vec* %3)
|
||||
ret void
|
||||
}
|
||||
|
||||
%nullary_fn = type void (i1*, %task*, %2*)
|
||||
|
||||
define void @_rust_spawn_wrap(
|
||||
i1* nocapture, %task*, %2* nocapture, %nullary_fn* %f)
|
||||
{
|
||||
call void %f(i1* %0, %task *%1, %2* nocapture %2)
|
||||
ret void
|
||||
}
|
||||
|
||||
declare external void @set_spawn_wrapper(void (i1*, %task*, %2*, %nullary_fn*)*);
|
||||
declare external void @_rust_main(i1* nocapture, %task*, %2* nocapture, %vec*)
|
||||
|
||||
define i32 @"MAIN"(i32, i32) {
|
||||
call void @set_spawn_wrapper(void (i1*, %task*, %2*, %nullary_fn*)* @_rust_spawn_wrap)
|
||||
|
||||
%result = tail call i32 @rust_start(i32 ptrtoint (void (i1*, %task*, %2*, %vec*)* @_rust_main_wrap to i32), i32 %0, i32 %1, i32 ptrtoint (%0* @_rust_crate_map_toplevel to i32))
|
||||
%result = tail call i32 @rust_start(i32 ptrtoint (void (i1*, %task*, %2*, %vec*)* @_rust_main to i32), i32 %0, i32 %1, i32 ptrtoint (%0* @_rust_crate_map_toplevel to i32))
|
||||
ret i32 %result
|
||||
}
|
||||
|
@ -472,13 +472,18 @@ struct fn_env_pair {
|
||||
intptr_t env;
|
||||
};
|
||||
|
||||
extern "C" CDECL uintptr_t get_spawn_wrapper();
|
||||
// FIXME This is probably not needed at all anymore. Have to rearrange some
|
||||
// argument passing to remove it.
|
||||
void rust_spawn_wrapper(void* retptr, rust_task* taskptr, void* envptr,
|
||||
void(*func)(void*, rust_task*, void*)) {
|
||||
func(retptr, taskptr, envptr);
|
||||
}
|
||||
|
||||
extern "C" CDECL void
|
||||
start_task(void *unused_task, rust_task_id id, fn_env_pair *f) {
|
||||
rust_task *task = rust_scheduler::get_task();
|
||||
rust_task *target = task->kernel->get_task_by_id(id);
|
||||
target->start(get_spawn_wrapper(), f->f, f->env);
|
||||
target->start((uintptr_t)rust_spawn_wrapper, f->f, f->env);
|
||||
target->deref();
|
||||
}
|
||||
|
||||
|
@ -180,22 +180,6 @@ void task_start_wrapper(spawn_args *a)
|
||||
}
|
||||
}
|
||||
|
||||
/* We spawn a rust (fastcc) function through a CDECL function
|
||||
defined in main.ll, which is built as part of each crate. These accessors
|
||||
allow each rust program to install that function at startup */
|
||||
|
||||
uintptr_t spawn_wrapper;
|
||||
|
||||
extern "C" CDECL void
|
||||
set_spawn_wrapper(uintptr_t f) {
|
||||
spawn_wrapper = f;
|
||||
}
|
||||
|
||||
extern "C" CDECL uintptr_t
|
||||
get_spawn_wrapper() {
|
||||
return spawn_wrapper;
|
||||
}
|
||||
|
||||
void
|
||||
rust_task::start(uintptr_t spawnee_fn,
|
||||
uintptr_t args,
|
||||
|
@ -54,7 +54,6 @@ rust_run_program
|
||||
rust_start
|
||||
rust_getcwd
|
||||
set_min_stack
|
||||
set_spawn_wrapper
|
||||
sched_threads
|
||||
size_of
|
||||
squareroot
|
||||
|
Loading…
Reference in New Issue
Block a user