ARMGOT.h revision 5f7f811840be89f5b7f0b5997054e6282a4a4196
1//===- ARMGOT.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_ARM_GOT_H
10#define MCLD_ARM_GOT_H
11#ifdef ENABLE_UNITTEST
12#include <gtest.h>
13#endif
14
15#include <mcld/Target/GOT.h>
16
17namespace mcld
18{
19class LDSection;
20class MemoryRegion;
21
22/** \class ARMGOT
23 *  \brief ARM Global Offset Table.
24 */
25class ARMGOT : public GOT
26{
27  typedef llvm::DenseMap<const ResolveInfo*, GOTEntry*> SymbolIndexMapType;
28
29public:
30  typedef llvm::MCSectionData::iterator iterator;
31  typedef llvm::MCSectionData::const_iterator const_iterator;
32
33  enum {
34    ARMGOT0Num = 3
35  };
36
37public:
38  ARMGOT(LDSection &pSection, llvm::MCSectionData& pSectionData);
39
40  ~ARMGOT();
41
42  iterator begin();
43
44  const_iterator begin() const;
45
46  iterator end();
47
48  const_iterator end() const;
49
50  uint64_t emit(MemoryRegion& pRegion);
51// For GOT0
52public:
53  void applyGOT0(uint64_t pAddress);
54
55// For normal GOT
56public:
57  // Reserve normal GOT entries.
58  void reserveEntry(size_t pNum = 1);
59
60  GOTEntry* getEntry(const ResolveInfo& pSymbol, bool& pExist);
61
62// For GOTPLT
63public:
64  void reserveGOTPLTEntry();
65
66  void applyAllGOTPLT(uint64_t pPLTBase);
67
68  GOTEntry*& lookupGOTPLTMap(const ResolveInfo& pSymbol);
69
70  iterator getNextGOTPLTEntry();
71
72  iterator getGOTPLTBegin();
73
74  const iterator getGOTPLTEnd();
75
76private:
77  // For normal GOT entries
78  iterator m_NormalGOTIterator;
79  SymbolIndexMapType m_NormalGOTMap;
80
81  // For GOTPLT entries
82  iterator m_GOTPLTIterator;
83  SymbolIndexMapType m_GOTPLTMap;
84
85  iterator m_GOTPLTBegin;
86  iterator m_GOTPLTEnd;
87};
88
89} // namespace of mcld
90
91#endif
92