| //===- MCLDDriver.h --------------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // MCLDDriver plays the same role as GNU collect2 to prepare all implicit |
| // parameters for MCLinker. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef MCLD_LDDRIVER_H |
| #define MCLD_LDDRIVER_H |
| #ifdef ENABLE_UNITTEST |
| #include <gtest.h> |
| #endif |
| |
| #include <mcld/LD/SectionMap.h> |
| |
| namespace mcld |
| { |
| |
| class MCLinker; |
| class MCLDInfo; |
| class TargetLDBackend; |
| class MemoryAreaFactory; |
| |
| /** \class MCLDDriver |
| * \brief MCLDDriver prepares parameters for MCLinker. |
| */ |
| class MCLDDriver |
| { |
| public: |
| MCLDDriver(MCLDInfo& pLDInfo, |
| TargetLDBackend& pLDBackend, |
| MemoryAreaFactory& pAreaFactory); |
| |
| ~MCLDDriver(); |
| |
| /// initMCLinker - initialize MCLinker |
| /// Connect all components in MCLinker |
| bool initMCLinker(); |
| |
| /// initStdSections - initialize standard sections of the output file. |
| bool initStdSections(); |
| |
| /// normalize - normalize the input files |
| void normalize(); |
| |
| /// linkable - check the linkability of current MCLDInfo |
| /// Check list: |
| /// - check the Attributes are not violate the constaint |
| /// - check every Input has a correct Attribute |
| bool linkable() const; |
| |
| /// mergeSections - put allinput sections into output sections |
| bool mergeSections(); |
| |
| /// addStandardSymbols - shared object and executable files need some |
| /// standard symbols |
| /// @return if there are some input symbols with the same name to the |
| /// standard symbols, return false |
| bool addStandardSymbols(); |
| |
| /// addTargetSymbols - some targets, such as MIPS and ARM, need some |
| /// target-dependent symbols |
| /// @return if there are some input symbols with the same name to the |
| /// target symbols, return false |
| bool addTargetSymbols(); |
| |
| /// readRelocations - read all relocation entries |
| bool readRelocations(); |
| |
| /// prelayout - help backend to do some modification before layout |
| bool prelayout(); |
| |
| /// layout - linearly layout all output sections and reserve some space |
| /// for GOT/PLT |
| /// Because we do not support instruction relaxing in this early version, |
| /// if there is a branch can not jump to its target, we return false |
| /// directly |
| bool layout(); |
| |
| /// postlayout - help backend to do some modification after layout |
| bool postlayout(); |
| |
| /// relocate - applying relocation entries and create relocation |
| /// section in the output files |
| /// Create relocation section, asking TargetLDBackend to |
| /// read the relocation information into RelocationEntry |
| /// and push_back into the relocation section |
| bool relocation(); |
| |
| /// finalizeSymbolValue - finalize the symbol value |
| bool finalizeSymbolValue(); |
| |
| /// emitOutput - emit the output file. |
| bool emitOutput(); |
| |
| /// postProcessing - do modificatiion after all processes |
| bool postProcessing(); |
| |
| /// getLinker - get internal MCLinker object |
| MCLinker* getLinker() |
| { return m_pLinker; } |
| |
| /// getLinker - get internal MCLinker object |
| const MCLinker* getLinker() const |
| { return m_pLinker; } |
| |
| /// hasInitLinker - has Linker been initialized? |
| bool hasInitLinker() const |
| { return (NULL != m_pLinker); } |
| |
| private: |
| MCLDInfo& m_LDInfo; |
| TargetLDBackend &m_LDBackend; |
| MCLinker* m_pLinker; |
| SectionMap m_SectionMap; |
| MemoryAreaFactory &m_AreaFactory; |
| }; |
| |
| } // end namespace mcld |
| #endif |