1//===------ JITSymbolFlags.h - Flags for symbols in the JIT -----*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Symbol flags for symbols in the JIT (e.g. weak, exported).
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_EXECUTIONENGINE_JITSYMBOLFLAGS_H
15#define LLVM_EXECUTIONENGINE_JITSYMBOLFLAGS_H
16
17#include "llvm/IR/GlobalValue.h"
18#include "llvm/Object/SymbolicFile.h"
19
20namespace llvm {
21
22/// @brief Flags for symbols in the JIT.
23enum class JITSymbolFlags : char {
24  None = 0,
25  Weak = 1U << 0,
26  Exported = 1U << 1
27};
28
29inline JITSymbolFlags operator|(JITSymbolFlags LHS, JITSymbolFlags RHS) {
30  typedef std::underlying_type<JITSymbolFlags>::type UT;
31  return static_cast<JITSymbolFlags>(
32           static_cast<UT>(LHS) | static_cast<UT>(RHS));
33}
34
35inline JITSymbolFlags& operator |=(JITSymbolFlags &LHS, JITSymbolFlags RHS) {
36  LHS = LHS | RHS;
37  return LHS;
38}
39
40inline JITSymbolFlags operator&(JITSymbolFlags LHS, JITSymbolFlags RHS) {
41  typedef std::underlying_type<JITSymbolFlags>::type UT;
42  return static_cast<JITSymbolFlags>(
43           static_cast<UT>(LHS) & static_cast<UT>(RHS));
44}
45
46inline JITSymbolFlags& operator &=(JITSymbolFlags &LHS, JITSymbolFlags RHS) {
47  LHS = LHS & RHS;
48  return LHS;
49}
50
51/// @brief Base class for symbols in the JIT.
52class JITSymbolBase {
53public:
54  JITSymbolBase(JITSymbolFlags Flags) : Flags(Flags) {}
55
56  JITSymbolFlags getFlags() const { return Flags; }
57
58  bool isWeak() const {
59    return (Flags & JITSymbolFlags::Weak) == JITSymbolFlags::Weak;
60  }
61
62  bool isExported() const {
63    return (Flags & JITSymbolFlags::Exported) == JITSymbolFlags::Exported;
64  }
65
66  static JITSymbolFlags flagsFromGlobalValue(const GlobalValue &GV) {
67    JITSymbolFlags Flags = JITSymbolFlags::None;
68    if (GV.hasWeakLinkage())
69      Flags |= JITSymbolFlags::Weak;
70    if (!GV.hasLocalLinkage() && !GV.hasHiddenVisibility())
71      Flags |= JITSymbolFlags::Exported;
72    return Flags;
73  }
74
75  static JITSymbolFlags
76  flagsFromObjectSymbol(const object::BasicSymbolRef &Symbol) {
77    JITSymbolFlags Flags = JITSymbolFlags::None;
78    if (Symbol.getFlags() & object::BasicSymbolRef::SF_Weak)
79      Flags |= JITSymbolFlags::Weak;
80    if (Symbol.getFlags() & object::BasicSymbolRef::SF_Exported)
81      Flags |= JITSymbolFlags::Exported;
82    return Flags;
83  }
84
85private:
86  JITSymbolFlags Flags;
87};
88
89} // end namespace llvm
90
91#endif
92