Skip to content

Commit ba0649c

Browse files
lhtgraydon
authored andcommitted
rustc: Hash includes direct dependent crates
1 parent f3c206c commit ba0649c

File tree

2 files changed

+36
-3
lines changed

2 files changed

+36
-3
lines changed

src/comp/back/link.rs

+11-3
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ mod write {
348348
* - Define CMETA as all the non-name, non-vers exported meta tags in the
349349
* crate (in sorted order).
350350
*
351-
* - Define CMH as hash(CMETA).
351+
* - Define CMH as hash(CMETA + hashes of dependent crates).
352352
*
353353
* - Compile our crate to lib CNAME-CMH-CVERS.so
354354
*
@@ -395,7 +395,8 @@ fn build_link_meta(sess: session::session, c: ast::crate, output: str,
395395

396396
// This calculates CMH as defined above
397397
fn crate_meta_extras_hash(sha: sha1, _crate: ast::crate,
398-
metas: provided_metas) -> str {
398+
metas: provided_metas,
399+
dep_hashes: [str]) -> str {
399400
fn len_and_str(s: str) -> str {
400401
ret #fmt["%u_%s", str::byte_len(s), s];
401402
}
@@ -421,6 +422,11 @@ fn build_link_meta(sess: session::session, c: ast::crate, output: str,
421422
}
422423
}
423424
}
425+
426+
for dh in dep_hashes {
427+
sha.input_str(len_and_str(dh));
428+
}
429+
424430
ret truncated_sha1_result(sha);
425431
}
426432

@@ -463,7 +469,9 @@ fn build_link_meta(sess: session::session, c: ast::crate, output: str,
463469
let provided_metas = provided_link_metas(sess, c);
464470
let name = crate_meta_name(sess, c, output, provided_metas);
465471
let vers = crate_meta_vers(sess, c, provided_metas);
466-
let extras_hash = crate_meta_extras_hash(sha, c, provided_metas);
472+
let dep_hashes = cstore::get_dep_hashes(sess.get_cstore());
473+
let extras_hash =
474+
crate_meta_extras_hash(sha, c, provided_metas, dep_hashes);
467475

468476
ret {name: name, vers: vers, extras_hash: extras_hash};
469477
}

src/comp/metadata/cstore.rs

+25
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ export add_used_link_args;
2020
export get_used_link_args;
2121
export add_use_stmt_cnum;
2222
export get_use_stmt_cnum;
23+
export get_dep_hashes;
24+
2325

2426
// A map from external crate numbers (as decoded from some crate file) to
2527
// 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 {
116118
ret p(cstore).use_crate_map.get(use_id);
117119
}
118120

121+
// returns hashes of crates directly used by this crate. Hashes are
122+
// sorted by crate name.
123+
fn get_dep_hashes(cstore: cstore) -> [str] {
124+
type crate_hash = {name: str, hash: str};
125+
let result = [];
126+
127+
p(cstore).use_crate_map.values {|cnum|
128+
let cdata = cstore::get_crate_data(cstore, cnum);
129+
let hash = decoder::get_crate_hash(cdata.data);
130+
log #fmt("Add hash[%s]: %s", cdata.name, hash);
131+
result += [{name: cdata.name, hash: hash}];
132+
};
133+
fn lteq(a: crate_hash, b: crate_hash) -> bool {
134+
ret a.name <= b.name;
135+
}
136+
let sorted = std::sort::merge_sort(lteq, result);
137+
log "sorted:";
138+
for x in sorted {
139+
log #fmt(" hash[%s]: %s", x.name, x.hash);
140+
}
141+
fn mapper(ch: crate_hash) -> str { ret ch.hash; }
142+
ret vec::map(mapper, sorted);
143+
}
119144
// Local Variables:
120145
// mode: rust
121146
// fill-column: 78;

0 commit comments

Comments
 (0)