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//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/MC/SymbolCategory.h"
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSymbol.h"
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ResolveInfo.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <algorithm>
156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <cassert>
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Category
2137b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::Category::Type SymbolCategory::Category::categorize(
2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    const ResolveInfo& pInfo) {
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (ResolveInfo::File == pInfo.type())
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return Category::File;
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (ResolveInfo::Local == pInfo.binding())
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return Category::Local;
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (ResolveInfo::Common == pInfo.desc())
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return Category::Common;
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  if (ResolveInfo::Default == pInfo.visibility() ||
306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines      ResolveInfo::Protected == pInfo.visibility())
316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    return Category::Dynamic;
326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return Category::Regular;
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// SymbolCategory
3737b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::SymbolCategory() {
3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pFile = new Category(Category::File);
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pLocal = new Category(Category::Local);
406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  m_pLocalDyn = new Category(Category::LocalDyn);
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pCommon = new Category(Category::Common);
4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pDynamic = new Category(Category::Dynamic);
4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pRegular = new Category(Category::Regular);
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pFile->next = m_pLocal;
4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pLocal->next = m_pLocalDyn;
476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  m_pLocalDyn->next = m_pCommon;
4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pCommon->next = m_pDynamic;
4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pDynamic->next = m_pRegular;
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pRegular->prev = m_pDynamic;
5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pDynamic->prev = m_pCommon;
5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pCommon->prev = m_pLocalDyn;
546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  m_pLocalDyn->prev = m_pLocal;
5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pLocal->prev = m_pFile;
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5837b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::~SymbolCategory() {
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Category* current = m_pFile;
6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  while (current != NULL) {
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Category* tmp = current;
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    current = current->next;
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    delete tmp;
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6737b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory& SymbolCategory::add(LDSymbol& pSymbol, Category::Type pTarget) {
686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Category* current = m_pRegular;
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_OutputSymbols.push_back(&pSymbol);
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // use non-stable bubble sort to arrange the order of symbols.
7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  while (current != NULL) {
736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    if (current->type == pTarget) {
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      current->end++;
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      break;
7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    } else {
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      if (!current->empty()) {
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        std::swap(m_OutputSymbols[current->begin],
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                  m_OutputSymbols[current->end]);
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      }
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      current->end++;
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      current->begin++;
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      current = current->prev;
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return *this;
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8937b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory& SymbolCategory::add(LDSymbol& pSymbol) {
9037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(pSymbol.resolveInfo() != NULL);
916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return add(pSymbol, Category::categorize(*pSymbol.resolveInfo()));
926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
9437b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory& SymbolCategory::forceLocal(LDSymbol& pSymbol) {
956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return add(pSymbol, Category::Local);
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesSymbolCategory& SymbolCategory::arrange(LDSymbol& pSymbol,
99f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                                        Category::Type pSource,
10037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        Category::Type pTarget) {
101f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  int distance = pTarget - pSource;
10237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  if (distance == 0) {
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // in the same category, do not need to re-arrange
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return *this;
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // source and target are not in the same category
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // find the category of source
1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Category* current = m_pFile;
11037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  while (current != NULL) {
111f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    if (pSource == current->type)
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      break;
1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    current = current->next;
1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
11637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(current != NULL);
117551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  size_t pos = 0;
118551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (!current->empty()) {
119551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    // find the position of source
120551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    pos = current->begin;
121551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    while (pos != current->end) {
122551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      if (m_OutputSymbols[pos] == &pSymbol)
123551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        break;
124551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      ++pos;
125551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    }
126551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
127551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // FIXME: Try to search the symbol explicitly, if symbol is not in the given
128551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // source category. Or we need to add some logics like shouldForceLocal() in
129551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // SymbolCategory::Category::categorize().
130551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (current->end == pos || current->empty()) {
131551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    current = m_pFile;
132551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    do {
133551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      pos = current->begin;
134551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      while (pos != current->end) {
135551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        if (m_OutputSymbols[pos] == &pSymbol) {
136551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines          distance = pTarget - current->type;
137551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines          break;
138551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        }
139551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        ++pos;
140551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      }
141551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      if (pos != current->end)
142551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        break;
143551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      current = current->next;
144551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    } while (current != NULL);
145551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    assert(current != NULL);
1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // The distance is positive. It means we should bubble sort downward.
1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (distance > 0) {
1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // downward
1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    size_t rear;
1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    do {
153f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines      if (current->type == pTarget) {
1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        break;
15537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      } else {
1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        assert(!current->isLast() && "target category is wrong.");
1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        rear = current->end - 1;
1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        std::swap(m_OutputSymbols[pos], m_OutputSymbols[rear]);
1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        pos = rear;
1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        current->next->begin--;
1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        current->end--;
1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      }
1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      current = current->next;
16437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    } while (current != NULL);
1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return *this;
16737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }  // downward
1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // The distance is negative. It means we should bubble sort upward.
1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (distance < 0) {
1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // upward
1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    do {
173f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines      if (current->type == pTarget) {
1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        break;
17537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      } else {
1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        assert(!current->isFirst() && "target category is wrong.");
1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        std::swap(m_OutputSymbols[current->begin], m_OutputSymbols[pos]);
1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        pos = current->begin;
1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        current->begin++;
1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        current->prev->end++;
1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      }
1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      current = current->prev;
18337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    } while (current != NULL);
1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return *this;
18637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }  // upward
1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return *this;
1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
190f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen HinesSymbolCategory& SymbolCategory::arrange(LDSymbol& pSymbol,
19137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        const ResolveInfo& pSourceInfo) {
19237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(pSymbol.resolveInfo() != NULL);
193f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  return arrange(pSymbol,
194f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                 Category::categorize(pSourceInfo),
195f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                 Category::categorize(*pSymbol.resolveInfo()));
196f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}
197f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
19837b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory& SymbolCategory::changeCommonsToGlobal() {
1996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  // Change Common to Dynamic/Regular
2006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  while (!emptyCommons()) {
2016f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    size_t pos = m_pCommon->end - 1;
2026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    switch (Category::categorize(*(m_OutputSymbols[pos]->resolveInfo()))) {
20337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      case Category::Dynamic:
20437b74a387bb3993387029859c2d9d051c41c724eStephen Hines        m_pCommon->end--;
20537b74a387bb3993387029859c2d9d051c41c724eStephen Hines        m_pDynamic->begin--;
20637b74a387bb3993387029859c2d9d051c41c724eStephen Hines        break;
20737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      case Category::Regular:
20837b74a387bb3993387029859c2d9d051c41c724eStephen Hines        std::swap(m_OutputSymbols[pos], m_OutputSymbols[m_pDynamic->end - 1]);
20937b74a387bb3993387029859c2d9d051c41c724eStephen Hines        m_pCommon->end--;
21037b74a387bb3993387029859c2d9d051c41c724eStephen Hines        m_pDynamic->begin--;
21137b74a387bb3993387029859c2d9d051c41c724eStephen Hines        m_pDynamic->end--;
21237b74a387bb3993387029859c2d9d051c41c724eStephen Hines        m_pRegular->begin--;
21337b74a387bb3993387029859c2d9d051c41c724eStephen Hines        break;
21437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      default:
21537b74a387bb3993387029859c2d9d051c41c724eStephen Hines        assert(0);
21637b74a387bb3993387029859c2d9d051c41c724eStephen Hines        break;
2176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    }
2185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return *this;
2205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
22237b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory& SymbolCategory::changeToDynamic(LDSymbol& pSymbol) {
22337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(pSymbol.resolveInfo() != NULL);
224f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  return arrange(pSymbol,
225f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                 Category::categorize(*pSymbol.resolveInfo()),
226f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines                 Category::LocalDyn);
22722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
22822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
22937b74a387bb3993387029859c2d9d051c41c724eStephen Hinessize_t SymbolCategory::numOfSymbols() const {
2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return m_OutputSymbols.size();
2315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
23337b74a387bb3993387029859c2d9d051c41c724eStephen Hinessize_t SymbolCategory::numOfFiles() const {
2346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return m_pFile->size();
2356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
2366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
23737b74a387bb3993387029859c2d9d051c41c724eStephen Hinessize_t SymbolCategory::numOfLocals() const {
2386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return m_pLocal->size();
2396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
2406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
24137b74a387bb3993387029859c2d9d051c41c724eStephen Hinessize_t SymbolCategory::numOfLocalDyns() const {
2426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return m_pLocalDyn->size();
2435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
24537b74a387bb3993387029859c2d9d051c41c724eStephen Hinessize_t SymbolCategory::numOfCommons() const {
2465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return m_pCommon->size();
2475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
24937b74a387bb3993387029859c2d9d051c41c724eStephen Hinessize_t SymbolCategory::numOfDynamics() const {
2506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return m_pDynamic->size();
2516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
2526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
25337b74a387bb3993387029859c2d9d051c41c724eStephen Hinessize_t SymbolCategory::numOfRegulars() const {
2546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return m_pRegular->size();
2555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
25737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool SymbolCategory::empty() const {
2586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return m_OutputSymbols.empty();
2596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
2606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
26137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool SymbolCategory::emptyFiles() const {
2626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return m_pFile->empty();
2635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
26537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool SymbolCategory::emptyLocals() const {
2666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return m_pLocal->empty();
2676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
2686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
26937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool SymbolCategory::emptyLocalDyns() const {
2706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return m_pLocalDyn->empty();
2715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
27337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool SymbolCategory::emptyCommons() const {
2745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return m_pCommon->empty();
2755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
27737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool SymbolCategory::emptyDynamics() const {
2786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return m_pDynamic->empty();
2796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
2806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
28137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool SymbolCategory::emptyRegulars() const {
2826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return m_pRegular->empty();
2835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
28537b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::iterator SymbolCategory::begin() {
2865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return m_OutputSymbols.begin();
2875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
28937b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::iterator SymbolCategory::end() {
2905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return m_OutputSymbols.end();
2915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
29337b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::const_iterator SymbolCategory::begin() const {
2945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return m_OutputSymbols.begin();
2955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
2965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
29737b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::const_iterator SymbolCategory::end() const {
2985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return m_OutputSymbols.end();
2995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
3005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
30137b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::iterator SymbolCategory::fileBegin() {
3025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return m_OutputSymbols.begin();
3035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
3045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
30537b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::iterator SymbolCategory::fileEnd() {
3066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  iterator iter = fileBegin();
3075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  iter += m_pFile->size();
3086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return iter;
3096f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
3106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
31137b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::const_iterator SymbolCategory::fileBegin() const {
3126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return m_OutputSymbols.begin();
3136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
3146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
31537b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::const_iterator SymbolCategory::fileEnd() const {
3166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const_iterator iter = fileBegin();
3176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  iter += m_pFile->size();
3186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return iter;
3196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
3206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
32137b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::iterator SymbolCategory::localBegin() {
3226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return fileEnd();
3236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
3246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
32537b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::iterator SymbolCategory::localEnd() {
3266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  iterator iter = localBegin();
3275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  iter += m_pLocal->size();
3285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return iter;
3295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
3305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
33137b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::const_iterator SymbolCategory::localBegin() const {
3326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return fileEnd();
3335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
3345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
33537b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::const_iterator SymbolCategory::localEnd() const {
3366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const_iterator iter = localBegin();
3375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  iter += m_pLocal->size();
3385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return iter;
3395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
3405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
34137b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::iterator SymbolCategory::localDynBegin() {
3425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return localEnd();
3435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
3445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
34537b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::iterator SymbolCategory::localDynEnd() {
3466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  iterator iter = localDynBegin();
3476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  iter += m_pLocalDyn->size();
34822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return iter;
34922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
35022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
35137b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::const_iterator SymbolCategory::localDynBegin() const {
35222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return localEnd();
35322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
35422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
35537b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::const_iterator SymbolCategory::localDynEnd() const {
3566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const_iterator iter = localDynBegin();
3576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  iter += m_pLocalDyn->size();
35822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return iter;
35922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
36022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
36137b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::iterator SymbolCategory::commonBegin() {
3626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return localDynEnd();
36322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
36422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
36537b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::iterator SymbolCategory::commonEnd() {
3666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  iterator iter = commonBegin();
3675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  iter += m_pCommon->size();
3685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return iter;
3695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
3705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
37137b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::const_iterator SymbolCategory::commonBegin() const {
3726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return localDynEnd();
3735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
3745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
37537b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::const_iterator SymbolCategory::commonEnd() const {
3766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const_iterator iter = commonBegin();
3775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  iter += m_pCommon->size();
3785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return iter;
3795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
3805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
38137b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::iterator SymbolCategory::dynamicBegin() {
3826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return commonEnd();
3836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
3846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
38537b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::iterator SymbolCategory::dynamicEnd() {
3866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  iterator iter = dynamicBegin();
3876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  iter += m_pDynamic->size();
3886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return iter;
3896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
3906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
39137b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::const_iterator SymbolCategory::dynamicBegin() const {
3926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return commonEnd();
3936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
3946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
39537b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::const_iterator SymbolCategory::dynamicEnd() const {
3966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const_iterator iter = dynamicBegin();
3976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  iter += m_pDynamic->size();
3986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return iter;
3996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
4006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
40137b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::iterator SymbolCategory::regularBegin() {
40237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  return dynamicEnd();
4035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
4045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
40537b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::iterator SymbolCategory::regularEnd() {
4065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return m_OutputSymbols.end();
4075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
4085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
40937b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::const_iterator SymbolCategory::regularBegin() const {
41037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  return dynamicEnd();
4115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
4125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
41337b74a387bb3993387029859c2d9d051c41c724eStephen HinesSymbolCategory::const_iterator SymbolCategory::regularEnd() const {
4145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return m_OutputSymbols.end();
4155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
4165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
41737b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
418