rustc_monomorphize/offload/
mod.rs1pub(crate) mod manifest;
2
3use rustc_data_structures::fx::FxHashSet;
4use rustc_hir::def::DefKind;
5use rustc_hir::def_id::DefId;
6use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
7use rustc_middle::mono::MonoItem;
8use rustc_middle::ty::TyCtxt;
9
10pub(crate) fn check_offload_kernels_instantiated<'tcx>(
11 tcx: TyCtxt<'tcx>,
12 mono_items: &[MonoItem<'tcx>],
13) {
14 let instantiated: FxHashSet<DefId> = mono_items
15 .iter()
16 .filter_map(|item| match item {
17 MonoItem::Fn(instance) => Some(instance.def_id()),
18 MonoItem::Static(def_id) => Some(*def_id),
19 _ => None,
20 })
21 .collect();
22
23 let crate_items = tcx.hir_crate_items(());
24 let check = |def_id: DefId| {
25 if !#[allow(non_exhaustive_omitted_patterns)] match tcx.def_kind(def_id) {
DefKind::Fn | DefKind::AssocFn => true,
_ => false,
}matches!(tcx.def_kind(def_id), DefKind::Fn | DefKind::AssocFn)
26 || !tcx.generics_of(def_id).requires_monomorphization(tcx)
27 || !tcx.codegen_fn_attrs(def_id).flags.intersects(CodegenFnAttrFlags::OFFLOAD_KERNEL)
28 || instantiated.contains(&def_id)
29 {
30 return;
31 }
32 tcx.dcx().emit_err(crate::diagnostics::GenericKernelNotInstantiated {
33 span: tcx.def_span(def_id),
34 def_path: tcx.def_path_str(def_id),
35 });
36 };
37 for id in crate_items.free_items() {
38 check(id.owner_id.to_def_id());
39 }
40 for id in crate_items.impl_items() {
41 check(id.owner_id.to_def_id());
42 }
43 for id in crate_items.trait_items() {
44 check(id.owner_id.to_def_id());
45 }
46}