From 460b92a37ff8b8a913c1d92c4755be66b3cee8aa Mon Sep 17 00:00:00 2001 From: Haitao Li Date: Mon, 9 Apr 2012 12:02:16 +0800 Subject: [PATCH 1/2] rustc: Declare rust_start as a function Issue #2167 --- src/rustc/middle/trans/base.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/rustc/middle/trans/base.rs b/src/rustc/middle/trans/base.rs index ed1c95dcd4a75..53a088d82aab3 100644 --- a/src/rustc/middle/trans/base.rs +++ b/src/rustc/middle/trans/base.rs @@ -4497,9 +4497,7 @@ fn create_main_wrapper(ccx: @crate_ctxt, sp: span, main_llfn: ValueRef, let crate_map = ccx.crate_map; let start_ty = T_fn([val_ty(rust_main), ccx.int_type, ccx.int_type, val_ty(crate_map)], ccx.int_type); - let start = str::as_c_str("rust_start", {|buf| - llvm::LLVMAddGlobal(ccx.llmod, start_ty, buf) - }); + let start = decl_cdecl_fn(ccx.llmod, "rust_start", start_ty); let args = [rust_main, llvm::LLVMGetParam(llfn, 0 as c_uint), llvm::LLVMGetParam(llfn, 1 as c_uint), crate_map]; let result = unsafe { From 46e4aaa0be9400ea9fedf59ce93b073ef8800339 Mon Sep 17 00:00:00 2001 From: Haitao Li Date: Mon, 9 Apr 2012 14:38:53 +0800 Subject: [PATCH 2/2] rustc: External fns declared as fns not global variables Issue #2167 --- src/rustc/middle/trans/base.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/rustc/middle/trans/base.rs b/src/rustc/middle/trans/base.rs index 53a088d82aab3..93f88b158c2a2 100644 --- a/src/rustc/middle/trans/base.rs +++ b/src/rustc/middle/trans/base.rs @@ -1772,11 +1772,17 @@ fn lval_no_env(bcx: block, val: ValueRef, kind: lval_kind) fn trans_external_path(ccx: @crate_ctxt, did: ast::def_id, t: ty::t) -> ValueRef { let name = csearch::get_symbol(ccx.sess.cstore, did); - let llty = alt ty::get(t).struct { - ty::ty_fn(_) { type_of_fn_from_ty(ccx, t) } - _ { type_of(ccx, t) } + alt ty::get(t).struct { + ty::ty_fn(_) { + let llty = type_of_fn_from_ty(ccx, t); + ret get_extern_fn(ccx.externs, ccx.llmod, name, + lib::llvm::CCallConv, llty); + } + _ { + let llty = type_of(ccx, t); + ret get_extern_const(ccx.externs, ccx.llmod, name, llty); + } }; - ret get_extern_const(ccx.externs, ccx.llmod, name, llty); } fn normalize_for_monomorphization(tcx: ty::ctxt, ty: ty::t) -> option { @@ -4498,6 +4504,7 @@ fn create_main_wrapper(ccx: @crate_ctxt, sp: span, main_llfn: ValueRef, let start_ty = T_fn([val_ty(rust_main), ccx.int_type, ccx.int_type, val_ty(crate_map)], ccx.int_type); let start = decl_cdecl_fn(ccx.llmod, "rust_start", start_ty); + let args = [rust_main, llvm::LLVMGetParam(llfn, 0 as c_uint), llvm::LLVMGetParam(llfn, 1 as c_uint), crate_map]; let result = unsafe {