]> git.lizzy.rs Git - rust.git/commitdiff
rustc: Hash includes direct dependent crates
authorHaitao Li <lihaitao@gmail.com>
Sun, 11 Dec 2011 15:42:32 +0000 (23:42 +0800)
committerGraydon Hoare <graydon@mozilla.com>
Tue, 13 Dec 2011 00:15:29 +0000 (16:15 -0800)
src/comp/back/link.rs
src/comp/metadata/cstore.rs

index 36a6daeff81f4df2b64a73afb538c461a0ef0e89..ed0ddad7fe2001e64d28b1d6e5b8c525d33fab57 100644 (file)
@@ -348,7 +348,7 @@ fn run_passes(sess: session::session, llmod: ModuleRef, output: str) {
  *  - Define CMETA as all the non-name, non-vers exported meta tags in the
  *    crate (in sorted order).
  *
- *  - Define CMH as hash(CMETA).
+ *  - Define CMH as hash(CMETA + hashes of dependent crates).
  *
  *  - Compile our crate to lib CNAME-CMH-CVERS.so
  *
@@ -395,7 +395,8 @@ fn provided_link_metas(sess: session::session, c: ast::crate) ->
 
     // This calculates CMH as defined above
     fn crate_meta_extras_hash(sha: sha1, _crate: ast::crate,
-                              metas: provided_metas) -> str {
+                              metas: provided_metas,
+                              dep_hashes: [str]) -> str {
         fn len_and_str(s: str) -> str {
             ret #fmt["%u_%s", str::byte_len(s), s];
         }
@@ -421,6 +422,11 @@ fn len_and_str_lit(l: ast::lit) -> str {
               }
             }
         }
+
+        for dh in dep_hashes {
+            sha.input_str(len_and_str(dh));
+        }
+
         ret truncated_sha1_result(sha);
     }
 
@@ -463,7 +469,9 @@ fn crate_meta_vers(sess: session::session, _crate: ast::crate,
     let provided_metas = provided_link_metas(sess, c);
     let name = crate_meta_name(sess, c, output, provided_metas);
     let vers = crate_meta_vers(sess, c, provided_metas);
-    let extras_hash = crate_meta_extras_hash(sha, c, provided_metas);
+    let dep_hashes = cstore::get_dep_hashes(sess.get_cstore());
+    let extras_hash =
+        crate_meta_extras_hash(sha, c, provided_metas, dep_hashes);
 
     ret {name: name, vers: vers, extras_hash: extras_hash};
 }
index c0f8588c8a2fba70aad94621612d503f57f5ee93..e7ca671fea89092c4217ee84e9804786183b0ee0 100644 (file)
@@ -20,6 +20,8 @@
 export get_used_link_args;
 export add_use_stmt_cnum;
 export get_use_stmt_cnum;
+export get_dep_hashes;
+
 
 // A map from external crate numbers (as decoded from some crate file) to
 // local crate numbers (as generated during this session). Each external
@@ -116,6 +118,29 @@ fn get_use_stmt_cnum(cstore: cstore, use_id: ast::node_id) -> ast::crate_num {
     ret p(cstore).use_crate_map.get(use_id);
 }
 
+// returns hashes of crates directly used by this crate. Hashes are
+// sorted by crate name.
+fn get_dep_hashes(cstore: cstore) -> [str] {
+    type crate_hash = {name: str, hash: str};
+    let result = [];
+
+    p(cstore).use_crate_map.values {|cnum|
+        let cdata = cstore::get_crate_data(cstore, cnum);
+        let hash = decoder::get_crate_hash(cdata.data);
+        log #fmt("Add hash[%s]: %s", cdata.name, hash);
+        result += [{name: cdata.name, hash: hash}];
+    };
+    fn lteq(a: crate_hash, b: crate_hash) -> bool {
+        ret a.name <= b.name;
+    }
+    let sorted = std::sort::merge_sort(lteq, result);
+    log "sorted:";
+    for x in sorted {
+        log #fmt("  hash[%s]: %s", x.name, x.hash);
+    }
+    fn mapper(ch: crate_hash) -> str { ret ch.hash; }
+    ret vec::map(mapper, sorted);
+}
 // Local Variables:
 // mode: rust
 // fill-column: 78;