16f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===- HexagonRelocator.h ------------------------------------------------===// 26f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// 36f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// The MCLinker Project 46f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// 56f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// This file is distributed under the University of Illinois Open Source 66f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// License. See LICENSE.TXT for details. 76f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// 86f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 9551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#ifndef TARGET_HEXAGON_HEXAGONRELOCATOR_H 10551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#define TARGET_HEXAGON_HEXAGONRELOCATOR_H 116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/LD/Relocator.h> 136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Target/GOT.h> 146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Target/PLT.h> 1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Target/KeyEntryMap.h> 166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include "HexagonLDBackend.h" 176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesnamespace mcld { 196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass ResolveInfo; 21f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass LinkerConfig; 226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/** \class HexagonRelocator 246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * \brief HexagonRelocator creates and destroys the Hexagon relocations. 256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * 266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines */ 276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass HexagonRelocator : public Relocator 286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic: 3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef KeyEntryMap<ResolveInfo, PLTEntryBase> SymPLTMap; 3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef KeyEntryMap<ResolveInfo, HexagonGOTEntry> SymGOTMap; 3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef KeyEntryMap<ResolveInfo, HexagonGOTEntry> SymGOTPLTMap; 3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef KeyEntryMap<Relocation, Relocation> RelRelMap; 346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic: 36f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /** \enum ReservedEntryType 37f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * \brief The reserved entry type of reserved space in ResolveInfo. 38f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 39f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * This is used for sacnRelocation to record what kinds of entries are 4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * reserved for this resolved symbol. In Hexagon, there are three kinds 4187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * of entries, GOT, PLT, and dynamic relocation. 42f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * bit: 3 2 1 0 4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * | | PLT | GOT | Rel | 45f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 46f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * value Name - Description 47f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 48f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 0000 None - no reserved entry 49f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 0001 ReserveRel - reserve an dynamic relocation entry 50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 0010 ReserveGOT - reserve an GOT entry 5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * 0100 ReservePLT - reserve an PLT entry and the corresponding GOT, 5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * 53f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines */ 54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines enum ReservedEntryType { 55f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines None = 0, 56f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ReserveRel = 1, 57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ReserveGOT = 2, 5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ReservePLT = 4, 5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /** \enum EntryValue 6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief The value of the entries. The symbol value will be decided at after 6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * layout, so we mark the entry during scanRelocation and fill up the actual 6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * value when applying relocations. 6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines enum EntryValue { 6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Default = 0, 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SymVal = 1 69f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines }; 70f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 71f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines HexagonRelocator(HexagonLDBackend& pParent, const LinkerConfig& pConfig); 726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines ~HexagonRelocator(); 736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Result applyRelocation(Relocation& pRelocation); 756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 76f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// scanRelocation - determine the empty entries are needed or not and create 77f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// the empty entries if needed. 78f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// For Hexagon, following entries are check to create: 79f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// - GOT entry (for .got and .got.plt sections) 80f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// - PLT entry (for .plt section) 81f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// - dynamin relocation entries (for .rel.plt and .rel.dyn sections) 82f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void scanRelocation(Relocation& pReloc, 83f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder& pBuilder, 84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module& pModule, 8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LDSection& pSection, 8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Input& pInput); 87f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 88f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // Handle partial linking 89f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void partialScanRelocation(Relocation& pReloc, 90f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module& pModule, 91f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const LDSection& pSection); 92f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines HexagonLDBackend& getTarget() 946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { return m_Target; } 956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const HexagonLDBackend& getTarget() const 976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { return m_Target; } 986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const char* getName(Relocation::Type pType) const; 1006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1016f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Size getSize(Relocation::Type pType) const; 1026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1036f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const SymPLTMap& getSymPLTMap() const { return m_SymPLTMap; } 1046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines SymPLTMap& getSymPLTMap() { return m_SymPLTMap; } 1056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const SymGOTMap& getSymGOTMap() const { return m_SymGOTMap; } 1076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines SymGOTMap& getSymGOTMap() { return m_SymGOTMap; } 1086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 109f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const SymGOTPLTMap& getSymGOTPLTMap() const { return m_SymGOTPLTMap; } 110f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SymGOTPLTMap& getSymGOTPLTMap() { return m_SymGOTPLTMap; } 111f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const RelRelMap& getRelRelMap() const { return m_RelRelMap; } 11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines RelRelMap& getRelRelMap() { return m_RelRelMap; } 11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 115f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprotected: 116f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// addCopyReloc - add a copy relocation into .rela.dyn for pSym 117f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @param pSym - A resolved copy symbol that defined in BSS section 118f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void addCopyReloc(ResolveInfo& pSym, HexagonLDBackend& pTarget); 119f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 120f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// defineSymbolforCopyReloc - allocate a space in BSS section and 121f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// and force define the copy of pSym to BSS section 122f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @return the output LDSymbol of the copy symbol 123f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSymbol& defineSymbolforCopyReloc(IRBuilder& pLinker, 124f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const ResolveInfo& pSym, 125f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines HexagonLDBackend& pTarget); 126f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 1276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate: 128f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual void scanLocalReloc(Relocation& pReloc, 129f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder& pBuilder, 130f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module& pModule, 131f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSection& pSection); 132f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 133f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual void scanGlobalReloc(Relocation& pReloc, 134f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder& pBuilder, 135f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module& pModule, 136f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSection& pSection); 137f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 1386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines HexagonLDBackend& m_Target; 1396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines SymPLTMap m_SymPLTMap; 1406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines SymGOTMap m_SymGOTMap; 141f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SymGOTPLTMap m_SymGOTPLTMap; 14287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines RelRelMap m_RelRelMap; 1436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}; 1446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} // namespace of mcld 1466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#endif 1486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 149