15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- SymbolCategory.h ---------------------------------------------------===// 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// The MCLinker Project 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details. 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_MC_SYMBOLCATEGORY_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_MC_SYMBOLCATEGORY_H_ 116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <cstddef> 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <vector> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass LDSymbol; 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ResolveInfo; 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class SymbolCategory 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief SymbolCategory groups output LDSymbol into different categories. 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 2137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass SymbolCategory { 2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef std::vector<LDSymbol*> OutputSymbols; 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef OutputSymbols::iterator iterator; 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef OutputSymbols::const_iterator const_iterator; 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SymbolCategory(); 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ~SymbolCategory(); 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- modifiers ----- // 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SymbolCategory& add(LDSymbol& pSymbol); 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SymbolCategory& forceLocal(LDSymbol& pSymbol); 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SymbolCategory& arrange(LDSymbol& pSymbol, const ResolveInfo& pSourceInfo); 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SymbolCategory& changeCommonsToGlobal(); 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 43f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SymbolCategory& changeToDynamic(LDSymbol& pSymbol); 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- access ----- // 4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSymbol& at(size_t pPosition) { return *m_OutputSymbols.at(pPosition); } 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines const LDSymbol& at(size_t pPosition) const { 4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines return *m_OutputSymbols.at(pPosition); 5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSymbol& operator[](size_t pPosition) { return *m_OutputSymbols[pPosition]; } 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines const LDSymbol& operator[](size_t pPosition) const { 5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines return *m_OutputSymbols[pPosition]; 5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- observers ----- // 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t numOfSymbols() const; 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines size_t numOfFiles() const; 626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t numOfLocals() const; 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines size_t numOfLocalDyns() const; 666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t numOfCommons() const; 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines size_t numOfDynamics() const; 706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t numOfRegulars() const; 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool empty() const; 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines bool emptyFiles() const; 766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool emptyLocals() const; 7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines bool emptyLocalDyns() const; 806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool emptyCommons() const; 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines bool emptyDynamics() const; 846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool emptyRegulars() const; 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- iterators ----- // 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator begin(); 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator end(); 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_iterator begin() const; 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_iterator end() const; 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines iterator fileBegin(); 946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines iterator fileEnd(); 956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const_iterator fileBegin() const; 966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const_iterator fileEnd() const; 976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator localBegin(); 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator localEnd(); 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_iterator localBegin() const; 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_iterator localEnd() const; 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1036f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines iterator localDynBegin(); 1046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines iterator localDynEnd(); 1056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const_iterator localDynBegin() const; 1066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const_iterator localDynEnd() const; 10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator commonBegin(); 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator commonEnd(); 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_iterator commonBegin() const; 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_iterator commonEnd() const; 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines iterator dynamicBegin(); 1146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines iterator dynamicEnd(); 1156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const_iterator dynamicBegin() const; 1166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const_iterator dynamicEnd() const; 1176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator regularBegin(); 1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator regularEnd(); 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_iterator regularBegin() const; 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_iterator regularEnd() const; 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12337b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 12437b74a387bb3993387029859c2d9d051c41c724eStephen Hines class Category { 12537b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 12637b74a387bb3993387029859c2d9d051c41c724eStephen Hines enum Type { File, Local, LocalDyn, Common, Dynamic, Regular }; 12737b74a387bb3993387029859c2d9d051c41c724eStephen Hines 12837b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Type type; 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t begin; 1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t end; 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Category* prev; 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Category* next; 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 13737b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 13837b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit Category(Type pType) 13937b74a387bb3993387029859c2d9d051c41c724eStephen Hines : type(pType), begin(0), end(0), prev(NULL), next(NULL) {} 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 14137b74a387bb3993387029859c2d9d051c41c724eStephen Hines size_t size() const { return (end - begin); } 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 14337b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool empty() const { return (begin == end); } 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 14537b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool isFirst() const { return (prev == NULL); } 1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 14737b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool isLast() const { return (next == NULL); } 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static Type categorize(const ResolveInfo& pInfo); 1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao }; 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 15237b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 1536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines SymbolCategory& add(LDSymbol& pSymbol, Category::Type pTarget); 1546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 155f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SymbolCategory& arrange(LDSymbol& pSymbol, 156f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Category::Type pSource, 157f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Category::Type pTarget); 158f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 15937b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao OutputSymbols m_OutputSymbols; 1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Category* m_pFile; 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Category* m_pLocal; 1646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Category* m_pLocalDyn; 1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Category* m_pCommon; 1666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Category* m_pDynamic; 1676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Category* m_pRegular; 1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 17037b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 17237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_MC_SYMBOLCATEGORY_H_ 173