@@ -23,6 +23,37 @@ namespace orc {
2323// / Represents a defining location for a JIT symbol.
2424class ExecutorSymbolDef {
2525public:
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+
2657 ExecutorSymbolDef () = default ;
2758 ExecutorSymbolDef (ExecutorAddr Addr, JITSymbolFlags Flags)
2859 : Addr(Addr), Flags(Flags) {}
0 commit comments