Relocator.h revision f7ac0f19a1c8d0ad14bcf6456ce368b830fea886
1d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//===- Relocator.h --------------------------------------------------------===// 2d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao// 3d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao// The MCLinker Project 4d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao// 5d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao// This file is distributed under the University of Illinois Open Source 6d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao// License. See LICENSE.TXT for details. 7d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao// 8d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//===----------------------------------------------------------------------===// 9d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#ifndef MCLD_RELOCATOR_H 10d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#define MCLD_RELOCATOR_H 11d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#ifdef ENABLE_UNITTEST 12d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <gtest.h> 13d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#endif 14d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 15d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/Fragment/Relocation.h> 16d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 17d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaonamespace mcld 18d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao{ 19d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 20d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass FragmentLinker; 21d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass TargetLDBackend; 22f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass IRBuilder; 23f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass Module; 24f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass Input; 25d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 26d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao/** \class Relocator 27d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao * \brief Relocator provides the interface of performing relocations 28d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao */ 29d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass Relocator 30d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao{ 31d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaopublic: 326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef Relocation::Type Type; 33d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao typedef Relocation::Address Address; 346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef Relocation::DWord DWord; 356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef Relocation::SWord SWord; 366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef Relocation::Size Size; 37d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 38d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaopublic: 39d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao enum Result { 40d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao OK, 41d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao BadReloc, 42d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao Overflow, 43d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao Unsupport, 44d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao Unknown 45d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao }; 46d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 47d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaopublic: 48f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Relocator(const LinkerConfig& pConfig) 49f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines : m_Config(pConfig) 50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines {} 51f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual ~Relocator() = 0; 53d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 54d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao /// apply - general apply function 55d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao virtual Result applyRelocation(Relocation& pRelocation) = 0; 56d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// scanRelocation - When read in relocations, backend can do any modification 58f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// to relocation and generate empty entries, such as GOT, dynamic relocation 59f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// entries and other target dependent entries. These entries are generated 60f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// for layout to adjust the ouput offset. 61f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @param pReloc - a read in relocation entry 62f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @param pInputSym - the input LDSymbol of relocation target symbol 63f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @param pSection - the section of relocation applying target 64f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual void scanRelocation(Relocation& pReloc, 65f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder& pBuilder, 66f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module& pModule, 67f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSection& pSection) = 0; 68f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 69f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// initializeScan - do initialization before scan relocations in pInput 70f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @return - return true for initialization success 71f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual bool initializeScan(Input& pInput) 72f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines { return true; } 73f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 74f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// finalizeScan - do finalization after scan relocations in pInput 75f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @return - return true for finalization success 76f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual bool finalizeScan(Input& pInput) 77f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines { return true; } 78f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 79f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// initializeApply - do initialization before apply relocations in pInput 80f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @return - return true for initialization success 81f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual bool initializeApply(Input& pInput) 82f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines { return true; } 83f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// finalizeApply - do finalization after apply relocations in pInput 85f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @return - return true for finalization success 86f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual bool finalizeApply(Input& pInput) 87f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines { return true; } 88f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 89f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// partialScanRelocation - When doing partial linking, backend can do any 90f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// modification to relocation to fix the relocation offset after section 91f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// merge 92f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @param pReloc - a read in relocation entry 93f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @param pInputSym - the input LDSymbol of relocation target symbol 94f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @param pSection - the section of relocation applying target 95f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual void partialScanRelocation(Relocation& pReloc, 96f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module& pModule, 97f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const LDSection& pSection); 98f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 99d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao // ------ observers -----// 100d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao virtual TargetLDBackend& getTarget() = 0; 101d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 102d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao virtual const TargetLDBackend& getTarget() const = 0; 103d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 1046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// getName - get the name of a relocation 105d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao virtual const char* getName(Type pType) const = 0; 106d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 1076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// getSize - get the size of a relocation in bit 1086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual Size getSize(Type pType) const = 0; 109f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 110f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprotected: 111f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const LinkerConfig& config() const { return m_Config; } 112f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 113f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprivate: 114f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const LinkerConfig& m_Config; 115d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 116d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 117d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao} // namespace of mcld 118d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 119d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#endif 120d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 121