diff options
| author | Wesley Wiser <wwiser@gmail.com> | 2018-02-26 21:14:55 -0500 |
|---|---|---|
| committer | Wesley Wiser <wwiser@gmail.com> | 2018-03-06 20:18:51 -0500 |
| commit | 39f9d23b656d5fc5bfaf8cc8b85dceb1e8b91b99 (patch) | |
| tree | 1da89503511b6bc22c659bef5acb9fed316ea73e /src | |
| parent | 6bc7f41955c7583eca76c77fb45e51e3431cc89e (diff) | |
| download | rust-39f9d23b656d5fc5bfaf8cc8b85dceb1e8b91b99.tar.gz rust-39f9d23b656d5fc5bfaf8cc8b85dceb1e8b91b99.zip | |
Add flag for rustc_std_internal_symbol attribute
Part of #47320
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc/hir/mod.rs | 1 | ||||
| -rw-r--r-- | src/librustc_mir/monomorphize/collector.rs | 8 | ||||
| -rw-r--r-- | src/librustc_trans/back/symbol_export.rs | 6 | ||||
| -rw-r--r-- | src/librustc_typeck/collect.rs | 2 |
4 files changed, 9 insertions, 8 deletions
diff --git a/src/librustc/hir/mod.rs b/src/librustc/hir/mod.rs index e9bada5a147..69f43bc293d 100644 --- a/src/librustc/hir/mod.rs +++ b/src/librustc/hir/mod.rs @@ -2228,6 +2228,7 @@ bitflags! { const RUSTC_ALLOCATOR_NOUNWIND = 0b0000_1000; const NAKED = 0b0001_0000; const NO_MANGLE = 0b0010_0000; + const RUSTC_STD_INTERNAL_SYMBOL = 0b0100_0000; } } diff --git a/src/librustc_mir/monomorphize/collector.rs b/src/librustc_mir/monomorphize/collector.rs index 10c2f9f758f..20edef8b35c 100644 --- a/src/librustc_mir/monomorphize/collector.rs +++ b/src/librustc_mir/monomorphize/collector.rs @@ -188,7 +188,7 @@ //! this is not implemented however: a mono item will be produced //! regardless of whether it is actually needed or not. -use rustc::hir; +use rustc::hir::{self, TransFnAttrFlags}; use rustc::hir::itemlikevisit::ItemLikeVisitor; use rustc::hir::map as hir_map; @@ -211,8 +211,6 @@ use monomorphize::item::{MonoItemExt, DefPathBasedNames, InstantiationMode}; use rustc_data_structures::bitvec::BitVector; -use syntax::attr; - use std::iter; #[derive(PartialEq, Eq, Hash, Clone, Copy, Debug)] @@ -985,8 +983,8 @@ impl<'b, 'a, 'v> RootCollector<'b, 'a, 'v> { MonoItemCollectionMode::Lazy => { self.entry_fn == Some(def_id) || self.tcx.is_reachable_non_generic(def_id) || - attr::contains_name(&self.tcx.get_attrs(def_id), - "rustc_std_internal_symbol") + self.tcx.trans_fn_attrs(def_id).flags.contains( + TransFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL) } } } diff --git a/src/librustc_trans/back/symbol_export.rs b/src/librustc_trans/back/symbol_export.rs index 799d8319767..fd79ae7435e 100644 --- a/src/librustc_trans/back/symbol_export.rs +++ b/src/librustc_trans/back/symbol_export.rs @@ -13,6 +13,7 @@ use std::sync::Arc; use monomorphize::Instance; use rustc::hir; +use rustc::hir::TransFnAttrFlags; use rustc::hir::def_id::CrateNum; use rustc::hir::def_id::{DefId, LOCAL_CRATE}; use rustc::middle::exported_symbols::{SymbolExportLevel, ExportedSymbol, metadata_symbol_name}; @@ -21,7 +22,6 @@ use rustc::ty::{TyCtxt, SymbolName}; use rustc::ty::maps::Providers; use rustc::util::nodemap::{FxHashMap, DefIdSet}; use rustc_allocator::ALLOCATOR_METHODS; -use syntax::attr; pub type ExportedSymbols = FxHashMap< CrateNum, @@ -258,8 +258,8 @@ fn symbol_export_level_provider(tcx: TyCtxt, sym_def_id: DefId) -> SymbolExportL // are not considered for export let trans_fn_attrs = tcx.trans_fn_attrs(sym_def_id); let is_extern = trans_fn_attrs.contains_extern_indicator(); - let std_internal = attr::contains_name(&tcx.get_attrs(sym_def_id), - "rustc_std_internal_symbol"); + let std_internal = trans_fn_attrs.flags.contains(TransFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL); + if is_extern && !std_internal { SymbolExportLevel::C } else { diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs index 76d2be6695c..f8e10c208ac 100644 --- a/src/librustc_typeck/collect.rs +++ b/src/librustc_typeck/collect.rs @@ -1745,6 +1745,8 @@ fn trans_fn_attrs<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, id: DefId) -> TransFnAt trans_fn_attrs.flags |= TransFnAttrFlags::NAKED; } else if attr.check_name("no_mangle") { trans_fn_attrs.flags |= TransFnAttrFlags::NO_MANGLE; + } else if attr.check_name("rustc_std_internal_symbol") { + trans_fn_attrs.flags |= TransFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL; } else if attr.check_name("inline") { trans_fn_attrs.inline = attrs.iter().fold(InlineAttr::None, |ia, attr| { if attr.path != "inline" { |
