Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 14 | pmbaty | 1 | //===- llvm/TextAPI/Symbol.h - TAPI Symbol ----------------------*- C++ -*-===// |
| 2 | // |
||
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
||
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
||
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
||
| 6 | // |
||
| 7 | //===----------------------------------------------------------------------===// |
||
| 8 | |||
| 9 | #ifndef LLVM_TEXTAPI_SYMBOL_H |
||
| 10 | #define LLVM_TEXTAPI_SYMBOL_H |
||
| 11 | |||
| 12 | #include "llvm/ADT/BitmaskEnum.h" |
||
| 13 | #include "llvm/ADT/StringRef.h" |
||
| 14 | #include "llvm/Support/raw_ostream.h" |
||
| 15 | #include "llvm/TextAPI/ArchitectureSet.h" |
||
| 16 | #include "llvm/TextAPI/Target.h" |
||
| 17 | |||
| 18 | namespace llvm { |
||
| 19 | namespace MachO { |
||
| 20 | |||
| 21 | // clang-format off |
||
| 22 | |||
| 23 | /// Symbol flags. |
||
| 24 | enum class SymbolFlags : uint8_t { |
||
| 25 | /// No flags |
||
| 26 | None = 0, |
||
| 27 | |||
| 28 | /// Thread-local value symbol |
||
| 29 | ThreadLocalValue = 1U << 0, |
||
| 30 | |||
| 31 | /// Weak defined symbol |
||
| 32 | WeakDefined = 1U << 1, |
||
| 33 | |||
| 34 | /// Weak referenced symbol |
||
| 35 | WeakReferenced = 1U << 2, |
||
| 36 | |||
| 37 | /// Undefined |
||
| 38 | Undefined = 1U << 3, |
||
| 39 | |||
| 40 | /// Rexported |
||
| 41 | Rexported = 1U << 4, |
||
| 42 | |||
| 43 | LLVM_MARK_AS_BITMASK_ENUM(/*LargestValue=*/Rexported), |
||
| 44 | }; |
||
| 45 | |||
| 46 | // clang-format on |
||
| 47 | |||
| 48 | enum class SymbolKind : uint8_t { |
||
| 49 | GlobalSymbol, |
||
| 50 | ObjectiveCClass, |
||
| 51 | ObjectiveCClassEHType, |
||
| 52 | ObjectiveCInstanceVariable, |
||
| 53 | }; |
||
| 54 | |||
| 55 | constexpr StringLiteral ObjC1ClassNamePrefix = ".objc_class_name_"; |
||
| 56 | constexpr StringLiteral ObjC2ClassNamePrefix = "_OBJC_CLASS_$_"; |
||
| 57 | constexpr StringLiteral ObjC2MetaClassNamePrefix = "_OBJC_METACLASS_$_"; |
||
| 58 | constexpr StringLiteral ObjC2EHTypePrefix = "_OBJC_EHTYPE_$_"; |
||
| 59 | constexpr StringLiteral ObjC2IVarPrefix = "_OBJC_IVAR_$_"; |
||
| 60 | |||
| 61 | using TargetList = SmallVector<Target, 5>; |
||
| 62 | class Symbol { |
||
| 63 | public: |
||
| 64 | Symbol(SymbolKind Kind, StringRef Name, TargetList Targets, SymbolFlags Flags) |
||
| 65 | : Name(Name), Targets(std::move(Targets)), Kind(Kind), Flags(Flags) {} |
||
| 66 | |||
| 67 | void addTarget(Target target) { Targets.emplace_back(target); } |
||
| 68 | SymbolKind getKind() const { return Kind; } |
||
| 69 | StringRef getName() const { return Name; } |
||
| 70 | ArchitectureSet getArchitectures() const { |
||
| 71 | return mapToArchitectureSet(Targets); |
||
| 72 | } |
||
| 73 | SymbolFlags getFlags() const { return Flags; } |
||
| 74 | |||
| 75 | bool isWeakDefined() const { |
||
| 76 | return (Flags & SymbolFlags::WeakDefined) == SymbolFlags::WeakDefined; |
||
| 77 | } |
||
| 78 | |||
| 79 | bool isWeakReferenced() const { |
||
| 80 | return (Flags & SymbolFlags::WeakReferenced) == SymbolFlags::WeakReferenced; |
||
| 81 | } |
||
| 82 | |||
| 83 | bool isThreadLocalValue() const { |
||
| 84 | return (Flags & SymbolFlags::ThreadLocalValue) == |
||
| 85 | SymbolFlags::ThreadLocalValue; |
||
| 86 | } |
||
| 87 | |||
| 88 | bool isUndefined() const { |
||
| 89 | return (Flags & SymbolFlags::Undefined) == SymbolFlags::Undefined; |
||
| 90 | } |
||
| 91 | |||
| 92 | bool isReexported() const { |
||
| 93 | return (Flags & SymbolFlags::Rexported) == SymbolFlags::Rexported; |
||
| 94 | } |
||
| 95 | |||
| 96 | using const_target_iterator = TargetList::const_iterator; |
||
| 97 | using const_target_range = llvm::iterator_range<const_target_iterator>; |
||
| 98 | const_target_range targets() const { return {Targets}; } |
||
| 99 | |||
| 100 | using const_filtered_target_iterator = |
||
| 101 | llvm::filter_iterator<const_target_iterator, |
||
| 102 | std::function<bool(const Target &)>>; |
||
| 103 | using const_filtered_target_range = |
||
| 104 | llvm::iterator_range<const_filtered_target_iterator>; |
||
| 105 | const_filtered_target_range targets(ArchitectureSet architectures) const; |
||
| 106 | |||
| 107 | #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) |
||
| 108 | void dump(raw_ostream &OS) const; |
||
| 109 | void dump() const { dump(llvm::errs()); } |
||
| 110 | #endif |
||
| 111 | |||
| 112 | bool operator==(const Symbol &O) const { |
||
| 113 | return std::tie(Name, Kind, Targets, Flags) == |
||
| 114 | std::tie(O.Name, O.Kind, O.Targets, O.Flags); |
||
| 115 | } |
||
| 116 | |||
| 117 | bool operator!=(const Symbol &O) const { return !(*this == O); } |
||
| 118 | |||
| 119 | bool operator<(const Symbol &O) const { |
||
| 120 | return std::tie(Name, Kind, Targets, Flags) < |
||
| 121 | std::tie(O.Name, O.Kind, O.Targets, O.Flags); |
||
| 122 | } |
||
| 123 | |||
| 124 | private: |
||
| 125 | StringRef Name; |
||
| 126 | TargetList Targets; |
||
| 127 | SymbolKind Kind; |
||
| 128 | SymbolFlags Flags; |
||
| 129 | }; |
||
| 130 | |||
| 131 | } // end namespace MachO. |
||
| 132 | } // end namespace llvm. |
||
| 133 | |||
| 134 | #endif // LLVM_TEXTAPI_SYMBOL_H |