122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- THMToTHMStub.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 TARGET_ARM_THMTOTHMSTUB_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define TARGET_ARM_THMTOTHMSTUB_H_
1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/Stub.h"
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/DataTypes.h>
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <string>
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Relocation;
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass ResolveInfo;
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class THMToTHMStub
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  \brief ARM stub for long call from ARM source to ARM target
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao */
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass THMToTHMStub : public Stub {
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
270dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  THMToTHMStub(bool pIsOutputPIC, bool pUsingThumb2);
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ~THMToTHMStub();
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // isMyDuty
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool isMyDuty(const class Relocation& pReloc,
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                uint64_t pSource,
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                uint64_t pTargetSymValue) const;
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // observers
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const std::string& name() const;
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const uint8_t* getContent() const;
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t size() const;
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t alignment() const;
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // for T bit of this stub
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  uint64_t initSymValue() const;
4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  THMToTHMStub(const THMToTHMStub&);
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  THMToTHMStub& operator=(const THMToTHMStub&);
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// for doClone
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  THMToTHMStub(const uint32_t* pData,
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao               size_t pSize,
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao               const_fixup_iterator pBegin,
570dea6bc96bb52346737966839ac68644f7939f58Stephen Hines               const_fixup_iterator pEnd,
580dea6bc96bb52346737966839ac68644f7939f58Stephen Hines               bool pUsingThumb2);
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// doClone
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Stub* doClone();
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static const uint32_t PIC_TEMPLATE[];
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static const uint32_t TEMPLATE[];
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const uint32_t* m_pData;
670dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  std::string m_Name;
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t m_Size;
690dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  bool m_bUsingThumb2;
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao};
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // TARGET_ARM_THMTOTHMSTUB_H_
75