Skip to content

Commit 4b2c703

Browse files
committed
Auto merge of #30830 - arcnmx:static-extern, r=alexcrichton
See #29676 r? @alexcrichton
2 parents 78a5d5b + 0ff055a commit 4b2c703

File tree

6 files changed

+42
-43
lines changed

6 files changed

+42
-43
lines changed

src/librustc/middle/cstore.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,7 @@ pub trait CrateStore<'tcx> : Any {
187187
fn is_defaulted_trait(&self, did: DefId) -> bool;
188188
fn is_impl(&self, did: DefId) -> bool;
189189
fn is_default_impl(&self, impl_did: DefId) -> bool;
190-
fn is_extern_fn(&self, tcx: &ty::ctxt<'tcx>, did: DefId) -> bool;
191-
fn is_static(&self, did: DefId) -> bool;
190+
fn is_extern_item(&self, tcx: &ty::ctxt<'tcx>, did: DefId) -> bool;
192191
fn is_static_method(&self, did: DefId) -> bool;
193192
fn is_statically_included_foreign_item(&self, id: ast::NodeId) -> bool;
194193
fn is_typedef(&self, did: DefId) -> bool;
@@ -357,8 +356,7 @@ impl<'tcx> CrateStore<'tcx> for DummyCrateStore {
357356
fn is_defaulted_trait(&self, did: DefId) -> bool { unimplemented!() }
358357
fn is_impl(&self, did: DefId) -> bool { unimplemented!() }
359358
fn is_default_impl(&self, impl_did: DefId) -> bool { unimplemented!() }
360-
fn is_extern_fn(&self, tcx: &ty::ctxt<'tcx>, did: DefId) -> bool { unimplemented!() }
361-
fn is_static(&self, did: DefId) -> bool { unimplemented!() }
359+
fn is_extern_item(&self, tcx: &ty::ctxt<'tcx>, did: DefId) -> bool { unimplemented!() }
362360
fn is_static_method(&self, did: DefId) -> bool { unimplemented!() }
363361
fn is_statically_included_foreign_item(&self, id: ast::NodeId) -> bool { false }
364362
fn is_typedef(&self, did: DefId) -> bool { unimplemented!() }

src/librustc/middle/reachable.rs

+11-9
Original file line numberDiff line numberDiff line change
@@ -229,16 +229,18 @@ impl<'a, 'tcx> ReachableContext<'a, 'tcx> {
229229
fn propagate_node(&mut self, node: &ast_map::Node,
230230
search_item: ast::NodeId) {
231231
if !self.any_library {
232-
// If we are building an executable, then there's no need to flag
233-
// anything as external except for `extern fn` types. These
234-
// functions may still participate in some form of native interface,
235-
// but all other rust-only interfaces can be private (they will not
236-
// participate in linkage after this product is produced)
232+
// If we are building an executable, only explicitly extern
233+
// types need to be exported.
237234
if let ast_map::NodeItem(item) = *node {
238-
if let hir::ItemFn(_, _, _, abi, _, _) = item.node {
239-
if abi != Abi::Rust {
240-
self.reachable_symbols.insert(search_item);
241-
}
235+
let reachable = if let hir::ItemFn(_, _, _, abi, _, _) = item.node {
236+
abi != Abi::Rust
237+
} else {
238+
false
239+
};
240+
let is_extern = attr::contains_extern_indicator(&self.tcx.sess.diagnostic(),
241+
&item.attrs);
242+
if reachable || is_extern {
243+
self.reachable_symbols.insert(search_item);
242244
}
243245
}
244246
} else {

src/librustc_metadata/csearch.rs

+2-9
Original file line numberDiff line numberDiff line change
@@ -260,16 +260,9 @@ impl<'tcx> CrateStore<'tcx> for cstore::CStore {
260260
decoder::is_default_impl(&*cdata, impl_did.index)
261261
}
262262

263-
fn is_extern_fn(&self, tcx: &ty::ctxt<'tcx>, did: DefId) -> bool
264-
{
265-
let cdata = self.get_crate_data(did.krate);
266-
decoder::is_extern_fn(&*cdata, did.index, tcx)
267-
}
268-
269-
fn is_static(&self, did: DefId) -> bool
270-
{
263+
fn is_extern_item(&self, tcx: &ty::ctxt<'tcx>, did: DefId) -> bool {
271264
let cdata = self.get_crate_data(did.krate);
272-
decoder::is_static(&*cdata, did.index)
265+
decoder::is_extern_item(&*cdata, did.index, tcx)
273266
}
274267

275268
fn is_static_method(&self, def: DefId) -> bool

src/librustc_metadata/decoder.rs

+21-19
Original file line numberDiff line numberDiff line change
@@ -1567,11 +1567,29 @@ pub fn is_const_fn(cdata: Cmd, id: DefIndex) -> bool {
15671567
}
15681568
}
15691569

1570-
pub fn is_static(cdata: Cmd, id: DefIndex) -> bool {
1571-
let item_doc = cdata.lookup_item(id);
1572-
match item_family(item_doc) {
1570+
pub fn is_extern_item(cdata: Cmd, id: DefIndex, tcx: &ty::ctxt) -> bool {
1571+
let item_doc = match cdata.get_item(id) {
1572+
Some(doc) => doc,
1573+
None => return false,
1574+
};
1575+
let applicable = match item_family(item_doc) {
15731576
ImmStatic | MutStatic => true,
1577+
Fn => {
1578+
let ty::TypeScheme { generics, ty } = get_type(cdata, id, tcx);
1579+
let no_generics = generics.types.is_empty();
1580+
match ty.sty {
1581+
ty::TyBareFn(_, fn_ty) if fn_ty.abi != Abi::Rust => return no_generics,
1582+
_ => no_generics,
1583+
}
1584+
},
15741585
_ => false,
1586+
};
1587+
1588+
if applicable {
1589+
attr::contains_extern_indicator(tcx.sess.diagnostic(),
1590+
&get_attributes(item_doc))
1591+
} else {
1592+
false
15751593
}
15761594
}
15771595

@@ -1693,22 +1711,6 @@ pub fn get_imported_filemaps(metadata: &[u8]) -> Vec<codemap::FileMap> {
16931711
}).collect()
16941712
}
16951713

1696-
pub fn is_extern_fn(cdata: Cmd, id: DefIndex, tcx: &ty::ctxt) -> bool {
1697-
let item_doc = match cdata.get_item(id) {
1698-
Some(doc) => doc,
1699-
None => return false,
1700-
};
1701-
if let Fn = item_family(item_doc) {
1702-
let ty::TypeScheme { generics, ty } = get_type(cdata, id, tcx);
1703-
generics.types.is_empty() && match ty.sty {
1704-
ty::TyBareFn(_, fn_ty) => fn_ty.abi != Abi::Rust,
1705-
_ => false,
1706-
}
1707-
} else {
1708-
false
1709-
}
1710-
}
1711-
17121714
pub fn closure_kind(cdata: Cmd, closure_id: DefIndex) -> ty::ClosureKind {
17131715
let closure_doc = cdata.lookup_item(closure_id);
17141716
let closure_kind_doc = reader::get_doc(closure_doc, tag_items_closure_kind);

src/librustc_trans/trans/base.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -3281,8 +3281,7 @@ pub fn trans_crate<'tcx>(tcx: &ty::ctxt<'tcx>,
32813281
for cnum in sess.cstore.crates() {
32823282
let syms = sess.cstore.reachable_ids(cnum);
32833283
reachable_symbols.extend(syms.into_iter().filter(|did| {
3284-
sess.cstore.is_extern_fn(shared_ccx.tcx(), *did) ||
3285-
sess.cstore.is_static(*did)
3284+
sess.cstore.is_extern_item(shared_ccx.tcx(), *did)
32863285
}).map(|did| {
32873286
sess.cstore.item_symbol(did)
32883287
}));

src/libsyntax/attr.rs

+5
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,11 @@ pub fn find_export_name_attr(diag: &Handler, attrs: &[Attribute]) -> Option<Inte
316316
})
317317
}
318318

319+
pub fn contains_extern_indicator(diag: &Handler, attrs: &[Attribute]) -> bool {
320+
contains_name(attrs, "no_mangle") ||
321+
find_export_name_attr(diag, attrs).is_some()
322+
}
323+
319324
#[derive(Copy, Clone, PartialEq)]
320325
pub enum InlineAttr {
321326
None,

0 commit comments

Comments
 (0)