1 //===- SymbolCategory.h ---------------------------------------------------===// 2 // 3 // The MCLinker Project 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 #ifndef MCLD_MC_SYMBOLCATEGORY_H_ 10 #define MCLD_MC_SYMBOLCATEGORY_H_ 11 #include <cstddef> 12 #include <vector> 13 14 namespace mcld { 15 16 class LDSymbol; 17 class ResolveInfo; 18 /** \class SymbolCategory 19 * \brief SymbolCategory groups output LDSymbol into different categories. 20 */ 21 class SymbolCategory { 22 private: 23 typedef std::vector<LDSymbol*> OutputSymbols; 24 25 public: 26 typedef OutputSymbols::iterator iterator; 27 typedef OutputSymbols::const_iterator const_iterator; 28 29 public: 30 SymbolCategory(); 31 32 ~SymbolCategory(); 33 34 // ----- modifiers ----- // 35 SymbolCategory& add(LDSymbol& pSymbol); 36 37 SymbolCategory& forceLocal(LDSymbol& pSymbol); 38 39 SymbolCategory& arrange(LDSymbol& pSymbol, const ResolveInfo& pSourceInfo); 40 41 SymbolCategory& changeCommonsToGlobal(); 42 43 SymbolCategory& changeToDynamic(LDSymbol& pSymbol); 44 45 // ----- access ----- // at(size_t pPosition)46 LDSymbol& at(size_t pPosition) { return *m_OutputSymbols.at(pPosition); } 47 at(size_t pPosition)48 const LDSymbol& at(size_t pPosition) const { 49 return *m_OutputSymbols.at(pPosition); 50 } 51 52 LDSymbol& operator[](size_t pPosition) { return *m_OutputSymbols[pPosition]; } 53 54 const LDSymbol& operator[](size_t pPosition) const { 55 return *m_OutputSymbols[pPosition]; 56 } 57 58 // ----- observers ----- // 59 size_t numOfSymbols() const; 60 61 size_t numOfFiles() const; 62 63 size_t numOfLocals() const; 64 65 size_t numOfLocalDyns() const; 66 67 size_t numOfCommons() const; 68 69 size_t numOfDynamics() const; 70 71 size_t numOfRegulars() const; 72 73 bool empty() const; 74 75 bool emptyFiles() const; 76 77 bool emptyLocals() const; 78 79 bool emptyLocalDyns() const; 80 81 bool emptyCommons() const; 82 83 bool emptyDynamics() const; 84 85 bool emptyRegulars() const; 86 87 // ----- iterators ----- // 88 iterator begin(); 89 iterator end(); 90 const_iterator begin() const; 91 const_iterator end() const; 92 93 iterator fileBegin(); 94 iterator fileEnd(); 95 const_iterator fileBegin() const; 96 const_iterator fileEnd() const; 97 98 iterator localBegin(); 99 iterator localEnd(); 100 const_iterator localBegin() const; 101 const_iterator localEnd() const; 102 103 iterator localDynBegin(); 104 iterator localDynEnd(); 105 const_iterator localDynBegin() const; 106 const_iterator localDynEnd() const; 107 108 iterator commonBegin(); 109 iterator commonEnd(); 110 const_iterator commonBegin() const; 111 const_iterator commonEnd() const; 112 113 iterator dynamicBegin(); 114 iterator dynamicEnd(); 115 const_iterator dynamicBegin() const; 116 const_iterator dynamicEnd() const; 117 118 iterator regularBegin(); 119 iterator regularEnd(); 120 const_iterator regularBegin() const; 121 const_iterator regularEnd() const; 122 123 private: 124 class Category { 125 public: 126 enum Type { File, Local, LocalDyn, Common, Dynamic, Regular }; 127 128 public: 129 Type type; 130 131 size_t begin; 132 size_t end; 133 134 Category* prev; 135 Category* next; 136 137 public: Category(Type pType)138 explicit Category(Type pType) 139 : type(pType), begin(0), end(0), prev(NULL), next(NULL) {} 140 size()141 size_t size() const { return (end - begin); } 142 empty()143 bool empty() const { return (begin == end); } 144 isFirst()145 bool isFirst() const { return (prev == NULL); } 146 isLast()147 bool isLast() const { return (next == NULL); } 148 149 static Type categorize(const ResolveInfo& pInfo); 150 }; 151 152 private: 153 SymbolCategory& add(LDSymbol& pSymbol, Category::Type pTarget); 154 155 SymbolCategory& arrange(LDSymbol& pSymbol, 156 Category::Type pSource, 157 Category::Type pTarget); 158 159 private: 160 OutputSymbols m_OutputSymbols; 161 162 Category* m_pFile; 163 Category* m_pLocal; 164 Category* m_pLocalDyn; 165 Category* m_pCommon; 166 Category* m_pDynamic; 167 Category* m_pRegular; 168 }; 169 170 } // namespace mcld 171 172 #endif // MCLD_MC_SYMBOLCATEGORY_H_ 173