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