122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- SymbolEntryMap.h ---------------------------------------------------===//
222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//                     The MCLinker Project
422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// This file is distributed under the University of Illinois Open Source
622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// License. See LICENSE.TXT for details.
722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifndef MCLD_TARGET_SYMBOL_ENTRY_MAP_H
1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#define MCLD_TARGET_SYMBOL_ENTRY_MAP_H
1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifdef ENABLE_UNITTEST
1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <gtest.h>
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <vector>
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass ResolveInfo;
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class SymbolEntryMap
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  \brief SymbolEntryMap is a <const ResolveInfo*, ENTRY*> map.
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao */
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaotemplate<typename ENTRY>
2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass SymbolEntryMap
2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic:
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef ENTRY EntryType;
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate:
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  struct Mapping {
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    const ResolveInfo* symbol;
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    EntryType*   entry;
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  };
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef std::vector<Mapping> SymbolEntryPool;
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic:
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef typename SymbolEntryPool::iterator iterator;
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef typename SymbolEntryPool::const_iterator const_iterator;
4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic:
4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const EntryType* lookUp(const ResolveInfo& pSymbol) const;
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  EntryType*       lookUp(const ResolveInfo& pSymbol);
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  void record(const ResolveInfo& pSymbol, EntryType& pEntry);
4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool   empty() const { return m_Pool.empty(); }
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t size () const { return m_Pool.size(); }
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_iterator begin() const { return m_Pool.begin(); }
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  iterator       begin()       { return m_Pool.begin(); }
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_iterator end  () const { return m_Pool.end();   }
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  iterator       end  ()       { return m_Pool.end();   }
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  void reserve(size_t pSize) { m_Pool.reserve(pSize); }
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate:
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SymbolEntryPool m_Pool;
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao};
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaotemplate<typename EntryType>
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoconst EntryType*
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoSymbolEntryMap<EntryType>::lookUp(const ResolveInfo& pSymbol) const
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_iterator mapping, mEnd = m_Pool.end();
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (mapping = m_Pool.begin(); mapping != mEnd; ++mapping) {
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if (mapping->symbol == &pSymbol) {
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      return mapping->entry;
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    }
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return NULL;
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaotemplate<typename EntryType>
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoEntryType*
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoSymbolEntryMap<EntryType>::lookUp(const ResolveInfo& pSymbol)
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  iterator mapping, mEnd = m_Pool.end();
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (mapping = m_Pool.begin(); mapping != mEnd; ++mapping) {
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if (mapping->symbol == &pSymbol) {
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      return mapping->entry;
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    }
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return NULL;
8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaotemplate<typename EntryType>
9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid
9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoSymbolEntryMap<EntryType>::record(const ResolveInfo& pSymbol, EntryType& pEntry)
9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Mapping mapping;
9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  mapping.symbol = &pSymbol;
9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  mapping.entry = &pEntry;
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_Pool.push_back(mapping);
9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} // namespace of mcld
10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif
10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
105