blob: fa77e64f001788e59b0a4766ffc3d56b2468a350 [file] [log] [blame]
//===- Relocation.h ----------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_LD_RELOCATION_H
#define MCLD_LD_RELOCATION_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif
#include <llvm/ADT/ilist_node.h>
#include <llvm/Support/DataTypes.h>
#include <mcld/LD/Fragment.h>
#include <mcld/LD/FragmentRef.h>
#include <mcld/LD/ResolveInfo.h>
#include <mcld/LD/LDSymbol.h>
namespace mcld
{
class Layout;
class RelocationFactory;
class MCLDInfo;
class Relocation : public Fragment
{
friend class RelocationFactory;
public:
typedef uint64_t Address; // FIXME: use SizeTrait<T>::Address instead
typedef uint64_t DWord; // FIXME: use SizeTrait<T>::Word instead
typedef uint8_t Type;
private:
Relocation(Type pType,
FragmentRef* pTargetRef,
Address pAddend,
DWord pTargetData);
public:
~Relocation();
/// type - relocation type
Type type() const
{ return m_Type; }
/// symValue - S value - the symbol address
Address symValue() const;
/// addend - A value
Address addend() const
{ return m_Addend; }
/// place - P value - address of the place being relocated
Address place(const Layout& pLayout) const;
/// symbol info - binding, type
const ResolveInfo* symInfo() const
{ return m_pSymInfo; }
/// symbol info - binding, type
ResolveInfo* symInfo()
{ return m_pSymInfo; }
/// target - the target data to relocate
DWord& target();
/// target - the target data to relocate
const DWord& target() const;
/// targetRef - the reference of the target data
FragmentRef& targetRef()
{ return m_TargetAddress; }
/// targetRef - the reference of the target data
const FragmentRef& targetRef() const
{ return m_TargetAddress; }
void apply(RelocationFactory& pRelocFactory, const MCLDInfo& pLDInfo);
/// ----- modifiers ----- ///
void setType(Type pType);
void setAddend(Address pAddend);
void setSymInfo(ResolveInfo* pSym);
// Relocation is a kind of Fragment with type of FT_Reloc
static bool classof(const Fragment *F)
{ return F->getKind() == Fragment::Relocation; }
static bool classof(const Relocation *) { return true; }
private:
/// m_Type - the type of the relocation entries
Type m_Type;
/// m_TargetData - target data of the place being relocated
DWord m_TargetData;
/// m_pSymInfo - resolved symbol info of relocation target symbol
ResolveInfo* m_pSymInfo;
/// m_TargetAddress - FragmentRef of the place being relocated
FragmentRef m_TargetAddress;
/// m_Addend - the addend
Address m_Addend;
};
} // namespace of mcld
#endif