//===-- Kernel.cpp - General kernel implementation ------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
///
/// \file
/// This file contains the implementation details for kernel types.
///
//===----------------------------------------------------------------------===//

#include <cassert>

#include "streamexecutor/Device.h"
#include "streamexecutor/Kernel.h"
#include "streamexecutor/PlatformInterfaces.h"

#include "llvm/DebugInfo/Symbolize/Symbolize.h"

namespace streamexecutor {

KernelBase::KernelBase(PlatformDevice *D, const void *PlatformKernelHandle,
                       llvm::StringRef Name)
    : PDevice(D), PlatformKernelHandle(PlatformKernelHandle), Name(Name),
      DemangledName(
          llvm::symbolize::LLVMSymbolizer::DemangleName(Name, nullptr)) {
  assert(D != nullptr &&
         "cannot construct a kernel object with a null platform device");
  assert(PlatformKernelHandle != nullptr &&
         "cannot construct a kernel object with a null platform kernel handle");
}

KernelBase::KernelBase(KernelBase &&Other)
    : PDevice(Other.PDevice), PlatformKernelHandle(Other.PlatformKernelHandle),
      Name(std::move(Other.Name)),
      DemangledName(std::move(Other.DemangledName)) {
  Other.PDevice = nullptr;
  Other.PlatformKernelHandle = nullptr;
}

KernelBase &KernelBase::operator=(KernelBase &&Other) {
  PDevice = Other.PDevice;
  PlatformKernelHandle = Other.PlatformKernelHandle;
  Name = std::move(Other.Name);
  DemangledName = std::move(Other.DemangledName);
  Other.PDevice = nullptr;
  Other.PlatformKernelHandle = nullptr;
  return *this;
}

KernelBase::~KernelBase() {
  if (PlatformKernelHandle)
    // TODO(jhen): Handle the error here.
    consumeError(PDevice->destroyKernel(PlatformKernelHandle));
}

} // namespace streamexecutor
