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 1287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/OutputSectDesc.h> 1387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/InputSectDesc.h> 1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/Assignment.h> 1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/Support/DataTypes.h> 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <vector> 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <string> 1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Fragment; 2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LDSection; 2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class SectionMap 2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief descirbe how to map input sections into output sections 2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao */ 2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass SectionMap 2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic: 3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines class Input { 3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao public: 3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::vector<std::pair<Fragment*, Assignment> > DotAssignments; 3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef DotAssignments::const_iterator const_dot_iterator; 3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef DotAssignments::iterator dot_iterator; 3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Input(const std::string& pName, InputSectDesc::KeepPolicy pPolicy); 3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Input(const InputSectDesc& pInputDesc); 3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines InputSectDesc::KeepPolicy policy() const { return m_Policy; } 4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const InputSectDesc::Spec& spec() const { return m_Spec; } 4287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const LDSection* getSection() const { return m_pSection; } 4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LDSection* getSection() { return m_pSection; } 4587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_dot_iterator dot_begin() const { return m_DotAssignments.begin(); } 4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines dot_iterator dot_begin() { return m_DotAssignments.begin(); } 4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_dot_iterator dot_end () const { return m_DotAssignments.end(); } 4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines dot_iterator dot_end () { return m_DotAssignments.end(); } 5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const DotAssignments& dotAssignments() const { return m_DotAssignments; } 5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines DotAssignments& dotAssignments() { return m_DotAssignments; } 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines private: 5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines InputSectDesc::KeepPolicy m_Policy; 5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines InputSectDesc::Spec m_Spec; 5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LDSection* m_pSection; 5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines DotAssignments m_DotAssignments; 5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines class Output { 6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao public: 6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::vector<Input*> InputList; 6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef InputList::const_iterator const_iterator; 6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef InputList::iterator iterator; 6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef InputList::const_reference const_reference; 6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef InputList::reference reference; 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::vector<Assignment> DotAssignments; 7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef DotAssignments::const_iterator const_dot_iterator; 7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef DotAssignments::iterator dot_iterator; 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Output(const std::string& pName); 7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Output(const OutputSectDesc& pOutputDesc); 7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& name() const { return m_Name; } 7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const OutputSectDesc::Prolog& prolog() const { return m_Prolog; } 7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines OutputSectDesc::Prolog& prolog() { return m_Prolog; } 8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const OutputSectDesc::Epilog& epilog() const { return m_Epilog; } 8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines OutputSectDesc::Epilog& epilog() { return m_Epilog; } 8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t order() const { return m_Order; } 8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setOrder(size_t pOrder) { m_Order = pOrder; } 8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool hasContent() const; 8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const LDSection* getSection() const { return m_pSection; } 9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LDSection* getSection() { return m_pSection; } 9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setSection(LDSection* pSection) { m_pSection = pSection; } 9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_iterator begin() const { return m_InputList.begin(); } 9687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines iterator begin() { return m_InputList.begin(); } 9787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_iterator end () const { return m_InputList.end(); } 9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines iterator end () { return m_InputList.end(); } 9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_reference front() const { return m_InputList.front(); } 10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines reference front() { return m_InputList.front(); } 10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_reference back () const { return m_InputList.back(); } 10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines reference back () { return m_InputList.back(); } 10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t size() const { return m_InputList.size(); } 10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool empty() const { return m_InputList.empty(); } 10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool isDiscard() const { return m_bIsDiscard; } 11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void append(Input* pInput) { m_InputList.push_back(pInput); } 11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_dot_iterator dot_begin() const { return m_DotAssignments.begin(); } 11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines dot_iterator dot_begin() { return m_DotAssignments.begin(); } 11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_dot_iterator dot_end () const { return m_DotAssignments.end(); } 11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines dot_iterator dot_end () { return m_DotAssignments.end(); } 11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_dot_iterator find_first_explicit_dot() const; 11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines dot_iterator find_first_explicit_dot(); 12087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_dot_iterator find_last_explicit_dot() const; 12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines dot_iterator find_last_explicit_dot(); 12387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const DotAssignments& dotAssignments() const { return m_DotAssignments; } 12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines DotAssignments& dotAssignments() { return m_DotAssignments; } 12687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines private: 12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines std::string m_Name; 12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines OutputSectDesc::Prolog m_Prolog; 13087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines OutputSectDesc::Epilog m_Epilog; 13187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LDSection* m_pSection; 13287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t m_Order; 13387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool m_bIsDiscard; 13487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines InputList m_InputList; 13587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines DotAssignments m_DotAssignments; 13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao }; 13722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines struct SHOCompare 13987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { 14087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool operator()(const Output* LHS, const Output* RHS) const 14187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { return LHS->order() < RHS->order(); } 14287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 14387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 14487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::pair<const Output*, const Input*> const_mapping; 14587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::pair<Output*, Input*> mapping; 14622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 14787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::vector<Output*> OutputDescList; 14887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef OutputDescList::const_iterator const_iterator; 14987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef OutputDescList::iterator iterator; 15087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef OutputDescList::const_reference const_reference; 15187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef OutputDescList::reference reference; 15287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 15387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef OutputDescList::const_reverse_iterator const_reverse_iterator; 15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef OutputDescList::reverse_iterator reverse_iterator; 15522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 15622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic: 15787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ~SectionMap(); 15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 15987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_mapping find(const std::string& pInputFile, 16087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& pInputSection) const; 16187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines mapping find(const std::string& pInputFile, 16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& pInputSection); 16322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 16487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_iterator find(const std::string& pOutputSection) const; 16587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines iterator find(const std::string& pOutputSection); 16622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 16787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines std::pair<mapping, bool> 16887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines insert(const std::string& pInputSection, 16987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& pOutputSection, 17087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines InputSectDesc::KeepPolicy pPolicy = InputSectDesc::NoKeep); 17187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines std::pair<mapping, bool> 17287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines insert(const InputSectDesc& pInputDesc, const OutputSectDesc& pOutputDesc); 17322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 17487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool empty() const { return m_OutputDescList.empty(); } 17587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t size () const { return m_OutputDescList.size(); } 17622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 17787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_iterator begin() const { return m_OutputDescList.begin(); } 17887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines iterator begin() { return m_OutputDescList.begin(); } 17987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_iterator end () const { return m_OutputDescList.end(); } 18087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines iterator end () { return m_OutputDescList.end(); } 18122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 18287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_reference front() const { return m_OutputDescList.front(); } 18387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines reference front() { return m_OutputDescList.front(); } 18487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_reference back () const { return m_OutputDescList.back(); } 18587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines reference back () { return m_OutputDescList.back(); } 18687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 18787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_reverse_iterator rbegin() const { return m_OutputDescList.rbegin(); } 18887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines reverse_iterator rbegin() { return m_OutputDescList.rbegin(); } 18987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_reverse_iterator rend () const { return m_OutputDescList.rend(); } 19087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines reverse_iterator rend () { return m_OutputDescList.rend(); } 19187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 19287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines iterator insert(iterator pPosition, LDSection* pSection); 19387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 19487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // fixupDotSymbols - ensure the dot assignments are valid 19587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void fixupDotSymbols(); 19622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 19722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate: 19887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool matched(const Input& pInput, 19987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& pInputFile, 20087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& pInputSection) const; 20187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 20287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool matched(const WildcardPattern& pPattern, const std::string& pName) const; 20387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 20422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate: 20587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines OutputDescList m_OutputDescList; 20622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}; 20722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 20822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} // namespace of mcld 20922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 21022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 21122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 212