diff options
| author | Brian Anderson <banderson@mozilla.com> | 2011-08-17 16:50:49 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2011-08-18 13:09:49 -0700 |
| commit | c2d8a4df35a0a22d64d7d15ccd5fe25a495a2bc1 (patch) | |
| tree | efb0e83b03126a0fadd2b2d240e3217a860fcc92 /src/comp | |
| parent | 53eb4a30255fc6b3d6be700c10eb7248b0bad3a9 (diff) | |
| download | rust-c2d8a4df35a0a22d64d7d15ccd5fe25a495a2bc1.tar.gz rust-c2d8a4df35a0a22d64d7d15ccd5fe25a495a2bc1.zip | |
Continue transition to an ivec-only main
Only generate a single main function. Rename rust_start_ivec to rust_start, leaving a transitional rust_start_ivec in place.
Diffstat (limited to 'src/comp')
| -rw-r--r-- | src/comp/middle/trans.rs | 94 |
1 files changed, 19 insertions, 75 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index a18b495a7bb..6cfdf80a0f9 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -6385,84 +6385,20 @@ fn create_main_wrapper(ccx: &@crate_ctxt, sp: &span, ccx.sess.span_fatal(sp, "multiple 'main' functions"); } - tag main_mode { - mm_nil; - mm_vec; - mm_ivec; - }; - - let main_mode = alt ty::struct(ccx.tcx, main_node_type) { + let main_takes_ivec = alt ty::struct(ccx.tcx, main_node_type) { ty::ty_fn(_, args, _ ,_ ,_) { - if std::vec::len(args) == 0u { - mm_nil - } else { - alt ty::struct(ccx.tcx, args.(0).ty) { - ty::ty_ivec(_) { mm_ivec } - ty::ty_vec(_) { mm_vec } - } - } + std::vec::len(args) != 0u } }; - // Have to create two different main functions depending on whether - // main was declared to take vec or ivec - let llfn_vec = create_main_wrapper_vec(ccx, sp, main_llfn, main_mode); - let llfn_ivec = create_main_wrapper_ivec(ccx, sp, main_llfn, main_mode); - let takes_ivec = main_mode == mm_ivec; - // Create a global to tell main.ll which main we want to use - create_main_type_indicator(ccx, takes_ivec); - ccx.main_fn = takes_ivec ? some(llfn_ivec) : some(llfn_vec); - - fn create_main_wrapper_vec(ccx: &@crate_ctxt, - sp: &span, - main_llfn: ValueRef, - main_mode: main_mode) -> ValueRef { - - let vecarg = { - mode: ty::mo_val, - ty: ty::mk_vec(ccx.tcx, { - ty: ty::mk_str(ccx.tcx), - mut: ast::imm - }) - }; - let llfty = type_of_fn(ccx, sp, - ast::proto_fn, - ~[vecarg], - ty::mk_nil(ccx.tcx), - 0u); - let llfdecl = decl_fastcall_fn(ccx.llmod, "_rust_main", llfty); - - let fcx = new_fn_ctxt(new_local_ctxt(ccx), sp, llfdecl); - let bcx = new_top_block_ctxt(fcx); - - if main_mode != mm_ivec { - let lloutputarg = llvm::LLVMGetParam(llfdecl, 0u); - let lltaskarg = llvm::LLVMGetParam(llfdecl, 1u); - let llenvarg = llvm::LLVMGetParam(llfdecl, 2u); - let llargvarg = llvm::LLVMGetParam(llfdecl, 3u); - let args = alt main_mode { - mm_nil. { ~[lloutputarg, - lltaskarg, - llenvarg] } - mm_vec. { ~[lloutputarg, - lltaskarg, - llenvarg, - llargvarg] } - }; - bcx.build.FastCall(main_llfn, args); - } - build_return(bcx); - - let lltop = bcx.llbb; - finish_fn(fcx, lltop); + let llfn = create_main(ccx, sp, main_llfn, main_takes_ivec); + create_main_type_indicator(ccx, main_takes_ivec); + ccx.main_fn = some(llfn); - ret llfdecl; - } - - fn create_main_wrapper_ivec(ccx: &@crate_ctxt, - sp: &span, - main_llfn: ValueRef, - main_mode: main_mode) -> ValueRef { + fn create_main(ccx: &@crate_ctxt, + sp: &span, + main_llfn: ValueRef, + takes_ivec: bool) -> ValueRef { let ivecarg = { mode: ty::mo_val, ty: ty::mk_ivec(ccx.tcx, { @@ -6475,12 +6411,12 @@ fn create_main_wrapper(ccx: &@crate_ctxt, sp: &span, ~[ivecarg], ty::mk_nil(ccx.tcx), 0u); - let llfdecl = decl_fastcall_fn(ccx.llmod, "_rust_main_ivec", llfty); + let llfdecl = decl_fastcall_fn(ccx.llmod, "_rust_main", llfty); let fcx = new_fn_ctxt(new_local_ctxt(ccx), sp, llfdecl); let bcx = new_top_block_ctxt(fcx); - if main_mode == mm_ivec { + if takes_ivec { let lloutputarg = llvm::LLVMGetParam(llfdecl, 0u); let lltaskarg = llvm::LLVMGetParam(llfdecl, 1u); let llenvarg = llvm::LLVMGetParam(llfdecl, 2u); @@ -6490,6 +6426,14 @@ fn create_main_wrapper(ccx: &@crate_ctxt, sp: &span, llenvarg, llargvarg]; bcx.build.FastCall(main_llfn, args); + } else { + let lloutputarg = llvm::LLVMGetParam(llfdecl, 0u); + let lltaskarg = llvm::LLVMGetParam(llfdecl, 1u); + let llenvarg = llvm::LLVMGetParam(llfdecl, 2u); + let args = ~[lloutputarg, + lltaskarg, + llenvarg]; + bcx.build.FastCall(main_llfn, args); } build_return(bcx); |
