1*1db9f3b2SDimitry Andric //===--------- ExecutorSymbolDef.h - (Addr, Flags) pair ---------*- C++ -*-===// 2*1db9f3b2SDimitry Andric // 3*1db9f3b2SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*1db9f3b2SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*1db9f3b2SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*1db9f3b2SDimitry Andric // 7*1db9f3b2SDimitry Andric //===----------------------------------------------------------------------===// 8*1db9f3b2SDimitry Andric // 9*1db9f3b2SDimitry Andric // Represents a defining location for a symbol in the executing program. 10*1db9f3b2SDimitry Andric // 11*1db9f3b2SDimitry Andric // This file was derived from 12*1db9f3b2SDimitry Andric // llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h. 13*1db9f3b2SDimitry Andric // 14*1db9f3b2SDimitry Andric //===----------------------------------------------------------------------===// 15*1db9f3b2SDimitry Andric 16*1db9f3b2SDimitry Andric #ifndef ORC_RT_EXECUTOR_SYMBOL_DEF_H 17*1db9f3b2SDimitry Andric #define ORC_RT_EXECUTOR_SYMBOL_DEF_H 18*1db9f3b2SDimitry Andric 19*1db9f3b2SDimitry Andric #include "bitmask_enum.h" 20*1db9f3b2SDimitry Andric #include "executor_address.h" 21*1db9f3b2SDimitry Andric #include "simple_packed_serialization.h" 22*1db9f3b2SDimitry Andric 23*1db9f3b2SDimitry Andric namespace __orc_rt { 24*1db9f3b2SDimitry Andric 25*1db9f3b2SDimitry Andric /// Flags for symbols in the JIT. 26*1db9f3b2SDimitry Andric class JITSymbolFlags { 27*1db9f3b2SDimitry Andric public: 28*1db9f3b2SDimitry Andric using UnderlyingType = uint8_t; 29*1db9f3b2SDimitry Andric using TargetFlagsType = uint8_t; 30*1db9f3b2SDimitry Andric 31*1db9f3b2SDimitry Andric /// These values must be kept in sync with \c JITSymbolFlags in the JIT. 32*1db9f3b2SDimitry Andric enum FlagNames : UnderlyingType { 33*1db9f3b2SDimitry Andric None = 0, 34*1db9f3b2SDimitry Andric HasError = 1U << 0, 35*1db9f3b2SDimitry Andric Weak = 1U << 1, 36*1db9f3b2SDimitry Andric Common = 1U << 2, 37*1db9f3b2SDimitry Andric Absolute = 1U << 3, 38*1db9f3b2SDimitry Andric Exported = 1U << 4, 39*1db9f3b2SDimitry Andric Callable = 1U << 5, 40*1db9f3b2SDimitry Andric MaterializationSideEffectsOnly = 1U << 6, 41*1db9f3b2SDimitry Andric ORC_RT_MARK_AS_BITMASK_ENUM( // LargestValue = 42*1db9f3b2SDimitry Andric MaterializationSideEffectsOnly) 43*1db9f3b2SDimitry Andric }; 44*1db9f3b2SDimitry Andric 45*1db9f3b2SDimitry Andric /// Default-construct a JITSymbolFlags instance. 46*1db9f3b2SDimitry Andric JITSymbolFlags() = default; 47*1db9f3b2SDimitry Andric 48*1db9f3b2SDimitry Andric /// Construct a JITSymbolFlags instance from the given flags and target 49*1db9f3b2SDimitry Andric /// flags. JITSymbolFlags(FlagNames Flags,TargetFlagsType TargetFlags)50*1db9f3b2SDimitry Andric JITSymbolFlags(FlagNames Flags, TargetFlagsType TargetFlags) 51*1db9f3b2SDimitry Andric : TargetFlags(TargetFlags), Flags(Flags) {} 52*1db9f3b2SDimitry Andric 53*1db9f3b2SDimitry Andric bool operator==(const JITSymbolFlags &RHS) const { 54*1db9f3b2SDimitry Andric return Flags == RHS.Flags && TargetFlags == RHS.TargetFlags; 55*1db9f3b2SDimitry Andric } 56*1db9f3b2SDimitry Andric 57*1db9f3b2SDimitry Andric /// Get the underlying flags value as an integer. getRawFlagsValue()58*1db9f3b2SDimitry Andric UnderlyingType getRawFlagsValue() const { 59*1db9f3b2SDimitry Andric return static_cast<UnderlyingType>(Flags); 60*1db9f3b2SDimitry Andric } 61*1db9f3b2SDimitry Andric 62*1db9f3b2SDimitry Andric /// Return a reference to the target-specific flags. getTargetFlags()63*1db9f3b2SDimitry Andric TargetFlagsType &getTargetFlags() { return TargetFlags; } 64*1db9f3b2SDimitry Andric 65*1db9f3b2SDimitry Andric /// Return a reference to the target-specific flags. getTargetFlags()66*1db9f3b2SDimitry Andric const TargetFlagsType &getTargetFlags() const { return TargetFlags; } 67*1db9f3b2SDimitry Andric 68*1db9f3b2SDimitry Andric private: 69*1db9f3b2SDimitry Andric TargetFlagsType TargetFlags = 0; 70*1db9f3b2SDimitry Andric FlagNames Flags = None; 71*1db9f3b2SDimitry Andric }; 72*1db9f3b2SDimitry Andric 73*1db9f3b2SDimitry Andric /// Represents a defining location for a JIT symbol. 74*1db9f3b2SDimitry Andric class ExecutorSymbolDef { 75*1db9f3b2SDimitry Andric public: 76*1db9f3b2SDimitry Andric ExecutorSymbolDef() = default; ExecutorSymbolDef(ExecutorAddr Addr,JITSymbolFlags Flags)77*1db9f3b2SDimitry Andric ExecutorSymbolDef(ExecutorAddr Addr, JITSymbolFlags Flags) 78*1db9f3b2SDimitry Andric : Addr(Addr), Flags(Flags) {} 79*1db9f3b2SDimitry Andric getAddress()80*1db9f3b2SDimitry Andric const ExecutorAddr &getAddress() const { return Addr; } 81*1db9f3b2SDimitry Andric getFlags()82*1db9f3b2SDimitry Andric const JITSymbolFlags &getFlags() const { return Flags; } 83*1db9f3b2SDimitry Andric 84*1db9f3b2SDimitry Andric friend bool operator==(const ExecutorSymbolDef &LHS, 85*1db9f3b2SDimitry Andric const ExecutorSymbolDef &RHS) { 86*1db9f3b2SDimitry Andric return LHS.getAddress() == RHS.getAddress() && 87*1db9f3b2SDimitry Andric LHS.getFlags() == RHS.getFlags(); 88*1db9f3b2SDimitry Andric } 89*1db9f3b2SDimitry Andric 90*1db9f3b2SDimitry Andric private: 91*1db9f3b2SDimitry Andric ExecutorAddr Addr; 92*1db9f3b2SDimitry Andric JITSymbolFlags Flags; 93*1db9f3b2SDimitry Andric }; 94*1db9f3b2SDimitry Andric 95*1db9f3b2SDimitry Andric using SPSJITSymbolFlags = 96*1db9f3b2SDimitry Andric SPSTuple<JITSymbolFlags::UnderlyingType, JITSymbolFlags::TargetFlagsType>; 97*1db9f3b2SDimitry Andric 98*1db9f3b2SDimitry Andric /// SPS serializatior for JITSymbolFlags. 99*1db9f3b2SDimitry Andric template <> class SPSSerializationTraits<SPSJITSymbolFlags, JITSymbolFlags> { 100*1db9f3b2SDimitry Andric using FlagsArgList = SPSJITSymbolFlags::AsArgList; 101*1db9f3b2SDimitry Andric 102*1db9f3b2SDimitry Andric public: size(const JITSymbolFlags & F)103*1db9f3b2SDimitry Andric static size_t size(const JITSymbolFlags &F) { 104*1db9f3b2SDimitry Andric return FlagsArgList::size(F.getRawFlagsValue(), F.getTargetFlags()); 105*1db9f3b2SDimitry Andric } 106*1db9f3b2SDimitry Andric serialize(SPSOutputBuffer & BOB,const JITSymbolFlags & F)107*1db9f3b2SDimitry Andric static bool serialize(SPSOutputBuffer &BOB, const JITSymbolFlags &F) { 108*1db9f3b2SDimitry Andric return FlagsArgList::serialize(BOB, F.getRawFlagsValue(), 109*1db9f3b2SDimitry Andric F.getTargetFlags()); 110*1db9f3b2SDimitry Andric } 111*1db9f3b2SDimitry Andric deserialize(SPSInputBuffer & BIB,JITSymbolFlags & F)112*1db9f3b2SDimitry Andric static bool deserialize(SPSInputBuffer &BIB, JITSymbolFlags &F) { 113*1db9f3b2SDimitry Andric JITSymbolFlags::UnderlyingType RawFlags; 114*1db9f3b2SDimitry Andric JITSymbolFlags::TargetFlagsType TargetFlags; 115*1db9f3b2SDimitry Andric if (!FlagsArgList::deserialize(BIB, RawFlags, TargetFlags)) 116*1db9f3b2SDimitry Andric return false; 117*1db9f3b2SDimitry Andric F = JITSymbolFlags{static_cast<JITSymbolFlags::FlagNames>(RawFlags), 118*1db9f3b2SDimitry Andric TargetFlags}; 119*1db9f3b2SDimitry Andric return true; 120*1db9f3b2SDimitry Andric } 121*1db9f3b2SDimitry Andric }; 122*1db9f3b2SDimitry Andric 123*1db9f3b2SDimitry Andric using SPSExecutorSymbolDef = SPSTuple<SPSExecutorAddr, SPSJITSymbolFlags>; 124*1db9f3b2SDimitry Andric 125*1db9f3b2SDimitry Andric /// SPS serializatior for ExecutorSymbolDef. 126*1db9f3b2SDimitry Andric template <> 127*1db9f3b2SDimitry Andric class SPSSerializationTraits<SPSExecutorSymbolDef, ExecutorSymbolDef> { 128*1db9f3b2SDimitry Andric using DefArgList = SPSExecutorSymbolDef::AsArgList; 129*1db9f3b2SDimitry Andric 130*1db9f3b2SDimitry Andric public: size(const ExecutorSymbolDef & ESD)131*1db9f3b2SDimitry Andric static size_t size(const ExecutorSymbolDef &ESD) { 132*1db9f3b2SDimitry Andric return DefArgList::size(ESD.getAddress(), ESD.getFlags()); 133*1db9f3b2SDimitry Andric } 134*1db9f3b2SDimitry Andric serialize(SPSOutputBuffer & BOB,const ExecutorSymbolDef & ESD)135*1db9f3b2SDimitry Andric static bool serialize(SPSOutputBuffer &BOB, const ExecutorSymbolDef &ESD) { 136*1db9f3b2SDimitry Andric return DefArgList::serialize(BOB, ESD.getAddress(), ESD.getFlags()); 137*1db9f3b2SDimitry Andric } 138*1db9f3b2SDimitry Andric deserialize(SPSInputBuffer & BIB,ExecutorSymbolDef & ESD)139*1db9f3b2SDimitry Andric static bool deserialize(SPSInputBuffer &BIB, ExecutorSymbolDef &ESD) { 140*1db9f3b2SDimitry Andric ExecutorAddr Addr; 141*1db9f3b2SDimitry Andric JITSymbolFlags Flags; 142*1db9f3b2SDimitry Andric if (!DefArgList::deserialize(BIB, Addr, Flags)) 143*1db9f3b2SDimitry Andric return false; 144*1db9f3b2SDimitry Andric ESD = ExecutorSymbolDef{Addr, Flags}; 145*1db9f3b2SDimitry Andric return true; 146*1db9f3b2SDimitry Andric } 147*1db9f3b2SDimitry Andric }; 148*1db9f3b2SDimitry Andric 149*1db9f3b2SDimitry Andric } // End namespace __orc_rt 150*1db9f3b2SDimitry Andric 151*1db9f3b2SDimitry Andric #endif // ORC_RT_EXECUTOR_SYMBOL_DEF_H 152