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