aboutsummaryrefslogtreecommitdiff
path: root/src/comp
diff options
context:
space:
mode:
authorRafael Ávila de Espíndola <[email protected]>2010-12-29 11:21:16 -0500
committerRafael Ávila de Espíndola <[email protected]>2010-12-29 11:21:16 -0500
commit2c6dd18224a926ed0da365511e05fcb8e5e817a5 (patch)
treeb897fadd33635683d36112766e968316897c12f4 /src/comp
parentParse 'import' directives in rustc. (diff)
downloadrust-2c6dd18224a926ed0da365511e05fcb8e5e817a5.tar.xz
rust-2c6dd18224a926ed0da365511e05fcb8e5e817a5.zip
Add a -shared option to rustc and don't try to look for main if it is given.
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/driver/rustc.rs13
-rw-r--r--src/comp/middle/trans.rs7
2 files changed, 14 insertions, 6 deletions
diff --git a/src/comp/driver/rustc.rs b/src/comp/driver/rustc.rs
index 9c0b2484..6d4cd104 100644
--- a/src/comp/driver/rustc.rs
+++ b/src/comp/driver/rustc.rs
@@ -13,12 +13,13 @@ import std.option.none;
import std._str;
import std._vec;
-impure fn compile_input(session.session sess, str input, str output) {
+impure fn compile_input(session.session sess, str input, str output,
+ bool shared) {
auto p = parser.new_parser(sess, 0, input);
auto crate = parser.parse_crate(p);
crate = resolve.resolve_crate(sess, crate);
crate = typeck.check_crate(sess, crate);
- trans.trans_crate(sess, crate, output);
+ trans.trans_crate(sess, crate, output, shared);
}
fn warn_wrong_compiler() {
@@ -34,6 +35,7 @@ fn usage(session.session sess, str argv0) {
log "";
log " -o <filename> write output to <filename>";
log " -nowarn suppress wrong-compiler warning";
+ log " -shared compile a shared-library crate";
log " -h display this message";
log "";
log "";
@@ -59,6 +61,7 @@ impure fn main(vec[str] args) {
let option.t[str] input_file = none[str];
let option.t[str] output_file = none[str];
let bool do_warn = true;
+ let bool shared = false;
auto i = 1u;
auto len = _vec.len[str](args);
@@ -69,6 +72,8 @@ impure fn main(vec[str] args) {
if (_str.byte_len(arg) > 0u && arg.(0) == '-' as u8) {
if (_str.eq(arg, "-nowarn")) {
do_warn = false;
+ } else if (_str.eq(arg, "-shared")) {
+ shared = true;
} else {
// FIXME: rust could use an elif construct.
if (_str.eq(arg, "-o")) {
@@ -120,10 +125,10 @@ impure fn main(vec[str] args) {
parts = _vec.pop[str](parts);
parts += ".bc";
auto ofile = _str.concat(parts);
- compile_input(sess, ifile, ofile);
+ compile_input(sess, ifile, ofile, shared);
}
case (some[str](?ofile)) {
- compile_input(sess, ifile, ofile);
+ compile_input(sess, ifile, ofile, shared);
}
}
}
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 986e965e..2834463f 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -3055,7 +3055,8 @@ fn make_glues(ModuleRef llmod) -> @glue_fns {
no_op_type_glue = make_no_op_type_glue(llmod));
}
-fn trans_crate(session.session sess, @ast.crate crate, str output) {
+fn trans_crate(session.session sess, @ast.crate crate, str output,
+ bool shared) {
auto llmod =
llvm.LLVMModuleCreateWithNameInContext(_str.buf("rust_out"),
llvm.LLVMGetGlobalContext());
@@ -3095,7 +3096,9 @@ fn trans_crate(session.session sess, @ast.crate crate, str output) {
trans_mod(cx, crate.node.module);
trans_exit_task_glue(cx);
- trans_main_fn(cx, crate_constant(cx));
+ if (!shared) {
+ trans_main_fn(cx, crate_constant(cx));
+ }
check_module(llmod);