Home | History | Annotate | Download | only in ExecutionEngine
      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 
     19 namespace llvm {
     20 
     21 /// @brief Flags for symbols in the JIT.
     22 enum class JITSymbolFlags : char {
     23   None = 0,
     24   Weak = 1U << 0,
     25   Exported = 1U << 1
     26 };
     27 
     28 inline JITSymbolFlags operator|(JITSymbolFlags LHS, JITSymbolFlags RHS) {
     29   typedef std::underlying_type<JITSymbolFlags>::type UT;
     30   return static_cast<JITSymbolFlags>(
     31            static_cast<UT>(LHS) | static_cast<UT>(RHS));
     32 }
     33 
     34 inline JITSymbolFlags& operator |=(JITSymbolFlags &LHS, JITSymbolFlags RHS) {
     35   LHS = LHS | RHS;
     36   return LHS;
     37 }
     38 
     39 inline JITSymbolFlags operator&(JITSymbolFlags LHS, JITSymbolFlags RHS) {
     40   typedef std::underlying_type<JITSymbolFlags>::type UT;
     41   return static_cast<JITSymbolFlags>(
     42            static_cast<UT>(LHS) & static_cast<UT>(RHS));
     43 }
     44 
     45 inline JITSymbolFlags& operator &=(JITSymbolFlags &LHS, JITSymbolFlags RHS) {
     46   LHS = LHS & RHS;
     47   return LHS;
     48 }
     49 
     50 /// @brief Base class for symbols in the JIT.
     51 class JITSymbolBase {
     52 public:
     53   JITSymbolBase(JITSymbolFlags Flags) : Flags(Flags) {}
     54 
     55   JITSymbolFlags getFlags() const { return Flags; }
     56 
     57   bool isWeak() const {
     58     return (Flags & JITSymbolFlags::Weak) == JITSymbolFlags::Weak;
     59   }
     60 
     61   bool isExported() const {
     62     return (Flags & JITSymbolFlags::Exported) == JITSymbolFlags::Exported;
     63   }
     64 
     65   static JITSymbolFlags flagsFromGlobalValue(const GlobalValue &GV) {
     66     JITSymbolFlags Flags = JITSymbolFlags::None;
     67     if (GV.hasWeakLinkage())
     68       Flags |= JITSymbolFlags::Weak;
     69     if (!GV.hasLocalLinkage() && !GV.hasHiddenVisibility())
     70       Flags |= JITSymbolFlags::Exported;
     71     return Flags;
     72 
     73   }
     74 
     75 private:
     76   JITSymbolFlags Flags;
     77 };
     78 
     79 } // end namespace llvm
     80 
     81 #endif
     82