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