• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- GOT.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_GOT_H
10 #define MCLD_GOT_H
11 #ifdef ENABLE_UNITTEST
12 #include <gtest.h>
13 #endif
14 
15 #include <mcld/LD/LDSection.h>
16 #include <mcld/MC/MCTargetFragment.h>
17 
18 namespace mcld
19 {
20 
21 class GOT;
22 class ResolveInfo;
23 
24 /** \class GOTEntry
25  *  \brief The entry of Global Offset Table
26  */
27 class GOTEntry : public MCTargetFragment
28 {
29 public:
30   explicit GOTEntry(uint64_t pContent, size_t pEntrySize,
31                     llvm::MCSectionData* pParent);
32 
33   virtual ~GOTEntry();
34 
getContent()35   uint64_t& getContent()
36   { return f_Content; }
37 
getContent()38   uint64_t getContent() const
39   { return f_Content; }
40 
setContent(uint64_t pValue)41   void setContent(uint64_t pValue)
42   { f_Content = pValue; }
43 
classof(const MCFragment * pFrag)44   static bool classof(const MCFragment *pFrag)
45   { return pFrag->getKind() == llvm::MCFragment::FT_Target; }
46 
classof(const GOTEntry * pFrag)47   static bool classof(const GOTEntry* pFrag)
48   { return true; }
49 
50   // Override pure virtual function
getSize()51   size_t getSize() const
52   { return m_EntrySize; }
53 
54 protected:
55   uint64_t f_Content;
56   size_t m_EntrySize;
57 };
58 
59 /** \class GOT
60  *  \brief The Global Offset Table
61  */
62 class GOT
63 {
64 protected:
65   GOT(LDSection& pSection,
66       llvm::MCSectionData& pSectionData,
67       size_t pEntrySize);
68 
69 public:
70   virtual ~GOT();
71 
72   /// entrySize - the number of bytes per entry
73   size_t getEntrySize() const;
74 
getSection()75   const LDSection& getSection() const
76   { return m_Section; }
77 
getSectionData()78   llvm::MCSectionData& getSectionData()
79   { return m_SectionData; }
80 
getSectionData()81   const llvm::MCSectionData& getSectionData() const
82   { return m_SectionData; }
83 
84 public:
85   /// reserveEntry - reseve number of pNum of empty entries
86   /// Before layout, we scan all relocations to determine if GOT entries are
87   /// needed. If an entry is needed, the empty entry is reserved for layout
88   /// to adjust the fragment offset. After that, we fill up the entries when
89   /// applying relocations.
90   virtual void reserveEntry(size_t pNum = 1) = 0;
91 
92   /// getEntry - get an empty entry or an exitsted filled entry with pSymbol.
93   /// @param pSymbol - the target symbol
94   /// @param pExist - ture if a filled entry with pSymbol existed, otherwise false.
95   virtual GOTEntry* getEntry(const ResolveInfo& pSymbol, bool& pExist) = 0;
96 
97 protected:
98   LDSection& m_Section;
99   llvm::MCSectionData& m_SectionData;
100   size_t f_EntrySize;
101 };
102 
103 } // namespace of mcld
104 
105 #endif
106 
107