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_SYMBOL_CATEGORY_H 10 #define MCLD_SYMBOL_CATEGORY_H 11 #ifdef ENABLE_UNITTEST 12 #include <gtest.h> 13 #endif 14 #include <mcld/ADT/TypeTraits.h> 15 #include <vector> 16 17 namespace mcld 18 { 19 20 class LDSymbol; 21 class ResolveInfo; 22 /** \class SymbolCategory 23 * \brief SymbolCategory groups output LDSymbol into different categories. 24 */ 25 class SymbolCategory 26 { 27 private: 28 typedef std::vector<LDSymbol*> OutputSymbols; 29 30 public: 31 typedef OutputSymbols::iterator iterator; 32 typedef OutputSymbols::const_iterator const_iterator; 33 34 public: 35 SymbolCategory(); 36 37 ~SymbolCategory(); 38 39 // ----- modifiers ----- // 40 SymbolCategory& add(LDSymbol& pSymbol); 41 42 SymbolCategory& forceLocal(LDSymbol& pSymbol); 43 44 SymbolCategory& arrange(LDSymbol& pSymbol, const ResolveInfo& pSourceInfo); 45 46 SymbolCategory& changeCommonsToGlobal(); 47 48 // ----- access ----- // at(size_t pPosition)49 LDSymbol& at(size_t pPosition) 50 { return *m_OutputSymbols.at(pPosition); } 51 at(size_t pPosition)52 const LDSymbol& at(size_t pPosition) const 53 { return *m_OutputSymbols.at(pPosition); } 54 55 LDSymbol& operator[](size_t pPosition) 56 { return *m_OutputSymbols[pPosition]; } 57 58 const LDSymbol& operator[](size_t pPosition) const 59 { return *m_OutputSymbols[pPosition]; } 60 61 // ----- observers ----- // 62 size_t numOfSymbols() const; 63 64 size_t numOfLocals() const; 65 66 size_t numOfCommons() const; 67 68 size_t numOfRegulars() const; 69 70 bool empty() const; 71 72 bool emptyLocals() const; 73 74 bool emptyCommons() const; 75 76 bool emptyRegulars() const; 77 78 // ----- iterators ----- // 79 iterator begin(); 80 iterator end(); 81 const_iterator begin() const; 82 const_iterator end() const; 83 84 iterator localBegin(); 85 iterator localEnd(); 86 const_iterator localBegin() const; 87 const_iterator localEnd() const; 88 89 iterator commonBegin(); 90 iterator commonEnd(); 91 const_iterator commonBegin() const; 92 const_iterator commonEnd() const; 93 94 iterator regularBegin(); 95 iterator regularEnd(); 96 const_iterator regularBegin() const; 97 const_iterator regularEnd() const; 98 99 private: 100 class Category 101 { 102 public: 103 enum Type { 104 File, 105 Local, 106 Common, 107 Weak, 108 Global 109 }; 110 111 public: 112 Type type; 113 114 size_t begin; 115 size_t end; 116 117 Category* prev; 118 Category* next; 119 120 public: Category(Type pType)121 Category(Type pType) 122 : type(pType), 123 begin(0), 124 end(0), 125 prev(NULL), 126 next(NULL) { 127 } 128 size()129 size_t size() const 130 { return (end - begin); } 131 empty()132 bool empty() const 133 { return (begin == end); } 134 isFirst()135 bool isFirst() const 136 { return (NULL == prev); } 137 isLast()138 bool isLast() const 139 { return (NULL == next); } 140 141 static Type categorize(const ResolveInfo& pInfo); 142 143 }; 144 145 private: 146 OutputSymbols m_OutputSymbols; 147 148 Category* m_pFile; 149 Category* m_pLocal; 150 Category* m_pCommon; 151 Category* m_pWeak; 152 Category* m_pGlobal; 153 }; 154 155 } // namespace of mcld 156 157 #endif 158 159