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