Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-10 08:43:51

0001 //===--------- ExecutorSymbolDef.h - (Addr, Flags) pair ---------*- C++ -*-===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0006 //
0007 //===----------------------------------------------------------------------===//
0008 //
0009 // Represents a defining location for a JIT symbol.
0010 //
0011 //===----------------------------------------------------------------------===//
0012 
0013 #ifndef LLVM_EXECUTIONENGINE_ORC_SHARED_EXECUTORSYMBOLDEF_H
0014 #define LLVM_EXECUTIONENGINE_ORC_SHARED_EXECUTORSYMBOLDEF_H
0015 
0016 #include "llvm/ExecutionEngine/JITSymbol.h"
0017 #include "llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h"
0018 #include "llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h"
0019 
0020 namespace llvm {
0021 namespace orc {
0022 
0023 /// Represents a defining location for a JIT symbol.
0024 class ExecutorSymbolDef {
0025 public:
0026   /// Create an ExecutorSymbolDef from the given pointer.
0027   /// Warning: This should only be used when JITing in-process.
0028   template <typename T, typename UnwrapFn = ExecutorAddr::defaultUnwrap<T>>
0029   static ExecutorSymbolDef fromPtr(T *Ptr,
0030                                    JITSymbolFlags BaseFlags = JITSymbolFlags(),
0031                                    UnwrapFn &&Unwrap = UnwrapFn()) {
0032     auto *UP = Unwrap(Ptr);
0033     JITSymbolFlags Flags = BaseFlags;
0034     if (std::is_function_v<T>)
0035       Flags |= JITSymbolFlags::Callable;
0036     return ExecutorSymbolDef(
0037         ExecutorAddr::fromPtr(UP, ExecutorAddr::rawPtr<T>()), Flags);
0038   }
0039 
0040   /// Cast this ExecutorSymbolDef to a pointer of the given type.
0041   /// Warning: This should only be used when JITing in-process.
0042   template <typename T, typename WrapFn =
0043                             ExecutorAddr::defaultWrap<std::remove_pointer_t<T>>>
0044   std::enable_if_t<std::is_pointer<T>::value, T>
0045   toPtr(WrapFn &&Wrap = WrapFn()) const {
0046     return Addr.toPtr<T>(std::forward<WrapFn>(Wrap));
0047   }
0048 
0049   /// Cast this ExecutorSymbolDef to a pointer of the given function type.
0050   /// Warning: This should only be used when JITing in-process.
0051   template <typename T, typename WrapFn = ExecutorAddr::defaultWrap<T>>
0052   std::enable_if_t<std::is_function<T>::value, T *>
0053   toPtr(WrapFn &&Wrap = WrapFn()) const {
0054     return Addr.toPtr<T>(std::forward<WrapFn>(Wrap));
0055   }
0056 
0057   ExecutorSymbolDef() = default;
0058   ExecutorSymbolDef(ExecutorAddr Addr, JITSymbolFlags Flags)
0059     : Addr(Addr), Flags(Flags) {}
0060 
0061   const ExecutorAddr &getAddress() const { return Addr; }
0062 
0063   const JITSymbolFlags &getFlags() const { return Flags; }
0064 
0065   void setFlags(JITSymbolFlags Flags) { this->Flags = Flags; }
0066 
0067   friend bool operator==(const ExecutorSymbolDef &LHS,
0068                          const ExecutorSymbolDef &RHS) {
0069     return LHS.getAddress() == RHS.getAddress() &&
0070            LHS.getFlags() == RHS.getFlags();
0071   }
0072 
0073   friend bool operator!=(const ExecutorSymbolDef &LHS,
0074                          const ExecutorSymbolDef &RHS) {
0075     return !(LHS == RHS);
0076   }
0077 
0078 private:
0079   ExecutorAddr Addr;
0080   JITSymbolFlags Flags;
0081 };
0082 
0083 namespace shared {
0084 
0085 using SPSJITSymbolFlags =
0086     SPSTuple<JITSymbolFlags::UnderlyingType, JITSymbolFlags::TargetFlagsType>;
0087 
0088 /// SPS serializatior for JITSymbolFlags.
0089 template <> class SPSSerializationTraits<SPSJITSymbolFlags, JITSymbolFlags> {
0090   using FlagsArgList = SPSJITSymbolFlags::AsArgList;
0091 
0092 public:
0093   static size_t size(const JITSymbolFlags &F) {
0094     return FlagsArgList::size(F.getRawFlagsValue(), F.getTargetFlags());
0095   }
0096 
0097   static bool serialize(SPSOutputBuffer &BOB, const JITSymbolFlags &F) {
0098     return FlagsArgList::serialize(BOB, F.getRawFlagsValue(),
0099                                    F.getTargetFlags());
0100   }
0101 
0102   static bool deserialize(SPSInputBuffer &BIB, JITSymbolFlags &F) {
0103     JITSymbolFlags::UnderlyingType RawFlags;
0104     JITSymbolFlags::TargetFlagsType TargetFlags;
0105     if (!FlagsArgList::deserialize(BIB, RawFlags, TargetFlags))
0106       return false;
0107     F = JITSymbolFlags{static_cast<JITSymbolFlags::FlagNames>(RawFlags),
0108                        TargetFlags};
0109     return true;
0110   }
0111 };
0112 
0113 using SPSExecutorSymbolDef = SPSTuple<SPSExecutorAddr, SPSJITSymbolFlags>;
0114 
0115 /// SPS serializatior for ExecutorSymbolDef.
0116 template <>
0117 class SPSSerializationTraits<SPSExecutorSymbolDef, ExecutorSymbolDef> {
0118   using DefArgList = SPSExecutorSymbolDef::AsArgList;
0119 
0120 public:
0121   static size_t size(const ExecutorSymbolDef &ESD) {
0122     return DefArgList::size(ESD.getAddress(), ESD.getFlags());
0123   }
0124 
0125   static bool serialize(SPSOutputBuffer &BOB, const ExecutorSymbolDef &ESD) {
0126     return DefArgList::serialize(BOB, ESD.getAddress(), ESD.getFlags());
0127   }
0128 
0129   static bool deserialize(SPSInputBuffer &BIB, ExecutorSymbolDef &ESD) {
0130     ExecutorAddr Addr;
0131     JITSymbolFlags Flags;
0132     if (!DefArgList::deserialize(BIB, Addr, Flags))
0133       return false;
0134     ESD = ExecutorSymbolDef{Addr, Flags};
0135     return true;
0136   }
0137 };
0138 
0139 } // End namespace shared.
0140 } // End namespace orc.
0141 } // End namespace llvm.
0142 
0143 #endif // LLVM_EXECUTIONENGINE_ORC_SHARED_EXECUTORSYMBOLDEF_H