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