Home | History | Annotate | Download | only in Fragment
      1 //===- Fragment.h ---------------------------------------------------------===//
      2 //
      3 //                     The MCLinker Project
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 #ifndef MCLD_FRAGMENT_FRAGMENT_H
     10 #define MCLD_FRAGMENT_FRAGMENT_H
     11 
     12 #include <llvm/ADT/ilist_node.h>
     13 
     14 #include <llvm/Support/DataTypes.h>
     15 
     16 #include <cstddef>
     17 #include <cassert>
     18 
     19 namespace mcld {
     20 
     21 class SectionData;
     22 
     23 /** \class Fragment
     24  *  \brief Fragment is the minimun linking unit of MCLinker.
     25  */
     26 class Fragment : public llvm::ilist_node<Fragment>
     27 {
     28 public:
     29   enum Type {
     30     Alignment,
     31     Fillment,
     32     Region,
     33     Target,
     34     Stub,
     35     Null
     36   };
     37 
     38 public:
     39   Fragment();
     40 
     41   Fragment(Type pKind, SectionData *pParent = NULL);
     42 
     43   virtual ~Fragment();
     44 
     45   Type getKind() const { return m_Kind; }
     46 
     47   const SectionData* getParent() const { return m_pParent; }
     48   SectionData*       getParent()       { return m_pParent; }
     49 
     50   void setParent(SectionData *pValue) { m_pParent = pValue; }
     51 
     52   uint64_t getOffset() const;
     53 
     54   void setOffset(uint64_t pOffset) { m_Offset = pOffset; }
     55 
     56   bool hasOffset() const;
     57 
     58   static bool classof(const Fragment *O) { return true; }
     59 
     60   virtual size_t size() const {
     61     assert(false && "Can not call abstract Fragment::size()!");
     62     return 0;
     63   }
     64 
     65 private:
     66   Fragment(const Fragment& );            // DO NOT IMPLEMENT
     67   Fragment& operator=(const Fragment& ); // DO NOT IMPLEMENT
     68 
     69 private:
     70   Type m_Kind;
     71   SectionData* m_pParent;
     72 
     73   uint64_t m_Offset;
     74 
     75 };
     76 
     77 } // namespace of mcld
     78 
     79 #endif
     80 
     81