//===-- OffloadPolicy.h - Configuration of offload behavior -----*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// Configuration for offload behavior, e.g., if offload is disabled, can be
// disabled, is mandatory, etc.
//
//===----------------------------------------------------------------------===//

#ifndef OMPTARGET_OFFLOAD_POLICY_H
#define OMPTARGET_OFFLOAD_POLICY_H

#include "PluginManager.h"

using namespace llvm::omp::target::debug;

enum kmp_target_offload_kind_t {
  tgt_disabled = 0,
  tgt_default = 1,
  tgt_mandatory = 2
};

class OffloadPolicy {

  OffloadPolicy(PluginManager &PM) {
    // TODO: Check for OpenMP.
    switch ((kmp_target_offload_kind_t)__kmpc_get_target_offload()) {
    case tgt_disabled:
      Kind = DISABLED;
      return;
    case tgt_mandatory:
      Kind = MANDATORY;
      return;
    default:
      if (PM.getNumDevices()) {
        ODBG(ODT_Init) << "Default TARGET OFFLOAD policy is now mandatory "
                       << "(devices were found)";
        Kind = MANDATORY;
      } else {
        ODBG(ODT_Init) << "Default TARGET OFFLOAD policy is now disabled "
                       << "(no devices were found)";
        Kind = DISABLED;
      }
      return;
    }
  }

public:
  static bool isOffloadDisabled() {
    return static_cast<kmp_target_offload_kind_t>(
               __kmpc_get_target_offload()) == tgt_disabled;
  }

  static const OffloadPolicy &get(PluginManager &PM) {
    static OffloadPolicy OP(PM);
    return OP;
  }

  enum OffloadPolicyKind { DISABLED, MANDATORY };

  OffloadPolicyKind Kind = MANDATORY;
};

#endif // OMPTARGET_OFFLOAD_POLICY_H
