15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- BranchIsland.h -----------------------------------------------------===//
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//===----------------------------------------------------------------------===//
922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifndef MCLD_LD_BRANCH_ISLAND_H
1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#define MCLD_LD_BRANCH_ISLAND_H
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h>
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/DataTypes.h>
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/ADT/StringRef.h>
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/ADT/HashEntry.h>
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/ADT/HashTable.h>
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/ADT/StringHash.h>
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/SectionData.h>
2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/LDSymbol.h>
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Fragment/Stub.h>
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <string>
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
25f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesnamespace mcld {
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Stub;
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Relocation;
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class BranchIsland
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \brief BranchIsland is a collection of stubs
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass BranchIsland
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic:
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef SectionData::iterator iterator;
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef SectionData::const_iterator const_iterator;
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef std::vector<Relocation*> RelocationListType;
4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef RelocationListType::iterator reloc_iterator;
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef RelocationListType::const_iterator const_reloc_iterator;
4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic:
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /*
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *               ----------
4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *  --- Entry -> | Island | -> Exit ---
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *               ----------
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   */
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// BranchIsland - constructor
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pEntryFrag - the entry fragment to the island
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pMaxSize   - the max size the island can be
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pIndex     - the inedx in the island factory
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  BranchIsland(Fragment& pEntryFrag, size_t pMaxSize, size_t pIndex);
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ~BranchIsland();
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// fragment iterators of the island
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  iterator begin();
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_iterator begin() const;
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  iterator end();
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_iterator end() const;
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// relocation iterators of the island
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  reloc_iterator reloc_begin()
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  { return m_Relocations.begin(); }
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_reloc_iterator reloc_begin() const
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  { return m_Relocations.begin(); }
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  reloc_iterator reloc_end()
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  { return m_Relocations.end(); }
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_reloc_iterator reloc_end() const
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  { return m_Relocations.end(); }
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// observers
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  uint64_t offset() const;
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t size() const;
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t maxSize() const;
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const std::string& name() const;
8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t numOfStubs() const;
9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// findStub - return true if there is a stub built from the given prototype
9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///            for the given relocation
9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Stub* findStub(const Stub* pPrototype, const Relocation& pReloc);
9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// addStub - add a stub into the island
9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool addStub(const Stub* pPrototype, const Relocation& pReloc, Stub& pStub);
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// addRelocation - add a relocation into island
10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool addRelocation(Relocation& pReloc);
10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate:
10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /** \class Key
10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *  \brief Key to recognize a stub in the island.
10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *
10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   */
10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  class Key
10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  {
10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  public:
11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    Key(const Stub* pPrototype, const LDSymbol* pSymbol, Stub::SWord pAddend)
11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    : m_pPrototype(pPrototype), m_pSymbol(pSymbol), m_Addend(pAddend)
11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    { }
11322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    ~Key()
11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    { }
11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    const Stub*  prototype() const { return m_pPrototype; }
11822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    const LDSymbol* symbol() const { return m_pSymbol; }
12022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
12122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    Stub::SWord     addend() const { return m_Addend; }
12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
12322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    struct Hash
12422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    {
12522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      size_t operator() (const Key& KEY) const
12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      {
12722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        llvm::StringRef sym_name(KEY.symbol()->name());
128f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines        hash::StringHash<hash::ELF> str_hasher;
12922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        return (size_t((uintptr_t)KEY.prototype())) ^
13022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao               str_hasher(sym_name) ^
13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao               KEY.addend();
13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      }
13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    };
13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
13522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    struct Compare
13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    {
13722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      bool operator() (const Key& KEY1, const Key& KEY2) const
13822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      {
13922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        return (KEY1.prototype() == KEY2.prototype()) &&
14022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao               (KEY1.symbol() == KEY2.symbol()) &&
14122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao               (KEY1.addend() == KEY2.addend());
14222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      }
14322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    };
14422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
14522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  private:
14622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    const Stub* m_pPrototype;
14722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    const LDSymbol* m_pSymbol;
14822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    Stub::SWord m_Addend;
14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  };
15022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
15122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef HashEntry<Key, Stub*, Key::Compare> StubEntryType;
1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
15322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef HashTable<StubEntryType,
15422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                    Key::Hash,
15522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                    EntryFactory<StubEntryType> > StubMapType;
15622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate:
15722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Fragment& m_Entry; // entry fragment of the island
15822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Fragment* m_pExit; // exit fragment of the island
15922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Fragment* m_pRear; // rear fragment of the island
16022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t m_MaxSize;
16122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  std::string m_Name;
16222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  StubMapType m_StubMap;
16322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// m_Relocations - list of relocations created for stubs in this island
16422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  RelocationListType m_Relocations;
1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
170affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
171