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 19fe6060f1SDimitry Andric Expected<std::unique_ptr<EPCDebugObjectRegistrar>> 20fe6060f1SDimitry Andric createJITLoaderGDBRegistrar(ExecutionSession &ES) { 21fe6060f1SDimitry Andric auto &EPC = ES.getExecutorProcessControl(); 22fe6060f1SDimitry Andric auto ProcessHandle = EPC.loadDylib(nullptr); 23fe6060f1SDimitry Andric if (!ProcessHandle) 24fe6060f1SDimitry Andric return ProcessHandle.takeError(); 25fe6060f1SDimitry Andric 26fe6060f1SDimitry Andric SymbolStringPtr RegisterFn = 27fe6060f1SDimitry Andric EPC.getTargetTriple().isOSBinFormatMachO() 28fe6060f1SDimitry Andric ? EPC.intern("_llvm_orc_registerJITLoaderGDBWrapper") 29fe6060f1SDimitry Andric : EPC.intern("llvm_orc_registerJITLoaderGDBWrapper"); 30fe6060f1SDimitry Andric 31fe6060f1SDimitry Andric SymbolLookupSet RegistrationSymbols; 32fe6060f1SDimitry Andric RegistrationSymbols.add(RegisterFn); 33fe6060f1SDimitry Andric 34fe6060f1SDimitry Andric auto Result = EPC.lookupSymbols({{*ProcessHandle, RegistrationSymbols}}); 35fe6060f1SDimitry Andric if (!Result) 36fe6060f1SDimitry Andric return Result.takeError(); 37fe6060f1SDimitry Andric 38fe6060f1SDimitry Andric assert(Result->size() == 1 && "Unexpected number of dylibs in result"); 39fe6060f1SDimitry Andric assert((*Result)[0].size() == 1 && 40fe6060f1SDimitry Andric "Unexpected number of addresses in result"); 41fe6060f1SDimitry Andric 42349cc55cSDimitry Andric return std::make_unique<EPCDebugObjectRegistrar>( 43349cc55cSDimitry Andric ES, ExecutorAddr((*Result)[0][0])); 44fe6060f1SDimitry Andric } 45fe6060f1SDimitry Andric 46349cc55cSDimitry Andric Error EPCDebugObjectRegistrar::registerDebugObject( 47349cc55cSDimitry Andric ExecutorAddrRange TargetMem) { 48*81ad6265SDimitry Andric return ES.callSPSWrapper<void(shared::SPSExecutorAddrRange)>(RegisterFn, 49*81ad6265SDimitry Andric TargetMem); 50fe6060f1SDimitry Andric } 51fe6060f1SDimitry Andric 52fe6060f1SDimitry Andric } // namespace orc 53fe6060f1SDimitry Andric } // namespace llvm 54