aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/ExecutionEngine/Orc/TPCDebugObjectRegistrar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc/TPCDebugObjectRegistrar.cpp')
-rw-r--r--llvm/lib/ExecutionEngine/Orc/TPCDebugObjectRegistrar.cpp62
1 files changed, 62 insertions, 0 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/TPCDebugObjectRegistrar.cpp b/llvm/lib/ExecutionEngine/Orc/TPCDebugObjectRegistrar.cpp
new file mode 100644
index 0000000..5c55338
--- /dev/null
+++ b/llvm/lib/ExecutionEngine/Orc/TPCDebugObjectRegistrar.cpp
@@ -0,0 +1,62 @@
+//===----- 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<uint8_t>
+writeDebugObjectInfo(sys::MemoryBlock TargetMemBlock) {
+ auto DebugObjAddr = pointerToJITTargetAddress(TargetMemBlock.base());
+ uint64_t DebugObjSize = TargetMemBlock.allocatedSize();
+
+ std::vector<uint8_t> 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<std::unique_ptr<TPCDebugObjectRegistrar>>
+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<TPCDebugObjectRegistrar>(TPC, (*Result)[0][0],
+ &writeDebugObjectInfo);
+}
+
+} // namespace orc
+} // namespace llvm