//===------ DebuggerSupport.cpp - Utils for enabling debugger support -----===//
//
// 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
//
//===----------------------------------------------------------------------===//

#include "llvm/ExecutionEngine/Orc/Debugging/DebuggerSupport.h"
#include "llvm/ExecutionEngine/Orc/Debugging/DebuggerSupportPlugin.h"
#include "llvm/ExecutionEngine/Orc/Debugging/ELFDebugObjectPlugin.h"
#include "llvm/ExecutionEngine/Orc/LLJIT.h"

#define DEBUG_TYPE "orc"

using namespace llvm;
using namespace llvm::orc;

namespace llvm::orc {

Error enableDebuggerSupport(LLJIT &J) {
  auto *ObjLinkingLayer = dyn_cast<ObjectLinkingLayer>(&J.getObjLinkingLayer());
  if (!ObjLinkingLayer)
    return make_error<StringError>("Cannot enable LLJIT debugger support: "
                                   "Debugger support requires JITLink",
                                   inconvertibleErrorCode());
  auto &ES = J.getExecutionSession();
  const auto &TT = J.getTargetTriple();

  switch (TT.getObjectFormat()) {
  case Triple::ELF: {
    Error TargetSymErr = Error::success();
    ObjLinkingLayer->addPlugin(
        std::make_unique<ELFDebugObjectPlugin>(ES, false, TargetSymErr));
    return TargetSymErr;
  }
  case Triple::MachO: {
    auto DS = GDBJITDebugInfoRegistrationPlugin::Create(
        ES, ES.getBootstrapJITDylib());
    if (!DS)
      return DS.takeError();
    ObjLinkingLayer->addPlugin(std::move(*DS));
    return Error::success();
  }
  default:
    return make_error<StringError>(
        "Cannot enable LLJIT debugger support: " +
            Triple::getObjectFormatTypeName(TT.getObjectFormat()) +
            " is not supported",
        inconvertibleErrorCode());
  }
}

} // namespace llvm::orc
