@@ -23,6 +23,37 @@ namespace orc {
23
23
// / Represents a defining location for a JIT symbol.
24
24
class ExecutorSymbolDef {
25
25
public:
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>>
29
+ static ExecutorSymbolDef fromPtr (T *Ptr,
30
+ JITSymbolFlags BaseFlags = JITSymbolFlags(),
31
+ UnwrapFn &&Unwrap = UnwrapFn()) {
32
+ auto *UP = Unwrap (Ptr);
33
+ JITSymbolFlags Flags = BaseFlags;
34
+ if (std::is_function_v<T>)
35
+ Flags |= JITSymbolFlags::Callable;
36
+ return ExecutorSymbolDef (
37
+ ExecutorAddr::fromPtr (UP, ExecutorAddr::rawPtr<T>()), Flags);
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 =
43
+ ExecutorAddr::defaultWrap<std::remove_pointer_t <T>>>
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
+
26
57
ExecutorSymbolDef () = default ;
27
58
ExecutorSymbolDef (ExecutorAddr Addr, JITSymbolFlags Flags)
28
59
: Addr(Addr), Flags(Flags) {}
0 commit comments