1//===- RelocData.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_LD_RELOCDATA_H_
10#define MCLD_LD_RELOCDATA_H_
11
12#include "mcld/ADT/ilist_sort.h"
13#include "mcld/Config/Config.h"
14#include "mcld/Fragment/Relocation.h"
15#include "mcld/Support/Allocators.h"
16#include "mcld/Support/Compiler.h"
17#include "mcld/Support/GCFactoryListTraits.h"
18
19#include <llvm/ADT/ilist.h>
20#include <llvm/ADT/ilist_node.h>
21#include <llvm/Support/DataTypes.h>
22
23#include <list>
24
25namespace mcld {
26
27class LDSection;
28
29/** \class RelocData
30 *  \brief RelocData stores Relocation.
31 *
32 *  Since Relocations are created by GCFactory, we use GCFactoryListTraits for
33 *the
34 *  RelocationList here to avoid iplist to delete Relocations.
35 */
36class RelocData {
37 private:
38  friend class Chunk<RelocData, MCLD_SECTIONS_PER_INPUT>;
39
40  RelocData();
41  explicit RelocData(LDSection& pSection);
42
43 public:
44  typedef llvm::iplist<Relocation, GCFactoryListTraits<Relocation> >
45      RelocationListType;
46
47  typedef RelocationListType::reference reference;
48  typedef RelocationListType::const_reference const_reference;
49
50  typedef RelocationListType::iterator iterator;
51  typedef RelocationListType::const_iterator const_iterator;
52
53  typedef RelocationListType::reverse_iterator reverse_iterator;
54  typedef RelocationListType::const_reverse_iterator const_reverse_iterator;
55
56 public:
57  static RelocData* Create(LDSection& pSection);
58
59  static void Destroy(RelocData*& pSection);
60
61  static void Clear();
62
63  const LDSection& getSection() const { return *m_pSection; }
64  LDSection& getSection() { return *m_pSection; }
65
66  const RelocationListType& getRelocationList() const { return m_Relocations; }
67  RelocationListType& getRelocationList() { return m_Relocations; }
68
69  size_t size() const { return m_Relocations.size(); }
70
71  bool empty() const { return m_Relocations.empty(); }
72
73  RelocData& append(Relocation& pRelocation);
74  Relocation& remove(Relocation& pRelocation);
75
76  const_reference front() const { return m_Relocations.front(); }
77  reference front() { return m_Relocations.front(); }
78  const_reference back() const { return m_Relocations.back(); }
79  reference back() { return m_Relocations.back(); }
80
81  const_iterator begin() const { return m_Relocations.begin(); }
82  iterator begin() { return m_Relocations.begin(); }
83  const_iterator end() const { return m_Relocations.end(); }
84  iterator end() { return m_Relocations.end(); }
85  const_reverse_iterator rbegin() const { return m_Relocations.rbegin(); }
86  reverse_iterator rbegin() { return m_Relocations.rbegin(); }
87  const_reverse_iterator rend() const { return m_Relocations.rend(); }
88  reverse_iterator rend() { return m_Relocations.rend(); }
89
90  template <class Comparator>
91  void sort(Comparator pComparator) {
92    mcld::sort(m_Relocations, pComparator);
93  }
94
95 private:
96  RelocationListType m_Relocations;
97  LDSection* m_pSection;
98
99 private:
100  DISALLOW_COPY_AND_ASSIGN(RelocData);
101};
102
103}  // namespace mcld
104
105#endif  // MCLD_LD_RELOCDATA_H_
106