Skip to content

Commit 3f10fb6

Browse files
committed
---
yaml --- r: 4797 b: refs/heads/master c: c2d8a4d h: refs/heads/master i: 4795: a9931eb v: v3
1 parent 43bf064 commit 3f10fb6

File tree

4 files changed

+42
-124
lines changed

4 files changed

+42
-124
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 53eb4a30255fc6b3d6be700c10eb7248b0bad3a9
2+
refs/heads/master: c2d8a4df35a0a22d64d7d15ccd5fe25a495a2bc1

trunk/src/comp/middle/trans.rs

Lines changed: 19 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -6385,84 +6385,20 @@ fn create_main_wrapper(ccx: &@crate_ctxt, sp: &span,
63856385
ccx.sess.span_fatal(sp, "multiple 'main' functions");
63866386
}
63876387

6388-
tag main_mode {
6389-
mm_nil;
6390-
mm_vec;
6391-
mm_ivec;
6392-
};
6393-
6394-
let main_mode = alt ty::struct(ccx.tcx, main_node_type) {
6388+
let main_takes_ivec = alt ty::struct(ccx.tcx, main_node_type) {
63956389
ty::ty_fn(_, args, _ ,_ ,_) {
6396-
if std::vec::len(args) == 0u {
6397-
mm_nil
6398-
} else {
6399-
alt ty::struct(ccx.tcx, args.(0).ty) {
6400-
ty::ty_ivec(_) { mm_ivec }
6401-
ty::ty_vec(_) { mm_vec }
6402-
}
6403-
}
6390+
std::vec::len(args) != 0u
64046391
}
64056392
};
64066393

6407-
// Have to create two different main functions depending on whether
6408-
// main was declared to take vec or ivec
6409-
let llfn_vec = create_main_wrapper_vec(ccx, sp, main_llfn, main_mode);
6410-
let llfn_ivec = create_main_wrapper_ivec(ccx, sp, main_llfn, main_mode);
6411-
let takes_ivec = main_mode == mm_ivec;
6412-
// Create a global to tell main.ll which main we want to use
6413-
create_main_type_indicator(ccx, takes_ivec);
6414-
ccx.main_fn = takes_ivec ? some(llfn_ivec) : some(llfn_vec);
6415-
6416-
fn create_main_wrapper_vec(ccx: &@crate_ctxt,
6417-
sp: &span,
6418-
main_llfn: ValueRef,
6419-
main_mode: main_mode) -> ValueRef {
6420-
6421-
let vecarg = {
6422-
mode: ty::mo_val,
6423-
ty: ty::mk_vec(ccx.tcx, {
6424-
ty: ty::mk_str(ccx.tcx),
6425-
mut: ast::imm
6426-
})
6427-
};
6428-
let llfty = type_of_fn(ccx, sp,
6429-
ast::proto_fn,
6430-
~[vecarg],
6431-
ty::mk_nil(ccx.tcx),
6432-
0u);
6433-
let llfdecl = decl_fastcall_fn(ccx.llmod, "_rust_main", llfty);
6434-
6435-
let fcx = new_fn_ctxt(new_local_ctxt(ccx), sp, llfdecl);
6436-
let bcx = new_top_block_ctxt(fcx);
6437-
6438-
if main_mode != mm_ivec {
6439-
let lloutputarg = llvm::LLVMGetParam(llfdecl, 0u);
6440-
let lltaskarg = llvm::LLVMGetParam(llfdecl, 1u);
6441-
let llenvarg = llvm::LLVMGetParam(llfdecl, 2u);
6442-
let llargvarg = llvm::LLVMGetParam(llfdecl, 3u);
6443-
let args = alt main_mode {
6444-
mm_nil. { ~[lloutputarg,
6445-
lltaskarg,
6446-
llenvarg] }
6447-
mm_vec. { ~[lloutputarg,
6448-
lltaskarg,
6449-
llenvarg,
6450-
llargvarg] }
6451-
};
6452-
bcx.build.FastCall(main_llfn, args);
6453-
}
6454-
build_return(bcx);
6455-
6456-
let lltop = bcx.llbb;
6457-
finish_fn(fcx, lltop);
6394+
let llfn = create_main(ccx, sp, main_llfn, main_takes_ivec);
6395+
create_main_type_indicator(ccx, main_takes_ivec);
6396+
ccx.main_fn = some(llfn);
64586397

6459-
ret llfdecl;
6460-
}
6461-
6462-
fn create_main_wrapper_ivec(ccx: &@crate_ctxt,
6463-
sp: &span,
6464-
main_llfn: ValueRef,
6465-
main_mode: main_mode) -> ValueRef {
6398+
fn create_main(ccx: &@crate_ctxt,
6399+
sp: &span,
6400+
main_llfn: ValueRef,
6401+
takes_ivec: bool) -> ValueRef {
64666402
let ivecarg = {
64676403
mode: ty::mo_val,
64686404
ty: ty::mk_ivec(ccx.tcx, {
@@ -6475,12 +6411,12 @@ fn create_main_wrapper(ccx: &@crate_ctxt, sp: &span,
64756411
~[ivecarg],
64766412
ty::mk_nil(ccx.tcx),
64776413
0u);
6478-
let llfdecl = decl_fastcall_fn(ccx.llmod, "_rust_main_ivec", llfty);
6414+
let llfdecl = decl_fastcall_fn(ccx.llmod, "_rust_main", llfty);
64796415

64806416
let fcx = new_fn_ctxt(new_local_ctxt(ccx), sp, llfdecl);
64816417
let bcx = new_top_block_ctxt(fcx);
64826418

6483-
if main_mode == mm_ivec {
6419+
if takes_ivec {
64846420
let lloutputarg = llvm::LLVMGetParam(llfdecl, 0u);
64856421
let lltaskarg = llvm::LLVMGetParam(llfdecl, 1u);
64866422
let llenvarg = llvm::LLVMGetParam(llfdecl, 2u);
@@ -6490,6 +6426,14 @@ fn create_main_wrapper(ccx: &@crate_ctxt, sp: &span,
64906426
llenvarg,
64916427
llargvarg];
64926428
bcx.build.FastCall(main_llfn, args);
6429+
} else {
6430+
let lloutputarg = llvm::LLVMGetParam(llfdecl, 0u);
6431+
let lltaskarg = llvm::LLVMGetParam(llfdecl, 1u);
6432+
let llenvarg = llvm::LLVMGetParam(llfdecl, 2u);
6433+
let args = ~[lloutputarg,
6434+
lltaskarg,
6435+
llenvarg];
6436+
bcx.build.FastCall(main_llfn, args);
64936437
}
64946438
build_return(bcx);
64956439

trunk/src/rt/main.ll.in

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,37 +17,20 @@
1717
; FIXME: Remove after main takes only ivec
1818
@_rust_main_is_ivec = external global i32
1919

20-
declare i32 @rust_start(i32, i32, i32, i32)
20+
declare i32 @rust_start(i32, i32, i32, i32, i32)
2121

22-
declare external fastcc void @_rust_main(i1* nocapture, %task*, %2* nocapture, %5*);
22+
declare external fastcc void @_rust_main(i1* nocapture, %task*, %2* nocapture, %ivec)
2323

24-
define void @_rust_main_wrap(i1* nocapture, %task *, %2* nocapture, %5 *)
25-
{
26-
tail call fastcc void @_rust_main(i1* %0, %task *%1, %2* nocapture %2, %5 *%3)
27-
ret void
28-
}
29-
30-
declare i32 @rust_start_ivec(i32, i32, i32, i32, i32)
31-
32-
declare external fastcc void @_rust_main_ivec(i1* nocapture, %task*, %2* nocapture, %ivec)
33-
34-
define void @_rust_main_wrap_ivec(i1* nocapture, %task *, %2* nocapture, %ivec *)
24+
define void @_rust_main_wrap(i1* nocapture, %task *, %2* nocapture, %ivec *)
3525
{
3626
%ivec = load %ivec *%3
37-
tail call fastcc void @_rust_main_ivec(i1* %0, %task *%1, %2* nocapture %2, %ivec %ivec)
27+
tail call fastcc void @_rust_main(i1* %0, %task *%1, %2* nocapture %2, %ivec %ivec)
3828
ret void
3929
}
4030

4131
define i32 @"MAIN"(i32, i32) {
4232
%is_ivec = load i32 *@_rust_main_is_ivec
43-
%is_ivec1 = trunc i32 %is_ivec to i1
44-
br i1 %is_ivec1, label %ivec, label %evec
4533

46-
evec:
47-
%3 = tail call i32 @rust_start(i32 ptrtoint (void (i1*, %task*, %2*, %5*)* @_rust_main_wrap to i32), i32 %0, i32 %1, i32 ptrtoint (%0* @_rust_crate_map_toplevel to i32))
34+
%3 = tail call i32 @rust_start(i32 ptrtoint (void (i1*, %task*, %2*, %ivec*)* @_rust_main_wrap to i32), i32 %0, i32 %1, i32 ptrtoint (%0* @_rust_crate_map_toplevel to i32), i32 %is_ivec)
4835
ret i32 %3
49-
50-
ivec:
51-
%4 = tail call i32 @rust_start_ivec(i32 ptrtoint (void (i1*, %task*, %2*, %ivec*)* @_rust_main_wrap_ivec to i32), i32 %0, i32 %1, i32 ptrtoint (%0* @_rust_crate_map_toplevel to i32), i32 %is_ivec)
52-
ret i32 %4
5336
}

trunk/src/rt/rust.cpp

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -59,31 +59,27 @@ command_line_args : public kernel_owned<command_line_args>
5959
// array here to ensure it survives to program-shutdown.
6060
args->ref();
6161

62+
size_t ivec_interior_sz =
63+
sizeof(size_t) * 2 + sizeof(rust_str *) * 4;
64+
args_ivec = (rust_ivec *)
65+
kernel->malloc(ivec_interior_sz,
66+
"command line arg interior");
67+
args_ivec->fill = 0;
68+
size_t ivec_exterior_sz = sizeof(rust_str *) * argc;
69+
args_ivec->alloc = ivec_exterior_sz;
6270
if (main_is_ivec) {
63-
size_t ivec_interior_sz =
64-
sizeof(size_t) * 2 + sizeof(rust_str *) * 4;
65-
args_ivec = (rust_ivec *)
66-
kernel->malloc(ivec_interior_sz,
67-
"command line arg interior");
68-
args_ivec->fill = 0;
69-
size_t ivec_exterior_sz = sizeof(rust_str *) * argc;
70-
args_ivec->alloc = ivec_exterior_sz;
7171
// NB: This is freed by some ivec machinery, probably the drop
7272
// glue in main, so we don't free it ourselves
7373
args_ivec->payload.ptr = (rust_ivec_heap *)
7474
kernel->malloc(ivec_exterior_sz + sizeof(size_t),
7575
"command line arg exterior");
7676
args_ivec->payload.ptr->fill = ivec_exterior_sz;
7777
memcpy(&args_ivec->payload.ptr->data, strs, ivec_exterior_sz);
78-
} else {
79-
args_ivec = NULL;
8078
}
8179
}
8280

8381
~command_line_args() {
84-
if (args_ivec) {
85-
kernel->free(args_ivec);
86-
}
82+
kernel->free(args_ivec);
8783
if (args) {
8884
// Drop the args we've had pinned here.
8985
rust_str **strs = (rust_str**) &args->data[0];
@@ -110,8 +106,8 @@ command_line_args : public kernel_owned<command_line_args>
110106
int check_claims = 0;
111107

112108
extern "C" CDECL int
113-
rust_start_ivec(uintptr_t main_fn, int argc, char **argv,
114-
void* crate_map, int main_is_ivec) {
109+
rust_start(uintptr_t main_fn, int argc, char **argv,
110+
void* crate_map, int main_takes_ivec) {
115111

116112
rust_env *env = load_env();
117113

@@ -126,21 +122,15 @@ rust_start_ivec(uintptr_t main_fn, int argc, char **argv,
126122
rust_scheduler *sched = root_task->sched;
127123
command_line_args *args
128124
= new (kernel, "main command line args")
129-
command_line_args(root_task, argc, argv, main_is_ivec);
125+
command_line_args(root_task, argc, argv, main_takes_ivec);
130126

131127
DLOG(sched, dom, "startup: %d args in 0x%" PRIxPTR,
132128
args->argc, (uintptr_t)args->args);
133129
for (int i = 0; i < args->argc; i++) {
134130
DLOG(sched, dom, "startup: arg[%d] = '%s'", i, args->argv[i]);
135131
}
136132

137-
if (main_is_ivec) {
138-
DLOG(sched, dom, "main takes ivec");
139-
root_task->start(main_fn, (uintptr_t)args->args_ivec);
140-
} else {
141-
DLOG(sched, dom, "main takes vec");
142-
root_task->start(main_fn, (uintptr_t)args->args);
143-
}
133+
root_task->start(main_fn, (uintptr_t)args->args_ivec);
144134
root_task->deref();
145135
root_task = NULL;
146136

@@ -160,10 +150,11 @@ rust_start_ivec(uintptr_t main_fn, int argc, char **argv,
160150
return ret;
161151
}
162152

153+
// FIXME: Transitional. Please remove.
163154
extern "C" CDECL int
164-
rust_start(uintptr_t main_fn, int argc, char **argv,
165-
void* crate_map) {
166-
return rust_start_ivec(main_fn, argc, argv, crate_map, 0);
155+
rust_start_ivec(uintptr_t main_fn, int argc, char **argv,
156+
void* crate_map, int main_takes_ivec) {
157+
return rust_start(main_fn, argc, argv, crate_map, main_takes_ivec);
167158
}
168159

169160

0 commit comments

Comments
 (0)