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 19*bdd1243dSDimitry Andric Expected<std::unique_ptr<EPCDebugObjectRegistrar>> createJITLoaderGDBRegistrar( 20*bdd1243dSDimitry Andric ExecutionSession &ES, 21*bdd1243dSDimitry Andric std::optional<ExecutorAddr> RegistrationFunctionDylib) { 22fe6060f1SDimitry Andric auto &EPC = ES.getExecutorProcessControl(); 23*bdd1243dSDimitry Andric 24*bdd1243dSDimitry Andric if (!RegistrationFunctionDylib) { 25*bdd1243dSDimitry Andric if (auto D = EPC.loadDylib(nullptr)) 26*bdd1243dSDimitry Andric RegistrationFunctionDylib = *D; 27*bdd1243dSDimitry Andric else 28*bdd1243dSDimitry Andric return D.takeError(); 29*bdd1243dSDimitry 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 39*bdd1243dSDimitry Andric auto Result = 40*bdd1243dSDimitry 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 48349cc55cSDimitry Andric return std::make_unique<EPCDebugObjectRegistrar>( 49349cc55cSDimitry Andric ES, ExecutorAddr((*Result)[0][0])); 50fe6060f1SDimitry Andric } 51fe6060f1SDimitry Andric 52349cc55cSDimitry Andric Error EPCDebugObjectRegistrar::registerDebugObject( 53349cc55cSDimitry Andric ExecutorAddrRange TargetMem) { 5481ad6265SDimitry Andric return ES.callSPSWrapper<void(shared::SPSExecutorAddrRange)>(RegisterFn, 5581ad6265SDimitry Andric TargetMem); 56fe6060f1SDimitry Andric } 57fe6060f1SDimitry Andric 58fe6060f1SDimitry Andric } // namespace orc 59fe6060f1SDimitry Andric } // namespace llvm 60