//===- 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