From c83d61de936f2910001fe72de01ac58479d90524 Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Thu, 5 Apr 2012 18:22:53 -0700 Subject: [PATCH] Mangle exported names using node IDs rather than types Use node IDs rather than types to ensure exported names are unique. duplicate symbol. Closes #2074. --- src/rustc/back/link.rs | 11 +++++------ src/rustc/middle/trans/base.rs | 8 ++++---- src/test/run-pass/issue-2074.rs | 11 +++++++++++ 3 files changed, 20 insertions(+), 10 deletions(-) create mode 100644 src/test/run-pass/issue-2074.rs diff --git a/src/rustc/back/link.rs b/src/rustc/back/link.rs index 28bfcc04c4c0..dc4a732e7513 100644 --- a/src/rustc/back/link.rs +++ b/src/rustc/back/link.rs @@ -485,15 +485,14 @@ fn mangle(ss: path) -> str { n } -fn exported_name(path: path, hash: str, _vers: str) -> str { +fn exported_name(path: path, id: ast::node_id, _vers: str) -> str { // FIXME: versioning isn't working yet - ret mangle(path + [path_name(hash)]); // + "@" + vers; - + ret mangle(path + [path_name(int::str(id))]); // + "@" + vers; } -fn mangle_exported_name(ccx: @crate_ctxt, path: path, t: ty::t) -> str { - let hash = get_symbol_hash(ccx, t); - ret exported_name(path, hash, ccx.link_meta.vers); +fn mangle_exported_name(ccx: @crate_ctxt, path: path, id: ast::node_id) + -> str { + ret exported_name(path, id, ccx.link_meta.vers); } fn mangle_internal_name_by_type_only(ccx: @crate_ctxt, t: ty::t, name: str) -> diff --git a/src/rustc/middle/trans/base.rs b/src/rustc/middle/trans/base.rs index 7cd14b7af394..61458e6e25d0 100644 --- a/src/rustc/middle/trans/base.rs +++ b/src/rustc/middle/trans/base.rs @@ -1944,7 +1944,7 @@ fn monomorphic_fn(ccx: @crate_ctxt, fn_id: ast::def_id, real_substs: [ty::t], let llfty = type_of_fn_from_ty(ccx, mono_ty); let pt = *pt + [path_name(ccx.names(name))]; - let s = mangle_exported_name(ccx, pt, mono_ty); + let s = mangle_exported_name(ccx, pt, fn_id.node); let lldecl = decl_internal_cdecl_fn(ccx.llmod, s, llfty); ccx.monomorphized.insert(hash_id, lldecl); ccx.item_symbols.insert(fn_id.node, s); @@ -4454,7 +4454,7 @@ fn register_fn_full(ccx: @crate_ctxt, sp: span, path: path, fn register_fn_fuller(ccx: @crate_ctxt, sp: span, path: path, node_id: ast::node_id, node_type: ty::t, cc: lib::llvm::CallConv, llfty: TypeRef) -> ValueRef { - let ps: str = mangle_exported_name(ccx, path, node_type); + let ps: str = mangle_exported_name(ccx, path, node_id); let llfn: ValueRef = decl_fn(ccx.llmod, ps, cc, llfty); ccx.item_symbols.insert(node_id, ps); @@ -4583,7 +4583,7 @@ fn get_item_val(ccx: @crate_ctxt, id: ast::node_id) -> ValueRef { alt check i.node { ast::item_const(_, _) { let typ = ty::node_id_to_type(ccx.tcx, i.id); - let s = mangle_exported_name(ccx, my_path, typ); + let s = mangle_exported_name(ccx, my_path, i.id); let g = str::as_c_str(s, {|buf| llvm::LLVMAddGlobal(ccx.llmod, type_of(ccx, typ), buf) }); @@ -4670,7 +4670,7 @@ fn trans_constant(ccx: @crate_ctxt, it: @ast::item) { for vec::each(variants) {|variant| let p = path + [path_name(variant.node.name), path_name("discrim")]; - let s = mangle_exported_name(ccx, p, ty::mk_int(ccx.tcx)); + let s = mangle_exported_name(ccx, p, it.id); let disr_val = vi[i].disr_val; note_unique_llvm_symbol(ccx, s); let discrim_gvar = str::as_c_str(s, {|buf| diff --git a/src/test/run-pass/issue-2074.rs b/src/test/run-pass/issue-2074.rs new file mode 100644 index 000000000000..2f920e419a2c --- /dev/null +++ b/src/test/run-pass/issue-2074.rs @@ -0,0 +1,11 @@ +fn main(args: [str]) { + let one = fn@() -> uint { + enum r { a }; + ret a as uint; + }; + let two = fn@() -> uint { + enum r { a }; + ret a as uint; + }; + one(); two(); +}