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: Symbol(SymbolKind Kind,StringRef Name,TargetList Targets,SymbolFlags Flags)64 Symbol(SymbolKind Kind, StringRef Name, TargetList Targets, SymbolFlags Flags) 65 : Name(Name), Targets(std::move(Targets)), Kind(Kind), Flags(Flags) {} 66 addTarget(Target target)67 void addTarget(Target target) { Targets.emplace_back(target); } getKind()68 SymbolKind getKind() const { return Kind; } getName()69 StringRef getName() const { return Name; } getArchitectures()70 ArchitectureSet getArchitectures() const { 71 return mapToArchitectureSet(Targets); 72 } getFlags()73 SymbolFlags getFlags() const { return Flags; } 74 isWeakDefined()75 bool isWeakDefined() const { 76 return (Flags & SymbolFlags::WeakDefined) == SymbolFlags::WeakDefined; 77 } 78 isWeakReferenced()79 bool isWeakReferenced() const { 80 return (Flags & SymbolFlags::WeakReferenced) == SymbolFlags::WeakReferenced; 81 } 82 isThreadLocalValue()83 bool isThreadLocalValue() const { 84 return (Flags & SymbolFlags::ThreadLocalValue) == 85 SymbolFlags::ThreadLocalValue; 86 } 87 isUndefined()88 bool isUndefined() const { 89 return (Flags & SymbolFlags::Undefined) == SymbolFlags::Undefined; 90 } 91 isReexported()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>; targets()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; dump()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 135