Home | History | Annotate | Download | only in Mips
      1 //===- MipsGOT.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_MIPS_GOT_H
     10 #define MCLD_MIPS_GOT_H
     11 #ifdef ENABLE_UNITTEST
     12 #include <gtest.h>
     13 #endif
     14 
     15 #include <llvm/ADT/DenseMap.h>
     16 
     17 #include <mcld/Target/GOT.h>
     18 
     19 namespace mcld
     20 {
     21 class LDSection;
     22 class MemoryRegion;
     23 
     24 /** \class MipsGOTEntry
     25  *  \brief GOT Entry with size of 4 bytes
     26  */
     27 class MipsGOTEntry : public GOT::Entry<4>
     28 {
     29 public:
     30   MipsGOTEntry(uint64_t pContent, SectionData* pParent)
     31    : GOT::Entry<4>(pContent, pParent)
     32   {}
     33 };
     34 
     35 /** \class MipsGOT
     36  *  \brief Mips Global Offset Table.
     37  */
     38 class MipsGOT : public GOT
     39 {
     40 public:
     41   MipsGOT(LDSection& pSection);
     42 
     43   uint64_t emit(MemoryRegion& pRegion);
     44 
     45   void reserve(size_t pNum = 1);
     46   void reserveLocalEntry();
     47   void reserveGlobalEntry();
     48 
     49   size_t getTotalNum() const;
     50   size_t getLocalNum() const;
     51 
     52   MipsGOTEntry* consume();
     53   MipsGOTEntry* consumeLocal();
     54   MipsGOTEntry* consumeGlobal();
     55 
     56   void setLocal(const ResolveInfo* pInfo) {
     57     m_GOTTypeMap[pInfo] = false;
     58   }
     59 
     60   void setGlobal(const ResolveInfo* pInfo) {
     61     m_GOTTypeMap[pInfo] = true;
     62   }
     63 
     64   bool isLocal(const ResolveInfo* pInfo) {
     65     return m_GOTTypeMap[pInfo] == false;
     66   }
     67 
     68   bool isGlobal(const ResolveInfo* pInfo) {
     69     return m_GOTTypeMap[pInfo] == true;
     70   }
     71 
     72   /// hasGOT1 - return if this got section has any GOT1 entry
     73   bool hasGOT1() const;
     74 
     75 private:
     76   typedef llvm::DenseMap<const ResolveInfo*, bool> SymbolTypeMapType;
     77 
     78 private:
     79   SymbolTypeMapType m_GOTTypeMap;
     80 
     81   iterator m_LocalGOTIterator;  // last local GOT entries
     82   iterator m_GlobalGOTIterator; // last global GOT entries
     83   size_t m_pLocalNum;
     84 
     85   MipsGOTEntry* m_pLast; ///< the last consumed entry
     86 };
     87 
     88 } // namespace of mcld
     89 
     90 #endif
     91 
     92