Relocator.h revision 87f34658dec9097d987d254a990ea7f311bfc95f
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 6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// @param pInput - the input file of relocation 65f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual void scanRelocation(Relocation& pReloc, 66f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder& pBuilder, 67f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module& pModule, 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LDSection& pSection, 6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Input& pInput) = 0; 7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// issueUndefRefError - Provides a basic version for undefined reference dump. 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// It will handle the filename and function name automatically. 7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// @param pReloc - a read in relocation entry 7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// @param pSection - the section of relocation applying target 7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// @ param pInput - the input file of relocation 7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual void issueUndefRef(Relocation& pReloc, 7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LDSection& pSection, 7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Input& pInput); 79f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 80f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// initializeScan - do initialization before scan relocations in pInput 81f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @return - return true for initialization success 82f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual bool initializeScan(Input& pInput) 83f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines { return true; } 84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 85f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// finalizeScan - do finalization after scan relocations in pInput 86f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @return - return true for finalization success 87f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual bool finalizeScan(Input& pInput) 88f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines { return true; } 89f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 90f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// initializeApply - do initialization before apply relocations in pInput 91f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @return - return true for initialization success 92f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual bool initializeApply(Input& pInput) 93f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines { return true; } 94f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 95f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// finalizeApply - do finalization after apply relocations in pInput 96f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @return - return true for finalization success 97f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual bool finalizeApply(Input& pInput) 98f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines { return true; } 99f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 100f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// partialScanRelocation - When doing partial linking, backend can do any 101f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// modification to relocation to fix the relocation offset after section 102f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// merge 103f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @param pReloc - a read in relocation entry 104f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @param pInputSym - the input LDSymbol of relocation target symbol 105f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @param pSection - the section of relocation applying target 106f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines virtual void partialScanRelocation(Relocation& pReloc, 107f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module& pModule, 108f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const LDSection& pSection); 109f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 110d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao // ------ observers -----// 111d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao virtual TargetLDBackend& getTarget() = 0; 112d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 113d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao virtual const TargetLDBackend& getTarget() const = 0; 114d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 1156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// getName - get the name of a relocation 116d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao virtual const char* getName(Type pType) const = 0; 117d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 1186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /// getSize - get the size of a relocation in bit 1196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines virtual Size getSize(Type pType) const = 0; 120f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 121f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprotected: 122f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const LinkerConfig& config() const { return m_Config; } 123f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 124f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprivate: 125f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const LinkerConfig& m_Config; 126d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}; 127d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 128d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao} // namespace of mcld 129d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 130d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#endif 131d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 132