aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/compiler-rt/lib/orc/executor_symbol_def.h
diff options
context:
space:
mode:
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.h151
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