LLVM 20.0.0git
JITLoaderGDB.cpp
Go to the documentation of this file.
1//===- JITLoaderGDB.h - Register objects via GDB JIT interface -*- 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
10
14
15#include <cstdint>
16#include <mutex>
17#include <utility>
18
19#define DEBUG_TYPE "orc"
20
21// First version as landed in August 2009
22static constexpr uint32_t JitDescriptorVersion = 1;
23
24extern "C" {
25
26// We put information about the JITed function in this global, which the
27// debugger reads. Make sure to specify the version statically, because the
28// debugger checks the version before we can set it during runtime.
31 nullptr, nullptr};
32
33// Debuggers that implement the GDB JIT interface put a special breakpoint in
34// this function.
37 // The noinline and the asm prevent calls to this function from being
38 // optimized out.
39#if !defined(_MSC_VER)
40 asm volatile("" ::: "memory");
41#endif
42}
43}
44
45using namespace llvm;
46using namespace llvm::orc;
47
48// Register debug object, return error message or null for success.
49static void appendJITDebugDescriptor(const char *ObjAddr, size_t Size) {
51 dbgs() << "Adding debug object to GDB JIT interface "
52 << formatv("([{0:x16} -- {1:x16}])",
53 reinterpret_cast<uintptr_t>(ObjAddr),
54 reinterpret_cast<uintptr_t>(ObjAddr + Size))
55 << "\n";
56 });
57
59 E->symfile_addr = ObjAddr;
60 E->symfile_size = Size;
61 E->prev_entry = nullptr;
62
63 // Serialize rendezvous with the debugger as well as access to shared data.
64 static std::mutex JITDebugLock;
65 std::lock_guard<std::mutex> Lock(JITDebugLock);
66
67 // Insert this entry at the head of the list.
69 E->next_entry = NextEntry;
70 if (NextEntry) {
71 NextEntry->prev_entry = E;
72 }
73
77}
78
81 using namespace orc::shared;
82 return WrapperFunction<SPSError(SPSExecutorAddrRange, bool)>::handle(
83 Data, Size,
84 [](ExecutorAddrRange R, bool AutoRegisterCode) {
85 appendJITDebugDescriptor(R.Start.toPtr<const char *>(),
86 R.size());
87 // Run into the rendezvous breakpoint.
88 if (AutoRegisterCode)
90 return Error::success();
91 })
92 .release();
93}
94
97 using namespace orc::shared;
98 return WrapperFunction<SPSError(SPSExecutorAddrRange, bool)>::handle(
99 Data, Size,
100 [](ExecutorAddrRange R, bool AutoRegisterCode) {
101 appendJITDebugDescriptor(R.Start.toPtr<const char *>(),
102 R.size());
103 // Run into the rendezvous breakpoint.
104 if (AutoRegisterCode)
106 return Error::success();
107 })
108 .release();
109}
#define LLVM_ATTRIBUTE_NOINLINE
LLVM_ATTRIBUTE_NOINLINE - On compilers where we have a directive to do so, mark a method "not for inl...
Definition: Compiler.h:251
#define LLVM_ATTRIBUTE_VISIBILITY_DEFAULT
Definition: Compiler.h:125
#define LLVM_DEBUG(X)
Definition: Debug.h:101
uint64_t Size
static void appendJITDebugDescriptor(const char *ObjAddr, size_t Size)
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT LLVM_ATTRIBUTE_NOINLINE void __jit_debug_register_code()
orc::shared::CWrapperFunctionResult llvm_orc_registerJITLoaderGDBAllocAction(const char *Data, size_t Size)
orc::shared::CWrapperFunctionResult llvm_orc_registerJITLoaderGDBWrapper(const char *Data, uint64_t Size)
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT struct jit_descriptor __jit_debug_descriptor
static constexpr uint32_t JitDescriptorVersion
@ JIT_REGISTER_FN
Definition: JITLoaderGDB.h:24
static ErrorSuccess success()
Create a success value.
Definition: Error.h:337
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
auto formatv(const char *Fmt, Ts &&...Vals) -> formatv_object< decltype(std::make_tuple(support::detail::build_format_adapter(std::forward< Ts >(Vals))...))>
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:163
Definition: JITLoaderGDB.h:28
struct jit_code_entry * prev_entry
Definition: JITLoaderGDB.h:30
const char * symfile_addr
Definition: JITLoaderGDB.h:31
struct jit_code_entry * next_entry
Definition: JITLoaderGDB.h:29
uint32_t action_flag
Definition: JITLoaderGDB.h:39
struct jit_code_entry * relevant_entry
Definition: JITLoaderGDB.h:40
struct jit_code_entry * first_entry
Definition: JITLoaderGDB.h:41
Represents an address range in the exceutor process.