SectionMap.h revision 87f34658dec9097d987d254a990ea7f311bfc95f
122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- SectionMap.h -------------------------------------------------------===// 222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// The MCLinker Project 422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// This file is distributed under the University of Illinois Open Source 622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// License. See LICENSE.TXT for details. 722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_OBJECT_SECTIONMAP_H 1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_OBJECT_SECTIONMAP_H 1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifdef ENABLE_UNITTEST 1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <gtest.h> 1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/OutputSectDesc.h> 1687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/InputSectDesc.h> 1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/Assignment.h> 1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/Support/DataTypes.h> 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <vector> 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <string> 2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Fragment; 2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LDSection; 2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class SectionMap 2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief descirbe how to map input sections into output sections 2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao */ 3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass SectionMap 3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic: 3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines class Input { 3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao public: 3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::vector<std::pair<Fragment*, Assignment> > DotAssignments; 3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef DotAssignments::const_iterator const_dot_iterator; 3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef DotAssignments::iterator dot_iterator; 3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Input(const std::string& pName, InputSectDesc::KeepPolicy pPolicy); 4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Input(const InputSectDesc& pInputDesc); 4187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines InputSectDesc::KeepPolicy policy() const { return m_Policy; } 4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const InputSectDesc::Spec& spec() const { return m_Spec; } 4587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const LDSection* getSection() const { return m_pSection; } 4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LDSection* getSection() { return m_pSection; } 4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_dot_iterator dot_begin() const { return m_DotAssignments.begin(); } 5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines dot_iterator dot_begin() { return m_DotAssignments.begin(); } 5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_dot_iterator dot_end () const { return m_DotAssignments.end(); } 5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines dot_iterator dot_end () { return m_DotAssignments.end(); } 5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const DotAssignments& dotAssignments() const { return m_DotAssignments; } 5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines DotAssignments& dotAssignments() { return m_DotAssignments; } 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines private: 5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines InputSectDesc::KeepPolicy m_Policy; 5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines InputSectDesc::Spec m_Spec; 6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LDSection* m_pSection; 6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines DotAssignments m_DotAssignments; 6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines class Output { 6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao public: 6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::vector<Input*> InputList; 6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef InputList::const_iterator const_iterator; 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef InputList::iterator iterator; 6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef InputList::const_reference const_reference; 7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef InputList::reference reference; 7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::vector<Assignment> DotAssignments; 7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef DotAssignments::const_iterator const_dot_iterator; 7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef DotAssignments::iterator dot_iterator; 7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Output(const std::string& pName); 7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Output(const OutputSectDesc& pOutputDesc); 7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& name() const { return m_Name; } 8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const OutputSectDesc::Prolog& prolog() const { return m_Prolog; } 8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines OutputSectDesc::Prolog& prolog() { return m_Prolog; } 8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const OutputSectDesc::Epilog& epilog() const { return m_Epilog; } 8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines OutputSectDesc::Epilog& epilog() { return m_Epilog; } 8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t order() const { return m_Order; } 8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setOrder(size_t pOrder) { m_Order = pOrder; } 9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool hasContent() const; 9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const LDSection* getSection() const { return m_pSection; } 9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LDSection* getSection() { return m_pSection; } 9587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setSection(LDSection* pSection) { m_pSection = pSection; } 9787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_iterator begin() const { return m_InputList.begin(); } 9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines iterator begin() { return m_InputList.begin(); } 10087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_iterator end () const { return m_InputList.end(); } 10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines iterator end () { return m_InputList.end(); } 10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_reference front() const { return m_InputList.front(); } 10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines reference front() { return m_InputList.front(); } 10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_reference back () const { return m_InputList.back(); } 10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines reference back () { return m_InputList.back(); } 10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t size() const { return m_InputList.size(); } 10987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool empty() const { return m_InputList.empty(); } 11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool isDiscard() const { return m_bIsDiscard; } 11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void append(Input* pInput) { m_InputList.push_back(pInput); } 11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_dot_iterator dot_begin() const { return m_DotAssignments.begin(); } 11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines dot_iterator dot_begin() { return m_DotAssignments.begin(); } 11887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_dot_iterator dot_end () const { return m_DotAssignments.end(); } 11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines dot_iterator dot_end () { return m_DotAssignments.end(); } 12087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_dot_iterator find_first_explicit_dot() const; 12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines dot_iterator find_first_explicit_dot(); 12387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_dot_iterator find_last_explicit_dot() const; 12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines dot_iterator find_last_explicit_dot(); 12687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const DotAssignments& dotAssignments() const { return m_DotAssignments; } 12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines DotAssignments& dotAssignments() { return m_DotAssignments; } 12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 13087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines private: 13187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines std::string m_Name; 13287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines OutputSectDesc::Prolog m_Prolog; 13387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines OutputSectDesc::Epilog m_Epilog; 13487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LDSection* m_pSection; 13587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t m_Order; 13687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool m_bIsDiscard; 13787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines InputList m_InputList; 13887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines DotAssignments m_DotAssignments; 13922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao }; 14022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 14187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines struct SHOCompare 14287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { 14387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool operator()(const Output* LHS, const Output* RHS) const 14487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { return LHS->order() < RHS->order(); } 14587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 14687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 14787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::pair<const Output*, const Input*> const_mapping; 14887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::pair<Output*, Input*> mapping; 14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 15087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::vector<Output*> OutputDescList; 15187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef OutputDescList::const_iterator const_iterator; 15287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef OutputDescList::iterator iterator; 15387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef OutputDescList::const_reference const_reference; 15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef OutputDescList::reference reference; 15587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 15687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef OutputDescList::const_reverse_iterator const_reverse_iterator; 15787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef OutputDescList::reverse_iterator reverse_iterator; 15822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 15922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic: 16087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ~SectionMap(); 16187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_mapping find(const std::string& pInputFile, 16387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& pInputSection) const; 16487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines mapping find(const std::string& pInputFile, 16587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& pInputSection); 16622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 16787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_iterator find(const std::string& pOutputSection) const; 16887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines iterator find(const std::string& pOutputSection); 16922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 17087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines std::pair<mapping, bool> 17187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines insert(const std::string& pInputSection, 17287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& pOutputSection, 17387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines InputSectDesc::KeepPolicy pPolicy = InputSectDesc::NoKeep); 17487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines std::pair<mapping, bool> 17587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines insert(const InputSectDesc& pInputDesc, const OutputSectDesc& pOutputDesc); 17622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 17787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool empty() const { return m_OutputDescList.empty(); } 17887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t size () const { return m_OutputDescList.size(); } 17922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 18087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_iterator begin() const { return m_OutputDescList.begin(); } 18187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines iterator begin() { return m_OutputDescList.begin(); } 18287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_iterator end () const { return m_OutputDescList.end(); } 18387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines iterator end () { return m_OutputDescList.end(); } 18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 18587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_reference front() const { return m_OutputDescList.front(); } 18687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines reference front() { return m_OutputDescList.front(); } 18787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_reference back () const { return m_OutputDescList.back(); } 18887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines reference back () { return m_OutputDescList.back(); } 18987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 19087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_reverse_iterator rbegin() const { return m_OutputDescList.rbegin(); } 19187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines reverse_iterator rbegin() { return m_OutputDescList.rbegin(); } 19287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_reverse_iterator rend () const { return m_OutputDescList.rend(); } 19387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines reverse_iterator rend () { return m_OutputDescList.rend(); } 19487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 19587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines iterator insert(iterator pPosition, LDSection* pSection); 19687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 19787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // fixupDotSymbols - ensure the dot assignments are valid 19887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void fixupDotSymbols(); 19922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 20022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate: 20187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool matched(const Input& pInput, 20287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& pInputFile, 20387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& pInputSection) const; 20487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 20587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool matched(const WildcardPattern& pPattern, const std::string& pName) const; 20687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 20722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate: 20887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines OutputDescList m_OutputDescList; 20922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}; 21022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 21122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} // namespace of mcld 21222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 21322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 21422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 215