Relocation.h revision affc150dc44fab1911775a49636d0ce85333b634
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//===----------------------------------------------------------------------===//
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef LD_RELOCATION_H
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define 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>
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/MC/MCFragmentRef.h>
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/ResolveInfo.h>
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDSymbol.h>
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Layout;
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass RelocationFactory;
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass MCLDInfo;
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Relocation : public llvm::MCFragment
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaofriend class RelocationFactory;
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef uint64_t Address; // FIXME: use SizeTrait<T>::Address instead
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef uint64_t DWord; // FIXME: use SizeTrait<T>::Word instead
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef uint8_t Type;
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Relocation(Type pType,
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao             MCFragmentRef* pTargetRef,
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao             Address pAddend,
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao             DWord pTargetData);
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ~Relocation();
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// type - relocation type
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Type type() const
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_Type; }
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// symValue - S value - the symbol address
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Address symValue() const;
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// addend - A value
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Address addend() const
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_Addend; }
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// place - P value - address of the place being relocated
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Address place(const Layout& pLayout) const;
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// symbol info - binding, type
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const ResolveInfo* symInfo() const
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_pSymInfo; }
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// symbol info - binding, type
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ResolveInfo* symInfo()
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_pSymInfo; }
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// target - the target data to relocate
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  DWord& target();
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// target - the target data to relocate
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const DWord& target() const;
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// targetRef - the reference of the target data
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  MCFragmentRef& targetRef()
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_TargetAddress; }
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// targetRef - the reference of the target data
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const MCFragmentRef& targetRef() const
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_TargetAddress; }
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void apply(RelocationFactory& pRelocFactory, const MCLDInfo& pLDInfo);
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// ----- modifiers ----- ///
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void setType(Type pType);
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void setAddend(Address pAddend);
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void setSymInfo(ResolveInfo* pSym);
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Relocation is a kind of MCFragment with type of FT_Reloc
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  static bool classof(const MCFragment *F)
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return F->getKind() == MCFragment::FT_Reloc;}
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  static bool classof(const Relocation *) { return true; }
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// m_Type - the type of the relocation entries
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Type m_Type;
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// m_TargetData - target data of the place being relocated
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  DWord m_TargetData;
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// m_pSymInfo - resolved symbol info of relocation target symbol
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ResolveInfo* m_pSymInfo;
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// m_TargetAddress - MCFragmentRef of the place being relocated
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  MCFragmentRef m_TargetAddress;
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// m_Addend - the addend
1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Address m_Addend;
1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
116