| //===- SectionSymbolSet.h -------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #ifndef MCLD_SECTIONSYMBOLSET_H |
| #define MCLD_SECTIONSYMBOLSET_H |
| #ifdef ENABLE_UNITTEST |
| #include <gtest.h> |
| #endif |
| |
| #include <mcld/ADT/HashTable.h> |
| #include <mcld/ADT/HashEntry.h> |
| #include <mcld/MC/SymbolCategory.h> |
| |
| namespace mcld |
| { |
| |
| class LDSection; |
| class NamePool; |
| class LDSymbol; |
| |
| /** \class SectionSymbolSet |
| * \brief SectionSymbolSet contains the section symbols defined by linker for |
| * the output sections |
| */ |
| class SectionSymbolSet |
| { |
| public: |
| typedef SymbolCategory SymbolTable; |
| |
| public: |
| SectionSymbolSet(); |
| ~SectionSymbolSet(); |
| |
| /// add - create and add an section symbol for the output |
| /// LDSection |
| bool add(LDSection& pOutSect, NamePool& pNamePool); |
| |
| /// finalize - set section symbols' fragmentRef and push it into the output |
| /// symbol table |
| bool finalize(LDSection& pOutSect, SymbolTable& pSymTab); |
| |
| /// get - get the section symbol for section pOutpSect |
| LDSymbol* get(const LDSection& pOutSect); |
| const LDSymbol* get(const LDSection& pOutSect) const; |
| |
| private: |
| /// sectCompare - hash compare function for LDSection* |
| struct SectCompare |
| { |
| bool operator()(const LDSection* X, const LDSection* Y) const |
| { return (X==Y); } |
| }; |
| |
| /// SectPtrHash - hash function for LDSection* |
| struct SectPtrHash |
| { |
| size_t operator()(const LDSection* pKey) const |
| { |
| return (unsigned((uintptr_t)pKey) >> 4) ^ |
| (unsigned((uintptr_t)pKey) >> 9); |
| } |
| }; |
| |
| typedef HashEntry<const LDSection*, LDSymbol*, SectCompare> SectHashEntryType; |
| typedef HashTable<SectHashEntryType, |
| SectPtrHash, |
| EntryFactory<SectHashEntryType> > SectHashTableType; |
| |
| private: |
| SectHashTableType* m_pSectionSymbolMap; |
| }; |
| |
| } // namespace of mcld |
| |
| #endif |
| |