JITSymbolFlags.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. #ifndef LLVM_EXECUTIONENGINE_JITSYMBOLFLAGS_H
  14. #define LLVM_EXECUTIONENGINE_JITSYMBOLFLAGS_H
  15. #include "llvm/IR/GlobalValue.h"
  16. namespace llvm {
  17. /// @brief Flags for symbols in the JIT.
  18. enum class JITSymbolFlags : char {
  19. None = 0,
  20. Weak = 1U << 0,
  21. Exported = 1U << 1
  22. };
  23. inline JITSymbolFlags operator|(JITSymbolFlags LHS, JITSymbolFlags RHS) {
  24. typedef std::underlying_type<JITSymbolFlags>::type UT;
  25. return static_cast<JITSymbolFlags>(
  26. static_cast<UT>(LHS) | static_cast<UT>(RHS));
  27. }
  28. inline JITSymbolFlags& operator |=(JITSymbolFlags &LHS, JITSymbolFlags RHS) {
  29. LHS = LHS | RHS;
  30. return LHS;
  31. }
  32. inline JITSymbolFlags operator&(JITSymbolFlags LHS, JITSymbolFlags RHS) {
  33. typedef std::underlying_type<JITSymbolFlags>::type UT;
  34. return static_cast<JITSymbolFlags>(
  35. static_cast<UT>(LHS) & static_cast<UT>(RHS));
  36. }
  37. inline JITSymbolFlags& operator &=(JITSymbolFlags &LHS, JITSymbolFlags RHS) {
  38. LHS = LHS & RHS;
  39. return LHS;
  40. }
  41. /// @brief Base class for symbols in the JIT.
  42. class JITSymbolBase {
  43. public:
  44. JITSymbolBase(JITSymbolFlags Flags) : Flags(Flags) {}
  45. JITSymbolFlags getFlags() const { return Flags; }
  46. bool isWeak() const {
  47. return (Flags & JITSymbolFlags::Weak) == JITSymbolFlags::Weak;
  48. }
  49. bool isExported() const {
  50. return (Flags & JITSymbolFlags::Exported) == JITSymbolFlags::Exported;
  51. }
  52. static JITSymbolFlags flagsFromGlobalValue(const GlobalValue &GV) {
  53. JITSymbolFlags Flags = JITSymbolFlags::None;
  54. if (GV.hasWeakLinkage())
  55. Flags |= JITSymbolFlags::Weak;
  56. if (!GV.hasLocalLinkage() && !GV.hasHiddenVisibility())
  57. Flags |= JITSymbolFlags::Exported;
  58. return Flags;
  59. }
  60. private:
  61. JITSymbolFlags Flags;
  62. };
  63. } // end namespace llvm
  64. #endif