1d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//===- MipsRelocator.h --------------------------------------------===// 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// The MCLinker Project 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details. 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef MIPS_RELOCATION_FACTORY_H 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MIPS_RELOCATION_FACTORY_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 15d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/LD/Relocator.h> 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Support/GCFactory.h> 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "MipsLDBackend.h" 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 21d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao/** \class MipsRelocator 22d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao * \brief MipsRelocator creates and destroys the Mips relocations. 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 24d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass MipsRelocator : public Relocator 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 27f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines enum ReservedEntryType { 28f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines None = 0, // no reserved entry 29f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ReserveRel = 1, // reserve a dynamic relocation entry 30f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ReserveGot = 2, // reserve a GOT entry 31f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ReserveGpDisp = 8 // reserve _gp_disp symbol 32f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines }; 3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic: 35f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines MipsRelocator(MipsGNULDBackend& pParent, const LinkerConfig& pConfig); 36f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 37f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// scanRelocation - determine the empty entries are needed or not and 38f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// create the empty entries if needed. 39f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// For Mips, the GOT, GP, and dynamic relocation entries are check to create. 40f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void scanRelocation(Relocation& pReloc, 41f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder& pBuilder, 42f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module& pModule, 43f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSection& pSection); 44f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 45f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// initializeScan - do initialization before scan relocations in pInput 46f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @return - return true for initialization success 47f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines bool initializeScan(Input& pInput); 48f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 49f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// finalizeScan - do finalization after scan relocations in pInput 50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @return - return true for finalization success 51f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines bool finalizeScan(Input& pInput); 52f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 53f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// initializeApply - do initialization before apply relocations in pInput 54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @return - return true for initialization success 55f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines bool initializeApply(Input& pInput); 56f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// finalizeApply - do finalization after apply relocations in pInput 58f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines /// @return - return true for finalization success 59f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines bool finalizeApply(Input& pInput); 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Result applyRelocation(Relocation& pRelocation); 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 63f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const Input& getApplyingInput() const 64f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines { return *m_pApplyingInput; } 65f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MipsGNULDBackend& getTarget() 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Target; } 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const MipsGNULDBackend& getTarget() const 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Target; } 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // Get last calculated AHL. 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao int32_t getAHL() const 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_AHL; } 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // Set last calculated AHL. 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setAHL(int32_t pAHL) 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_AHL = pAHL; } 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao const char* getName(Relocation::Type pType) const; 8167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao 826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Size getSize(Relocation::Type pType) const; 836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesprivate: 85f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void scanLocalReloc(Relocation& pReloc, 86f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder& pBuilder, 87f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const LDSection& pSection); 88f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 89f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines void scanGlobalReloc(Relocation& pReloc, 90f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder& pBuilder, 91f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const LDSection& pSection); 9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MipsGNULDBackend& m_Target; 95f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Input* m_pApplyingInput; 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao int32_t m_AHL; 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 102