aboutsummaryrefslogtreecommitdiff
path: root/src/comp
diff options
context:
space:
mode:
authorMarijn Haverbeke <[email protected]>2011-04-18 16:18:55 +0200
committerMarijn Haverbeke <[email protected]>2011-04-18 16:21:49 +0200
commitf6be25a8705b40c2c5127b52479485d904d38b64 (patch)
treedc569bf01f47e01e70c8820a7a6341ac229154dd /src/comp
parentAdd a -c option. (diff)
downloadrust-f6be25a8705b40c2c5127b52479485d904d38b64.tar.xz
rust-f6be25a8705b40c2c5127b52479485d904d38b64.zip
Update foregoing patches to leave rust_crate alone.
Apparently it can't live in the main binary, since on non-Linux platforms, dynamics libs won't find symbols in the binary. This removes the crate_map pointer from rust_crate again, and instead passes it as an extra argument to rust_start. Rustboot doesn't pass this argument, but supposedly that's okay as long as we don't actually use it on that platform.
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/trans.rs22
1 files changed, 11 insertions, 11 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index db27a823..c7ad35b5 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -428,8 +428,7 @@ fn T_crate(type_names tn) -> TypeRef {
T_int(), // int n_rust_syms
T_int(), // int n_c_syms
T_int(), // int n_libs
- T_int(), // uintptr_t abi_tag
- T_int() // void* crate_map
+ T_int() // uintptr_t abi_tag
));
tn.associate(s, t);
ret t;
@@ -6624,8 +6623,7 @@ fn create_typedefs(@crate_ctxt cx) {
llvm.LLVMAddTypeName(cx.llmod, _str.buf("tydesc"), T_tydesc(cx.tn));
}
-fn create_crate_constant(ValueRef crate_ptr, @glue_fns glues,
- ValueRef crate_map) {
+fn create_crate_constant(ValueRef crate_ptr, @glue_fns glues) {
let ValueRef crate_addr = p2i(crate_ptr);
@@ -6653,8 +6651,7 @@ fn create_crate_constant(ValueRef crate_ptr, @glue_fns glues,
C_null(T_int()), // int n_rust_syms
C_null(T_int()), // int n_c_syms
C_null(T_int()), // int n_libs
- C_int(abi.abi_x86_rustc_fastcall), // uintptr_t abi_tag
- p2i(crate_map) // void* crate_map
+ C_int(abi.abi_x86_rustc_fastcall) // uintptr_t abi_tag
));
llvm.LLVMSetInitializer(crate_ptr, crate_val);
@@ -6684,9 +6681,9 @@ fn find_main_fn(@crate_ctxt cx) -> ValueRef {
fail;
}
-fn trans_main_fn(@local_ctxt cx, ValueRef llcrate) {
+fn trans_main_fn(@local_ctxt cx, ValueRef llcrate, ValueRef crate_map) {
auto T_main_args = vec(T_int(), T_int());
- auto T_rust_start_args = vec(T_int(), T_int(), T_int(), T_int());
+ auto T_rust_start_args = vec(T_int(), T_int(), T_int(), T_int(), T_int());
auto main_name;
if (_str.eq(std.os.target_os(), "win32")) {
@@ -6717,7 +6714,8 @@ fn trans_main_fn(@local_ctxt cx, ValueRef llcrate) {
llvm.LLVMAppendBasicBlock(llmain, _str.buf(""));
auto b = new_builder(llbb);
- auto start_args = vec(p2i(llrust_main), p2i(llcrate), llargc, llargv);
+ auto start_args = vec(p2i(llrust_main), p2i(llcrate), llargc, llargv,
+ p2i(crate_map));
b.Ret(b.Call(llrust_start, start_args));
}
@@ -7200,12 +7198,15 @@ fn make_common_glue(str output, bool optimize,
llvm.LLVMSetTarget(llmod, _str.buf(x86.get_target_triple()));
auto td = mk_target_data(x86.get_data_layout());
auto tn = mk_type_names();
+ let ValueRef crate_ptr =
+ llvm.LLVMAddGlobal(llmod, T_crate(tn), _str.buf("rust_crate"));
auto intrinsics = declare_intrinsics(llmod);
llvm.LLVMSetModuleInlineAsm(llmod, _str.buf(x86.get_module_asm()));
auto glues = make_glues(llmod, tn);
+ create_crate_constant(crate_ptr, glues);
make_memcpy_glue(glues.memcpy_glue);
make_bzero_glue(glues.bzero_glue);
@@ -7326,8 +7327,7 @@ fn trans_crate(session.session sess, @ast.crate crate,
trans_vec_append_glue(cx);
auto crate_map = create_crate_map(ccx);
if (!shared) {
- trans_main_fn(cx, crate_ptr);
- create_crate_constant(crate_ptr, ccx.glues, crate_map);
+ trans_main_fn(cx, crate_ptr, crate_map);
}
// Translate the metadata.