From 991d466c180d1c5733fc29d14f131d81e3d2db13 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 21 Feb 2014 10:54:00 -0800 Subject: [PATCH 1/2] rustc: Compress bytecode files in rlibs These are only ever used with LTO, so there's no need for reading them to be speedy. --- src/librustc/back/link.rs | 10 ++++++++++ src/librustc/back/lto.rs | 3 +++ 2 files changed, 13 insertions(+) diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs index a9d7d231cefd9..bd0748761ee7a 100644 --- a/src/librustc/back/link.rs +++ b/src/librustc/back/link.rs @@ -34,6 +34,7 @@ use std::run; 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 b2440dcedbdcb..75fde2fdc5140 100644 --- a/src/librustc/back/lto.rs +++ b/src/librustc/back/lto.rs @@ -16,6 +16,7 @@ use metadata::cstore; 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 { From 3cf0b9bd113e25b9b8020cff6ed7bcd82760473e Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 21 Feb 2014 10:55:30 -0800 Subject: [PATCH 2/2] mk: Don't install host rlibs You rarely want to statically link against librustc and friends, so there's no real reason to install the rlib version of these libraries, especially because the rlibs are massive. --- mk/prepare.mk | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/mk/prepare.mk b/mk/prepare.mk index 361b9c7ea9b45..356ce2e908ed1 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