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 AndricError 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