1cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===- Fragment.h ---------------------------------------------------------===//
2cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//
3cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//                     The MCLinker Project
4cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//
5cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao// This file is distributed under the University of Illinois Open Source
6cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao// License. See LICENSE.TXT for details.
7cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//
8cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_FRAGMENT_FRAGMENT_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_FRAGMENT_FRAGMENT_H_
11cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/Compiler.h"
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <llvm/ADT/ilist_node.h>
15cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <llvm/Support/DataTypes.h>
16cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <cassert>
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <cstddef>
19cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
21cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
22cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass SectionData;
23cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
24cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/** \class Fragment
25cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao *  \brief Fragment is the minimun linking unit of MCLinker.
26cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao */
2707177ff8032d136567f3e99d372cb67713f1bba8Stephen Hinesclass Fragment : public llvm::ilist_node_with_parent<Fragment, SectionData> {
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  enum Type { Alignment, Fillment, Region, Target, Stub, Null };
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
32cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  Fragment();
33cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  explicit Fragment(Type pKind, SectionData* pParent = NULL);
35cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
36cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  virtual ~Fragment();
37cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
38cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  Type getKind() const { return m_Kind; }
39cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
40d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  const SectionData* getParent() const { return m_pParent; }
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  SectionData* getParent() { return m_pParent; }
42cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  void setParent(SectionData* pValue) { m_pParent = pValue; }
44cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  uint64_t getOffset() const;
46cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
47cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  void setOffset(uint64_t pOffset) { m_Offset = pOffset; }
48cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool hasOffset() const;
50cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  static bool classof(const Fragment* O) { return true; }
52cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  virtual size_t size() const {
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    assert(false && "Can not call abstract Fragment::size()!");
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    return 0;
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
59cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  Type m_Kind;
6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
61cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  SectionData* m_pParent;
62cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
63cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  uint64_t m_Offset;
64cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
6637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  DISALLOW_COPY_AND_ASSIGN(Fragment);
67cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao};
68cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
6937b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
70cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // MCLD_FRAGMENT_FRAGMENT_H_
72