[Orc][MCJIT][RuntimeDyld] Add header that was accidentally left out of r231724.
authorLang Hames <lhames@gmail.com>
Mon, 9 Mar 2015 23:51:09 +0000 (23:51 +0000)
committerLang Hames <lhames@gmail.com>
Mon, 9 Mar 2015 23:51:09 +0000 (23:51 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231726 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ExecutionEngine/JITSymbolFlags.h [new file with mode: 0644]

diff --git a/include/llvm/ExecutionEngine/JITSymbolFlags.h b/include/llvm/ExecutionEngine/JITSymbolFlags.h
new file mode 100644 (file)
index 0000000..a3609e8
--- /dev/null
@@ -0,0 +1,81 @@
+//===------ JITSymbolFlags.h - Flags for symbols in the JIT -----*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Symbol flags for symbols in the JIT (e.g. weak, exported).
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_EXECUTIONENGINE_JITSYMBOLFLAGS_H
+#define LLVM_EXECUTIONENGINE_JITSYMBOLFLAGS_H
+
+#include "llvm/IR/GlobalValue.h"
+
+namespace llvm {
+
+/// @brief Flags for symbols in the JIT.
+enum class JITSymbolFlags : char {
+  None = 0,
+  Weak = 1U << 0,
+  Exported = 1U << 1
+};
+
+JITSymbolFlags operator|(JITSymbolFlags LHS, JITSymbolFlags RHS) {
+  typedef std::underlying_type<JITSymbolFlags>::type UT;
+  return static_cast<JITSymbolFlags>(
+           static_cast<UT>(LHS) | static_cast<UT>(RHS));
+}
+
+JITSymbolFlags& operator |=(JITSymbolFlags &LHS, JITSymbolFlags RHS) {
+  LHS = LHS | RHS;
+  return LHS;
+}
+
+JITSymbolFlags operator&(JITSymbolFlags LHS, JITSymbolFlags RHS) {
+  typedef std::underlying_type<JITSymbolFlags>::type UT;
+  return static_cast<JITSymbolFlags>(
+           static_cast<UT>(LHS) & static_cast<UT>(RHS));
+}
+
+JITSymbolFlags& operator &=(JITSymbolFlags &LHS, JITSymbolFlags RHS) {
+  LHS = LHS & RHS;
+  return LHS;
+}
+
+/// @brief Base class for symbols in the JIT.
+class JITSymbolBase {
+public:
+  JITSymbolBase(JITSymbolFlags Flags) : Flags(Flags) {}
+
+  JITSymbolFlags getFlags() const { return Flags; }
+
+  bool isWeak() const {
+    return (Flags & JITSymbolFlags::Weak) == JITSymbolFlags::Weak;
+  }
+
+  bool isExported() const {
+    return (Flags & JITSymbolFlags::Exported) == JITSymbolFlags::Exported;
+  }
+
+  static JITSymbolFlags flagsFromGlobalValue(const GlobalValue &GV) {
+    JITSymbolFlags Flags = JITSymbolFlags::None;
+    if (GV.hasWeakLinkage())
+      Flags |= JITSymbolFlags::Weak;
+    if (!GV.hasLocalLinkage() && !GV.hasHiddenVisibility())
+      Flags |= JITSymbolFlags::Exported;
+    return Flags;
+
+  }
+
+private:
+  JITSymbolFlags Flags;
+};
+
+} // end namespace llvm
+
+#endif