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