diff options
Diffstat (limited to 'src/comp/driver/rustc.rs')
| -rw-r--r-- | src/comp/driver/rustc.rs | 102 |
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; |