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#ifdef ENABLE_UNITTEST
12#include <gtest.h>
13#endif
14
15#include <llvm/ADT/ilist_node.h>
16
17#include <llvm/Support/DataTypes.h>
18
19#include <cstddef>
20#include <cassert>
21
22namespace mcld {
23
24class SectionData;
25
26/** \class Fragment
27 *  \brief Fragment is the minimun linking unit of MCLinker.
28 */
29class Fragment : public llvm::ilist_node<Fragment>
30{
31public:
32  enum Type {
33    Alignment,
34    Fillment,
35    Region,
36    Target,
37    Stub,
38    Null
39  };
40
41public:
42  Fragment();
43
44  Fragment(Type pKind, SectionData *pParent = NULL);
45
46  virtual ~Fragment();
47
48  Type getKind() const { return m_Kind; }
49
50  const SectionData* getParent() const { return m_pParent; }
51  SectionData*       getParent()       { return m_pParent; }
52
53  void setParent(SectionData *pValue) { m_pParent = pValue; }
54
55  uint64_t getOffset() const;
56
57  void setOffset(uint64_t pOffset) { m_Offset = pOffset; }
58
59  bool hasOffset() const;
60
61  static bool classof(const Fragment *O) { return true; }
62
63  virtual size_t size() const {
64    assert(false && "Can not call abstract Fragment::size()!");
65    return 0;
66  }
67
68private:
69  Fragment(const Fragment& );            // DO NOT IMPLEMENT
70  Fragment& operator=(const Fragment& ); // DO NOT IMPLEMENT
71
72private:
73  Type m_Kind;
74  SectionData* m_pParent;
75
76  uint64_t m_Offset;
77
78};
79
80} // namespace of mcld
81
82#endif
83
84