15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- Relocation.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//===----------------------------------------------------------------------===// 9cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#ifndef MCLD_LD_RELOCATION_H 10cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#define MCLD_LD_RELOCATION_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/ilist_node.h> 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/DataTypes.h> 16cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 17cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/Fragment.h> 18cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/FragmentRef.h> 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/ResolveInfo.h> 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDSymbol.h> 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Layout; 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass RelocationFactory; 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass MCLDInfo; 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 29cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass Relocation : public Fragment 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaofriend class RelocationFactory; 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef uint64_t Address; // FIXME: use SizeTrait<T>::Address instead 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef uint64_t DWord; // FIXME: use SizeTrait<T>::Word instead 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef uint8_t Type; 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Relocation(Type pType, 40cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao FragmentRef* pTargetRef, 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Address pAddend, 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao DWord pTargetData); 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ~Relocation(); 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// type - relocation type 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Type type() const 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Type; } 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// symValue - S value - the symbol address 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Address symValue() const; 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// addend - A value 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Address addend() const 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Addend; } 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// place - P value - address of the place being relocated 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Address place(const Layout& pLayout) const; 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// symbol info - binding, type 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const ResolveInfo* symInfo() const 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_pSymInfo; } 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// symbol info - binding, type 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo* symInfo() 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_pSymInfo; } 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// target - the target data to relocate 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao DWord& target(); 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// target - the target data to relocate 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const DWord& target() const; 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// targetRef - the reference of the target data 76cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao FragmentRef& targetRef() 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_TargetAddress; } 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// targetRef - the reference of the target data 80cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao const FragmentRef& targetRef() const 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_TargetAddress; } 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void apply(RelocationFactory& pRelocFactory, const MCLDInfo& pLDInfo); 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// ----- modifiers ----- /// 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setType(Type pType); 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setAddend(Address pAddend); 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setSymInfo(ResolveInfo* pSym); 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 92cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao // Relocation is a kind of Fragment with type of FT_Reloc 93cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao static bool classof(const Fragment *F) 94cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao { return F->getKind() == Fragment::Relocation; } 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static bool classof(const Relocation *) { return true; } 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// m_Type - the type of the relocation entries 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Type m_Type; 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// m_TargetData - target data of the place being relocated 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao DWord m_TargetData; 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// m_pSymInfo - resolved symbol info of relocation target symbol 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo* m_pSymInfo; 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 107cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// m_TargetAddress - FragmentRef of the place being relocated 108cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao FragmentRef m_TargetAddress; 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// m_Addend - the addend 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Address m_Addend; 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 118