1
Fork 0

Do not fetch HIR to compute symbols.

This commit is contained in:
Camille GILLOT 2023-02-12 20:15:12 +00:00
parent 0d39f9d94d
commit e49e7f6a2e

View file

@ -2,9 +2,8 @@ use std::collections::hash_map::Entry::*;
use rustc_ast::expand::allocator::ALLOCATOR_METHODS; use rustc_ast::expand::allocator::ALLOCATOR_METHODS;
use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::fx::FxHashMap;
use rustc_hir as hir; use rustc_hir::def::DefKind;
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LOCAL_CRATE}; use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LOCAL_CRATE};
use rustc_hir::Node;
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags; use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
use rustc_middle::middle::exported_symbols::{ use rustc_middle::middle::exported_symbols::{
metadata_symbol_name, ExportedSymbol, SymbolExportInfo, SymbolExportKind, SymbolExportLevel, metadata_symbol_name, ExportedSymbol, SymbolExportInfo, SymbolExportKind, SymbolExportLevel,
@ -12,7 +11,7 @@ use rustc_middle::middle::exported_symbols::{
use rustc_middle::ty::query::{ExternProviders, Providers}; use rustc_middle::ty::query::{ExternProviders, Providers};
use rustc_middle::ty::subst::{GenericArgKind, SubstsRef}; use rustc_middle::ty::subst::{GenericArgKind, SubstsRef};
use rustc_middle::ty::Instance; use rustc_middle::ty::Instance;
use rustc_middle::ty::{self, SymbolName, TyCtxt}; use rustc_middle::ty::{self, DefIdTree, SymbolName, TyCtxt};
use rustc_session::config::{CrateType, OomStrategy}; use rustc_session::config::{CrateType, OomStrategy};
use rustc_target::spec::SanitizerSet; use rustc_target::spec::SanitizerSet;
@ -74,32 +73,34 @@ fn reachable_non_generics_provider(tcx: TyCtxt<'_>, cnum: CrateNum) -> DefIdMap<
// //
// As a result, if this id is an FFI item (foreign item) then we only // As a result, if this id is an FFI item (foreign item) then we only
// let it through if it's included statically. // let it through if it's included statically.
match tcx.hir().get_by_def_id(def_id) { if let Some(parent_id) = tcx.opt_local_parent(def_id)
Node::ForeignItem(..) => { && let DefKind::ForeignMod = tcx.def_kind(parent_id)
tcx.native_library(def_id).map_or(false, |library| library.kind.is_statically_included()).then_some(def_id) {
} let library = tcx.native_library(def_id)?;
return library.kind.is_statically_included().then_some(def_id);
}
// Only consider nodes that actually have exported symbols. // Only consider nodes that actually have exported symbols.
Node::Item(&hir::Item { match tcx.def_kind(def_id) {
kind: hir::ItemKind::Static(..) | hir::ItemKind::Fn(..), DefKind::Fn | DefKind::Static(_) => {}
.. DefKind::AssocFn if tcx.impl_of_method(def_id.to_def_id()).is_some() => {}
}) _ => return None,
| Node::ImplItem(&hir::ImplItem { kind: hir::ImplItemKind::Fn(..), .. }) => { };
let generics = tcx.generics_of(def_id);
if !generics.requires_monomorphization(tcx)
// Functions marked with #[inline] are codegened with "internal"
// linkage and are not exported unless marked with an extern
// indicator
&& (!Instance::mono(tcx, def_id.to_def_id()).def.generates_cgu_internal_copy(tcx)
|| tcx.codegen_fn_attrs(def_id.to_def_id()).contains_extern_indicator())
{
Some(def_id)
} else {
None
}
}
_ => None, let generics = tcx.generics_of(def_id);
if generics.requires_monomorphization(tcx) {
return None;
}
// Functions marked with #[inline] are codegened with "internal"
// linkage and are not exported unless marked with an extern
// indicator
if !Instance::mono(tcx, def_id.to_def_id()).def.generates_cgu_internal_copy(tcx)
|| tcx.codegen_fn_attrs(def_id.to_def_id()).contains_extern_indicator()
{
Some(def_id)
} else {
None
} }
}) })
.map(|def_id| { .map(|def_id| {
@ -118,7 +119,7 @@ fn reachable_non_generics_provider(tcx: TyCtxt<'_>, cnum: CrateNum) -> DefIdMap<
tcx.symbol_name(Instance::mono(tcx, def_id.to_def_id())), tcx.symbol_name(Instance::mono(tcx, def_id.to_def_id())),
export_level export_level
); );
(def_id.to_def_id(), SymbolExportInfo { let info = SymbolExportInfo {
level: export_level, level: export_level,
kind: if tcx.is_static(def_id.to_def_id()) { kind: if tcx.is_static(def_id.to_def_id()) {
if codegen_attrs.flags.contains(CodegenFnAttrFlags::THREAD_LOCAL) { if codegen_attrs.flags.contains(CodegenFnAttrFlags::THREAD_LOCAL) {
@ -130,8 +131,10 @@ fn reachable_non_generics_provider(tcx: TyCtxt<'_>, cnum: CrateNum) -> DefIdMap<
SymbolExportKind::Text SymbolExportKind::Text
}, },
used: codegen_attrs.flags.contains(CodegenFnAttrFlags::USED) used: codegen_attrs.flags.contains(CodegenFnAttrFlags::USED)
|| codegen_attrs.flags.contains(CodegenFnAttrFlags::USED_LINKER) || used, || codegen_attrs.flags.contains(CodegenFnAttrFlags::USED_LINKER)
}) || used,
};
(def_id.to_def_id(), info)
}) })
.collect(); .collect();
@ -457,9 +460,7 @@ fn symbol_export_level(tcx: TyCtxt<'_>, sym_def_id: DefId) -> SymbolExportLevel
let target = &tcx.sess.target.llvm_target; let target = &tcx.sess.target.llvm_target;
// WebAssembly cannot export data symbols, so reduce their export level // WebAssembly cannot export data symbols, so reduce their export level
if target.contains("emscripten") { if target.contains("emscripten") {
if let Some(Node::Item(&hir::Item { kind: hir::ItemKind::Static(..), .. })) = if let DefKind::Static(_) = tcx.def_kind(sym_def_id) {
tcx.hir().get_if_local(sym_def_id)
{
return SymbolExportLevel::Rust; return SymbolExportLevel::Rust;
} }
} }