122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- BranchIslandFactory.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//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_LD_BRANCHISLANDFACTORY_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_LD_BRANCHISLANDFACTORY_H_
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/BranchIsland.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/GCFactory.h"
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/DataTypes.h>
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Fragment;
2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Module;
2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class BranchIslandFactory
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  \brief
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *
2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao */
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass BranchIslandFactory : public GCFactory<BranchIsland, 0> {
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ctor
290dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  /// @param pMaxFwdBranchRange - the max forward branch range of the target
300dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  /// @param pMaxBwdBranchRange - the max backward branch range of the target
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pMaxIslandSize - a predifned value (64KB here) to decide the max
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///                         size of the island
330dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  BranchIslandFactory(int64_t pMaxFwdBranchRange,
340dea6bc96bb52346737966839ac68644f7939f58Stephen Hines                      int64_t pMaxBwdBranchRange,
350dea6bc96bb52346737966839ac68644f7939f58Stephen Hines                      size_t pMaxIslandSize = 65536U);
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ~BranchIslandFactory();
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// group - group fragments and create islands when needed
4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// @param pSectionData - the SectionData holds fragments need to be grouped
4187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void group(Module& pModule);
4287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// produce - produce a island for the given fragment
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pFragment - the fragment needs a branch island
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  BranchIsland* produce(Fragment& pFragment);
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
470dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  /// getIsland - find fwd and bwd islands for the fragment
480dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  /// @param pFragment - the fragment needs a branch island
490dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  /// @return - return the pair of <fwd island, bwd island>
500dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  std::pair<BranchIsland*, BranchIsland*> getIslands(const Fragment& pFragment);
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
530dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  int64_t m_MaxFwdBranchRange;
540dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  int64_t m_MaxBwdBranchRange;
550dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  size_t m_MaxIslandSize;
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao};
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // MCLD_LD_BRANCHISLANDFACTORY_H_
61