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