diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs
index f85d1f1d825..a85d5f35b5a 100644
--- a/src/librustc/back/link.rs
+++ b/src/librustc/back/link.rs
@@ -208,8 +208,9 @@ pub mod write {
             // Emit the bytecode if we're either saving our temporaries or
             // emitting an rlib. Whenever an rlib is create, the bytecode is
             // inserted into the archive in order to allow LTO against it.
+            let outputs = sess.outputs.borrow();
             if sess.opts.save_temps ||
-               sess.outputs.iter().any(|&o| o == session::OutputRlib) {
+               outputs.get().iter().any(|&o| o == session::OutputRlib) {
                 output.with_extension("bc").with_c_str(|buf| {
                     llvm::LLVMWriteBitcodeToFile(llmod, buf);
                 })
@@ -745,7 +746,8 @@ pub fn link_binary(sess: Session,
                    out_filename: &Path,
                    lm: &LinkMeta) -> ~[Path] {
     let mut out_filenames = ~[];
-    for &output in sess.outputs.iter() {
+    let outputs = sess.outputs.borrow();
+    for &output in outputs.get().iter() {
         let out_file = link_binary_output(sess, trans, output, obj_filename,
                                           out_filename, lm);
         out_filenames.push(out_file);
diff --git a/src/librustc/back/lto.rs b/src/librustc/back/lto.rs
index 697b2a6686b..2425b36687e 100644
--- a/src/librustc/back/lto.rs
+++ b/src/librustc/back/lto.rs
@@ -20,7 +20,8 @@ use std::libc;
 pub fn run(sess: session::Session, llmod: ModuleRef,
            tm: TargetMachineRef, reachable: &[~str]) {
     // Make sure we actually can run LTO
-    for output in sess.outputs.iter() {
+    let outputs = sess.outputs.borrow();
+    for output in outputs.get().iter() {
         match *output {
             session::OutputExecutable | session::OutputStaticlib => {}
             _ => {
diff --git a/src/librustc/driver/driver.rs b/src/librustc/driver/driver.rs
index 9eff923e651..2b9acb1db9d 100644
--- a/src/librustc/driver/driver.rs
+++ b/src/librustc/driver/driver.rs
@@ -167,7 +167,7 @@ pub fn phase_2_configure_and_expand(sess: Session,
     let time_passes = sess.time_passes();
 
     sess.building_library.set(session::building_library(sess.opts, &crate));
-    *sess.outputs = session::collect_outputs(sess.opts, crate.attrs);
+    sess.outputs.set(session::collect_outputs(sess.opts, crate.attrs));
 
     time(time_passes, "gated feature checking", (), |_|
          front::feature_gate::check_crate(sess, &crate));
@@ -882,7 +882,7 @@ pub fn build_session_(sopts: @session::options,
         working_dir: os::getcwd(),
         lints: RefCell::new(HashMap::new()),
         node_id: Cell::new(1),
-        outputs: @mut ~[],
+        outputs: @RefCell::new(~[]),
     }
 }
 
diff --git a/src/librustc/driver/session.rs b/src/librustc/driver/session.rs
index 8bcefbd7c76..e3167dee068 100644
--- a/src/librustc/driver/session.rs
+++ b/src/librustc/driver/session.rs
@@ -215,7 +215,7 @@ pub struct Session_ {
     lints: RefCell<HashMap<ast::NodeId,
                            ~[(lint::lint, codemap::Span, ~str)]>>,
     node_id: Cell<ast::NodeId>,
-    outputs: @mut ~[OutputStyle],
+    outputs: @RefCell<~[OutputStyle]>,
 }
 
 pub type Session = @Session_;