1 //===- EPCDebugObjectRegistrar.h - EPC-based debug registration -*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // ExecutorProcessControl based registration of debug objects. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_EXECUTIONENGINE_ORC_EPCDEBUGOBJECTREGISTRAR_H 14 #define LLVM_EXECUTIONENGINE_ORC_EPCDEBUGOBJECTREGISTRAR_H 15 16 #include "llvm/ExecutionEngine/JITSymbol.h" 17 #include "llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h" 18 #include "llvm/ExecutionEngine/Orc/Shared/WrapperFunctionUtils.h" 19 #include "llvm/Support/Error.h" 20 #include "llvm/Support/Memory.h" 21 22 #include <cstdint> 23 #include <memory> 24 #include <vector> 25 26 namespace llvm { 27 namespace orc { 28 29 class ExecutionSession; 30 31 /// Abstract interface for registering debug objects in the executor process. 32 class DebugObjectRegistrar { 33 public: 34 virtual Error registerDebugObject(ExecutorAddrRange TargetMem) = 0; 35 virtual ~DebugObjectRegistrar() = default; 36 }; 37 38 /// Use ExecutorProcessControl to register debug objects locally or in a remote 39 /// executor process. 40 class EPCDebugObjectRegistrar : public DebugObjectRegistrar { 41 public: 42 EPCDebugObjectRegistrar(ExecutionSession &ES, ExecutorAddr RegisterFn) 43 : ES(ES), RegisterFn(RegisterFn) {} 44 45 Error registerDebugObject(ExecutorAddrRange TargetMem) override; 46 47 private: 48 ExecutionSession &ES; 49 ExecutorAddr RegisterFn; 50 }; 51 52 /// Create a ExecutorProcessControl-based DebugObjectRegistrar that emits debug 53 /// objects to the GDB JIT interface. This will use the EPC's lookupSymbols 54 /// method to find the registration/deregistration funciton addresses by name. 55 /// 56 /// If RegistrationFunctionsDylib is non-None then it will be searched to find 57 /// the registration functions. If it is None then the process dylib will be 58 /// loaded to find the registration functions. 59 Expected<std::unique_ptr<EPCDebugObjectRegistrar>> createJITLoaderGDBRegistrar( 60 ExecutionSession &ES, 61 std::optional<ExecutorAddr> RegistrationFunctionDylib = std::nullopt); 62 63 } // end namespace orc 64 } // end namespace llvm 65 66 #endif // LLVM_EXECUTIONENGINE_ORC_EPCDEBUGOBJECTREGISTRAR_H 67