Skip to content

Commit 2f42b14

Browse files
committed
Use version and hash in crate_map name
Related issue #2137
1 parent 13686b6 commit 2f42b14

File tree

5 files changed

+57
-6
lines changed

5 files changed

+57
-6
lines changed

src/rustc/metadata/cstore.rs

+15-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
import std::map;
55
import std::map::hashmap;
6-
import syntax::ast;
6+
import syntax::{ast, attr};
77
import util::common::*;
88

99
export cstore::{};
@@ -12,6 +12,8 @@ export crate_metadata;
1212
export mk_cstore;
1313
export get_crate_data;
1414
export set_crate_data;
15+
export get_crate_hash;
16+
export get_crate_vers;
1517
export have_crate_data;
1618
export iter_crate_data;
1719
export add_used_crate_file;
@@ -79,6 +81,18 @@ fn get_crate_data(cstore: cstore, cnum: ast::crate_num) -> crate_metadata {
7981
ret p(cstore).metas.get(cnum);
8082
}
8183

84+
fn get_crate_hash(cstore: cstore, cnum: ast::crate_num) -> str {
85+
let cdata = get_crate_data(cstore, cnum);
86+
ret decoder::get_crate_hash(cdata.data);
87+
}
88+
89+
fn get_crate_vers(cstore: cstore, cnum: ast::crate_num) -> str {
90+
let cdata = get_crate_data(cstore, cnum);
91+
let attrs = decoder::get_crate_attributes(cdata.data);
92+
ret option::get(attr::meta_item_value_from_list(
93+
attr::find_linkage_metas(attrs), "vers"));
94+
}
95+
8296
fn set_crate_data(cstore: cstore, cnum: ast::crate_num,
8397
data: crate_metadata) {
8498
p(cstore).metas.insert(cnum, data);

src/rustc/middle/trans/base.rs

+9-5
Original file line numberDiff line numberDiff line change
@@ -4748,14 +4748,16 @@ fn create_module_map(ccx: @crate_ctxt) -> ValueRef {
47484748
}
47494749

47504750

4751-
fn decl_crate_map(sess: session::session, mapname: str,
4751+
fn decl_crate_map(sess: session::session, mapmeta: link::link_meta,
47524752
llmod: ModuleRef) -> ValueRef {
47534753
let targ_cfg = sess.targ_cfg;
47544754
let int_type = T_int(targ_cfg);
47554755
let mut n_subcrates = 1;
47564756
let cstore = sess.cstore;
47574757
while cstore::have_crate_data(cstore, n_subcrates) { n_subcrates += 1; }
4758-
let mapname = if sess.building_library { mapname } else { "toplevel" };
4758+
let mapname = if sess.building_library {
4759+
mapmeta.name + "_" + mapmeta.vers + "_" + mapmeta.extras_hash
4760+
} else { "toplevel" };
47594761
let sym_name = "_rust_crate_map_" + mapname;
47604762
let arrtype = T_array(int_type, n_subcrates as uint);
47614763
let maptype = T_struct([int_type, arrtype]);
@@ -4766,13 +4768,15 @@ fn decl_crate_map(sess: session::session, mapname: str,
47664768
ret map;
47674769
}
47684770

4769-
// FIXME use hashed metadata instead of crate names once we have that
47704771
fn fill_crate_map(ccx: @crate_ctxt, map: ValueRef) {
47714772
let mut subcrates: [ValueRef] = [];
47724773
let mut i = 1;
47734774
let cstore = ccx.sess.cstore;
47744775
while cstore::have_crate_data(cstore, i) {
4775-
let nm = "_rust_crate_map_" + cstore::get_crate_data(cstore, i).name;
4776+
let cdata = cstore::get_crate_data(cstore, i);
4777+
let nm = "_rust_crate_map_" + cdata.name +
4778+
"_" + cstore::get_crate_vers(cstore, i) +
4779+
"_" + cstore::get_crate_hash(cstore, i);
47764780
let cr = str::as_c_str(nm, {|buf|
47774781
llvm::LLVMAddGlobal(ccx.llmod, ccx.int_type, buf)
47784782
});
@@ -4857,7 +4861,7 @@ fn trans_crate(sess: session::session, crate: @ast::crate, tcx: ty::ctxt,
48574861
lib::llvm::associate_type(tn, "taskptr", taskptr_type);
48584862
let tydesc_type = T_tydesc(targ_cfg);
48594863
lib::llvm::associate_type(tn, "tydesc", tydesc_type);
4860-
let crate_map = decl_crate_map(sess, link_meta.name, llmod);
4864+
let crate_map = decl_crate_map(sess, link_meta, llmod);
48614865
let dbg_cx = if sess.opts.debuginfo {
48624866
option::some(debuginfo::mk_ctxt(llmod_id))
48634867
} else {

src/test/auxiliary/crateresolve3-1.rs

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#[link(name = "crateresolve3",
2+
vers = "0.1")];
3+
4+
#[crate_type = "lib"];
5+
6+
fn f() -> int { 10 }

src/test/auxiliary/crateresolve3-2.rs

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#[link(name = "crateresolve3",
2+
vers = "0.2")];
3+
4+
#[crate_type = "lib"];
5+
6+
fn g() -> int { 20 }

src/test/run-pass/crateresolve3.rs

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// xfail-fast
2+
// aux-build:crateresolve3-1.rs
3+
// aux-build:crateresolve3-2.rs
4+
5+
// verify able to link with crates with same name but different versions
6+
// as long as no name collision on invoked functions.
7+
8+
mod a {
9+
use crateresolve3(vers = "0.1");
10+
fn f() { assert crateresolve3::f() == 10; }
11+
}
12+
13+
mod b {
14+
use crateresolve3(vers = "0.2");
15+
fn f() { assert crateresolve3::g() == 20; }
16+
}
17+
18+
fn main() {
19+
a::f();
20+
b::f();
21+
}

0 commit comments

Comments
 (0)