HexagonRelocator.h revision f7ac0f19a1c8d0ad14bcf6456ce368b830fea886
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> 186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Target/SymbolEntryMap.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: 336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef SymbolEntryMap<PLTEntryBase> SymPLTMap; 346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef SymbolEntryMap<HexagonGOTEntry> SymGOTMap; 35f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines typedef SymbolEntryMap<HexagonGOTEntry> SymGOTPLTMap; 36f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 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 43f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * reserved for this resolved symbol 44f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 45f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * In Hexagon, there are three kinds of entries, GOT, PLT, and dynamic 46f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * relocation. 47f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 48f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * GOT may needs a corresponding relocation to relocate itself, so we 49f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * separate GOT to two situations: GOT and GOTRel. Besides, for the same 50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * symbol, there might be two kinds of entries reserved for different location. 51f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * For example, reference to the same symbol, one may use GOT and the other may 52f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * use dynamic relocation. 53f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * bit: 3 2 1 0 55f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * | PLT | GOTRel | GOT | Rel | 56f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * value Name - Description 58f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 59f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 0000 None - no reserved entry 60f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 0001 ReserveRel - reserve an dynamic relocation entry 61f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 0010 ReserveGOT - reserve an GOT entry 62f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 0011 GOTandRel - For different relocation, we've reserved GOT and 63f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * Rel for different location. 64f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 0100 GOTRel - reserve an GOT entry and the corresponding Dyncamic 65f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * relocation entry which relocate this GOT entry 66f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 0101 GOTRelandRel - For different relocation, we've reserved GOTRel 67f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * and relocation entry for different location. 68f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 1000 ReservePLT - reserve an PLT entry and the corresponding GOT, 69f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * Dynamic relocation entries 70f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * 1001 PLTandRel - For different relocation, we've reserved PLT and 71f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * Rel for different location. 72f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines */ 73f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines enum ReservedEntryType { 74f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines None = 0, 75f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ReserveRel = 1, 76f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ReserveGOT = 2, 77f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines GOTandRel = 3, 78f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines GOTRel = 4, 79f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines GOTRelandRel = 5, 80f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ReservePLT = 8, 81f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines PLTandRel = 9 82f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines }; 83f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines HexagonRelocator(HexagonLDBackend& pParent, const LinkerConfig& pConfig); 856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines ~HexagonRelocator(); 866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Result applyRelocation(Relocation& pRelocation); 886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 89f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// scanRelocation - determine the empty entries are needed or not and create 90f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// the empty entries if needed. 91f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// For Hexagon, following entries are check to create: 92f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// - GOT entry (for .got and .got.plt sections) 93f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// - PLT entry (for .plt section) 94f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// - dynamin relocation entries (for .rel.plt and .rel.dyn sections) 95f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void scanRelocation(Relocation& pReloc, 96f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder& pBuilder, 97f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module& pModule, 98f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSection& pSection); 99f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 100f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // Handle partial linking 101f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void partialScanRelocation(Relocation& pReloc, 102f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module& pModule, 103f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const LDSection& pSection); 104f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 1056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines HexagonLDBackend& getTarget() 1066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { return m_Target; } 1076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const HexagonLDBackend& getTarget() const 1096f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { return m_Target; } 1106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const char* getName(Relocation::Type pType) const; 1126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Size getSize(Relocation::Type pType) const; 1146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const SymPLTMap& getSymPLTMap() const { return m_SymPLTMap; } 1166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines SymPLTMap& getSymPLTMap() { return m_SymPLTMap; } 1176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const SymGOTMap& getSymGOTMap() const { return m_SymGOTMap; } 1196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines SymGOTMap& getSymGOTMap() { return m_SymGOTMap; } 1206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 121f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const SymGOTPLTMap& getSymGOTPLTMap() const { return m_SymGOTPLTMap; } 122f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SymGOTPLTMap& getSymGOTPLTMap() { return m_SymGOTPLTMap; } 123f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 124f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprotected: 125f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// addCopyReloc - add a copy relocation into .rela.dyn for pSym 126f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @param pSym - A resolved copy symbol that defined in BSS section 127f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void addCopyReloc(ResolveInfo& pSym, HexagonLDBackend& pTarget); 128f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 129f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// defineSymbolforCopyReloc - allocate a space in BSS section and 130f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// and force define the copy of pSym to BSS section 131f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @return the output LDSymbol of the copy symbol 132f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSymbol& defineSymbolforCopyReloc(IRBuilder& pLinker, 133f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const ResolveInfo& pSym, 134f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines HexagonLDBackend& pTarget); 135f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 1366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate: 137f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual void scanLocalReloc(Relocation& pReloc, 138f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder& pBuilder, 139f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module& pModule, 140f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSection& pSection); 141f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 142f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual void scanGlobalReloc(Relocation& pReloc, 143f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder& pBuilder, 144f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module& pModule, 145f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSection& pSection); 146f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 1476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines HexagonLDBackend& m_Target; 1486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines SymPLTMap m_SymPLTMap; 1496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines SymGOTMap m_SymGOTMap; 150f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SymGOTPLTMap m_SymGOTPLTMap; 1516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}; 1526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} // namespace of mcld 1546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#endif 1566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 157