From df90f57a5f76059394abd8328d30003b844cb497 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Thu, 21 Jul 2011 11:23:50 -0700 Subject: [PATCH] rustc: Avoid SHA-1 hashing every type, since they're interned --- src/comp/back/link.rs | 30 +++++------------------------- src/comp/middle/trans.rs | 8 ++++---- 2 files changed, 9 insertions(+), 29 deletions(-) diff --git a/src/comp/back/link.rs b/src/comp/back/link.rs index ab9f47e3cc02..098f7263005c 100644 --- a/src/comp/back/link.rs +++ b/src/comp/back/link.rs @@ -399,38 +399,18 @@ fn truncated_sha1_result(sha1 sha) -> str { ret str::substr(sha.result_str(), 0u, 16u); } - -// This calculates STH for a symbol, as defined above -fn symbol_hash(ty::ctxt tcx, sha1 sha, &ty::t t, - &link_meta link_meta) -> str { - // NB: do *not* use abbrevs here as we want the symbol names - // to be independent of one another in the crate. - +fn hash_link_meta(sha1 sha, &link_meta link_meta) -> str { sha.reset(); sha.input_str(link_meta.name); sha.input_str("-"); - // FIXME: This wants to be link_meta.meta_hash - sha.input_str(link_meta.name); + sha.input_str(link_meta.vers); sha.input_str("-"); - sha.input_str(encoder::encoded_ty(tcx, t)); - auto hash = truncated_sha1_result(sha); - // Prefix with _ so that it never blends into adjacent digits - - ret "_" + hash; + sha.input_str(link_meta.extras_hash); + ret truncated_sha1_result(sha); } fn get_symbol_hash(&@crate_ctxt ccx, &ty::t t) -> str { - auto hash = ""; - alt (ccx.type_sha1s.find(t)) { - case (some(?h)) { hash = h; } - case (none) { - hash = - symbol_hash(ccx.tcx, ccx.sha, t, - ccx.link_meta); - ccx.type_sha1s.insert(t, hash); - } - } - ret hash; + ret #fmt("_%s_%u", ccx.link_meta_hash, t); } fn mangle(&str[] ss) -> str { diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index fb79b3602527..f0e76658eb29 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -136,6 +136,7 @@ type crate_ctxt = hashmap[ast::node_id, str] item_symbols, mutable option::t[ValueRef] main_fn, link::link_meta link_meta, + str link_meta_hash, // TODO: hashmap[tup(tag_id,subtys), @tag_info] hashmap[ty::t, uint] tag_sizes, @@ -150,7 +151,6 @@ type crate_ctxt = @glue_fns glues, namegen names, std::sha1::sha1 sha, - hashmap[ty::t, str] type_sha1s, hashmap[ty::t, str] type_short_names, ty::ctxt tcx, stats stats, @@ -8601,9 +8601,9 @@ fn trans_crate(&session::session sess, &@ast::crate crate, &ty::ctxt tcx, auto tag_sizes = map::mk_hashmap[ty::t, uint](hasher, eqer); auto tydescs = map::mk_hashmap[ty::t, @tydesc_info](hasher, eqer); auto lltypes = map::mk_hashmap[ty::t, TypeRef](hasher, eqer); - auto sha1s = map::mk_hashmap[ty::t, str](hasher, eqer); auto short_names = map::mk_hashmap[ty::t, str](hasher, eqer); auto sha = std::sha1::mk_sha1(); + auto link_meta = link::build_link_meta(sess, *crate, output, sha); auto ccx = @rec(sess=sess, llmod=llmod, @@ -8615,7 +8615,8 @@ fn trans_crate(&session::session sess, &@ast::crate crate, &ty::ctxt tcx, ast_map=amap, item_symbols=new_int_hash[str](), mutable main_fn=none[ValueRef], - link_meta=link::build_link_meta(sess, *crate, output, sha), + link_meta=link_meta, + link_meta_hash=link::hash_link_meta(sha, link_meta), tag_sizes=tag_sizes, discrims=new_int_hash[ValueRef](), discrim_symbols=new_int_hash[str](), @@ -8628,7 +8629,6 @@ fn trans_crate(&session::session sess, &@ast::crate crate, &ty::ctxt tcx, glues=glues, names=namegen(0), sha=sha, - type_sha1s=sha1s, type_short_names=short_names, tcx=tcx, stats=rec(mutable n_static_tydescs=0u,