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 12d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/Fragment/Relocation.h> 13d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 14d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaonamespace mcld 15d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao{ 16d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 17d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass FragmentLinker; 18d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass TargetLDBackend; 19f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass IRBuilder; 20f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass Module; 21f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass Input; 22d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 23d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao/** \class Relocator 24d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao * \brief Relocator provides the interface of performing relocations 25d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao */ 26d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass Relocator 27d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao{ 28d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaopublic: 296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef Relocation::Type Type; 30d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao typedef Relocation::Address Address; 316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef Relocation::DWord DWord; 326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef Relocation::SWord SWord; 336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef Relocation::Size Size; 34d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 35d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaopublic: 36d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao enum Result { 37d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao OK, 38d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao BadReloc, 39d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao Overflow, 40d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao Unsupport, 41d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao Unknown 42d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao }; 43d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 44d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaopublic: 45f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Relocator(const LinkerConfig& pConfig) 46f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines : m_Config(pConfig) 47f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines {} 48f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual ~Relocator() = 0; 50d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 51d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao /// apply - general apply function 52d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao virtual Result applyRelocation(Relocation& pRelocation) = 0; 53d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// scanRelocation - When read in relocations, backend can do any modification 55f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// to relocation and generate empty entries, such as GOT, dynamic relocation 56f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// entries and other target dependent entries. These entries are generated 57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// for layout to adjust the ouput offset. 58f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @param pReloc - a read in relocation entry 59f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @param pInputSym - the input LDSymbol of relocation target symbol 60f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @param pSection - the section of relocation applying target 6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// @param pInput - the input file of relocation 62f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual void scanRelocation(Relocation& pReloc, 63f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder& pBuilder, 64f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module& pModule, 6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LDSection& pSection, 6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Input& pInput) = 0; 6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// issueUndefRefError - Provides a basic version for undefined reference dump. 6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// It will handle the filename and function name automatically. 7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// @param pReloc - a read in relocation entry 7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// @param pSection - the section of relocation applying target 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// @ param pInput - the input file of relocation 7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual void issueUndefRef(Relocation& pReloc, 7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LDSection& pSection, 7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Input& pInput); 76f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 77f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// initializeScan - do initialization before scan relocations in pInput 78f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @return - return true for initialization success 79f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual bool initializeScan(Input& pInput) 80f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines { return true; } 81f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 82f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// finalizeScan - do finalization after scan relocations in pInput 83f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @return - return true for finalization success 84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual bool finalizeScan(Input& pInput) 85f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines { return true; } 86f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 87f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// initializeApply - do initialization before apply relocations in pInput 88f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @return - return true for initialization success 89f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual bool initializeApply(Input& pInput) 90f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines { return true; } 91f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 92f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// finalizeApply - do finalization after apply relocations in pInput 93f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @return - return true for finalization success 94f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual bool finalizeApply(Input& pInput) 95f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines { return true; } 96f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 97f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// partialScanRelocation - When doing partial linking, backend can do any 98f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// modification to relocation to fix the relocation offset after section 99f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// merge 100f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @param pReloc - a read in relocation entry 101f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @param pInputSym - the input LDSymbol of relocation target symbol 102f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @param pSection - the section of relocation applying target 103f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual void partialScanRelocation(Relocation& pReloc, 104f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module& pModule, 105f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const LDSection& pSection); 106f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 107d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao // ------ observers -----// 108d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao virtual TargetLDBackend& getTarget() = 0; 109d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 110d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao virtual const TargetLDBackend& getTarget() const = 0; 111d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 1126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// getName - get the name of a relocation 113d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao virtual const char* getName(Type pType) const = 0; 114d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 1156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// getSize - get the size of a relocation in bit 1166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual Size getSize(Type pType) const = 0; 117f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 118a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines /// mayHaveFunctionPointerAccess - check if the given reloc would possibly 119a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines /// access a function pointer. 120a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines /// Note: Each target relocator should override this function, or be 121a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines /// conservative and return true to avoid getting folded. 122a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines virtual bool mayHaveFunctionPointerAccess(const Relocation& pReloc) const 123a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines { return true; } 124a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines 125f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprotected: 126f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const LinkerConfig& config() const { return m_Config; } 127f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 128f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprivate: 129f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const LinkerConfig& m_Config; 130d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 131d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 132d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao} // namespace of mcld 133d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 134d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#endif 135d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 136