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//===----------------------------------------------------------------------===// 987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_MC_SYMBOLCATEGORY_H 1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_MC_SYMBOLCATEGORY_H 116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <cstddef> 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <vector> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass LDSymbol; 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ResolveInfo; 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class SymbolCategory 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief SymbolCategory groups output LDSymbol into different categories. 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass SymbolCategory 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef std::vector<LDSymbol*> OutputSymbols; 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef OutputSymbols::iterator iterator; 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef OutputSymbols::const_iterator const_iterator; 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SymbolCategory(); 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ~SymbolCategory(); 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- modifiers ----- // 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SymbolCategory& add(LDSymbol& pSymbol); 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SymbolCategory& forceLocal(LDSymbol& pSymbol); 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SymbolCategory& arrange(LDSymbol& pSymbol, const ResolveInfo& pSourceInfo); 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SymbolCategory& changeCommonsToGlobal(); 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 45f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SymbolCategory& changeToDynamic(LDSymbol& pSymbol); 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- access ----- // 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDSymbol& at(size_t pPosition) 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return *m_OutputSymbols.at(pPosition); } 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const LDSymbol& at(size_t pPosition) const 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return *m_OutputSymbols.at(pPosition); } 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDSymbol& operator[](size_t pPosition) 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return *m_OutputSymbols[pPosition]; } 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const LDSymbol& operator[](size_t pPosition) const 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return *m_OutputSymbols[pPosition]; } 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- observers ----- // 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t numOfSymbols() const; 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines size_t numOfFiles() const; 646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t numOfLocals() const; 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines size_t numOfLocalDyns() const; 686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t numOfCommons() const; 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines size_t numOfDynamics() const; 726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t numOfRegulars() const; 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool empty() const; 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines bool emptyFiles() const; 786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool emptyLocals() const; 8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines bool emptyLocalDyns() const; 826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool emptyCommons() const; 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines bool emptyDynamics() const; 866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool emptyRegulars() const; 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- iterators ----- // 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator begin(); 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator end(); 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_iterator begin() const; 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_iterator end() const; 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines iterator fileBegin(); 966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines iterator fileEnd(); 976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const_iterator fileBegin() const; 986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const_iterator fileEnd() const; 996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator localBegin(); 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator localEnd(); 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_iterator localBegin() const; 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_iterator localEnd() const; 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines iterator localDynBegin(); 1066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines iterator localDynEnd(); 1076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const_iterator localDynBegin() const; 1086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const_iterator localDynEnd() const; 10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator commonBegin(); 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator commonEnd(); 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_iterator commonBegin() const; 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_iterator commonEnd() const; 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines iterator dynamicBegin(); 1166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines iterator dynamicEnd(); 1176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const_iterator dynamicBegin() const; 1186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const_iterator dynamicEnd() const; 1196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator regularBegin(); 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator regularEnd(); 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_iterator regularBegin() const; 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_iterator regularEnd() const; 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao class Category 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao public: 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao enum Type { 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao File, 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Local, 1326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines LocalDyn, 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Common, 1346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Dynamic, 1356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Regular 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao }; 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao public: 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Type type; 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t begin; 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t end; 1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Category* prev; 1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Category* next; 1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao public: 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Category(Type pType) 1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao : type(pType), 1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao begin(0), 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao end(0), 1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao prev(NULL), 1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao next(NULL) { 1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t size() const 1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return (end - begin); } 1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool empty() const 1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return (begin == end); } 1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isFirst() const 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return (NULL == prev); } 1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isLast() const 1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return (NULL == next); } 1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static Type categorize(const ResolveInfo& pInfo); 1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao }; 1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 1726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines SymbolCategory& add(LDSymbol& pSymbol, Category::Type pTarget); 1736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 174f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SymbolCategory& arrange(LDSymbol& pSymbol, 175f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Category::Type pSource, 176f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Category::Type pTarget); 177f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 1786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate: 1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao OutputSymbols m_OutputSymbols; 1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Category* m_pFile; 1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Category* m_pLocal; 1836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Category* m_pLocalDyn; 1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Category* m_pCommon; 1856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Category* m_pDynamic; 1866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Category* m_pRegular; 1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 193