diff options
Diffstat (limited to 'contrib/llvm-project/compiler-rt/lib/orc/executor_symbol_def.h')
| -rw-r--r-- | contrib/llvm-project/compiler-rt/lib/orc/executor_symbol_def.h | 151 | 
1 files changed, 151 insertions, 0 deletions
| diff --git a/contrib/llvm-project/compiler-rt/lib/orc/executor_symbol_def.h b/contrib/llvm-project/compiler-rt/lib/orc/executor_symbol_def.h new file mode 100644 index 000000000000..454cefe525cf --- /dev/null +++ b/contrib/llvm-project/compiler-rt/lib/orc/executor_symbol_def.h @@ -0,0 +1,151 @@ +//===--------- ExecutorSymbolDef.h - (Addr, Flags) pair ---------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Represents a defining location for a symbol in the executing program. +// +// This file was derived from +// llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h. +// +//===----------------------------------------------------------------------===// + +#ifndef ORC_RT_EXECUTOR_SYMBOL_DEF_H +#define ORC_RT_EXECUTOR_SYMBOL_DEF_H + +#include "bitmask_enum.h" +#include "executor_address.h" +#include "simple_packed_serialization.h" + +namespace __orc_rt { + +/// Flags for symbols in the JIT. +class JITSymbolFlags { +public: +  using UnderlyingType = uint8_t; +  using TargetFlagsType = uint8_t; + +  /// These values must be kept in sync with \c JITSymbolFlags in the JIT. +  enum FlagNames : UnderlyingType { +    None = 0, +    HasError = 1U << 0, +    Weak = 1U << 1, +    Common = 1U << 2, +    Absolute = 1U << 3, +    Exported = 1U << 4, +    Callable = 1U << 5, +    MaterializationSideEffectsOnly = 1U << 6, +    ORC_RT_MARK_AS_BITMASK_ENUM( // LargestValue = +        MaterializationSideEffectsOnly) +  }; + +  /// Default-construct a JITSymbolFlags instance. +  JITSymbolFlags() = default; + +  /// Construct a JITSymbolFlags instance from the given flags and target +  ///        flags. +  JITSymbolFlags(FlagNames Flags, TargetFlagsType TargetFlags) +      : TargetFlags(TargetFlags), Flags(Flags) {} + +  bool operator==(const JITSymbolFlags &RHS) const { +    return Flags == RHS.Flags && TargetFlags == RHS.TargetFlags; +  } + +  /// Get the underlying flags value as an integer. +  UnderlyingType getRawFlagsValue() const { +    return static_cast<UnderlyingType>(Flags); +  } + +  /// Return a reference to the target-specific flags. +  TargetFlagsType &getTargetFlags() { return TargetFlags; } + +  /// Return a reference to the target-specific flags. +  const TargetFlagsType &getTargetFlags() const { return TargetFlags; } + +private: +  TargetFlagsType TargetFlags = 0; +  FlagNames Flags = None; +}; + +/// Represents a defining location for a JIT symbol. +class ExecutorSymbolDef { +public: +  ExecutorSymbolDef() = default; +  ExecutorSymbolDef(ExecutorAddr Addr, JITSymbolFlags Flags) +      : Addr(Addr), Flags(Flags) {} + +  const ExecutorAddr &getAddress() const { return Addr; } + +  const JITSymbolFlags &getFlags() const { return Flags; } + +  friend bool operator==(const ExecutorSymbolDef &LHS, +                         const ExecutorSymbolDef &RHS) { +    return LHS.getAddress() == RHS.getAddress() && +           LHS.getFlags() == RHS.getFlags(); +  } + +private: +  ExecutorAddr Addr; +  JITSymbolFlags Flags; +}; + +using SPSJITSymbolFlags = +    SPSTuple<JITSymbolFlags::UnderlyingType, JITSymbolFlags::TargetFlagsType>; + +/// SPS serializatior for JITSymbolFlags. +template <> class SPSSerializationTraits<SPSJITSymbolFlags, JITSymbolFlags> { +  using FlagsArgList = SPSJITSymbolFlags::AsArgList; + +public: +  static size_t size(const JITSymbolFlags &F) { +    return FlagsArgList::size(F.getRawFlagsValue(), F.getTargetFlags()); +  } + +  static bool serialize(SPSOutputBuffer &BOB, const JITSymbolFlags &F) { +    return FlagsArgList::serialize(BOB, F.getRawFlagsValue(), +                                   F.getTargetFlags()); +  } + +  static bool deserialize(SPSInputBuffer &BIB, JITSymbolFlags &F) { +    JITSymbolFlags::UnderlyingType RawFlags; +    JITSymbolFlags::TargetFlagsType TargetFlags; +    if (!FlagsArgList::deserialize(BIB, RawFlags, TargetFlags)) +      return false; +    F = JITSymbolFlags{static_cast<JITSymbolFlags::FlagNames>(RawFlags), +                       TargetFlags}; +    return true; +  } +}; + +using SPSExecutorSymbolDef = SPSTuple<SPSExecutorAddr, SPSJITSymbolFlags>; + +/// SPS serializatior for ExecutorSymbolDef. +template <> +class SPSSerializationTraits<SPSExecutorSymbolDef, ExecutorSymbolDef> { +  using DefArgList = SPSExecutorSymbolDef::AsArgList; + +public: +  static size_t size(const ExecutorSymbolDef &ESD) { +    return DefArgList::size(ESD.getAddress(), ESD.getFlags()); +  } + +  static bool serialize(SPSOutputBuffer &BOB, const ExecutorSymbolDef &ESD) { +    return DefArgList::serialize(BOB, ESD.getAddress(), ESD.getFlags()); +  } + +  static bool deserialize(SPSInputBuffer &BIB, ExecutorSymbolDef &ESD) { +    ExecutorAddr Addr; +    JITSymbolFlags Flags; +    if (!DefArgList::deserialize(BIB, Addr, Flags)) +      return false; +    ESD = ExecutorSymbolDef{Addr, Flags}; +    return true; +  } +}; + +} // End namespace __orc_rt + +#endif // ORC_RT_EXECUTOR_SYMBOL_DEF_H | 
