Auto merge of #95604 - nbdd0121:used2, r=petrochenkov
Generate synthetic object file to ensure all exported and used symbols participate in the linking Fix #50007 and #47384 This is the synthetic object file approach that I described in https://github.com/rust-lang/rust/pull/95363#issuecomment-1079932354, allowing all exported and used symbols to be linked while still allowing them to be GCed. Related #93791, #95363 r? `@petrochenkov` cc `@carbotaniuman`
This commit is contained in:
commit
18b53cefdf
23 changed files with 324 additions and 75 deletions
|
@ -21,6 +21,23 @@ impl SymbolExportLevel {
|
|||
}
|
||||
}
|
||||
|
||||
/// Kind of exported symbols.
|
||||
#[derive(Eq, PartialEq, Debug, Copy, Clone, Encodable, Decodable, HashStable)]
|
||||
pub enum SymbolExportKind {
|
||||
Text,
|
||||
Data,
|
||||
Tls,
|
||||
}
|
||||
|
||||
/// The `SymbolExportInfo` of a symbols specifies symbol-related information
|
||||
/// that is relevant to code generation and linking.
|
||||
#[derive(Eq, PartialEq, Debug, Copy, Clone, TyEncodable, TyDecodable, HashStable)]
|
||||
pub struct SymbolExportInfo {
|
||||
pub level: SymbolExportLevel,
|
||||
pub kind: SymbolExportKind,
|
||||
pub used: bool,
|
||||
}
|
||||
|
||||
#[derive(Eq, PartialEq, Debug, Copy, Clone, TyEncodable, TyDecodable, HashStable)]
|
||||
pub enum ExportedSymbol<'tcx> {
|
||||
NonGeneric(DefId),
|
||||
|
|
|
@ -1359,7 +1359,7 @@ rustc_queries! {
|
|||
// Does not include external symbols that don't have a corresponding DefId,
|
||||
// like the compiler-generated `main` function and so on.
|
||||
query reachable_non_generics(_: CrateNum)
|
||||
-> DefIdMap<SymbolExportLevel> {
|
||||
-> DefIdMap<SymbolExportInfo> {
|
||||
storage(ArenaCacheSelector<'tcx>)
|
||||
desc { "looking up the exported symbols of a crate" }
|
||||
separate_provide_extern
|
||||
|
@ -1675,7 +1675,7 @@ rustc_queries! {
|
|||
/// correspond to a publicly visible symbol in `cnum` machine code.
|
||||
/// - The `exported_symbols` sets of different crates do not intersect.
|
||||
query exported_symbols(_: CrateNum)
|
||||
-> &'tcx [(ExportedSymbol<'tcx>, SymbolExportLevel)] {
|
||||
-> &'tcx [(ExportedSymbol<'tcx>, SymbolExportInfo)] {
|
||||
desc { "exported_symbols" }
|
||||
separate_provide_extern
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@ use crate::infer::canonical::{self, Canonical};
|
|||
use crate::lint::LintLevelMap;
|
||||
use crate::metadata::ModChild;
|
||||
use crate::middle::codegen_fn_attrs::CodegenFnAttrs;
|
||||
use crate::middle::exported_symbols::{ExportedSymbol, SymbolExportLevel};
|
||||
use crate::middle::exported_symbols::{ExportedSymbol, SymbolExportInfo};
|
||||
use crate::middle::lib_features::LibFeatures;
|
||||
use crate::middle::privacy::AccessLevels;
|
||||
use crate::middle::region;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue