HexagonRelocator.h revision 87f34658dec9097d987d254a990ea7f311bfc95f
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//===----------------------------------------------------------------------===// 96f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#ifndef HEXAGON_RELOCATION_FACTORY_H 106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#define HEXAGON_RELOCATION_FACTORY_H 116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#ifdef ENABLE_UNITTEST 126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <gtest.h> 136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#endif 146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/LD/Relocator.h> 166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Target/GOT.h> 176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Target/PLT.h> 1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Target/KeyEntryMap.h> 196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include "HexagonLDBackend.h" 206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesnamespace mcld { 226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass ResolveInfo; 24f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass LinkerConfig; 256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/** \class HexagonRelocator 276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * \brief HexagonRelocator creates and destroys the Hexagon relocations. 286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * 296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines */ 306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass HexagonRelocator : public Relocator 316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic: 3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef KeyEntryMap<ResolveInfo, PLTEntryBase> SymPLTMap; 3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef KeyEntryMap<ResolveInfo, HexagonGOTEntry> SymGOTMap; 3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef KeyEntryMap<ResolveInfo, HexagonGOTEntry> SymGOTPLTMap; 3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef KeyEntryMap<Relocation, Relocation> RelRelMap; 376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic: 39f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /** \enum ReservedEntryType 40f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * \brief The reserved entry type of reserved space in ResolveInfo. 41f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 42f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * This is used for sacnRelocation to record what kinds of entries are 4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * reserved for this resolved symbol. In Hexagon, there are three kinds 4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * of entries, GOT, PLT, and dynamic relocation. 45f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * bit: 3 2 1 0 4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * | | PLT | GOT | Rel | 48f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 49f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * value Name - Description 50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 51f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 0000 None - no reserved entry 52f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 0001 ReserveRel - reserve an dynamic relocation entry 53f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 0010 ReserveGOT - reserve an GOT entry 5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * 0100 ReservePLT - reserve an PLT entry and the corresponding GOT, 5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * 56f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines */ 57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines enum ReservedEntryType { 58f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines None = 0, 59f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ReserveRel = 1, 60f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ReserveGOT = 2, 6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ReservePLT = 4, 6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /** \enum EntryValue 6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief The value of the entries. The symbol value will be decided at after 6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * layout, so we mark the entry during scanRelocation and fill up the actual 6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * value when applying relocations. 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines enum EntryValue { 7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Default = 0, 7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SymVal = 1 72f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines }; 73f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 74f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines HexagonRelocator(HexagonLDBackend& pParent, const LinkerConfig& pConfig); 756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines ~HexagonRelocator(); 766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Result applyRelocation(Relocation& pRelocation); 786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 79f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// scanRelocation - determine the empty entries are needed or not and create 80f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// the empty entries if needed. 81f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// For Hexagon, following entries are check to create: 82f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// - GOT entry (for .got and .got.plt sections) 83f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// - PLT entry (for .plt section) 84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// - dynamin relocation entries (for .rel.plt and .rel.dyn sections) 85f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void scanRelocation(Relocation& pReloc, 86f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder& pBuilder, 87f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module& pModule, 8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LDSection& pSection, 8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Input& pInput); 90f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 91f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // Handle partial linking 92f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void partialScanRelocation(Relocation& pReloc, 93f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module& pModule, 94f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const LDSection& pSection); 95f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines HexagonLDBackend& getTarget() 976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { return m_Target; } 986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const HexagonLDBackend& getTarget() const 1006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { return m_Target; } 1016f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const char* getName(Relocation::Type pType) const; 1036f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Size getSize(Relocation::Type pType) const; 1056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const SymPLTMap& getSymPLTMap() const { return m_SymPLTMap; } 1076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines SymPLTMap& getSymPLTMap() { return m_SymPLTMap; } 1086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1096f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const SymGOTMap& getSymGOTMap() const { return m_SymGOTMap; } 1106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines SymGOTMap& getSymGOTMap() { return m_SymGOTMap; } 1116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 112f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const SymGOTPLTMap& getSymGOTPLTMap() const { return m_SymGOTPLTMap; } 113f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SymGOTPLTMap& getSymGOTPLTMap() { return m_SymGOTPLTMap; } 114f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const RelRelMap& getRelRelMap() const { return m_RelRelMap; } 11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines RelRelMap& getRelRelMap() { return m_RelRelMap; } 11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 118f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprotected: 119f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// addCopyReloc - add a copy relocation into .rela.dyn for pSym 120f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @param pSym - A resolved copy symbol that defined in BSS section 121f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void addCopyReloc(ResolveInfo& pSym, HexagonLDBackend& pTarget); 122f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 123f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// defineSymbolforCopyReloc - allocate a space in BSS section and 124f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// and force define the copy of pSym to BSS section 125f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @return the output LDSymbol of the copy symbol 126f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSymbol& defineSymbolforCopyReloc(IRBuilder& pLinker, 127f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const ResolveInfo& pSym, 128f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines HexagonLDBackend& pTarget); 129f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 1306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate: 131f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual void scanLocalReloc(Relocation& pReloc, 132f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder& pBuilder, 133f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module& pModule, 134f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSection& pSection); 135f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 136f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual void scanGlobalReloc(Relocation& pReloc, 137f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder& pBuilder, 138f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module& pModule, 139f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSection& pSection); 140f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 1416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines HexagonLDBackend& m_Target; 1426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines SymPLTMap m_SymPLTMap; 1436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines SymGOTMap m_SymGOTMap; 144f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SymGOTPLTMap m_SymGOTPLTMap; 14587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines RelRelMap m_RelRelMap; 1466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}; 1476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} // namespace of mcld 1496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#endif 1516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 152