SymbolCategory.cpp revision 5460a1f25d9ddecb5c70667267d66d51af177a99
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- SymbolCategory.cpp -------------------------------------------------===// 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//===----------------------------------------------------------------------===// 95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/MC/SymbolCategory.h> 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDSymbol.h> 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/ResolveInfo.h> 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <algorithm> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld; 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Category 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory::Category::Type 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory::Category::categorize(const ResolveInfo& pInfo) 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (ResolveInfo::File == pInfo.type()) 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return Category::File; 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (ResolveInfo::Local == pInfo.binding()) 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return Category::Local; 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (ResolveInfo::Common == pInfo.desc()) 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return Category::Common; 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (ResolveInfo::Weak == pInfo.binding()) 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return Category::Weak; 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return Category::Global; 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// SymbolCategory 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory::SymbolCategory() 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pFile = new Category(Category::File); 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pLocal = new Category(Category::Local); 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pCommon = new Category(Category::Common); 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pWeak = new Category(Category::Weak); 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pGlobal = new Category(Category::Global); 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pFile->next = m_pLocal; 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pLocal->next = m_pCommon; 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pCommon->next = m_pWeak; 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pWeak->next = m_pGlobal; 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pGlobal->prev = m_pWeak; 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pWeak->prev = m_pCommon; 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pCommon->prev = m_pLocal; 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pLocal->prev = m_pFile; 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory::~SymbolCategory() 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Category* current = m_pFile; 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao while (NULL != current) { 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Category* tmp = current; 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao current = current->next; 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao delete tmp; 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory& SymbolCategory::add(LDSymbol& pSymbol) 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_OutputSymbols.push_back(&pSymbol); 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(NULL != pSymbol.resolveInfo()); 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Category::Type target = Category::categorize(*pSymbol.resolveInfo()); 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Category* current = m_pGlobal; 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // use non-stable bubble sort to arrange the order of symbols. 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao while (NULL != current) { 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (current->type == target) { 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao current->end++; 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao break; 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else { 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (!current->empty()) { 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao std::swap(m_OutputSymbols[current->begin], 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_OutputSymbols[current->end]); 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao current->end++; 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao current->begin++; 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao current = current->prev; 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return *this; 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory& SymbolCategory::forceLocal(LDSymbol& pSymbol) 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_OutputSymbols.insert(localEnd(), &pSymbol); 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pLocal->end++; 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pCommon->begin++; 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pCommon->end++; 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pWeak->begin++; 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pWeak->end++; 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pGlobal->begin++; 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pGlobal->end++; 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return *this; 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory& SymbolCategory::arrange(LDSymbol& pSymbol, const ResolveInfo& pSourceInfo) 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(NULL != pSymbol.resolveInfo()); 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Category::Type source = Category::categorize(pSourceInfo); 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Category::Type target = Category::categorize(*pSymbol.resolveInfo()); 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao int distance = target - source; 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (0 == distance) { 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // in the same category, do not need to re-arrange 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return *this; 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // source and target are not in the same category 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // find the category of source 1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Category* current = m_pFile; 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao while(NULL != current) { 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (source == current->type) 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao break; 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao current = current->next; 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(NULL != current); 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(!current->empty()); 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // find the position of source 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t pos = current->begin; 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao while (pos != current->end) { 1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (m_OutputSymbols[pos] == &pSymbol) 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao break; 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ++pos; 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(current->end != pos); 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // The distance is positive. It means we should bubble sort downward. 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (distance > 0) { 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // downward 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t rear; 1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao do { 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (current->type == target) { 1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao break; 1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else { 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(!current->isLast() && "target category is wrong."); 1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao rear = current->end - 1; 1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao std::swap(m_OutputSymbols[pos], m_OutputSymbols[rear]); 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pos = rear; 1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao current->next->begin--; 1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao current->end--; 1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao current = current->next; 1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } while(NULL != current); 1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return *this; 1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } // downward 1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // The distance is negative. It means we should bubble sort upward. 1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (distance < 0) { 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // upward 1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao do { 1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (current->type == target) { 1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao break; 1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else { 1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(!current->isFirst() && "target category is wrong."); 1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao std::swap(m_OutputSymbols[current->begin], m_OutputSymbols[pos]); 1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pos = current->begin; 1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao current->begin++; 1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao current->prev->end++; 1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao current = current->prev; 1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } while(NULL != current); 1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return *this; 1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } // upward 1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return *this; 1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory& SymbolCategory::changeCommonsToGlobal() 1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (emptyCommons()) 1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return *this; 1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t com_rear = m_pCommon->end - 1; 1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t com_front = m_pCommon->begin; 1915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t weak_rear = m_pWeak->end - 1; 1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t weak_size = m_pWeak->end - m_pWeak->begin; 1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao for (size_t sym = com_rear; sym >= com_front; --sym) { 1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao std::swap(m_OutputSymbols[weak_rear], m_OutputSymbols[sym]); 1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao --weak_rear; 1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pWeak->begin = m_pCommon->begin; 1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pWeak->end = m_pCommon->begin + weak_size; 2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pGlobal->begin = m_pWeak->end; 2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pCommon->begin = m_pCommon->end = m_pWeak->begin; 2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return *this; 2045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaosize_t SymbolCategory::numOfSymbols() const 2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_OutputSymbols.size(); 2095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaosize_t SymbolCategory::numOfLocals() const 2125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (m_pFile->size() + m_pLocal->size()); 2145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaosize_t SymbolCategory::numOfCommons() const 2175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pCommon->size(); 2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaosize_t SymbolCategory::numOfRegulars() const 2225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (m_pWeak->size() + m_pGlobal->size()); 2245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool SymbolCategory::empty() const 2275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (emptyLocals() && 2295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao emptyCommons() && 2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao emptyRegulars()); 2315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool SymbolCategory::emptyLocals() const 2345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (m_pFile->empty() && m_pLocal->empty()); 2365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool SymbolCategory::emptyCommons() const 2395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pCommon->empty(); 2415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool SymbolCategory::emptyRegulars() const 2445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (m_pWeak->empty() && m_pGlobal->empty()); 2465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory::iterator SymbolCategory::begin() 2495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_OutputSymbols.begin(); 2515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory::iterator SymbolCategory::end() 2545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_OutputSymbols.end(); 2565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory::const_iterator SymbolCategory::begin() const 2595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_OutputSymbols.begin(); 2615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory::const_iterator SymbolCategory::end() const 2645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_OutputSymbols.end(); 2665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory::iterator SymbolCategory::localBegin() 2695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_OutputSymbols.begin(); 2715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory::iterator SymbolCategory::localEnd() 2745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator iter = m_OutputSymbols.begin(); 2765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iter += m_pFile->size(); 2775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iter += m_pLocal->size(); 2785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return iter; 2795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory::const_iterator SymbolCategory::localBegin() const 2825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_OutputSymbols.begin(); 2845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory::const_iterator SymbolCategory::localEnd() const 2875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_iterator iter = m_OutputSymbols.begin(); 2895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iter += m_pFile->size(); 2905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iter += m_pLocal->size(); 2915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return iter; 2925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory::iterator SymbolCategory::commonBegin() 2955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return localEnd(); 2975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory::iterator SymbolCategory::commonEnd() 3005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 3015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator iter = localEnd(); 3025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iter += m_pCommon->size(); 3035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return iter; 3045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 3055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory::const_iterator SymbolCategory::commonBegin() const 3075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 3085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return localEnd(); 3095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 3105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory::const_iterator SymbolCategory::commonEnd() const 3125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 3135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const_iterator iter = localEnd(); 3145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iter += m_pCommon->size(); 3155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return iter; 3165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 3175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory::iterator SymbolCategory::regularBegin() 3195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 3205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return commonEnd(); 3215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 3225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory::iterator SymbolCategory::regularEnd() 3245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 3255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_OutputSymbols.end(); 3265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 3275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory::const_iterator SymbolCategory::regularBegin() const 3295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 3305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return commonEnd(); 3315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 3325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSymbolCategory::const_iterator SymbolCategory::regularEnd() const 3345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 3355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_OutputSymbols.end(); 3365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 3375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 338