blob: a4dca281e0122857d2f3bc9ee7b78b8268bcc859 [file] [edit]
pub(crate) mod manifest;
use rustc_data_structures::fx::FxHashSet;
use rustc_hir::def::DefKind;
use rustc_hir::def_id::DefId;
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
use rustc_middle::mono::MonoItem;
use rustc_middle::ty::TyCtxt;
pub(crate) fn check_offload_kernels_instantiated<'tcx>(
tcx: TyCtxt<'tcx>,
mono_items: &[MonoItem<'tcx>],
) {
let instantiated: FxHashSet<DefId> = mono_items
.iter()
.filter_map(|item| match item {
MonoItem::Fn(instance) => Some(instance.def_id()),
MonoItem::Static(def_id) => Some(*def_id),
_ => None,
})
.collect();
let crate_items = tcx.hir_crate_items(());
let check = |def_id: DefId| {
if !matches!(tcx.def_kind(def_id), DefKind::Fn | DefKind::AssocFn)
|| !tcx.generics_of(def_id).requires_monomorphization(tcx)
|| !tcx.codegen_fn_attrs(def_id).flags.intersects(CodegenFnAttrFlags::OFFLOAD_KERNEL)
|| instantiated.contains(&def_id)
{
return;
}
tcx.dcx().emit_err(crate::diagnostics::GenericKernelNotInstantiated {
span: tcx.def_span(def_id),
def_path: tcx.def_path_str(def_id),
});
};
for id in crate_items.free_items() {
check(id.owner_id.to_def_id());
}
for id in crate_items.impl_items() {
check(id.owner_id.to_def_id());
}
for id in crate_items.trait_items() {
check(id.owner_id.to_def_id());
}
}