Skip to main content

rustc_monomorphize/offload/
mod.rs

1pub(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}