Rollup merge of #145892 - jdonszelmann:codegen-fn-attrs-foreign-item, r=bjorn3
add a flag to codegen fn attrs for foreign items r? `@ghost` refiled to rerun CI
This commit is contained in:
@@ -570,7 +570,7 @@ fn symbol_export_level(tcx: TyCtxt<'_>, sym_def_id: DefId) -> SymbolExportLevel
|
|||||||
// core/std/allocators/etc. For example symbols used to hook up allocation
|
// core/std/allocators/etc. For example symbols used to hook up allocation
|
||||||
// are not considered for export
|
// are not considered for export
|
||||||
let codegen_fn_attrs = tcx.codegen_fn_attrs(sym_def_id);
|
let codegen_fn_attrs = tcx.codegen_fn_attrs(sym_def_id);
|
||||||
let is_extern = codegen_fn_attrs.contains_extern_indicator(tcx, sym_def_id);
|
let is_extern = codegen_fn_attrs.contains_extern_indicator();
|
||||||
let std_internal =
|
let std_internal =
|
||||||
codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL);
|
codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL);
|
||||||
|
|
||||||
|
|||||||
@@ -385,6 +385,8 @@ fn apply_overrides(tcx: TyCtxt<'_>, did: LocalDefId, codegen_fn_attrs: &mut Code
|
|||||||
|
|
||||||
// Foreign items by default use no mangling for their symbol name.
|
// Foreign items by default use no mangling for their symbol name.
|
||||||
if tcx.is_foreign_item(did) {
|
if tcx.is_foreign_item(did) {
|
||||||
|
codegen_fn_attrs.flags |= CodegenFnAttrFlags::FOREIGN_ITEM;
|
||||||
|
|
||||||
// There's a few exceptions to this rule though:
|
// There's a few exceptions to this rule though:
|
||||||
if codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL) {
|
if codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL) {
|
||||||
// * `#[rustc_std_internal_symbol]` mangles the symbol name in a special way
|
// * `#[rustc_std_internal_symbol]` mangles the symbol name in a special way
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ use std::borrow::Cow;
|
|||||||
|
|
||||||
use rustc_abi::Align;
|
use rustc_abi::Align;
|
||||||
use rustc_hir::attrs::{InlineAttr, InstructionSetAttr, Linkage, OptimizeAttr};
|
use rustc_hir::attrs::{InlineAttr, InstructionSetAttr, Linkage, OptimizeAttr};
|
||||||
use rustc_hir::def_id::DefId;
|
|
||||||
use rustc_macros::{HashStable, TyDecodable, TyEncodable};
|
use rustc_macros::{HashStable, TyDecodable, TyEncodable};
|
||||||
use rustc_span::Symbol;
|
use rustc_span::Symbol;
|
||||||
use rustc_target::spec::SanitizerSet;
|
use rustc_target::spec::SanitizerSet;
|
||||||
@@ -161,6 +160,8 @@ bitflags::bitflags! {
|
|||||||
const ALLOCATOR_ZEROED = 1 << 14;
|
const ALLOCATOR_ZEROED = 1 << 14;
|
||||||
/// `#[no_builtins]`: indicates that disable implicit builtin knowledge of functions for the function.
|
/// `#[no_builtins]`: indicates that disable implicit builtin knowledge of functions for the function.
|
||||||
const NO_BUILTINS = 1 << 15;
|
const NO_BUILTINS = 1 << 15;
|
||||||
|
/// Marks foreign items, to make `contains_extern_indicator` cheaper.
|
||||||
|
const FOREIGN_ITEM = 1 << 16;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rustc_data_structures::external_bitflags_debug! { CodegenFnAttrFlags }
|
rustc_data_structures::external_bitflags_debug! { CodegenFnAttrFlags }
|
||||||
@@ -194,8 +195,8 @@ impl CodegenFnAttrs {
|
|||||||
/// * `#[linkage]` is present
|
/// * `#[linkage]` is present
|
||||||
///
|
///
|
||||||
/// Keep this in sync with the logic for the unused_attributes for `#[inline]` lint.
|
/// Keep this in sync with the logic for the unused_attributes for `#[inline]` lint.
|
||||||
pub fn contains_extern_indicator(&self, tcx: TyCtxt<'_>, did: DefId) -> bool {
|
pub fn contains_extern_indicator(&self) -> bool {
|
||||||
if tcx.is_foreign_item(did) {
|
if self.flags.contains(CodegenFnAttrFlags::FOREIGN_ITEM) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ impl<'tcx> MonoItem<'tcx> {
|
|||||||
// instantiation:
|
// instantiation:
|
||||||
// We emit an unused_attributes lint for this case, which should be kept in sync if possible.
|
// We emit an unused_attributes lint for this case, which should be kept in sync if possible.
|
||||||
let codegen_fn_attrs = tcx.codegen_instance_attrs(instance.def);
|
let codegen_fn_attrs = tcx.codegen_instance_attrs(instance.def);
|
||||||
if codegen_fn_attrs.contains_extern_indicator(tcx, instance.def.def_id())
|
if codegen_fn_attrs.contains_extern_indicator()
|
||||||
|| codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::NAKED)
|
|| codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::NAKED)
|
||||||
{
|
{
|
||||||
return InstantiationMode::GloballyShared { may_conflict: false };
|
return InstantiationMode::GloballyShared { may_conflict: false };
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ fn cross_crate_inlinable(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
|
|||||||
let codegen_fn_attrs = tcx.codegen_fn_attrs(def_id);
|
let codegen_fn_attrs = tcx.codegen_fn_attrs(def_id);
|
||||||
// If this has an extern indicator, then this function is globally shared and thus will not
|
// If this has an extern indicator, then this function is globally shared and thus will not
|
||||||
// generate cgu-internal copies which would make it cross-crate inlinable.
|
// generate cgu-internal copies which would make it cross-crate inlinable.
|
||||||
if codegen_fn_attrs.contains_extern_indicator(tcx, def_id.into()) {
|
if codegen_fn_attrs.contains_extern_indicator() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -492,7 +492,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
|||||||
{
|
{
|
||||||
let attrs = self.tcx.codegen_fn_attrs(did);
|
let attrs = self.tcx.codegen_fn_attrs(did);
|
||||||
// Not checking naked as `#[inline]` is forbidden for naked functions anyways.
|
// Not checking naked as `#[inline]` is forbidden for naked functions anyways.
|
||||||
if attrs.contains_extern_indicator(self.tcx, did.into()) {
|
if attrs.contains_extern_indicator() {
|
||||||
self.tcx.emit_node_span_lint(
|
self.tcx.emit_node_span_lint(
|
||||||
UNUSED_ATTRIBUTES,
|
UNUSED_ATTRIBUTES,
|
||||||
hir_id,
|
hir_id,
|
||||||
|
|||||||
@@ -706,7 +706,7 @@ fn has_allow_dead_code_or_lang_attr(
|
|||||||
|
|
||||||
// #[used], #[no_mangle], #[export_name], etc also keeps the item alive
|
// #[used], #[no_mangle], #[export_name], etc also keeps the item alive
|
||||||
// forcefully, e.g., for placing it in a specific section.
|
// forcefully, e.g., for placing it in a specific section.
|
||||||
cg_attrs.contains_extern_indicator(tcx, def_id.into())
|
cg_attrs.contains_extern_indicator()
|
||||||
|| cg_attrs.flags.contains(CodegenFnAttrFlags::USED_COMPILER)
|
|| cg_attrs.flags.contains(CodegenFnAttrFlags::USED_COMPILER)
|
||||||
|| cg_attrs.flags.contains(CodegenFnAttrFlags::USED_LINKER)
|
|| cg_attrs.flags.contains(CodegenFnAttrFlags::USED_LINKER)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -183,7 +183,7 @@ impl<'tcx> ReachableContext<'tcx> {
|
|||||||
} else {
|
} else {
|
||||||
CodegenFnAttrs::EMPTY
|
CodegenFnAttrs::EMPTY
|
||||||
};
|
};
|
||||||
let is_extern = codegen_attrs.contains_extern_indicator(self.tcx, search_item.into());
|
let is_extern = codegen_attrs.contains_extern_indicator();
|
||||||
if is_extern {
|
if is_extern {
|
||||||
self.reachable_symbols.insert(search_item);
|
self.reachable_symbols.insert(search_item);
|
||||||
}
|
}
|
||||||
@@ -425,7 +425,7 @@ fn has_custom_linkage(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let codegen_attrs = tcx.codegen_fn_attrs(def_id);
|
let codegen_attrs = tcx.codegen_fn_attrs(def_id);
|
||||||
codegen_attrs.contains_extern_indicator(tcx, def_id.into())
|
codegen_attrs.contains_extern_indicator()
|
||||||
// FIXME(nbdd0121): `#[used]` are marked as reachable here so it's picked up by
|
// FIXME(nbdd0121): `#[used]` are marked as reachable here so it's picked up by
|
||||||
// `linked_symbols` in cg_ssa. They won't be exported in binary or cdylib due to their
|
// `linked_symbols` in cg_ssa. They won't be exported in binary or cdylib due to their
|
||||||
// `SymbolExportLevel::Rust` export level but may end up being exported in dylibs.
|
// `SymbolExportLevel::Rust` export level but may end up being exported in dylibs.
|
||||||
|
|||||||
@@ -190,5 +190,5 @@ impl<'tcx> LateLintPass<'tcx> for MissingInline {
|
|||||||
/// and a rustc warning would be triggered, see #15301
|
/// and a rustc warning would be triggered, see #15301
|
||||||
fn fn_is_externally_exported(cx: &LateContext<'_>, def_id: DefId) -> bool {
|
fn fn_is_externally_exported(cx: &LateContext<'_>, def_id: DefId) -> bool {
|
||||||
let attrs = cx.tcx.codegen_fn_attrs(def_id);
|
let attrs = cx.tcx.codegen_fn_attrs(def_id);
|
||||||
attrs.contains_extern_indicator(cx.tcx, def_id)
|
attrs.contains_extern_indicator()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -279,7 +279,7 @@ impl rustc_driver::Callbacks for MiriBeRustCompilerCalls {
|
|||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
let codegen_fn_attrs = tcx.codegen_fn_attrs(local_def_id);
|
let codegen_fn_attrs = tcx.codegen_fn_attrs(local_def_id);
|
||||||
if codegen_fn_attrs.contains_extern_indicator(tcx, local_def_id.into())
|
if codegen_fn_attrs.contains_extern_indicator()
|
||||||
|| codegen_fn_attrs
|
|| codegen_fn_attrs
|
||||||
.flags
|
.flags
|
||||||
.contains(CodegenFnAttrFlags::USED_COMPILER)
|
.contains(CodegenFnAttrFlags::USED_COMPILER)
|
||||||
|
|||||||
@@ -134,8 +134,7 @@ pub fn iter_exported_symbols<'tcx>(
|
|||||||
for def_id in crate_items.definitions() {
|
for def_id in crate_items.definitions() {
|
||||||
let exported = tcx.def_kind(def_id).has_codegen_attrs() && {
|
let exported = tcx.def_kind(def_id).has_codegen_attrs() && {
|
||||||
let codegen_attrs = tcx.codegen_fn_attrs(def_id);
|
let codegen_attrs = tcx.codegen_fn_attrs(def_id);
|
||||||
codegen_attrs.contains_extern_indicator(tcx, def_id.into())
|
codegen_attrs.contains_extern_indicator()
|
||||||
|| codegen_attrs.flags.contains(CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL)
|
|
||||||
|| codegen_attrs.flags.contains(CodegenFnAttrFlags::USED_COMPILER)
|
|| codegen_attrs.flags.contains(CodegenFnAttrFlags::USED_COMPILER)
|
||||||
|| codegen_attrs.flags.contains(CodegenFnAttrFlags::USED_LINKER)
|
|| codegen_attrs.flags.contains(CodegenFnAttrFlags::USED_LINKER)
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user