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;
22d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
23d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao/** \class Relocator
24d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao *  \brief Relocator provides the interface of performing relocations
25d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao */
26d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass Relocator
27d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao{
28d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaopublic:
296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef Relocation::Type    Type;
30d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  typedef Relocation::Address Address;
316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef Relocation::DWord   DWord;
326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef Relocation::SWord   SWord;
336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef Relocation::Size    Size;
34d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
35d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaopublic:
36d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  enum Result {
37d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    OK,
38d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    BadReloc,
39d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    Overflow,
40d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    Unsupport,
41d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    Unknown
42d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  };
43d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
44d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaopublic:
456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual ~Relocator() = 0;
46d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
47d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// apply - general apply function
48d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  virtual Result applyRelocation(Relocation& pRelocation) = 0;
49d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
50d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  // ------ observers -----//
51d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  virtual TargetLDBackend& getTarget() = 0;
52d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
53d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  virtual const TargetLDBackend& getTarget() const = 0;
54d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// getName - get the name of a relocation
56d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  virtual const char* getName(Type pType) const = 0;
57d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// getSize - get the size of a relocation in bit
596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual Size getSize(Type pType) const = 0;
60d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao};
61d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
62d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao} // namespace of mcld
63d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
64d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#endif
65d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
66