diff options
| -rw-r--r-- | src/librustc/driver/driver.rs | 31 | ||||
| -rw-r--r-- | src/librustc/driver/session.rs | 6 | ||||
| -rw-r--r-- | src/librustc/middle/trans/build.rs | 5 | ||||
| -rw-r--r-- | src/librustc/middle/trans/builder.rs | 7 | ||||
| -rw-r--r-- | src/librustc/middle/trans/common.rs | 4 |
5 files changed, 34 insertions, 19 deletions
diff --git a/src/librustc/driver/driver.rs b/src/librustc/driver/driver.rs index cbc72b5a918..5edf7a3251c 100644 --- a/src/librustc/driver/driver.rs +++ b/src/librustc/driver/driver.rs @@ -27,6 +27,9 @@ use middle; use util::common::time; use util::ppaux; +use extra::json; +use serialize::Encodable; + use std::cell::{Cell, RefCell}; use std::hashmap::{HashMap,HashSet}; use std::io; @@ -154,7 +157,7 @@ pub enum Input { pub fn phase_1_parse_input(sess: Session, cfg: ast::CrateConfig, input: &Input) -> ast::Crate { - time(sess.time_passes(), "parsing", (), |_| { + let krate = time(sess.time_passes(), "parsing", (), |_| { match *input { FileInput(ref file) => { parse::parse_crate_from_file(&(*file), cfg.clone(), sess.parse_sess) @@ -166,7 +169,15 @@ pub fn phase_1_parse_input(sess: Session, cfg: ast::CrateConfig, input: &Input) sess.parse_sess) } } - }) + }); + + if sess.opts.debugging_opts & session::AST_JSON_NOEXPAND != 0 { + let mut stdout = io::stdout(); + let mut json = json::PrettyEncoder::new(&mut stdout); + krate.encode(&mut json); + } + + krate } // For continuing compilation after a parsed crate has been @@ -220,8 +231,16 @@ pub fn phase_2_configure_and_expand(sess: Session, krate = time(time_passes, "prelude injection", krate, |krate| front::std_inject::maybe_inject_prelude(sess, krate)); - time(time_passes, "assinging node ids and indexing ast", krate, |krate| - front::assign_node_ids_and_map::assign_node_ids_and_map(sess, krate)) + let (krate, map) = time(time_passes, "assinging node ids and indexing ast", krate, |krate| + front::assign_node_ids_and_map::assign_node_ids_and_map(sess, krate)); + + if sess.opts.debugging_opts & session::AST_JSON != 0 { + let mut stdout = io::stdout(); + let mut json = json::PrettyEncoder::new(&mut stdout); + krate.encode(&mut json); + } + + (krate, map) } pub struct CrateAnalysis { @@ -428,7 +447,7 @@ pub fn stop_after_phase_1(sess: Session) -> bool { debug!("invoked with --parse-only, returning early from compile_input"); return true; } - return false; + return sess.opts.debugging_opts & session::AST_JSON_NOEXPAND != 0; } pub fn stop_after_phase_2(sess: Session) -> bool { @@ -436,7 +455,7 @@ pub fn stop_after_phase_2(sess: Session) -> bool { debug!("invoked with --no-analysis, returning early from compile_input"); return true; } - return false; + return sess.opts.debugging_opts & session::AST_JSON != 0; } pub fn stop_after_phase_5(sess: Session) -> bool { diff --git a/src/librustc/driver/session.rs b/src/librustc/driver/session.rs index aff89974ca6..d43a68e4f87 100644 --- a/src/librustc/driver/session.rs +++ b/src/librustc/driver/session.rs @@ -65,7 +65,9 @@ debugging_opts!( GC, PRINT_LINK_ARGS, PRINT_LLVM_PASSES, - LTO + LTO, + AST_JSON, + AST_JSON_NOEXPAND ] 0 ) @@ -97,6 +99,8 @@ pub fn debugging_opts_map() -> ~[(&'static str, &'static str, u64)] { "Prints the llvm optimization passes being run", PRINT_LLVM_PASSES), ("lto", "Perform LLVM link-time optimizations", LTO), + ("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), ] } diff --git a/src/librustc/middle/trans/build.rs b/src/librustc/middle/trans/build.rs index e54b2ab29b2..e8424bcde60 100644 --- a/src/librustc/middle/trans/build.rs +++ b/src/librustc/middle/trans/build.rs @@ -20,7 +20,6 @@ use syntax::codemap::Span; use middle::trans::builder::Builder; use middle::trans::type_::Type; -use std::cast; use std::libc::{c_uint, c_ulonglong, c_char}; pub fn terminate(cx: &Block, _: &str) { @@ -623,9 +622,7 @@ pub fn Phi(cx: &Block, Ty: Type, vals: &[ValueRef], bbs: &[BasicBlockRef]) -> Va pub fn AddIncomingToPhi(phi: ValueRef, val: ValueRef, bb: BasicBlockRef) { unsafe { if llvm::LLVMIsUndef(phi) == lib::llvm::True { return; } - let valptr = cast::transmute(&val); - let bbptr = cast::transmute(&bb); - llvm::LLVMAddIncoming(phi, valptr, bbptr, 1 as c_uint); + llvm::LLVMAddIncoming(phi, &val, &bb, 1 as c_uint); } } diff --git a/src/librustc/middle/trans/builder.rs b/src/librustc/middle/trans/builder.rs index b8d16f9bb80..9dd92fbc45c 100644 --- a/src/librustc/middle/trans/builder.rs +++ b/src/librustc/middle/trans/builder.rs @@ -17,7 +17,6 @@ use middle::trans::base; use middle::trans::common::*; use middle::trans::machine::llalign_of_pref; use middle::trans::type_::Type; -use std::cast; use std::hashmap::HashMap; use std::libc::{c_uint, c_ulonglong, c_char}; use syntax::codemap::Span; @@ -30,10 +29,8 @@ pub struct Builder<'a> { // This is a really awful way to get a zero-length c-string, but better (and a // lot more efficient) than doing str::as_c_str("", ...) every time. pub fn noname() -> *c_char { - unsafe { - static cnull: uint = 0u; - cast::transmute(&cnull) - } + static cnull: c_char = 0; + &cnull as *c_char } impl<'a> Builder<'a> { diff --git a/src/librustc/middle/trans/common.rs b/src/librustc/middle/trans/common.rs index e29e6585783..27ad5998d8c 100644 --- a/src/librustc/middle/trans/common.rs +++ b/src/librustc/middle/trans/common.rs @@ -30,8 +30,6 @@ use util::ppaux::Repr; use arena::TypedArena; use std::c_str::ToCStr; -use std::cast::transmute; -use std::cast; use std::cell::{Cell, RefCell}; use std::hashmap::HashMap; use std::libc::{c_uint, c_longlong, c_ulonglong, c_char}; @@ -668,7 +666,7 @@ pub fn C_array(ty: Type, elts: &[ValueRef]) -> ValueRef { pub fn C_bytes(bytes: &[u8]) -> ValueRef { unsafe { - let ptr = cast::transmute(bytes.as_ptr()); + let ptr = bytes.as_ptr() as *c_char; return llvm::LLVMConstStringInContext(base::task_llcx(), ptr, bytes.len() as c_uint, True); } } |
