| //===- SectionMerger.cpp --------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #include <cassert> |
| #include <cstring> |
| #include <mcld/LD/SectionMerger.h> |
| |
| using namespace mcld; |
| |
| //========================== |
| // SectionMerger |
| |
| SectionMerger::SectionMerger(SectionMap& pSectionMap, LDContext& pContext) |
| : m_SectionNameMap(pSectionMap), |
| m_Output(pContext), |
| m_LDSectionMap() |
| { |
| } |
| |
| SectionMerger::~SectionMerger() |
| { |
| } |
| |
| SectionMerger::iterator SectionMerger::find(const std::string& pName) |
| { |
| if (empty()) |
| initOutputSectMap(); |
| |
| iterator it; |
| for (it = begin(); it != end(); ++it) { |
| if (0 == strncmp(pName.c_str(), |
| (*it).inputSubStr.c_str(), |
| (*it).inputSubStr.length())) |
| break; |
| // wildcard to a user-defined output section. |
| else if(0 == strcmp("*", (*it).inputSubStr.c_str())) |
| break; |
| } |
| return it; |
| } |
| |
| LDSection* SectionMerger::getOutputSectHdr(const std::string& pName) |
| { |
| LDSection* section; |
| iterator it = find(pName); |
| |
| // check if we can find a matched LDSection. |
| // If not, we need to find it in output context. But this should be rare. |
| if (it != end()) |
| section = (*it).outputSection; |
| else |
| section = m_Output.getSection(pName); |
| |
| assert(NULL != section); |
| return section; |
| } |
| |
| SectionData* SectionMerger::getOutputSectData(const std::string& pName) |
| { |
| return getOutputSectHdr(pName)->getSectionData(); |
| } |
| |
| bool SectionMerger::addMapping(const std::string& pName, LDSection* pSection) |
| { |
| iterator it = find(pName); |
| if (it != end()) { |
| assert(NULL == (*it).outputSection); |
| (*it).outputSection = pSection; |
| return true; |
| } |
| // the mapping rule is not in SectionMap, and this is handled in getOutputSectHdr. |
| return false; |
| } |
| |
| void SectionMerger::initOutputSectMap() |
| { |
| // Based on SectionMap to initialize the map from a input substr to its |
| // associated output LDSection* |
| SectionMap::iterator it; |
| for (it = m_SectionNameMap.begin(); it != m_SectionNameMap.end(); ++it) { |
| struct Mapping mapping = { |
| (*it).inputSubStr, |
| NULL, |
| }; |
| m_LDSectionMap.push_back(mapping); |
| } |
| assert(m_SectionNameMap.size() == m_LDSectionMap.size()); |
| } |