aboutsummaryrefslogtreecommitdiff
path: root/src/comp
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2011-05-04 16:53:42 -0700
committerGraydon Hoare <[email protected]>2011-05-04 16:59:21 -0700
commitcdb68224054eddddb0c1d2519f9c12b654a6ff8f (patch)
treecf2adf7393a984ca1a96c73eddb43270aba1cca2 /src/comp
parentAdd *.pyc to .gitignore (diff)
downloadrust-cdb68224054eddddb0c1d2519f9c12b654a6ff8f.tar.xz
rust-cdb68224054eddddb0c1d2519f9c12b654a6ff8f.zip
Add a structure for passing option flags around the compiler, put it in session, and use it.
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/driver/rustc.rs111
-rw-r--r--src/comp/driver/session.rs31
-rw-r--r--src/comp/front/creader.rs5
-rw-r--r--src/comp/middle/metadata.rs4
-rw-r--r--src/comp/middle/trans.rs42
5 files changed, 106 insertions, 87 deletions
diff --git a/src/comp/driver/rustc.rs b/src/comp/driver/rustc.rs
index 6a37dece..061b5a14 100644
--- a/src/comp/driver/rustc.rs
+++ b/src/comp/driver/rustc.rs
@@ -78,50 +78,39 @@ fn time[T](bool do_it, str what, fn()->T thunk) -> T {
}
fn compile_input(session.session sess,
- eval.env env,
- str input, str output,
- bool shared,
- bool optimize,
- bool debuginfo,
- bool verify,
- bool save_temps,
- trans.output_type ot,
- bool time_passes,
- bool run_typestate,
- vec[str] library_search_paths) {
+ eval.env env,
+ str input, str output) {
+ auto time_passes = sess.get_opts().time_passes;
auto def = tup(0, 0);
auto p = parser.new_parser(sess, env, def, input, 0u);
auto crate = time[@ast.crate](time_passes, "parsing",
- bind parse_input(sess, p, input));
- if (ot == trans.output_type_none) {ret;}
+ bind parse_input(sess, p, input));
+ if (sess.get_opts().output_type == trans.output_type_none) {ret;}
crate = time[@ast.crate](time_passes, "external crate reading",
- bind creader.read_crates(sess, crate, library_search_paths));
+ bind creader.read_crates(sess, crate));
crate = time[@ast.crate](time_passes, "resolution",
- bind resolve.resolve_crate(sess, crate));
+ bind resolve.resolve_crate(sess, crate));
time[()](time_passes, "capture checking",
- bind capture.check_for_captures(sess, crate));
+ bind capture.check_for_captures(sess, crate));
auto ty_cx = ty.mk_ctxt(sess);
auto typeck_result =
time[typeck.typecheck_result](time_passes, "typechecking",
- bind typeck.check_crate(ty_cx, crate));
+ bind typeck.check_crate(ty_cx, crate));
crate = typeck_result._0;
auto type_cache = typeck_result._1;
- if (run_typestate) {
+ if (sess.get_opts().run_typestate) {
crate = time[@ast.crate](time_passes, "typestate checking",
bind typestate_check.check_crate(crate));
}
auto llmod = time[llvm.ModuleRef](time_passes, "translation",
- bind trans.trans_crate(sess, crate, ty_cx, type_cache, output,
- debuginfo, shared));
+ bind trans.trans_crate(sess, crate, ty_cx, type_cache, output));
time[()](time_passes, "LLVM passes",
- bind trans.run_passes(llmod, optimize, debuginfo,
- verify, save_temps, output,
- ot));
+ bind trans.run_passes(sess, llmod, output));
}
fn pretty_print_input(session.session sess,
@@ -133,7 +122,7 @@ fn pretty_print_input(session.session sess,
pretty.pprust.print_file(crate.node.module, input, std.io.stdout());
}
-fn usage(session.session sess, str argv0) {
+fn usage(str argv0) {
io.stdout().write_str(#fmt("usage: %s [options] <input>\n", argv0) + "
options:
@@ -166,17 +155,12 @@ fn get_os() -> session.os {
fn main(vec[str] args) {
// FIXME: don't hard-wire this.
- auto target_cfg = rec(os = get_os(),
- arch = session.arch_x86,
- int_type = common.ty_i32,
- uint_type = common.ty_u32,
- float_type = common.ty_f64 );
-
- auto crate_cache = common.new_int_hash[session.crate_metadata]();
- auto target_crate_num = 0;
- let vec[@ast.meta_item] md = vec();
- auto sess = session.session(target_crate_num, target_cfg, crate_cache,
- md, front.codemap.new_codemap());
+ let @session.config target_cfg =
+ @rec(os = get_os(),
+ arch = session.arch_x86,
+ int_type = common.ty_i32,
+ uint_type = common.ty_u32,
+ float_type = common.ty_f64);
auto opts = vec(optflag("h"), optflag("glue"),
optflag("pretty"), optflag("ls"), optflag("parse-only"),
@@ -187,11 +171,14 @@ fn main(vec[str] args) {
auto binary = _vec.shift[str](args);
auto match;
alt (GetOpts.getopts(args, opts)) {
- case (GetOpts.failure(?f)) { sess.err(GetOpts.fail_str(f)); fail; }
+ case (GetOpts.failure(?f)) {
+ log_err #fmt("error: %s", GetOpts.fail_str(f));
+ fail;
+ }
case (GetOpts.success(?m)) { match = m; }
}
if (opt_present(match, "h")) {
- usage(sess, binary);
+ usage(binary);
ret;
}
@@ -201,13 +188,13 @@ fn main(vec[str] args) {
auto shared = opt_present(match, "shared");
auto output_file = GetOpts.opt_maybe_str(match, "o");
auto library_search_paths = GetOpts.opt_strs(match, "L");
- auto ot = trans.output_type_bitcode;
+ auto output_type = trans.output_type_bitcode;
if (opt_present(match, "parse-only")) {
- ot = trans.output_type_none;
+ output_type = trans.output_type_none;
} else if (opt_present(match, "S")) {
- ot = trans.output_type_assembly;
+ output_type = trans.output_type_assembly;
} else if (opt_present(match, "c")) {
- ot = trans.output_type_object;
+ output_type = trans.output_type_object;
}
auto verify = !opt_present(match, "noverify");
auto save_temps = opt_present(match, "save-temps");
@@ -216,6 +203,25 @@ fn main(vec[str] args) {
auto debuginfo = opt_present(match, "g");
auto time_passes = opt_present(match, "time-passes");
auto run_typestate = !opt_present(match, "no-typestate");
+
+ let @session.options sopts =
+ @rec(shared = shared,
+ optimize = optimize,
+ debuginfo = debuginfo,
+ verify = verify,
+ run_typestate = run_typestate,
+ save_temps = save_temps,
+ time_passes = time_passes,
+ output_type = output_type,
+ library_search_paths = library_search_paths);
+
+ auto crate_cache = common.new_int_hash[session.crate_metadata]();
+ auto target_crate_num = 0;
+ let vec[@ast.meta_item] md = vec();
+ auto sess =
+ session.session(target_crate_num, target_cfg, sopts,
+ crate_cache, md, front.codemap.new_codemap());
+
auto n_inputs = _vec.len[str](match.free);
if (glue) {
@@ -223,7 +229,7 @@ fn main(vec[str] args) {
sess.err("No input files allowed with --glue.");
}
auto out = option.from_maybe[str]("glue.bc", output_file);
- middle.trans.make_common_glue(out, optimize, verify, save_temps, ot);
+ middle.trans.make_common_glue(sess, out);
ret;
}
@@ -244,18 +250,21 @@ fn main(vec[str] args) {
case (none[str]) {
let vec[str] parts = _str.split(ifile, '.' as u8);
_vec.pop[str](parts);
- parts += vec("bc");
+ alt (output_type) {
+ case (trans.output_type_none)
+ { parts += vec("pp"); }
+ case (trans.output_type_bitcode)
+ { parts += vec("bc"); }
+ case (trans.output_type_assembly)
+ { parts += vec("s"); }
+ case (trans.output_type_object)
+ { parts += vec("o"); }
+ }
auto ofile = _str.connect(parts, ".");
- compile_input(sess, env, ifile, ofile, shared,
- optimize, debuginfo, verify,
- save_temps, ot, time_passes,
- run_typestate, library_search_paths);
+ compile_input(sess, env, ifile, ofile);
}
case (some[str](?ofile)) {
- compile_input(sess, env, ifile, ofile, shared,
- optimize, debuginfo, verify,
- save_temps, ot, time_passes,
- run_typestate, library_search_paths);
+ compile_input(sess, env, ifile, ofile);
}
}
}
diff --git a/src/comp/driver/session.rs b/src/comp/driver/session.rs
index 501b50b1..ec924f51 100644
--- a/src/comp/driver/session.rs
+++ b/src/comp/driver/session.rs
@@ -19,11 +19,21 @@ tag arch {
arch_arm;
}
-type cfg = rec(os os,
- arch arch,
- ty_mach int_type,
- ty_mach uint_type,
- ty_mach float_type);
+type config = rec(os os,
+ arch arch,
+ ty_mach int_type,
+ ty_mach uint_type,
+ ty_mach float_type);
+
+type options = rec(bool shared,
+ bool optimize,
+ bool debuginfo,
+ bool verify,
+ bool run_typestate,
+ bool save_temps,
+ bool time_passes,
+ middle.trans.output_type output_type,
+ vec[str] library_search_paths);
type crate_metadata = rec(str name,
vec[u8] data);
@@ -47,13 +57,18 @@ fn emit_diagnostic(span sp, str msg, str kind, u8 color, codemap.codemap cm) {
io.stdout().write_str(#fmt(" %s\n", msg));
}
-state obj session(ast.crate_num cnum, cfg targ,
+state obj session(ast.crate_num cnum,
+ @config targ_cfg, @options opts,
map.hashmap[int, crate_metadata] crates,
mutable vec[@ast.meta_item] metadata,
codemap.codemap cm) {
- fn get_targ_cfg() -> cfg {
- ret targ;
+ fn get_targ_cfg() -> @config {
+ ret targ_cfg;
+ }
+
+ fn get_opts() -> @options {
+ ret opts;
}
fn get_targ_crate_num() -> ast.crate_num {
diff --git a/src/comp/front/creader.rs b/src/comp/front/creader.rs
index c8b31159..cdbafe5a 100644
--- a/src/comp/front/creader.rs
+++ b/src/comp/front/creader.rs
@@ -459,12 +459,11 @@ fn fold_view_item_use(&env e, &span sp, ast.ident ident,
// Reads external crates referenced by "use" directives.
fn read_crates(session.session sess,
- @ast.crate crate,
- vec[str] library_search_paths) -> @ast.crate {
+ @ast.crate crate) -> @ast.crate {
auto e = @rec(
sess=sess,
[email protected]_str_hash[int](),
- library_search_paths=library_search_paths,
+ library_search_paths=sess.get_opts().library_search_paths,
mutable next_crate_num=1
);
diff --git a/src/comp/middle/metadata.rs b/src/comp/middle/metadata.rs
index 2b4ad2a2..5f222cd4 100644
--- a/src/comp/middle/metadata.rs
+++ b/src/comp/middle/metadata.rs
@@ -687,9 +687,9 @@ fn encode_metadata(@trans.crate_ctxt cx, @ast.crate crate)
ret C_postr(string_w.get_str());
}
-fn write_metadata(@trans.crate_ctxt cx, bool shared, @ast.crate crate) {
+fn write_metadata(@trans.crate_ctxt cx, @ast.crate crate) {
auto llmeta = C_postr("");
- if (shared) {
+ if (cx.sess.get_opts().shared) {
llmeta = encode_metadata(cx, crate);
}
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 7e8e788e..7f9eebc8 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -116,8 +116,7 @@ state type crate_ctxt = rec(session.session sess,
std.sha1.sha1 sha,
hashmap[ty.t, str] type_sha1s,
hashmap[ty.t, metadata.ty_abbrev] type_abbrevs,
- ty.ctxt tcx,
- bool debuginfo);
+ ty.ctxt tcx);
type local_ctxt = rec(vec[str] path,
vec[str] module_path,
@@ -1787,7 +1786,7 @@ fn declare_generic_glue(@local_ctxt cx,
TypeRef llfnty,
str name) -> ValueRef {
auto fn_nm;
- if (cx.ccx.debuginfo) {
+ if (cx.ccx.sess.get_opts().debuginfo) {
fn_nm = mangle_name_by_type_only(cx.ccx, t, "glue_" + name);
fn_nm = sanitize(fn_nm);
} else {
@@ -7247,18 +7246,18 @@ fn is_object_or_assembly(output_type ot) -> bool {
ret false;
}
-fn run_passes(ModuleRef llmod, bool opt, bool dbg, bool verify,
- bool save_temps, str output, output_type ot) {
+fn run_passes(session.session sess, ModuleRef llmod, str output) {
auto pm = mk_pass_manager();
+ auto opts = sess.get_opts();
// TODO: run the linter here also, once there are llvm-c bindings for it.
// Generate a pre-optimization intermediate file if -save-temps was
// specified.
- if (save_temps) {
- alt (ot) {
+ if (opts.save_temps) {
+ alt (opts.output_type) {
case (output_type_bitcode) {
- if (opt) {
+ if (opts.optimize) {
auto filename = mk_intermediate_name(output, "no-opt.bc");
llvm.LLVMWriteBitcodeToFile(llmod, _str.buf(filename));
}
@@ -7274,7 +7273,7 @@ fn run_passes(ModuleRef llmod, bool opt, bool dbg, bool verify,
// available in the C api.
// FIXME2: We might want to add optmization levels like -O1, -O2, -Os, etc
// FIXME3: Should we expose and use the pass lists used by the opt tool?
- if (opt) {
+ if (opts.optimize) {
auto fpm = mk_pass_manager();
// createStandardFunctionPasses
@@ -7330,25 +7329,25 @@ fn run_passes(ModuleRef llmod, bool opt, bool dbg, bool verify,
llvm.LLVMAddConstantMergePass(pm.llpm);
}
- if (verify) {
+ if (opts.verify) {
llvm.LLVMAddVerifierPass(pm.llpm);
}
// TODO: Write .s if -c was specified and -save-temps was on.
- if (is_object_or_assembly(ot)) {
+ if (is_object_or_assembly(opts.output_type)) {
let int LLVMAssemblyFile = 0;
let int LLVMObjectFile = 1;
let int LLVMNullFile = 2;
auto FileType;
- if (ot == output_type_object) {
+ if (opts.output_type == output_type_object) {
FileType = LLVMObjectFile;
} else {
FileType = LLVMAssemblyFile;
}
// Write optimized bitcode if --save-temps was on.
- if (save_temps) {
- alt (ot) {
+ if (opts.save_temps) {
+ alt (opts.output_type) {
case (output_type_bitcode) { /* nothing to do */ }
case (_) {
auto filename = mk_intermediate_name(output, "opt.bc");
@@ -7712,8 +7711,7 @@ fn make_glues(ModuleRef llmod, type_names tn) -> @glue_fns {
vec_append_glue = make_vec_append_glue(llmod, tn));
}
-fn make_common_glue(str output, bool optimize, bool verify, bool save_temps,
- output_type ot) {
+fn make_common_glue(session.session sess, str output) {
// FIXME: part of this is repetitive and is probably a good idea
// to autogen it, but things like the memcpy implementation are not
// and it might be better to just check in a .ll file.
@@ -7739,7 +7737,7 @@ fn make_common_glue(str output, bool optimize, bool verify, bool save_temps,
trans_exit_task_glue(glues, new_str_hash[ValueRef](), tn, llmod);
- run_passes(llmod, optimize, false, verify, save_temps, output, ot);
+ run_passes(sess, llmod, output);
}
fn create_module_map(@crate_ctxt ccx) -> ValueRef {
@@ -7791,8 +7789,7 @@ fn create_crate_map(@crate_ctxt ccx) -> ValueRef {
}
fn trans_crate(session.session sess, @ast.crate crate, ty.ctxt tcx,
- ty.type_cache type_cache, str output,
- bool debuginfo, bool shared)
+ ty.type_cache type_cache, str output)
-> ModuleRef {
auto llmod =
llvm.LLVMModuleCreateWithNameInContext(_str.buf("rust_out"),
@@ -7842,8 +7839,7 @@ fn trans_crate(session.session sess, @ast.crate crate, ty.ctxt tcx,
sha = std.sha1.mk_sha1(),
type_sha1s = sha1s,
type_abbrevs = abbrevs,
- tcx = tcx,
- debuginfo = debuginfo);
+ tcx = tcx);
auto cx = new_local_ctxt(ccx);
create_typedefs(ccx);
@@ -7854,12 +7850,12 @@ fn trans_crate(session.session sess, @ast.crate crate, ty.ctxt tcx,
trans_mod(cx, crate.node.module);
trans_vec_append_glue(cx);
auto crate_map = create_crate_map(ccx);
- if (!shared) {
+ if (!sess.get_opts().shared) {
trans_main_fn(cx, crate_ptr, crate_map);
}
// Translate the metadata.
- middle.metadata.write_metadata(cx.ccx, shared, crate);
+ middle.metadata.write_metadata(cx.ccx, crate);
ret llmod;
}