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