From 133200a6e293f6e74b14ddb6334fab11b13e0f46 Mon Sep 17 00:00:00 2001 From: Luqman Aden Date: Wed, 18 Sep 2013 17:44:04 -0400 Subject: [PATCH] libstd/librustc: Make the crate_map a weak symbol that libstd links against. --- src/librustc/middle/trans/base.rs | 13 +++++++------ src/libstd/rt/crate_map.rs | 3 ++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index 7cc38835ebc..762c658ea6e 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -2652,17 +2652,18 @@ pub fn get_item_val(ccx: @mut CrateContext, id: ast::NodeId) -> ValueRef { let path = vec::append((*pth).clone(), [path_name(ni.ident)]); foreign::register_foreign_item_fn(ccx, abis, &path, ni) } - ast::foreign_item_static(*) if attr::contains_name(ni.attrs, "crate_map") - => ccx.crate_map, ast::foreign_item_static(*) => { let ident = foreign::link_name(ccx, ni); - let g = do ident.with_c_str |buf| { - unsafe { + unsafe { + let g = do ident.with_c_str |buf| { let ty = type_of(ccx, ty); llvm::LLVMAddGlobal(ccx.llmod, ty.to_ref(), buf) + }; + if attr::contains_name(ni.attrs, "weak_linkage") { + lib::llvm::SetLinkage(g, lib::llvm::ExternalWeakLinkage); } - }; - g + g + } } } } diff --git a/src/libstd/rt/crate_map.rs b/src/libstd/rt/crate_map.rs index ee89df2bd96..f6ebb8bcdff 100644 --- a/src/libstd/rt/crate_map.rs +++ b/src/libstd/rt/crate_map.rs @@ -18,7 +18,8 @@ extern { #[cfg(not(stage0))] - #[crate_map] + #[weak_linkage] + #[link_name = "_rust_crate_map_toplevel"] static CRATE_MAP: CrateMap; } -- 2.44.0