1*c9157d92SDimitry Andric //===------ DebuggerSupport.cpp - Utils for enabling debugger support -----===//
2*c9157d92SDimitry Andric //
3*c9157d92SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*c9157d92SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*c9157d92SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*c9157d92SDimitry Andric //
7*c9157d92SDimitry Andric //===----------------------------------------------------------------------===//
8*c9157d92SDimitry Andric 
9*c9157d92SDimitry Andric #include "llvm/ExecutionEngine/Orc/Debugging/DebuggerSupport.h"
10*c9157d92SDimitry Andric #include "llvm/ExecutionEngine/Orc/DebugObjectManagerPlugin.h"
11*c9157d92SDimitry Andric #include "llvm/ExecutionEngine/Orc/Debugging/DebuggerSupportPlugin.h"
12*c9157d92SDimitry Andric #include "llvm/ExecutionEngine/Orc/LLJIT.h"
13*c9157d92SDimitry Andric 
14*c9157d92SDimitry Andric #define DEBUG_TYPE "orc"
15*c9157d92SDimitry Andric 
16*c9157d92SDimitry Andric using namespace llvm;
17*c9157d92SDimitry Andric using namespace llvm::orc;
18*c9157d92SDimitry Andric 
19*c9157d92SDimitry Andric namespace llvm::orc {
20*c9157d92SDimitry Andric 
enableDebuggerSupport(LLJIT & J)21*c9157d92SDimitry Andric Error enableDebuggerSupport(LLJIT &J) {
22*c9157d92SDimitry Andric   auto *ObjLinkingLayer = dyn_cast<ObjectLinkingLayer>(&J.getObjLinkingLayer());
23*c9157d92SDimitry Andric   if (!ObjLinkingLayer)
24*c9157d92SDimitry Andric     return make_error<StringError>("Cannot enable LLJIT debugger support: "
25*c9157d92SDimitry Andric                                    "Debugger support requires JITLink",
26*c9157d92SDimitry Andric                                    inconvertibleErrorCode());
27*c9157d92SDimitry Andric   auto ProcessSymsJD = J.getProcessSymbolsJITDylib();
28*c9157d92SDimitry Andric   if (!ProcessSymsJD)
29*c9157d92SDimitry Andric     return make_error<StringError>("Cannot enable LLJIT debugger support: "
30*c9157d92SDimitry Andric                                    "Process symbols are not available",
31*c9157d92SDimitry Andric                                    inconvertibleErrorCode());
32*c9157d92SDimitry Andric 
33*c9157d92SDimitry Andric   auto &ES = J.getExecutionSession();
34*c9157d92SDimitry Andric   const auto &TT = J.getTargetTriple();
35*c9157d92SDimitry Andric 
36*c9157d92SDimitry Andric   switch (TT.getObjectFormat()) {
37*c9157d92SDimitry Andric   case Triple::ELF: {
38*c9157d92SDimitry Andric     auto Registrar = createJITLoaderGDBRegistrar(ES);
39*c9157d92SDimitry Andric     if (!Registrar)
40*c9157d92SDimitry Andric       return Registrar.takeError();
41*c9157d92SDimitry Andric     ObjLinkingLayer->addPlugin(std::make_unique<DebugObjectManagerPlugin>(
42*c9157d92SDimitry Andric         ES, std::move(*Registrar), false, true));
43*c9157d92SDimitry Andric     return Error::success();
44*c9157d92SDimitry Andric   }
45*c9157d92SDimitry Andric   case Triple::MachO: {
46*c9157d92SDimitry Andric     auto DS = GDBJITDebugInfoRegistrationPlugin::Create(ES, *ProcessSymsJD, TT);
47*c9157d92SDimitry Andric     if (!DS)
48*c9157d92SDimitry Andric       return DS.takeError();
49*c9157d92SDimitry Andric     ObjLinkingLayer->addPlugin(std::move(*DS));
50*c9157d92SDimitry Andric     return Error::success();
51*c9157d92SDimitry Andric   }
52*c9157d92SDimitry Andric   default:
53*c9157d92SDimitry Andric     return make_error<StringError>(
54*c9157d92SDimitry Andric         "Cannot enable LLJIT debugger support: " +
55*c9157d92SDimitry Andric             Triple::getObjectFormatTypeName(TT.getObjectFormat()) +
56*c9157d92SDimitry Andric             " is not supported",
57*c9157d92SDimitry Andric         inconvertibleErrorCode());
58*c9157d92SDimitry Andric   }
59*c9157d92SDimitry Andric }
60*c9157d92SDimitry Andric 
61*c9157d92SDimitry Andric } // namespace llvm::orc
62