xref: /llvm-project/offload/include/OffloadPolicy.h (revision 330d8983d25d08580fc1642fea48b2473f47a9da)
1*330d8983SJohannes Doerfert //===-- OffloadPolicy.h - Configuration of offload behavior -----*- C++ -*-===//
2*330d8983SJohannes Doerfert //
3*330d8983SJohannes Doerfert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*330d8983SJohannes Doerfert // See https://llvm.org/LICENSE.txt for license information.
5*330d8983SJohannes Doerfert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*330d8983SJohannes Doerfert //
7*330d8983SJohannes Doerfert //===----------------------------------------------------------------------===//
8*330d8983SJohannes Doerfert //
9*330d8983SJohannes Doerfert // Configuration for offload behavior, e.g., if offload is disabled, can be
10*330d8983SJohannes Doerfert // disabled, is mandatory, etc.
11*330d8983SJohannes Doerfert //
12*330d8983SJohannes Doerfert //===----------------------------------------------------------------------===//
13*330d8983SJohannes Doerfert 
14*330d8983SJohannes Doerfert #ifndef OMPTARGET_OFFLOAD_POLICY_H
15*330d8983SJohannes Doerfert #define OMPTARGET_OFFLOAD_POLICY_H
16*330d8983SJohannes Doerfert 
17*330d8983SJohannes Doerfert #include "PluginManager.h"
18*330d8983SJohannes Doerfert 
19*330d8983SJohannes Doerfert enum kmp_target_offload_kind_t {
20*330d8983SJohannes Doerfert   tgt_disabled = 0,
21*330d8983SJohannes Doerfert   tgt_default = 1,
22*330d8983SJohannes Doerfert   tgt_mandatory = 2
23*330d8983SJohannes Doerfert };
24*330d8983SJohannes Doerfert 
25*330d8983SJohannes Doerfert extern "C" int __kmpc_get_target_offload(void) __attribute__((weak));
26*330d8983SJohannes Doerfert 
27*330d8983SJohannes Doerfert class OffloadPolicy {
28*330d8983SJohannes Doerfert 
OffloadPolicy(PluginManager & PM)29*330d8983SJohannes Doerfert   OffloadPolicy(PluginManager &PM) {
30*330d8983SJohannes Doerfert     // TODO: Check for OpenMP.
31*330d8983SJohannes Doerfert     switch ((kmp_target_offload_kind_t)__kmpc_get_target_offload()) {
32*330d8983SJohannes Doerfert     case tgt_disabled:
33*330d8983SJohannes Doerfert       Kind = DISABLED;
34*330d8983SJohannes Doerfert       return;
35*330d8983SJohannes Doerfert     case tgt_mandatory:
36*330d8983SJohannes Doerfert       Kind = MANDATORY;
37*330d8983SJohannes Doerfert       return;
38*330d8983SJohannes Doerfert     default:
39*330d8983SJohannes Doerfert       if (PM.getNumDevices()) {
40*330d8983SJohannes Doerfert         DP("Default TARGET OFFLOAD policy is now mandatory "
41*330d8983SJohannes Doerfert            "(devices were found)\n");
42*330d8983SJohannes Doerfert         Kind = MANDATORY;
43*330d8983SJohannes Doerfert       } else {
44*330d8983SJohannes Doerfert         DP("Default TARGET OFFLOAD policy is now disabled "
45*330d8983SJohannes Doerfert            "(no devices were found)\n");
46*330d8983SJohannes Doerfert         Kind = DISABLED;
47*330d8983SJohannes Doerfert       }
48*330d8983SJohannes Doerfert       return;
49*330d8983SJohannes Doerfert     };
50*330d8983SJohannes Doerfert   }
51*330d8983SJohannes Doerfert 
52*330d8983SJohannes Doerfert public:
get(PluginManager & PM)53*330d8983SJohannes Doerfert   static const OffloadPolicy &get(PluginManager &PM) {
54*330d8983SJohannes Doerfert     static OffloadPolicy OP(PM);
55*330d8983SJohannes Doerfert     return OP;
56*330d8983SJohannes Doerfert   }
57*330d8983SJohannes Doerfert 
58*330d8983SJohannes Doerfert   enum OffloadPolicyKind { DISABLED, MANDATORY };
59*330d8983SJohannes Doerfert 
60*330d8983SJohannes Doerfert   OffloadPolicyKind Kind = MANDATORY;
61*330d8983SJohannes Doerfert };
62*330d8983SJohannes Doerfert 
63*330d8983SJohannes Doerfert #endif // OMPTARGET_OFFLOAD_POLICY_H
64