aboutsummaryrefslogtreecommitdiff
path: root/src/comp/driver/rustc.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/comp/driver/rustc.rs')
-rw-r--r--src/comp/driver/rustc.rs102
1 files changed, 70 insertions, 32 deletions
diff --git a/src/comp/driver/rustc.rs b/src/comp/driver/rustc.rs
index 004c9d4c..7ad0cdc7 100644
--- a/src/comp/driver/rustc.rs
+++ b/src/comp/driver/rustc.rs
@@ -2,6 +2,7 @@
import front.parser;
import front.token;
+import front.eval;
import middle.trans;
import middle.resolve;
import middle.typeck;
@@ -13,6 +14,30 @@ import std.option.none;
import std._str;
import std._vec;
+fn default_environment(session.session sess,
+ str argv0,
+ str input) -> eval.env {
+
+ auto libc = "libc.so";
+ alt (sess.get_targ_cfg().os) {
+ case (session.os_win32) { libc = "msvcrt.dll"; }
+ case (session.os_macos) { libc = "libc.dylib"; }
+ case (session.os_linux) { libc = "libc.so.6"; }
+ }
+
+ ret
+ vec(
+ // Target bindings.
+ tup("target_os", eval.val_str(std.os.target_os())),
+ tup("target_arch", eval.val_str("x86")),
+ tup("target_libc", eval.val_str(libc)),
+
+ // Build bindings.
+ tup("build_compiler", eval.val_str(argv0)),
+ tup("build_input", eval.val_str(input))
+ );
+}
+
impure fn parse_input(session.session sess,
parser.parser p,
str input) -> @front.ast.crate {
@@ -25,20 +50,30 @@ impure fn parse_input(session.session sess,
fail;
}
-impure fn compile_input(session.session sess, str input, str output,
+impure fn compile_input(session.session sess,
+ eval.env env,
+ str input, str output,
bool shared) {
- auto p = parser.new_parser(sess, 0, input);
+ auto p = parser.new_parser(sess, env, 0, input);
auto crate = parse_input(sess, p, input);
crate = resolve.resolve_crate(sess, crate);
crate = typeck.check_crate(sess, crate);
trans.trans_crate(sess, crate, output, shared);
}
+impure fn pretty_print_input(session.session sess,
+ eval.env env,
+ str input) {
+ auto p = front.parser.new_parser(sess, env, 0, input);
+ auto crate = front.parser.parse_crate_from_source_file(p);
+ pretty.pprust.print_ast(crate.node.module);
+}
+
fn warn_wrong_compiler() {
log "This is the rust 'self-hosted' compiler.";
log "The one written in rust.";
log "It is currently incomplete.";
- log "You may want rustboot insteaad, the compiler next door.";
+ log "You may want rustboot instead, the compiler next door.";
}
fn usage(session.session sess, str argv0) {
@@ -48,6 +83,7 @@ fn usage(session.session sess, str argv0) {
log " -o <filename> write output to <filename>";
log " -nowarn suppress wrong-compiler warning";
log " -shared compile a shared-library crate";
+ log " -pp pretty-print the input instead of compiling";
log " -h display this message";
log "";
log "";
@@ -74,6 +110,7 @@ impure fn main(vec[str] args) {
let option.t[str] output_file = none[str];
let bool do_warn = true;
let bool shared = false;
+ let bool pretty = false;
auto i = 1u;
auto len = _vec.len[str](args);
@@ -86,24 +123,21 @@ impure fn main(vec[str] args) {
do_warn = false;
} else if (_str.eq(arg, "-shared")) {
shared = true;
- } else {
- // FIXME: rust could use an elif construct.
- if (_str.eq(arg, "-o")) {
- if (i+1u < len) {
- output_file = some(args.(i+1u));
- i += 1u;
- } else {
- usage(sess, args.(0));
- sess.err("-o requires an argument");
- }
+ } else if (_str.eq(arg, "-pp")) {
+ pretty = true;
+ } else if (_str.eq(arg, "-o")) {
+ if (i+1u < len) {
+ output_file = some(args.(i+1u));
+ i += 1u;
} else {
- if (_str.eq(arg, "-h")) {
- usage(sess, args.(0));
- } else {
- usage(sess, args.(0));
- sess.err("unrecognized option: " + arg);
- }
+ usage(sess, args.(0));
+ sess.err("-o requires an argument");
}
+ } else if (_str.eq(arg, "-h")) {
+ usage(sess, args.(0));
+ } else {
+ usage(sess, args.(0));
+ sess.err("unrecognized option: " + arg);
}
} else {
alt (input_file) {
@@ -115,8 +149,6 @@ impure fn main(vec[str] args) {
input_file = some[str](arg);
}
}
- // FIXME: dummy node to work around typestate mis-wiring bug.
- i = i;
}
i += 1u;
}
@@ -131,23 +163,29 @@ impure fn main(vec[str] args) {
sess.err("no input filename");
}
case (some[str](?ifile)) {
- alt (output_file) {
- case (none[str]) {
- let vec[str] parts = _str.split(ifile, '.' as u8);
- parts = _vec.pop[str](parts);
- parts += ".bc";
- auto ofile = _str.concat(parts);
- compile_input(sess, ifile, ofile, shared);
- }
- case (some[str](?ofile)) {
- compile_input(sess, ifile, ofile, shared);
+
+ auto env = default_environment(sess, args.(0), ifile);
+ if (pretty) {
+ pretty_print_input(sess, env, ifile);
+ }
+ else {
+ alt (output_file) {
+ case (none[str]) {
+ let vec[str] parts = _str.split(ifile, '.' as u8);
+ parts = _vec.pop[str](parts);
+ parts += ".bc";
+ auto ofile = _str.concat(parts);
+ compile_input(sess, env, ifile, ofile, shared);
+ }
+ case (some[str](?ofile)) {
+ compile_input(sess, env, ifile, ofile, shared);
+ }
}
}
}
}
}
-
// Local Variables:
// mode: rust
// fill-column: 78;