From 7e87ea9fc5c3ab5d6c853e6d3ae0603f19526eb4 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Tue, 9 Dec 2014 15:25:49 +0530 Subject: [PATCH] librustc::session : Make DebuggingOpts use the options! macro --- .../middle/infer/region_inference/graphviz.rs | 3 +- src/librustc/session/config.rs | 202 +++++++----------- src/librustc/session/mod.rs | 31 ++- src/librustc_borrowck/borrowck/fragments.rs | 3 +- src/librustc_driver/driver.rs | 10 +- src/librustc_driver/lib.rs | 14 +- src/librustc_driver/pretty.rs | 17 +- src/librustc_driver/test.rs | 2 +- src/librustc_trans/back/link.rs | 2 +- src/librustc_trans/back/write.rs | 2 +- 10 files changed, 118 insertions(+), 168 deletions(-) diff --git a/src/librustc/middle/infer/region_inference/graphviz.rs b/src/librustc/middle/infer/region_inference/graphviz.rs index 29feaf358e2..0d6ab9c273b 100644 --- a/src/librustc/middle/infer/region_inference/graphviz.rs +++ b/src/librustc/middle/infer/region_inference/graphviz.rs @@ -22,7 +22,6 @@ use middle::ty; use super::Constraint; use middle::infer::SubregionOrigin; use middle::infer::region_inference::RegionVarBindings; -use session::config; use util::nodemap::{FnvHashMap, FnvHashSet}; use util::ppaux::Repr; @@ -55,7 +54,7 @@ pub fn maybe_print_constraints_for<'a, 'tcx>(region_vars: &RegionVarBindings<'a, subject_node: ast::NodeId) { let tcx = region_vars.tcx; - if !region_vars.tcx.sess.debugging_opt(config::PRINT_REGION_GRAPH) { + if !region_vars.tcx.sess.opts.debugging_opts.print_region_graph { return; } diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index a108982f031..ca24c1f56a0 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -99,7 +99,7 @@ pub struct Options { pub parse_only: bool, pub no_trans: bool, pub no_analysis: bool, - pub debugging_opts: u64, + pub debugging_opts: DebuggingOptions, /// Whether to write dependency files. It's (enabled, optional filename). pub write_dependency_info: (bool, Option), pub prints: Vec, @@ -224,7 +224,7 @@ pub fn basic_options() -> Options { parse_only: false, no_trans: false, no_analysis: false, - debugging_opts: 0, + debugging_opts: basic_debugging_options(), write_dependency_info: (false, None), prints: Vec::new(), cg: basic_codegen_options(), @@ -257,103 +257,6 @@ pub enum CrateType { CrateTypeStaticlib, } -macro_rules! debugging_opts { - ([ $opt:ident ] $cnt:expr ) => ( - pub const $opt: u64 = 1 << $cnt; - ); - ([ $opt:ident, $($rest:ident),* ] $cnt:expr ) => ( - pub const $opt: u64 = 1 << $cnt; - debugging_opts! { [ $($rest),* ] $cnt + 1 } - ) -} - -debugging_opts! { - [ - VERBOSE, - TIME_PASSES, - COUNT_LLVM_INSNS, - TIME_LLVM_PASSES, - TRANS_STATS, - ASM_COMMENTS, - NO_VERIFY, - BORROWCK_STATS, - NO_LANDING_PADS, - DEBUG_LLVM, - COUNT_TYPE_SIZES, - META_STATS, - GC, - PRINT_LINK_ARGS, - PRINT_LLVM_PASSES, - AST_JSON, - AST_JSON_NOEXPAND, - LS, - SAVE_ANALYSIS, - PRINT_MOVE_FRAGMENTS, - FLOWGRAPH_PRINT_LOANS, - FLOWGRAPH_PRINT_MOVES, - FLOWGRAPH_PRINT_ASSIGNS, - FLOWGRAPH_PRINT_ALL, - PRINT_REGION_GRAPH, - PARSE_ONLY, - NO_TRANS, - NO_ANALYSIS, - UNSTABLE_OPTIONS, - PRINT_ENUM_SIZES - ] - 0 -} - -pub fn debugging_opts_map() -> Vec<(&'static str, &'static str, u64)> { - vec![("verbose", "in general, enable more debug printouts", VERBOSE), - ("time-passes", "measure time of each rustc pass", TIME_PASSES), - ("count-llvm-insns", "count where LLVM \ - instrs originate", COUNT_LLVM_INSNS), - ("time-llvm-passes", "measure time of each LLVM pass", - TIME_LLVM_PASSES), - ("trans-stats", "gather trans statistics", TRANS_STATS), - ("asm-comments", "generate comments into the assembly (may change behavior)", - ASM_COMMENTS), - ("no-verify", "skip LLVM verification", NO_VERIFY), - ("borrowck-stats", "gather borrowck statistics", BORROWCK_STATS), - ("no-landing-pads", "omit landing pads for unwinding", - NO_LANDING_PADS), - ("debug-llvm", "enable debug output from LLVM", DEBUG_LLVM), - ("count-type-sizes", "count the sizes of aggregate types", - COUNT_TYPE_SIZES), - ("meta-stats", "gather metadata statistics", META_STATS), - ("print-link-args", "Print the arguments passed to the linker", - PRINT_LINK_ARGS), - ("gc", "Garbage collect shared data (experimental)", GC), - ("print-llvm-passes", - "Prints the llvm optimization passes being run", - PRINT_LLVM_PASSES), - ("ast-json", "Print the AST as JSON and halt", AST_JSON), - ("ast-json-noexpand", "Print the pre-expansion AST as JSON and halt", AST_JSON_NOEXPAND), - ("ls", "List the symbols defined by a library crate", LS), - ("save-analysis", "Write syntax and type analysis information \ - in addition to normal output", SAVE_ANALYSIS), - ("print-move-fragments", "Print out move-fragment data for every fn", - PRINT_MOVE_FRAGMENTS), - ("flowgraph-print-loans", "Include loan analysis data in \ - --pretty flowgraph output", FLOWGRAPH_PRINT_LOANS), - ("flowgraph-print-moves", "Include move analysis data in \ - --pretty flowgraph output", FLOWGRAPH_PRINT_MOVES), - ("flowgraph-print-assigns", "Include assignment analysis data in \ - --pretty flowgraph output", FLOWGRAPH_PRINT_ASSIGNS), - ("flowgraph-print-all", "Include all dataflow analysis data in \ - --pretty flowgraph output", FLOWGRAPH_PRINT_ALL), - ("print-region-graph", "Prints region inference graph. \ - Use with RUST_REGION_GRAPH=help for more info", - PRINT_REGION_GRAPH), - ("parse-only", "Parse only; do not compile, assemble, or link", PARSE_ONLY), - ("no-trans", "Run all passes except translation; no output", NO_TRANS), - ("no-analysis", "Parse and expand the source, but run no analysis and", - NO_ANALYSIS), - ("unstable-options", "Adds unstable command line options to rustc interface", - UNSTABLE_OPTIONS), - ("print-enum-sizes", "Print the size of enums and their variants", PRINT_ENUM_SIZES), - ] -} #[derive(Clone)] pub enum Passes { @@ -387,6 +290,7 @@ macro_rules! options { $($opt:ident : $t:ty = ($init:expr, $parse:ident, $desc:expr)),* ,) => ( #[derive(Clone)] + #[allow(missing_copy_implementations)] pub struct $struct_name { $(pub $opt: $t),* } pub fn $defaultfn() -> $struct_name { @@ -439,7 +343,7 @@ macro_rules! options { Option<&'static str>, &'static str)] = &[ $( (stringify!($opt), $mod_set::$opt, $mod_desc::$parse, $desc) ),* ]; - #[allow(non_upper_case_globals)] + #[allow(non_upper_case_globals, dead_code)] mod $mod_desc { pub const parse_bool: Option<&'static str> = None; pub const parse_opt_bool: Option<&'static str> = None; @@ -454,6 +358,7 @@ macro_rules! options { Some("a number"); } + #[allow(dead_code)] mod $mod_set { use super::{$struct_name, Passes, SomePasses, AllPasses}; @@ -608,6 +513,73 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options, "Optimize with possible levels 0-3"), } + +options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, + build_debugging_options, "Z", "debugging", + DB_OPTIONS, db_type_desc, dbsetters, + verbose: bool = (false, parse_bool, + "in general, enable more debug printouts"), + time_passes: bool = (false, parse_bool, + "measure time of each rustc pass"), + count_llvm_insns: bool = (false, parse_bool, + "count where LLVM instrs originate"), + time_llvm_passes: bool = (false, parse_bool, + "measure time of each LLVM pass"), + trans_stats: bool = (false, parse_bool, + "gather trans statistics"), + asm_comments: bool = (false, parse_bool, + "generate comments into the assembly (may change behavior)"), + no_verify: bool = (false, parse_bool, + "skip LLVM verification"), + borrowck_stats: bool = (false, parse_bool, + "gather borrowck statistics"), + no_landing_pads: bool = (false, parse_bool, + "omit landing pads for unwinding"), + debug_llvm: bool = (false, parse_bool, + "enable debug output from LLVM"), + count_type_sizes: bool = (false, parse_bool, + "count the sizes of aggregate types"), + meta_stats: bool = (false, parse_bool, + "gather metadata statistics"), + print_link_args: bool = (false, parse_bool, + "Print the arguments passed to the linker"), + gc: bool = (false, parse_bool, + "Garbage collect shared data (experimental)"), + print_llvm_passes: bool = (false, parse_bool, + "Prints the llvm optimization passes being run"), + ast_json: bool = (false, parse_bool, + "Print the AST as JSON and halt"), + ast_json_noexpand: bool = (false, parse_bool, + "Print the pre-expansion AST as JSON and halt"), + ls: bool = (false, parse_bool, + "List the symbols defined by a library crate"), + save_analysis: bool = (false, parse_bool, + "Write syntax and type analysis information in addition to normal output"), + print_move_fragments: bool = (false, parse_bool, + "Print out move-fragment data for every fn"), + flowgraph_print_loans: bool = (false, parse_bool, + "Include loan analysis data in --pretty flowgraph output"), + flowgraph_print_moves: bool = (false, parse_bool, + "Include move analysis data in --pretty flowgraph output"), + flowgraph_print_assigns: bool = (false, parse_bool, + "Include assignment analysis data in --pretty flowgraph output"), + flowgraph_print_all: bool = (false, parse_bool, + "Include all dataflow analysis data in --pretty flowgraph output"), + print_region_graph: bool = (false, parse_bool, + "Prints region inference graph. \ + Use with RUST_REGION_GRAPH=help for more info"), + parse_only: bool = (false, parse_bool, + "Parse only; do not compile, assemble, or link"), + no_trans: bool = (false, parse_bool, + "Run all passes except translation; no output"), + no_analysis: bool = (false, parse_bool, + "Parse and expand the source, but run no analysis"), + unstable_options: bool = (false, parse_bool, + "Adds unstable command line options to rustc interface"), + print_enum_sizes: bool = (false, parse_bool, + "Print the size of enums and their variants"), +} + pub fn default_lib_output() -> CrateType { CrateTypeRlib } @@ -883,52 +855,36 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options { } } - let mut debugging_opts = 0; - let debug_flags = matches.opt_strs("Z"); - let debug_map = debugging_opts_map(); - for debug_flag in debug_flags.iter() { - let mut this_bit = 0; - for &(name, _, bit) in debug_map.iter() { - if name == *debug_flag { - this_bit = bit; - break; - } - } - if this_bit == 0 { - early_error(&format!("unknown debug flag: {}", - *debug_flag)[]) - } - debugging_opts |= this_bit; - } + let debugging_opts = build_debugging_options(matches); let parse_only = if matches.opt_present("parse-only") { // FIXME(acrichto) remove this eventually early_warn("--parse-only is deprecated in favor of -Z parse-only"); true } else { - debugging_opts & PARSE_ONLY != 0 + debugging_opts.parse_only }; let no_trans = if matches.opt_present("no-trans") { // FIXME(acrichto) remove this eventually early_warn("--no-trans is deprecated in favor of -Z no-trans"); true } else { - debugging_opts & NO_TRANS != 0 + debugging_opts.no_trans }; let no_analysis = if matches.opt_present("no-analysis") { // FIXME(acrichto) remove this eventually early_warn("--no-analysis is deprecated in favor of -Z no-analysis"); true } else { - debugging_opts & NO_ANALYSIS != 0 + debugging_opts.no_analysis }; - if debugging_opts & DEBUG_LLVM != 0 { + if debugging_opts.debug_llvm { unsafe { llvm::LLVMSetDebug(1); } } let mut output_types = Vec::new(); - if !parse_only && !no_trans { + if !debugging_opts.parse_only && !no_trans { let unparsed_output_types = matches.opt_strs("emit"); for unparsed_output_type in unparsed_output_types.iter() { for part in unparsed_output_type.split(',') { @@ -998,7 +954,7 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options { } } }; - let gc = debugging_opts & GC != 0; + let gc = debugging_opts.gc; let debuginfo = if matches.opt_present("g") { if matches.opt_present("debuginfo") { early_error("-g and --debuginfo both provided"); diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index 65dac1a5fac..79e4d0f7aea 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -164,9 +164,6 @@ impl Session { pub fn diagnostic<'a>(&'a self) -> &'a diagnostic::SpanHandler { &self.parse_sess.span_diagnostic } - pub fn debugging_opt(&self, opt: u64) -> bool { - (self.opts.debugging_opts & opt) != 0 - } pub fn codemap<'a>(&'a self) -> &'a codemap::CodeMap { &self.parse_sess.span_diagnostic.cm } @@ -176,36 +173,36 @@ impl Session { self.span_bug(sp, &format!("impossible case reached: {}", msg)[]); } - pub fn verbose(&self) -> bool { self.debugging_opt(config::VERBOSE) } - pub fn time_passes(&self) -> bool { self.debugging_opt(config::TIME_PASSES) } + pub fn verbose(&self) -> bool { self.opts.debugging_opts.verbose } + pub fn time_passes(&self) -> bool { self.opts.debugging_opts.time_passes } pub fn count_llvm_insns(&self) -> bool { - self.debugging_opt(config::COUNT_LLVM_INSNS) + self.opts.debugging_opts.count_llvm_insns } pub fn count_type_sizes(&self) -> bool { - self.debugging_opt(config::COUNT_TYPE_SIZES) + self.opts.debugging_opts.count_type_sizes } pub fn time_llvm_passes(&self) -> bool { - self.debugging_opt(config::TIME_LLVM_PASSES) + self.opts.debugging_opts.time_llvm_passes } - pub fn trans_stats(&self) -> bool { self.debugging_opt(config::TRANS_STATS) } - pub fn meta_stats(&self) -> bool { self.debugging_opt(config::META_STATS) } - pub fn asm_comments(&self) -> bool { self.debugging_opt(config::ASM_COMMENTS) } - pub fn no_verify(&self) -> bool { self.debugging_opt(config::NO_VERIFY) } - pub fn borrowck_stats(&self) -> bool { self.debugging_opt(config::BORROWCK_STATS) } + pub fn trans_stats(&self) -> bool { self.opts.debugging_opts.trans_stats } + pub fn meta_stats(&self) -> bool { self.opts.debugging_opts.meta_stats } + pub fn asm_comments(&self) -> bool { self.opts.debugging_opts.asm_comments } + pub fn no_verify(&self) -> bool { self.opts.debugging_opts.no_verify } + pub fn borrowck_stats(&self) -> bool { self.opts.debugging_opts.borrowck_stats } pub fn print_llvm_passes(&self) -> bool { - self.debugging_opt(config::PRINT_LLVM_PASSES) + self.opts.debugging_opts.print_llvm_passes } pub fn lto(&self) -> bool { self.opts.cg.lto } pub fn no_landing_pads(&self) -> bool { - self.debugging_opt(config::NO_LANDING_PADS) + self.opts.debugging_opts.no_landing_pads } pub fn unstable_options(&self) -> bool { - self.debugging_opt(config::UNSTABLE_OPTIONS) + self.opts.debugging_opts.unstable_options } pub fn print_enum_sizes(&self) -> bool { - self.debugging_opt(config::PRINT_ENUM_SIZES) + self.opts.debugging_opts.print_enum_sizes } pub fn sysroot<'a>(&'a self) -> &'a Path { match self.opts.maybe_sysroot { diff --git a/src/librustc_borrowck/borrowck/fragments.rs b/src/librustc_borrowck/borrowck/fragments.rs index 1b120208217..e2942719f2a 100644 --- a/src/librustc_borrowck/borrowck/fragments.rs +++ b/src/librustc_borrowck/borrowck/fragments.rs @@ -19,7 +19,6 @@ use borrowck::LoanPathKind::{LpVar, LpUpvar, LpDowncast, LpExtend}; use borrowck::LoanPathElem::{LpDeref, LpInterior}; use borrowck::move_data::{InvalidMovePathIndex}; use borrowck::move_data::{MoveData, MovePathIndex}; -use rustc::session::config; use rustc::middle::ty; use rustc::middle::mem_categorization as mc; use rustc::util::ppaux::{Repr, UserString}; @@ -133,7 +132,7 @@ pub fn instrument_move_fragments<'tcx>(this: &MoveData<'tcx>, let span_err = attrs.iter().any(|a| a.check_name("rustc_move_fragments")); - let print = tcx.sess.debugging_opt(config::PRINT_MOVE_FRAGMENTS); + let print = tcx.sess.opts.debugging_opts.print_move_fragments; (span_err, print) }; diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs index 019691c1e10..c5ade686dfb 100644 --- a/src/librustc_driver/driver.rs +++ b/src/librustc_driver/driver.rs @@ -142,7 +142,7 @@ pub fn phase_1_parse_input(sess: &Session, cfg: ast::CrateConfig, input: &Input) } }); - if sess.opts.debugging_opts & config::AST_JSON_NOEXPAND != 0 { + if sess.opts.debugging_opts.ast_json_noexpand { println!("{}", json::as_json(&krate)); } @@ -334,7 +334,7 @@ pub fn assign_node_ids_and_map<'ast>(sess: &Session, let map = time(sess.time_passes(), "assigning node ids and indexing ast", forest, |forest| ast_map::map_crate(forest, NodeIdAssigner { sess: sess })); - if sess.opts.debugging_opts & config::AST_JSON != 0 { + if sess.opts.debugging_opts.ast_json { println!("{}", json::as_json(map.krate())); } @@ -484,7 +484,7 @@ pub fn phase_3_run_analysis_passes<'tcx>(sess: Session, } fn save_analysis(sess: &Session) -> bool { - (sess.opts.debugging_opts & config::SAVE_ANALYSIS) != 0 + sess.opts.debugging_opts.save_analysis } pub fn phase_save_analysis(sess: &Session, @@ -575,7 +575,7 @@ pub fn stop_after_phase_1(sess: &Session) -> bool { if sess.opts.show_span.is_some() { return true; } - return sess.opts.debugging_opts & config::AST_JSON_NOEXPAND != 0; + return sess.opts.debugging_opts.ast_json_noexpand; } pub fn stop_after_phase_2(sess: &Session) -> bool { @@ -583,7 +583,7 @@ pub fn stop_after_phase_2(sess: &Session) -> bool { debug!("invoked with --no-analysis, returning early from compile_input"); return true; } - return sess.opts.debugging_opts & config::AST_JSON != 0; + return sess.opts.debugging_opts.ast_json; } pub fn stop_after_phase_5(sess: &Session) -> bool { diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs index 27e1eaacdfd..c4ecb6b7b06 100644 --- a/src/librustc_driver/lib.rs +++ b/src/librustc_driver/lib.rs @@ -378,13 +378,13 @@ Available lint options: fn describe_debug_flags() { println!("\nAvailable debug options:\n"); - let r = config::debugging_opts_map(); - for tuple in r.iter() { - match *tuple { - (ref name, ref desc, _) => { - println!(" -Z {:>20} -- {}", *name, *desc); - } - } + for &(name, _, opt_type_desc, desc) in config::DB_OPTIONS.iter() { + let (width, extra) = match opt_type_desc { + Some(..) => (21, "=val"), + None => (25, "") + }; + println!(" -Z {:>width$}{} -- {}", name.replace("_", "-"), + extra, desc, width=width); } } diff --git a/src/librustc_driver/pretty.rs b/src/librustc_driver/pretty.rs index 7592fbc05b3..1765c80f943 100644 --- a/src/librustc_driver/pretty.rs +++ b/src/librustc_driver/pretty.rs @@ -23,7 +23,7 @@ use rustc::middle::ty; use rustc::middle::cfg; use rustc::middle::cfg::graphviz::LabelledCFG; use rustc::session::Session; -use rustc::session::config::{self, Input}; +use rustc::session::config::Input; use rustc::util::ppaux; use rustc_borrowck as borrowck; use rustc_borrowck::graphviz as borrowck_dot; @@ -305,19 +305,18 @@ impl<'tcx> pprust::PpAnn for TypedAnnotation<'tcx> { } fn gather_flowgraph_variants(sess: &Session) -> Vec { - let print_loans = config::FLOWGRAPH_PRINT_LOANS; - let print_moves = config::FLOWGRAPH_PRINT_MOVES; - let print_assigns = config::FLOWGRAPH_PRINT_ASSIGNS; - let print_all = config::FLOWGRAPH_PRINT_ALL; - let opt = |&: print_which| sess.debugging_opt(print_which); + let print_loans = sess.opts.debugging_opts.flowgraph_print_loans; + let print_moves = sess.opts.debugging_opts.flowgraph_print_moves; + let print_assigns = sess.opts.debugging_opts.flowgraph_print_assigns; + let print_all = sess.opts.debugging_opts.flowgraph_print_all; let mut variants = Vec::new(); - if opt(print_all) || opt(print_loans) { + if print_all || print_loans { variants.push(borrowck_dot::Loans); } - if opt(print_all) || opt(print_moves) { + if print_all || print_moves { variants.push(borrowck_dot::Moves); } - if opt(print_all) || opt(print_assigns) { + if print_all || print_assigns { variants.push(borrowck_dot::Assigns); } variants diff --git a/src/librustc_driver/test.rs b/src/librustc_driver/test.rs index a798ec9aaf7..f68c76f4c44 100644 --- a/src/librustc_driver/test.rs +++ b/src/librustc_driver/test.rs @@ -99,7 +99,7 @@ fn test_env(source_string: &str, { let mut options = config::basic_options(); - options.debugging_opts |= config::VERBOSE; + options.debugging_opts.verbose = true; let codemap = CodeMap::new(); let diagnostic_handler = diff --git a/src/librustc_trans/back/link.rs b/src/librustc_trans/back/link.rs index 43f8c677e30..351be70cf52 100644 --- a/src/librustc_trans/back/link.rs +++ b/src/librustc_trans/back/link.rs @@ -778,7 +778,7 @@ fn link_natively(sess: &Session, trans: &CrateTranslation, dylib: bool, cmd.arg("-lcompiler-rt"); } - if (sess.opts.debugging_opts & config::PRINT_LINK_ARGS) != 0 { + if sess.opts.debugging_opts.print_link_args { println!("{}", &cmd); } diff --git a/src/librustc_trans/back/write.rs b/src/librustc_trans/back/write.rs index e0ba6d569cc..c818dda7581 100644 --- a/src/librustc_trans/back/write.rs +++ b/src/librustc_trans/back/write.rs @@ -715,7 +715,7 @@ pub fn run_passes(sess: &Session, cmd.args(&sess.target.target.options.post_link_args[]); - if (sess.opts.debugging_opts & config::PRINT_LINK_ARGS) != 0 { + if sess.opts.debugging_opts.print_link_args { println!("{}", &cmd); }