1fe6060f1SDimitry Andric //===----- EPCDebugObjectRegistrar.cpp - EPC-based debug registration -----===// 2fe6060f1SDimitry Andric // 3fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6fe6060f1SDimitry Andric // 7fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 8fe6060f1SDimitry Andric 9fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/EPCDebugObjectRegistrar.h" 10fe6060f1SDimitry Andric 11fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/Core.h" 12fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h" 13fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderGDB.h" 14fe6060f1SDimitry Andric #include "llvm/Support/BinaryStreamWriter.h" 15fe6060f1SDimitry Andric 16fe6060f1SDimitry Andric namespace llvm { 17fe6060f1SDimitry Andric namespace orc { 18fe6060f1SDimitry Andric 19bdd1243dSDimitry Andric Expected<std::unique_ptr<EPCDebugObjectRegistrar>> createJITLoaderGDBRegistrar( 20bdd1243dSDimitry Andric ExecutionSession &ES, 21bdd1243dSDimitry Andric std::optional<ExecutorAddr> RegistrationFunctionDylib) { 22fe6060f1SDimitry Andric auto &EPC = ES.getExecutorProcessControl(); 23bdd1243dSDimitry Andric 24bdd1243dSDimitry Andric if (!RegistrationFunctionDylib) { 25bdd1243dSDimitry Andric if (auto D = EPC.loadDylib(nullptr)) 26bdd1243dSDimitry Andric RegistrationFunctionDylib = *D; 27bdd1243dSDimitry Andric else 28bdd1243dSDimitry Andric return D.takeError(); 29bdd1243dSDimitry Andric } 30fe6060f1SDimitry Andric 31fe6060f1SDimitry Andric SymbolStringPtr RegisterFn = 32fe6060f1SDimitry Andric EPC.getTargetTriple().isOSBinFormatMachO() 33fe6060f1SDimitry Andric ? EPC.intern("_llvm_orc_registerJITLoaderGDBWrapper") 34fe6060f1SDimitry Andric : EPC.intern("llvm_orc_registerJITLoaderGDBWrapper"); 35fe6060f1SDimitry Andric 36fe6060f1SDimitry Andric SymbolLookupSet RegistrationSymbols; 37fe6060f1SDimitry Andric RegistrationSymbols.add(RegisterFn); 38fe6060f1SDimitry Andric 39bdd1243dSDimitry Andric auto Result = 40bdd1243dSDimitry Andric EPC.lookupSymbols({{*RegistrationFunctionDylib, RegistrationSymbols}}); 41fe6060f1SDimitry Andric if (!Result) 42fe6060f1SDimitry Andric return Result.takeError(); 43fe6060f1SDimitry Andric 44fe6060f1SDimitry Andric assert(Result->size() == 1 && "Unexpected number of dylibs in result"); 45fe6060f1SDimitry Andric assert((*Result)[0].size() == 1 && 46fe6060f1SDimitry Andric "Unexpected number of addresses in result"); 47fe6060f1SDimitry Andric 48*06c3fb27SDimitry Andric return std::make_unique<EPCDebugObjectRegistrar>(ES, (*Result)[0][0]); 49fe6060f1SDimitry Andric } 50fe6060f1SDimitry Andric 51*06c3fb27SDimitry Andric Error EPCDebugObjectRegistrar::registerDebugObject(ExecutorAddrRange TargetMem, 52*06c3fb27SDimitry Andric bool AutoRegisterCode) { 53*06c3fb27SDimitry Andric return ES.callSPSWrapper<void(shared::SPSExecutorAddrRange, bool)>( 54*06c3fb27SDimitry Andric RegisterFn, TargetMem, AutoRegisterCode); 55fe6060f1SDimitry Andric } 56fe6060f1SDimitry Andric 57fe6060f1SDimitry Andric } // namespace orc 58fe6060f1SDimitry Andric } // namespace llvm 59