//===----- TPCDebugObjectRegistrar.cpp - TPC-based debug registration -----===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/ExecutionEngine/Orc/TPCDebugObjectRegistrar.h" #include "llvm/ExecutionEngine/Orc/Core.h" #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderGDB.h" #include "llvm/Support/BinaryStreamWriter.h" namespace llvm { namespace orc { // Counterpart for readDebugObjectInfo() in TargetProcess/JITLoaderGDB.cpp static std::vector writeDebugObjectInfo(sys::MemoryBlock TargetMemBlock) { auto DebugObjAddr = pointerToJITTargetAddress(TargetMemBlock.base()); uint64_t DebugObjSize = TargetMemBlock.allocatedSize(); std::vector ArgBuffer; ArgBuffer.resize(sizeof(decltype(DebugObjAddr)) + sizeof(decltype(DebugObjSize))); BinaryStreamWriter ArgWriter(ArgBuffer, support::endianness::big); cantFail(ArgWriter.writeInteger(DebugObjAddr)); cantFail(ArgWriter.writeInteger(DebugObjSize)); return ArgBuffer; } Expected> createJITLoaderGDBRegistrar(TargetProcessControl &TPC) { auto ProcessHandle = TPC.loadDylib(nullptr); if (!ProcessHandle) return ProcessHandle.takeError(); SymbolStringPtr RegisterFn = TPC.getTargetTriple().isOSBinFormatMachO() ? TPC.intern("_llvm_orc_registerJITLoaderGDBWrapper") : TPC.intern("llvm_orc_registerJITLoaderGDBWrapper"); SymbolLookupSet RegistrationSymbols; RegistrationSymbols.add(RegisterFn); auto Result = TPC.lookupSymbols({{*ProcessHandle, RegistrationSymbols}}); if (!Result) return Result.takeError(); assert(Result->size() == 1 && "Unexpected number of dylibs in result"); assert((*Result)[0].size() == 1 && "Unexpected number of addresses in result"); return std::make_unique(TPC, (*Result)[0][0], &writeDebugObjectInfo); } } // namespace orc } // namespace llvm