| //===- SectionMerger.h ----------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #ifndef MCLD_SECTION_MERGER_H |
| #define MCLD_SECTION_MERGER_H |
| #ifdef ENABLE_UNITTEST |
| #include <gtest.h> |
| #endif |
| |
| #include <vector> |
| #include <string> |
| |
| #include <mcld/LD/LDSection.h> |
| #include <mcld/LD/LDContext.h> |
| #include <mcld/LD/SectionMap.h> |
| |
| namespace mcld |
| { |
| class MCLinker; |
| |
| /** \class SectionMerger |
| * \brief maintain the mappings of substr of input section name to associated |
| * output section (data) |
| */ |
| class SectionMerger |
| { |
| public: |
| struct Mapping { |
| std::string inputSubStr; |
| LDSection* outputSection; |
| }; |
| typedef std::vector<Mapping> LDSectionMapTy; |
| |
| typedef LDSectionMapTy::iterator iterator; |
| typedef LDSectionMapTy::const_iterator const_iterator; |
| |
| public: |
| SectionMerger(SectionMap& pSectionMap, LDContext& pContext); |
| ~SectionMerger(); |
| |
| /// getOutputSectHdr - return a associated output section header |
| LDSection* getOutputSectHdr(const std::string& pName); |
| |
| /// getOutputSectData - return a associated output section data |
| SectionData* getOutputSectData(const std::string& pName); |
| |
| /// addMapping - add a mapping as creating one new output LDSection |
| /// @param pName - a input section name |
| /// @param pSection - the output LDSection* |
| bool addMapping(const std::string& pName, LDSection* pSection); |
| |
| // ----- observers ----- // |
| bool empty() const |
| { return m_LDSectionMap.empty(); } |
| |
| size_t size() const |
| { return m_LDSectionMap.size(); } |
| |
| size_t capacity () const |
| { return m_LDSectionMap.capacity(); } |
| |
| // ----- iterators ----- // |
| iterator find(const std::string& pName); |
| |
| iterator begin() |
| { return m_LDSectionMap.begin(); } |
| |
| iterator end() |
| { return m_LDSectionMap.end(); } |
| |
| const_iterator begin() const |
| { return m_LDSectionMap.begin(); } |
| |
| const_iterator end() const |
| { return m_LDSectionMap.end(); } |
| |
| private: |
| /// initOutputSectMap - initialize the map from input substr to associated |
| /// output LDSection* |
| void initOutputSectMap(); |
| |
| private: |
| SectionMap& m_SectionNameMap; |
| |
| LDContext& m_Output; |
| |
| LDSectionMapTy m_LDSectionMap; |
| }; |
| |
| } // namespace of mcld |
| |
| #endif |
| |