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_FACTORY_H 10cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#define MCLD_LD_RELOCATION_FACTORY_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Support/GCFactory.h> 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/Relocation.h> 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass LDSymbol; 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ResolveInfo; 22cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass FragmentRef; 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Layout; 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass GOT; 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass TargetLDBackend; 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass MCLDInfo; 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class RelocationFactory 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief RelocationFactory provides the interface for generating target 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * relocation 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass RelocationFactory : public GCFactory<Relocation, 0> 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef Relocation::Type Type; 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef Relocation::Address Address; 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef Relocation::DWord DWord; 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 4067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao enum Result { 4167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao OK, 4267e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao BadReloc, 4367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao Overflow, 4467e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao Unsupport, 4567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao Unknown 4667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao }; 4767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao explicit RelocationFactory(size_t pNum); 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual ~RelocationFactory(); 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// apply - general apply function 5467e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao virtual Result applyRelocation(Relocation& pRelocation, 5567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao const MCLDInfo& pLDInfo) = 0; 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- production ----- // 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// produce - produce a relocation entry 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param pType - the type of the relocation entry 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param pFragRef - the place to apply the relocation 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param pAddend - the addend of the relocation entry 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Relocation* produce(Type pType, 63cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao FragmentRef& pFragRef, 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Address pAddend = 0); 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// produceEmptyEntry - produce an empty relocation which 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// occupied memory space but all contents set to zero. 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Relocation* produceEmptyEntry(); 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void destroy(Relocation* pRelocation); 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setLayout(const Layout& pLayout); 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ------ observers -----// 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const Layout& getLayout() const; 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual TargetLDBackend& getTarget() = 0; 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual const TargetLDBackend& getTarget() const = 0; 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao virtual const char* getName(Type pType) const = 0; 8267e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const Layout* m_pLayout; 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 92