| //===- Stub.h -------------------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef MCLD_FRAGMENT_STUB_H |
| #define MCLD_FRAGMENT_STUB_H |
| #ifdef ENABLE_UNITTEST |
| #include <gtest.h> |
| #endif |
| |
| #include <llvm/Support/DataTypes.h> |
| #include <mcld/Fragment/Fragment.h> |
| #include <mcld/Fragment/Relocation.h> |
| #include <vector> |
| #include <string> |
| |
| namespace mcld |
| { |
| |
| class Relocation; |
| class ResolveInfo; |
| |
| class Stub: public Fragment |
| { |
| public: |
| typedef Relocation::DWord DWord; |
| typedef Relocation::SWord SWord; |
| typedef Relocation::Type Type; |
| |
| class Fixup |
| { |
| public: |
| Fixup(DWord pOffset, SWord pAddend, Type pType) |
| : m_Offset(pOffset), m_Addend(pAddend), m_Type(pType) |
| { } |
| |
| ~Fixup() |
| { } |
| |
| DWord offset() const { return m_Offset; } |
| |
| SWord addend() const { return m_Addend; } |
| |
| Type type() const { return m_Type; } |
| |
| private: |
| DWord m_Offset; |
| SWord m_Addend; |
| Type m_Type; |
| }; |
| |
| public: |
| typedef std::vector<Fixup*> FixupListType; |
| typedef FixupListType::iterator fixup_iterator; |
| typedef FixupListType::const_iterator const_fixup_iterator; |
| |
| public: |
| Stub(); |
| |
| virtual ~Stub(); |
| |
| /// clone - clone function for stub factory to create the corresponding stub |
| Stub* clone() { return doClone(); } |
| |
| /// isMyDuty - return true when the pReloc is problematic and the stub is able |
| /// to fix it! |
| virtual bool isMyDuty(const class Relocation& pReloc, |
| uint64_t pSource, |
| uint64_t pTargetSymValue) const = 0; |
| |
| /// name - name of this stub |
| virtual const std::string& name() const = 0; |
| |
| /// getContent - content of the stub |
| virtual const uint8_t* getContent() const = 0; |
| |
| /// size - size of the stub |
| virtual size_t size() const = 0; |
| |
| /// alignment - alignment of the stub |
| virtual size_t alignment() const = 0; |
| |
| /// symInfo - ResolveInfo of this Stub |
| ResolveInfo* symInfo() { return m_pSymInfo; } |
| |
| const ResolveInfo* symInfo() const { return m_pSymInfo; } |
| |
| /// symValue - initial value for stub's symbol |
| virtual uint64_t initSymValue() const { return 0x0; } |
| |
| /// ----- Fixup ----- /// |
| fixup_iterator fixup_begin() { return m_FixupList.begin(); } |
| |
| const_fixup_iterator fixup_begin() const { return m_FixupList.begin(); } |
| |
| fixup_iterator fixup_end() { return m_FixupList.end(); } |
| |
| const_fixup_iterator fixup_end() const { return m_FixupList.end(); } |
| |
| /// ----- modifiers ----- /// |
| void setSymInfo(ResolveInfo* pSymInfo); |
| |
| // Stub is a kind of Fragment with type of Stub |
| static bool classof(const Fragment *F) |
| { return F->getKind() == Fragment::Stub; } |
| |
| static bool classof(const Stub *) |
| { return true; } |
| |
| protected: |
| /// addFixup - add a fixup for this stub to build a relocation |
| void addFixup(DWord pOffset, SWord pAddend, Type pType); |
| |
| /// addFixup - add a fixup from a existing fixup of the prototype |
| void addFixup(const Fixup& pFixup); |
| |
| private: |
| /// doClone - when adding a backend stub, we should implement this function |
| virtual Stub* doClone() = 0; |
| |
| private: |
| ResolveInfo* m_pSymInfo; |
| FixupListType m_FixupList; |
| }; |
| |
| } // namespace of mcld |
| |
| #endif |
| |