ARMGOT.h revision f33f6de54db174aa679a4b6d1e040d37e95541c0
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//===- ARMGOT.h -----------------------------------------------------------===//
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//                     The MCLinker Project
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// This file is distributed under the University of Illinois Open Source
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// License. See LICENSE.TXT for details.
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//===----------------------------------------------------------------------===//
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#ifndef MCLD_ARM_GOT_H
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#define MCLD_ARM_GOT_H
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#ifdef ENABLE_UNITTEST
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include <gtest.h>
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#endif
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include <mcld/Target/GOT.h>
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include <mcld/Support/MemoryRegion.h>
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include <llvm/ADT/DenseMap.h>
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include <vector>
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughesnamespace mcld {
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectclass LDSection;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** \class ARMGOTEntry
2578e3320540c8bdcbefba5ae1222ee18f6679ab33Elliott Hughes *  \brief GOT Entry with size of 4 bytes
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectclass ARMGOTEntry : public GOT::Entry<4>
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project{
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic:
30c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz  ARMGOTEntry(uint64_t pContent, SectionData* pParent)
31c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz   : GOT::Entry<4>(pContent, pParent)
32c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz  {}
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project};
34c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** \class ARMGOT
36c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz *  \brief ARM Global Offset Table.
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  ARM GOT integrates traditional .got.plt and .got sections into one.
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Traditional .got.plt is placed in the front part of GOT (PLTGOT), and
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  traditional .got is placed in the rear part of GOT (GOT).
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  ARM .got
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *            +--------------+
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *            |    GOT0      |
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *            +--------------+
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *            |    GOTPLT    |
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *            +--------------+
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *            |    GOT       |
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *            +--------------+
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
51c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz */
52c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewiczclass ARMGOT : public GOT
53c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz{
54c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewiczpublic:
55c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz  ARMGOT(LDSection &pSection);
56c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz
57c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz  ~ARMGOT();
58c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz
59c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz  ARMGOTEntry* createGOT();
60c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz  ARMGOTEntry* createGOTPLT();
61c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz
62c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz  void finalizeSectionSize();
63c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz
64c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz  uint64_t emit(MemoryRegion& pRegion);
65c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz
66c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz  void applyGOT0(uint64_t pAddress);
67c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz
68c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz  void applyGOTPLT(uint64_t pPLTBase);
69c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz
70c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz  bool hasGOT1() const;
71c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz
72c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewiczprivate:
73c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz  typedef std::vector<ARMGOTEntry*> EntryListType;
74c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz  typedef EntryListType::iterator entry_iterator;
75c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz  typedef EntryListType::const_iterator const_entry_iterator;
76c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz
77c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewiczprivate:
78c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz  ARMGOTEntry* m_pGOTPLTFront;
79c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz  ARMGOTEntry* m_pGOTFront;
80c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz
81c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz  /// m_GOTPLTEntries - a list of gotplt entries
82c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz  EntryListType m_GOTPLT;
83c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz
84c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz  /// m_GOTEntris - a list of got entries
85c3dc3f7b4d1abfc9d52f87ed47921c53942f9a86Wojciech Staszkiewicz  EntryListType m_GOT;
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project};
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} // namespace of mcld
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#endif
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project