]> git.lizzy.rs Git - rust.git/commitdiff
Add flag for rustc_std_internal_symbol attribute
authorWesley Wiser <wwiser@gmail.com>
Tue, 27 Feb 2018 02:14:55 +0000 (21:14 -0500)
committerWesley Wiser <wwiser@gmail.com>
Wed, 7 Mar 2018 01:18:51 +0000 (20:18 -0500)
Part of #47320

src/librustc/hir/mod.rs
src/librustc_mir/monomorphize/collector.rs
src/librustc_trans/back/symbol_export.rs
src/librustc_typeck/collect.rs

index e9bada5a1478da1289de5b7bf8a75bffb731e077..69f43bc293d0824d51ba95e64f255d44ec6aebe5 100644 (file)
@@ -2228,6 +2228,7 @@ pub struct TransFnAttrFlags: u8 {
         const RUSTC_ALLOCATOR_NOUNWIND  = 0b0000_1000;
         const NAKED                     = 0b0001_0000;
         const NO_MANGLE                 = 0b0010_0000;
+        const RUSTC_STD_INTERNAL_SYMBOL = 0b0100_0000;
     }
 }
 
index 10c2f9f758f14a07eb376222ad2a4c17a918d1ab..20edef8b35ccb1bb45a333e9a7fd67ef30093db1 100644 (file)
 //! 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;
 
 use rustc_data_structures::bitvec::BitVector;
 
-use syntax::attr;
-
 use std::iter;
 
 #[derive(PartialEq, Eq, Hash, Clone, Copy, Debug)]
@@ -985,8 +983,8 @@ fn is_root(&self, def_id: DefId) -> bool {
             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)
             }
         }
     }
index 799d8319767aaac8b145dc3d65e2c0a3fa8e3a8e..fd79ae7435ed1b74857c187b5aaa5d8fcde9b661 100644 (file)
@@ -13,6 +13,7 @@
 
 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::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 {
index 76d2be6695c75d744dd9bf27f903d183e3c5b3df..f8e10c208ac6533794f2abfb41ed914f72485ab6 100644 (file)
@@ -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" {