diff options
| author | arcnmx <arcnmx@users.noreply.github.com> | 2015-11-07 12:22:04 -0500 |
|---|---|---|
| committer | arcnmx <arcnmx@users.noreply.github.com> | 2016-02-11 12:45:52 -0500 |
| commit | e6f0f7d52d69d0c4f290ac32c6eebf92bbf6dd81 (patch) | |
| tree | eed6c22c1a4a2ab9925546d91f317728b6ef0898 /src/librustc_metadata/decoder.rs | |
| parent | a91ff1c9d1842918329ef7a81afd3848854d53c7 (diff) | |
| download | rust-e6f0f7d52d69d0c4f290ac32c6eebf92bbf6dd81.tar.gz rust-e6f0f7d52d69d0c4f290ac32c6eebf92bbf6dd81.zip | |
Only retain external static symbols across LTO
Diffstat (limited to 'src/librustc_metadata/decoder.rs')
| -rw-r--r-- | src/librustc_metadata/decoder.rs | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/src/librustc_metadata/decoder.rs b/src/librustc_metadata/decoder.rs index 5ba9e566e00..3ec32635a4b 100644 --- a/src/librustc_metadata/decoder.rs +++ b/src/librustc_metadata/decoder.rs @@ -1567,11 +1567,28 @@ 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) { +pub fn is_extern_item(cdata: Cmd, id: DefIndex, tcx: &ty::ctxt) -> bool { + let item_doc = match cdata.get_item(id) { + Some(doc) => doc, + None => return false, + }; + let applicable = match item_family(item_doc) { ImmStatic | MutStatic => true, + Fn => { + let ty::TypeScheme { generics, ty } = get_type(cdata, id, tcx); + let no_generics = generics.types.is_empty(); + match ty.sty { + ty::TyBareFn(_, fn_ty) if fn_ty.abi != Abi::Rust => return no_generics, + _ => no_generics, + } + }, _ => false, + }; + + if applicable { + attr::contains_extern_indicator(&get_attributes(item_doc)) + } else { + false } } @@ -1693,22 +1710,6 @@ pub fn get_imported_filemaps(metadata: &[u8]) -> Vec<codemap::FileMap> { }).collect() } -pub fn is_extern_fn(cdata: Cmd, id: DefIndex, tcx: &ty::ctxt) -> bool { - let item_doc = match cdata.get_item(id) { - Some(doc) => doc, - None => return false, - }; - if let Fn = item_family(item_doc) { - let ty::TypeScheme { generics, ty } = get_type(cdata, id, tcx); - generics.types.is_empty() && match ty.sty { - ty::TyBareFn(_, fn_ty) => fn_ty.abi != Abi::Rust, - _ => false, - } - } else { - false - } -} - pub fn closure_kind(cdata: Cmd, closure_id: DefIndex) -> ty::ClosureKind { let closure_doc = cdata.lookup_item(closure_id); let closure_kind_doc = reader::get_doc(closure_doc, tag_items_closure_kind); |
