• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- MipsLDBackend.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 MIPS_LDBACKEND_H
10 #define MIPS_LDBACKEND_H
11 #include <mcld/Target/GNULDBackend.h>
12 #include "MipsELFDynamic.h"
13 #include "MipsGOT.h"
14 
15 namespace mcld {
16 
17 class LinkerConfig;
18 class OutputRelocSection;
19 class SectionMap;
20 class MemoryArea;
21 class MipsGNUInfo;
22 
23 //===----------------------------------------------------------------------===//
24 /// MipsGNULDBackend - linker backend of Mips target of GNU ELF format
25 ///
26 class MipsGNULDBackend : public GNULDBackend
27 {
28 public:
29   typedef std::vector<LDSymbol*> SymbolListType;
30 
31 public:
32   MipsGNULDBackend(const LinkerConfig& pConfig, MipsGNUInfo* pInfo);
33   ~MipsGNULDBackend();
34 
35 public:
36   /// initTargetSections - initialize target dependent sections in output
37   void initTargetSections(Module& pModule, ObjectBuilder& pBuilder);
38 
39   /// initTargetSymbols - initialize target dependent symbols in output.
40   void initTargetSymbols(IRBuilder& pBuilder, Module& pModule);
41 
42   /// initRelocator - create and initialize Relocator.
43   bool initRelocator();
44 
45   /// getRelocator - return relocator.
46   Relocator* getRelocator();
47 
48   /// preLayout - Backend can do any needed modification before layout
49   void doPreLayout(IRBuilder& pBuilder);
50 
51   /// postLayout - Backend can do any needed modification after layout
52   void doPostLayout(Module& pModule, IRBuilder& pBuilder);
53 
54   /// dynamic - the dynamic section of the target machine.
55   /// Use co-variant return type to return its own dynamic section.
56   MipsELFDynamic& dynamic();
57 
58   /// dynamic - the dynamic section of the target machine.
59   /// Use co-variant return type to return its own dynamic section.
60   const MipsELFDynamic& dynamic() const;
61 
62   /// emitSectionData - write out the section data into the memory region.
63   /// When writers get a LDSection whose kind is LDFileFormat::Target, writers
64   /// call back target backend to emit the data.
65   ///
66   /// Backends handle the target-special tables (plt, gp,...) by themselves.
67   /// Backend can put the data of the tables in SectionData directly
68   ///  - LDSection.getSectionData can get the section data.
69   /// Or, backend can put the data into special data structure
70   ///  - backend can maintain its own map<LDSection, table> to get the table
71   /// from given LDSection.
72   ///
73   /// @param pSection - the given LDSection
74   /// @param pRegion - the region to write out data
75   /// @return the size of the table in the file.
76   uint64_t emitSectionData(const LDSection& pSection,
77                            MemoryRegion& pRegion) const;
78 
79   /// hasEntryInStrTab - symbol has an entry in a .strtab
80   bool hasEntryInStrTab(const LDSymbol& pSym) const;
81 
82   /// orderSymbolTable - order symbol table before emitting
83   void orderSymbolTable(Module& pModule);
84 
85   MipsGOT& getGOT();
86   const MipsGOT& getGOT() const;
87 
88   OutputRelocSection& getRelDyn();
89   const OutputRelocSection& getRelDyn() const;
90 
getGOTSymbo()91   LDSymbol*             getGOTSymbo()            { return m_pGOTSymbol;    }
getGOTSymbo()92   const LDSymbol*       getGOTSymbo() const      { return m_pGOTSymbol;    }
93 
getGpDispSymbol()94   LDSymbol*             getGpDispSymbol()        { return m_pGpDispSymbol; }
getGpDispSymbol()95   const LDSymbol*       getGpDispSymbol() const  { return m_pGpDispSymbol; }
96 
getGlobalGOTSyms()97   SymbolListType&       getGlobalGOTSyms()       { return m_GlobalGOTSyms; }
getGlobalGOTSyms()98   const SymbolListType& getGlobalGOTSyms() const { return m_GlobalGOTSyms; }
99 
100   /// getTargetSectionOrder - compute the layout order of ARM target sections
101   unsigned int getTargetSectionOrder(const LDSection& pSectHdr) const;
102 
103   /// finalizeSymbol - finalize the symbol value
104   bool finalizeTargetSymbols();
105 
106   /// allocateCommonSymbols - allocate common symbols in the corresponding
107   /// sections.
108   bool allocateCommonSymbols(Module& pModule);
109 
110 private:
111   void defineGOTSymbol(IRBuilder& pBuilder);
112 
113   /// emitSymbol32 - emit an ELF32 symbol, override parent's function
114   void emitSymbol32(llvm::ELF::Elf32_Sym& pSym32,
115                     LDSymbol& pSymbol,
116                     char* pStrtab,
117                     size_t pStrtabsize,
118                     size_t pSymtabIdx);
119 
120   /// getRelEntrySize - the size in BYTE of rel type relocation
getRelEntrySize()121   size_t getRelEntrySize()
122   { return 8; }
123 
124   /// getRelEntrySize - the size in BYTE of rela type relocation
getRelaEntrySize()125   size_t getRelaEntrySize()
126   { return 12; }
127 
128   /// doCreateProgramHdrs - backend can implement this function to create the
129   /// target-dependent segments
130   void doCreateProgramHdrs(Module& pModule);
131 
132 private:
133   Relocator* m_pRelocator;
134 
135   MipsGOT* m_pGOT;                      // .got
136   OutputRelocSection* m_pRelDyn;        // .rel.dyn
137 
138   MipsELFDynamic* m_pDynamic;
139   LDSymbol* m_pGOTSymbol;
140   LDSymbol* m_pGpDispSymbol;
141 
142   SymbolListType m_GlobalGOTSyms;
143 };
144 
145 } // namespace of mcld
146 
147 #endif
148 
149