]> git.lizzy.rs Git - rust.git/commitdiff
Optimize `write_metadata`.
authorNicholas Nethercote <nnethercote@mozilla.com>
Wed, 19 Oct 2016 01:06:46 +0000 (12:06 +1100)
committerNicholas Nethercote <nnethercote@mozilla.com>
Wed, 19 Oct 2016 03:00:48 +0000 (14:00 +1100)
`write_metadata` currently generates metadata unnecessarily in some
cases, and also compresses it unnecessarily in some cases. This commit
fixes that. It speeds up three of the rustc-benchmarks by 1--4%.

src/librustc_trans/base.rs

index 3caf8c9e4c3b85c94c5f7c5caab5225648bf7178..02aa7c069f9b3d478a2fc1ba5d38ca37fb85115c 100644 (file)
@@ -1250,12 +1250,27 @@ fn write_metadata(cx: &SharedCrateContext,
                   reachable_ids: &NodeSet) -> Vec<u8> {
     use flate;
 
-    let any_library = cx.sess()
-                        .crate_types
-                        .borrow()
-                        .iter()
-                        .any(|ty| *ty != config::CrateTypeExecutable);
-    if !any_library {
+    #[derive(PartialEq, Eq, PartialOrd, Ord)]
+    enum MetadataKind {
+        None,
+        Uncompressed,
+        Compressed
+    }
+
+    let kind = cx.sess().crate_types.borrow().iter().map(|ty| {
+        match *ty {
+            config::CrateTypeExecutable |
+            config::CrateTypeStaticlib |
+            config::CrateTypeCdylib => MetadataKind::None,
+
+            config::CrateTypeRlib => MetadataKind::Uncompressed,
+
+            config::CrateTypeDylib |
+            config::CrateTypeProcMacro => MetadataKind::Compressed,
+        }
+    }).max().unwrap();
+
+    if kind == MetadataKind::None {
         return Vec::new();
     }
 
@@ -1265,6 +1280,11 @@ fn write_metadata(cx: &SharedCrateContext,
                                           cx.link_meta(),
                                           reachable_ids,
                                           cx.mir_map());
+    if kind == MetadataKind::Uncompressed {
+        return metadata;
+    }
+
+    assert!(kind == MetadataKind::Compressed);
     let mut compressed = cstore.metadata_encoding_version().to_vec();
     compressed.extend_from_slice(&flate::deflate_bytes(&metadata));