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