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