1//===- MCLDDriver.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// 10// MCLDDriver plays the same role as GNU collect2 to prepare all implicit 11// parameters for MCLinker. 12// 13//===----------------------------------------------------------------------===// 14 15#ifndef MCLD_LDDRIVER_H 16#define MCLD_LDDRIVER_H 17#ifdef ENABLE_UNITTEST 18#include <gtest.h> 19#endif 20 21#include <mcld/LD/SectionMap.h> 22namespace mcld 23{ 24 25class MCLinker; 26class MCLDInfo; 27class TargetLDBackend; 28 29//===----------------------------------------------------------------------===// 30/// MCLDDriver - MCLDDriver prepares parameters for MCLinker. 31/// 32class MCLDDriver 33{ 34public: 35 MCLDDriver(MCLDInfo& pLDInfo, TargetLDBackend& pLDBackend); 36 ~MCLDDriver(); 37 38 /// normalize - normalize the input files 39 void normalize(); 40 41 /// linkable - check the linkability of current MCLDInfo 42 /// Check list: 43 /// - check the Attributes are not violate the constaint 44 /// - check every Input has a correct Attribute 45 bool linkable() const; 46 47 /// initMCLinker - initialize MCLinker 48 /// Connect all components in MCLinker 49 bool initMCLinker(); 50 51 /// readSections - read all input section headers 52 bool readSections(); 53 54 /// mergeSections - put allinput sections into output sections 55 bool mergeSections(); 56 57 /// readSymbolTables - read symbol tables from the input files. 58 /// for each input file, loads its symbol table from file. 59 bool readSymbolTables(); 60 61 /// mergeSymbolTables - merge the symbol tables of input files into the 62 /// output's symbol table. 63 bool mergeSymbolTables(); 64 65 /// addStandardSymbols - shared object and executable files need some 66 /// standard symbols 67 /// @return if there are some input symbols with the same name to the 68 /// standard symbols, return false 69 bool addStandardSymbols(); 70 71 /// addTargetSymbols - some targets, such as MIPS and ARM, need some 72 /// target-dependent symbols 73 /// @return if there are some input symbols with the same name to the 74 /// target symbols, return false 75 bool addTargetSymbols(); 76 77 /// readRelocations - read all relocation entries 78 bool readRelocations(); 79 80 /// prelayout - help backend to do some modification before layout 81 bool prelayout(); 82 83 /// layout - linearly layout all output sections and reserve some space 84 /// for GOT/PLT 85 /// Because we do not support instruction relaxing in this early version, 86 /// if there is a branch can not jump to its target, we return false 87 /// directly 88 bool layout(); 89 90 /// postlayout - help backend to do some modification after layout 91 bool postlayout(); 92 93 /// relocate - applying relocation entries and create relocation 94 /// section in the output files 95 /// Create relocation section, asking TargetLDBackend to 96 /// read the relocation information into RelocationEntry 97 /// and push_back into the relocation section 98 bool relocate(); 99 100 /// finalizeSymbolValue - finalize the symbol value 101 bool finalizeSymbolValue(); 102 103 /// emitOutput - emit the output file. 104 bool emitOutput(); 105 106 /// postProcessing - do modificatiion after all processes 107 bool postProcessing(); 108 109private: 110 MCLDInfo& m_LDInfo; 111 TargetLDBackend &m_LDBackend; 112 MCLinker* m_pLinker; 113 SectionMap m_SectionMap; 114}; 115 116} // end namespace mcld 117#endif 118