From 892b50ba74c12c3fa397d283f16b9209b27aad8f Mon Sep 17 00:00:00 2001 From: arcnmx Date: Fri, 6 Nov 2015 04:51:03 -0500 Subject: [PATCH] Preserve public static items across LTO --- src/librustc/metadata/csearch.rs | 5 +++++ src/librustc/metadata/decoder.rs | 8 ++++++++ src/librustc_trans/trans/base.rs | 3 ++- src/test/run-make/issue-14500/foo.c | 3 ++- src/test/run-make/issue-14500/foo.rs | 3 +++ 5 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/librustc/metadata/csearch.rs b/src/librustc/metadata/csearch.rs index e04df51dc68..09dec375a69 100644 --- a/src/librustc/metadata/csearch.rs +++ b/src/librustc/metadata/csearch.rs @@ -344,6 +344,11 @@ pub fn is_const_fn(cstore: &cstore::CStore, did: DefId) -> bool { decoder::is_const_fn(&*cdata, did.index) } +pub fn is_static(cstore: &cstore::CStore, did: DefId) -> bool { + let cdata = cstore.get_crate_data(did.krate); + decoder::is_static(&*cdata, did.index) +} + pub fn is_impl(cstore: &cstore::CStore, did: DefId) -> bool { let cdata = cstore.get_crate_data(did.krate); decoder::is_impl(&*cdata, did.index) diff --git a/src/librustc/metadata/decoder.rs b/src/librustc/metadata/decoder.rs index 0780252fc88..b102213eff0 100644 --- a/src/librustc/metadata/decoder.rs +++ b/src/librustc/metadata/decoder.rs @@ -1425,6 +1425,14 @@ pub fn is_const_fn(cdata: Cmd, id: DefIndex) -> bool { } } +pub fn is_static(cdata: Cmd, id: DefIndex) -> bool { + let item_doc = cdata.lookup_item(id); + match item_family(item_doc) { + ImmStatic | MutStatic => true, + _ => false, + } +} + pub fn is_impl(cdata: Cmd, id: DefIndex) -> bool { let item_doc = cdata.lookup_item(id); match item_family(item_doc) { diff --git a/src/librustc_trans/trans/base.rs b/src/librustc_trans/trans/base.rs index a536060efbd..4a99f2142d7 100644 --- a/src/librustc_trans/trans/base.rs +++ b/src/librustc_trans/trans/base.rs @@ -2875,7 +2875,8 @@ pub fn trans_crate<'tcx>(tcx: &ty::ctxt<'tcx>, sess.cstore.iter_crate_data(|cnum, _| { let syms = csearch::get_reachable_ids(&sess.cstore, cnum); reachable_symbols.extend(syms.into_iter().filter(|did| { - csearch::is_extern_fn(&sess.cstore, *did, shared_ccx.tcx()) + csearch::is_extern_fn(&sess.cstore, *did, shared_ccx.tcx()) || + csearch::is_static(&sess.cstore, *did) }).map(|did| { csearch::get_symbol(&sess.cstore, did) })); diff --git a/src/test/run-make/issue-14500/foo.c b/src/test/run-make/issue-14500/foo.c index 25098ac479d..e84b5509c50 100644 --- a/src/test/run-make/issue-14500/foo.c +++ b/src/test/run-make/issue-14500/foo.c @@ -9,8 +9,9 @@ // except according to those terms. extern void foo(); +extern char FOO_STATIC; int main() { foo(); - return 0; + return (int)FOO_STATIC; } diff --git a/src/test/run-make/issue-14500/foo.rs b/src/test/run-make/issue-14500/foo.rs index ceca907403f..a91d8d6a21d 100644 --- a/src/test/run-make/issue-14500/foo.rs +++ b/src/test/run-make/issue-14500/foo.rs @@ -10,3 +10,6 @@ #[no_mangle] pub extern fn foo() {} + +#[no_mangle] +pub static FOO_STATIC: u8 = 0;