diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/Debugging/DebuggerSupport.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/Debugging/DebuggerSupport.cpp | 61 | 
1 files changed, 61 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/Debugging/DebuggerSupport.cpp b/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/Debugging/DebuggerSupport.cpp new file mode 100644 index 000000000000..1668473c0eb4 --- /dev/null +++ b/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/Debugging/DebuggerSupport.cpp @@ -0,0 +1,61 @@ +//===------ 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/DebugObjectManagerPlugin.h" +#include "llvm/ExecutionEngine/Orc/Debugging/DebuggerSupportPlugin.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 ProcessSymsJD = J.getProcessSymbolsJITDylib(); +  if (!ProcessSymsJD) +    return make_error<StringError>("Cannot enable LLJIT debugger support: " +                                   "Process symbols are not available", +                                   inconvertibleErrorCode()); + +  auto &ES = J.getExecutionSession(); +  const auto &TT = J.getTargetTriple(); + +  switch (TT.getObjectFormat()) { +  case Triple::ELF: { +    auto Registrar = createJITLoaderGDBRegistrar(ES); +    if (!Registrar) +      return Registrar.takeError(); +    ObjLinkingLayer->addPlugin(std::make_unique<DebugObjectManagerPlugin>( +        ES, std::move(*Registrar), false, true)); +    return Error::success(); +  } +  case Triple::MachO: { +    auto DS = GDBJITDebugInfoRegistrationPlugin::Create(ES, *ProcessSymsJD, TT); +    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  | 
