ARMGOT.h revision 37b74a387bb3993387029859c2d9d051c41c724e
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