LLVM 20.0.0git
ExecutorSymbolDef.h
Go to the documentation of this file.
1//===--------- ExecutorSymbolDef.h - (Addr, Flags) pair ---------*- 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// Represents a defining location for a JIT symbol.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_EXECUTIONENGINE_ORC_SHARED_EXECUTORSYMBOLDEF_H
14#define LLVM_EXECUTIONENGINE_ORC_SHARED_EXECUTORSYMBOLDEF_H
15
19
20namespace llvm {
21namespace orc {
22
23/// Represents a defining location for a JIT symbol.
25public:
26 /// Create an ExecutorSymbolDef from the given pointer.
27 /// Warning: This should only be used when JITing in-process.
28 template <typename T, typename UnwrapFn = ExecutorAddr::defaultUnwrap<T>>
30 JITSymbolFlags BaseFlags = JITSymbolFlags(),
31 UnwrapFn &&Unwrap = UnwrapFn()) {
32 auto *UP = Unwrap(Ptr);
33 JITSymbolFlags Flags = BaseFlags;
34 if (std::is_function_v<T>)
36 return ExecutorSymbolDef(
38 }
39
40 /// Cast this ExecutorSymbolDef to a pointer of the given type.
41 /// Warning: This should only be used when JITing in-process.
42 template <typename T, typename WrapFn =
44 std::enable_if_t<std::is_pointer<T>::value, T>
45 toPtr(WrapFn &&Wrap = WrapFn()) const {
46 return Addr.toPtr<T>(std::forward<WrapFn>(Wrap));
47 }
48
49 /// Cast this ExecutorSymbolDef to a pointer of the given function type.
50 /// Warning: This should only be used when JITing in-process.
51 template <typename T, typename WrapFn = ExecutorAddr::defaultWrap<T>>
52 std::enable_if_t<std::is_function<T>::value, T *>
53 toPtr(WrapFn &&Wrap = WrapFn()) const {
54 return Addr.toPtr<T>(std::forward<WrapFn>(Wrap));
55 }
56
57 ExecutorSymbolDef() = default;
59 : Addr(Addr), Flags(Flags) {}
60
61 const ExecutorAddr &getAddress() const { return Addr; }
62
63 const JITSymbolFlags &getFlags() const { return Flags; }
64
65 void setFlags(JITSymbolFlags Flags) { this->Flags = Flags; }
66
67 friend bool operator==(const ExecutorSymbolDef &LHS,
68 const ExecutorSymbolDef &RHS) {
69 return LHS.getAddress() == RHS.getAddress() &&
70 LHS.getFlags() == RHS.getFlags();
71 }
72
73 friend bool operator!=(const ExecutorSymbolDef &LHS,
74 const ExecutorSymbolDef &RHS) {
75 return !(LHS == RHS);
76 }
77
78private:
79 ExecutorAddr Addr;
80 JITSymbolFlags Flags;
81};
82
83namespace shared {
84
87
88/// SPS serializatior for JITSymbolFlags.
91
92public:
93 static size_t size(const JITSymbolFlags &F) {
94 return FlagsArgList::size(F.getRawFlagsValue(), F.getTargetFlags());
95 }
96
97 static bool serialize(SPSOutputBuffer &BOB, const JITSymbolFlags &F) {
98 return FlagsArgList::serialize(BOB, F.getRawFlagsValue(),
99 F.getTargetFlags());
100 }
101
105 if (!FlagsArgList::deserialize(BIB, RawFlags, TargetFlags))
106 return false;
107 F = JITSymbolFlags{static_cast<JITSymbolFlags::FlagNames>(RawFlags),
108 TargetFlags};
109 return true;
110 }
111};
112
114
115/// SPS serializatior for ExecutorSymbolDef.
116template <>
119
120public:
121 static size_t size(const ExecutorSymbolDef &ESD) {
122 return DefArgList::size(ESD.getAddress(), ESD.getFlags());
123 }
124
125 static bool serialize(SPSOutputBuffer &BOB, const ExecutorSymbolDef &ESD) {
126 return DefArgList::serialize(BOB, ESD.getAddress(), ESD.getFlags());
127 }
128
131 JITSymbolFlags Flags;
132 if (!DefArgList::deserialize(BIB, Addr, Flags))
133 return false;
134 ESD = ExecutorSymbolDef{Addr, Flags};
135 return true;
136 }
137};
138
139} // End namespace shared.
140} // End namespace orc.
141} // End namespace llvm.
142
143#endif // LLVM_EXECUTIONENGINE_ORC_SHARED_EXECUTORSYMBOLDEF_H
uint64_t Addr
#define F(x, y, z)
Definition: MD5.cpp:55
#define T
Value * RHS
Value * LHS
Flags for symbols in the JIT.
Definition: JITSymbol.h:74
Represents an address in the executor process.
static ExecutorAddr fromPtr(T *Ptr, UnwrapFn &&Unwrap=UnwrapFn())
Create an ExecutorAddr from the given pointer.
std::enable_if_t< std::is_pointer< T >::value, T > toPtr(WrapFn &&Wrap=WrapFn()) const
Cast this ExecutorAddr to a pointer of the given type.
Represents a defining location for a JIT symbol.
void setFlags(JITSymbolFlags Flags)
friend bool operator==(const ExecutorSymbolDef &LHS, const ExecutorSymbolDef &RHS)
friend bool operator!=(const ExecutorSymbolDef &LHS, const ExecutorSymbolDef &RHS)
std::enable_if_t< std::is_pointer< T >::value, T > toPtr(WrapFn &&Wrap=WrapFn()) const
Cast this ExecutorSymbolDef to a pointer of the given type.
static ExecutorSymbolDef fromPtr(T *Ptr, JITSymbolFlags BaseFlags=JITSymbolFlags(), UnwrapFn &&Unwrap=UnwrapFn())
Create an ExecutorSymbolDef from the given pointer.
ExecutorSymbolDef(ExecutorAddr Addr, JITSymbolFlags Flags)
const JITSymbolFlags & getFlags() const
const ExecutorAddr & getAddress() const
std::enable_if_t< std::is_function< T >::value, T * > toPtr(WrapFn &&Wrap=WrapFn()) const
Cast this ExecutorSymbolDef to a pointer of the given function type.
A utility class for serializing to a blob from a variadic list.
Input char buffer with underflow check.
Output char buffer with overflow check.
static bool deserialize(SPSInputBuffer &BIB, ExecutorSymbolDef &ESD)
static bool serialize(SPSOutputBuffer &BOB, const ExecutorSymbolDef &ESD)
static bool serialize(SPSOutputBuffer &BOB, const JITSymbolFlags &F)
Specialize to describe how to serialize/deserialize to/from the given concrete type.
SPSArgList< SPSTagTs... > AsArgList
Convenience typedef of the corresponding arg list.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18