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