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