AArch64GOT.h revision 37b74a387bb3993387029859c2d9d051c41c724e
1//===- AArch64GOT.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 TARGET_AARCH64_AARCH64GOT_H_
10#define TARGET_AARCH64_AARCH64GOT_H_
11
12#include "mcld/Support/MemoryRegion.h"
13#include "mcld/Target/GOT.h"
14
15#include <llvm/ADT/DenseMap.h>
16
17#include <vector>
18
19namespace mcld {
20
21class LDSection;
22
23/** \class AArch64GOTEntry
24 *  \brief GOT Entry with size of 8 bytes
25 */
26class AArch64GOTEntry : public GOT::Entry<8> {
27 public:
28  AArch64GOTEntry(uint64_t pContent, SectionData* pParent)
29      : GOT::Entry<8>(pContent, pParent) {}
30};
31
32/** \class AArch64GOT
33 *  \brief AArch64 Global Offset Table.
34 *
35 *  AArch64 GOT integrates traditional .got.plt and .got sections into one.
36 *  Traditional .got.plt is placed in the front part of GOT (PLTGOT), and
37 *  traditional .got is placed in the rear part of GOT (GOT). When -z now and
38 *  -z relro are given, the got section layout will be as below. Otherwise,
39 *  there will be two seperated sections, .got and .got.plt.
40 *
41 *  This class may be used as .got (with no GOTPLT entry), .got.plt (with only
42 *  GOTPLT entries) or .got (with GOTPLT and normal GOT entries)
43 *
44 *  AArch64 .got
45 *            +--------------+
46 *            |    GOT0      |
47 *            +--------------+
48 *            |    GOTPLT    |
49 *            +--------------+
50 *            |    GOT       |
51 *            +--------------+
52 *
53 */
54class AArch64GOT : public GOT {
55 public:
56  explicit AArch64GOT(LDSection& pSection);
57
58  ~AArch64GOT();
59
60  /// createGOT0 - create the defualt GOT0 entries. This function called when
61  /// it's a .got section (with GOTPLT entries and normal GOT entry) or it's a
62  /// .got.plt section
63  void createGOT0();
64
65  AArch64GOTEntry* createGOT();
66  AArch64GOTEntry* createGOTPLT();
67
68  void finalizeSectionSize();
69
70  uint64_t emit(MemoryRegion& pRegion);
71
72  void applyGOT0(uint64_t pAddress);
73
74  void applyGOTPLT(uint64_t pPLTBase);
75
76  bool hasGOT1() const;
77
78 private:
79  typedef std::vector<AArch64GOTEntry*> EntryListType;
80  typedef EntryListType::iterator entry_iterator;
81  typedef EntryListType::const_iterator const_entry_iterator;
82
83 private:
84  AArch64GOTEntry* m_pGOTPLTFront;
85  AArch64GOTEntry* m_pGOTFront;
86
87  /// m_GOTPLTEntries - a list of gotplt entries
88  EntryListType m_GOTPLT;
89
90  /// m_GOTEntris - a list of got entries
91  EntryListType m_GOT;
92};
93
94}  // namespace mcld
95
96#endif  // TARGET_AARCH64_AARCH64GOT_H_
97