15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- SectionMerger.cpp --------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <cassert>
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <cstring>
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/SectionMerger.h>
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld;
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//==========================
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// SectionMerger
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSectionMerger::SectionMerger(SectionMap& pSectionMap, LDContext& pContext)
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao: m_SectionNameMap(pSectionMap),
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_Output(pContext),
21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  m_LDSectionMap()
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSectionMerger::~SectionMerger()
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSectionMerger::iterator SectionMerger::find(const std::string& pName)
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (empty())
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    initOutputSectMap();
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  iterator it;
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  for (it = begin(); it != end(); ++it) {
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (0 == strncmp(pName.c_str(),
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     (*it).inputSubStr.c_str(),
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     (*it).inputSubStr.length()))
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      break;
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // wildcard to a user-defined output section.
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    else if(0 == strcmp("*", (*it).inputSubStr.c_str()))
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      break;
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return it;
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoLDSection* SectionMerger::getOutputSectHdr(const std::string& pName)
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSection* section;
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  iterator it = find(pName);
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // check if we can find a matched LDSection.
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // If not, we need to find it in output context. But this should be rare.
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (it != end())
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    section = (*it).outputSection;
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    section = m_Output.getSection(pName);
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  assert(NULL != section);
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return section;
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
63cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei LiaoSectionData* SectionMerger::getOutputSectData(const std::string& pName)
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return getOutputSectHdr(pName)->getSectionData();
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool SectionMerger::addMapping(const std::string& pName, LDSection* pSection)
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  iterator it = find(pName);
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (it != end()) {
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    assert(NULL == (*it).outputSection);
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    (*it).outputSection = pSection;
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return true;
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // the mapping rule is not in SectionMap, and this is handled in getOutputSectHdr.
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return false;
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid SectionMerger::initOutputSectMap()
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Based on SectionMap to initialize the map from a input substr to its
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // associated output LDSection*
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  SectionMap::iterator it;
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  for (it = m_SectionNameMap.begin(); it != m_SectionNameMap.end(); ++it) {
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    struct Mapping mapping = {
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      (*it).inputSubStr,
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      NULL,
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    };
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_LDSectionMap.push_back(mapping);
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  assert(m_SectionNameMap.size() == m_LDSectionMap.size());
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
94