diff --git a/mk/prepare.mk b/mk/prepare.mk index 361b9c7ea9b453eaff5528d77bdcea424cf9a5ae..356ce2e908ed18e7a30b22f1ab2d244f1ac5718b 100644 --- a/mk/prepare.mk +++ b/mk/prepare.mk @@ -16,7 +16,7 @@ # # It requires the following variables to be set: # -# PREPARE_HOST - the host triple +# PREPARE_HOST - the host triple # PREPARE_TARGETS - the target triples, space separated # PREPARE_DEST_DIR - the directory to put the image @@ -172,7 +172,10 @@ prepare-target-$(2)-host-$(3)-$(1): \ $$(if $$(findstring $(2),$$(CFG_HOST)), \ $$(foreach crate,$$(HOST_CRATES), \ $$(TLIB$(1)_T_$(2)_H_$(3))/stamp.$$(crate)),) -# Only install if this host and target combo is being prepared +# Only install if this host and target combo is being prepared. Also be sure to +# *not* install the rlibs for host crates because there's no need to statically +# link against most of them. They just produce a large amount of extra size +# bloat. $$(if $$(findstring $(1), $$(PREPARE_STAGE)),\ $$(if $$(findstring $(2), $$(PREPARE_TARGETS)),\ $$(if $$(findstring $(3), $$(PREPARE_HOST)),\ @@ -182,8 +185,7 @@ prepare-target-$(2)-host-$(3)-$(1): \ $$(call PREPARE_LIB,$$(call CFG_RLIB_GLOB,$$(crate))))\ $$(if $$(findstring $(2),$$(CFG_HOST)),\ $$(foreach crate,$$(HOST_CRATES),\ - $$(call PREPARE_LIB,$$(call CFG_LIB_GLOB_$(2),$$(crate)))\ - $$(call PREPARE_LIB,$$(call CFG_RLIB_GLOB,$$(crate)))),)\ + $$(call PREPARE_LIB,$$(call CFG_LIB_GLOB_$(2),$$(crate)))),)\ $$(call PREPARE_LIB,libmorestack.a) \ $$(call PREPARE_LIB,libcompiler-rt.a),),),) endef diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs index a9d7d231cefd99ac117349a0e22e70dc180bda5c..bd0748761ee7ab376959bb7d4dc61cfdcf58b825 100644 --- a/src/librustc/back/link.rs +++ b/src/librustc/back/link.rs @@ -34,6 +34,7 @@ use std::str; use std::io; use std::io::fs; +use flate; use serialize::hex::ToHex; use extra::tempfile::TempDir; use syntax::abi; @@ -942,6 +943,15 @@ fn link_rlib(sess: Session, // For LTO purposes, the bytecode of this library is also inserted // into the archive. let bc = obj_filename.with_extension("bc"); + match fs::File::open(&bc).read_to_end().and_then(|data| { + fs::File::create(&bc).write(flate::deflate_bytes(data)) + }) { + Ok(()) => {} + Err(e) => { + sess.err(format!("failed to compress bytecode: {}", e)); + sess.abort_if_errors() + } + } a.add_file(&bc, false); if !sess.opts.cg.save_temps && !sess.opts.output_types.contains(&OutputTypeBitcode) { diff --git a/src/librustc/back/lto.rs b/src/librustc/back/lto.rs index b2440dcedbdcb6a52e1794898d0e7b88bc8523f4..75fde2fdc51403bde3a8e0ad26dcd5f2eaa24387 100644 --- a/src/librustc/back/lto.rs +++ b/src/librustc/back/lto.rs @@ -16,6 +16,7 @@ use util::common::time; use std::libc; +use flate; pub fn run(sess: session::Session, llmod: ModuleRef, tm: TargetMachineRef, reachable: &[~str]) { @@ -55,6 +56,8 @@ pub fn run(sess: session::Session, llmod: ModuleRef, let bc = time(sess.time_passes(), format!("read {}.bc", name), (), |_| archive.read(format!("{}.bc", name))); let bc = bc.expect("missing bytecode in archive!"); + let bc = time(sess.time_passes(), format!("inflate {}.bc", name), (), |_| + flate::inflate_bytes(bc)); let ptr = bc.as_ptr(); debug!("linking {}", name); time(sess.time_passes(), format!("ll link {}", name), (), |()| unsafe {