15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- ARMGOT.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//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef TARGET_ARM_ARMGOT_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define TARGET_ARM_ARMGOT_H_
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MemoryRegion.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/GOT.h"
1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/ADT/DenseMap.h>
1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <vector>
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass LDSection;
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
21d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao/** \class ARMGOTEntry
22d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao *  \brief GOT Entry with size of 4 bytes
23d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao */
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass ARMGOTEntry : public GOT::Entry<4> {
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
26d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  ARMGOTEntry(uint64_t pContent, SectionData* pParent)
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      : GOT::Entry<4>(pContent, pParent) {}
28d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao};
29d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class ARMGOT
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \brief ARM Global Offset Table.
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  ARM GOT integrates traditional .got.plt and .got sections into one.
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  Traditional .got.plt is placed in the front part of GOT (PLTGOT), and
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  traditional .got is placed in the rear part of GOT (GOT).
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  ARM .got
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *            +--------------+
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *            |    GOT0      |
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *            +--------------+
4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *            |    GOTPLT    |
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *            +--------------+
4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *            |    GOT       |
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *            +--------------+
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
4737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass ARMGOT : public GOT {
4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  explicit ARMGOT(LDSection& pSection);
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ~ARMGOT();
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  ARMGOTEntry* createGOT();
5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  ARMGOTEntry* createGOTPLT();
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void finalizeSectionSize();
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  uint64_t emit(MemoryRegion& pRegion);
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  void applyGOT0(uint64_t pAddress);
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  void applyGOTPLT(uint64_t pPLTBase);
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool hasGOT1() const;
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6637b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef std::vector<ARMGOTEntry*> EntryListType;
6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef EntryListType::iterator entry_iterator;
6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef EntryListType::const_iterator const_entry_iterator;
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  ARMGOTEntry* m_pGOTPLTFront;
7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  ARMGOTEntry* m_pGOTFront;
7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// m_GOTPLTEntries - a list of gotplt entries
7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  EntryListType m_GOTPLT;
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// m_GOTEntris - a list of got entries
7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  EntryListType m_GOT;
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8237b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
8437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // TARGET_ARM_ARMGOT_H_
85