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