ObjectBuilder.h revision 87f34658dec9097d987d254a990ea7f311bfc95f
1a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears//===- ObjectBuilder.h ----------------------------------------------------===// 2a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears// 3a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears// The MCLinker Project 4a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears// 5a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears// This file is distributed under the University of Illinois Open Source 6a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears// License. See LICENSE.TXT for details. 7a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears// 8a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears//===----------------------------------------------------------------------===// 9a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears#ifndef MCLD_OBJECT_OBJECTBUILDER_H 10a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears#define MCLD_OBJECT_OBJECTBUILDER_H 11a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears#ifdef ENABLE_UNITTEST 12a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears#include <gtest.h> 13a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears#endif 14a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears#include <mcld/LD/LDFileFormat.h> 15a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears#include <mcld/LD/EhFrame.h> 16a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears 17a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears#include <llvm/Support/DataTypes.h> 18a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears 19a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears#include <string> 20a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears 21a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Searsnamespace mcld { 22a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears 23a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Searsclass LinkerConfig; 24a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Searsclass Module; 25a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Searsclass LDSection; 26a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Searsclass SectionData; 27a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Searsclass RelocData; 28a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Searsclass Fragment; 29a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Searsclass Relocation; 30a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Searsclass Input; 31a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears 32a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears/** \class ObjectBuilder 33a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears * \brief ObjectBuilder recieve ObjectAction and build the mcld::Module. 34a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears */ 35a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Searsclass ObjectBuilder 36a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears{ 37a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Searspublic: 38a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears ObjectBuilder(const LinkerConfig& pConfig, 39a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears Module& pTheModule); 40a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears 41a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears/// @} 42a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears/// @name Section Methods 43a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears/// @{ 44a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// CreateSection - To create an output LDSection in mcld::Module. 45a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// Link scripts and command line options define some SECTIONS commands that 46a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// specify where input sections are placed into output sections. This function 47a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// checks SECTIONS commands to change given name to the output section name. 48a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// This function creates a new LDSection and push the created LDSection into 49a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// @ref mcld::Module. 50a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// 51a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// To create an input LDSection in mcld::LDContext, use @ref LDSection::Create(). 52a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// 53a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// @see SectionMap 54a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// 55a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// @param [in] pName The given name. Returned LDSection used the changed name 56a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// by SectionMap. 57a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears LDSection* CreateSection(const std::string& pInputName, 58a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears LDFileFormat::Kind pKind, 59a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears uint32_t pType, 60a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears uint32_t pFlag, 61a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears uint32_t pAlign = 0x0); 62a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears 63a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// MergeSection - merge the pInput section to mcld::Module. 64a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// This function moves all fragments in pInputSection to the corresponding 65a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// output section of mcld::Module. 66a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// 67a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// @see SectionMap 68a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// @param [in] pInputSection The merged input section. 69a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// @return The merged output section. If the corresponding output sections 70a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// is not defined, return NULL. 71a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears LDSection* MergeSection(const Input& pInputFile, LDSection& pInputSection); 72a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears 73a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// MoveSectionData - move the fragment of pFrom to pTo section data. 74a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears static bool MoveSectionData(SectionData& pFrom, SectionData& pTo); 75a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears 76a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// UpdateSectionAlign - update alignment for input section 77a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears static void UpdateSectionAlign(LDSection& pTo, const LDSection& pFrom); 78a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears 79a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears/// @} 80a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears/// @name Fragment Methods 81a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears/// @{ 82a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// AppendFragment - To append pFrag to the given SectionData pSD. 83a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// In order to keep the alignment of pFrag, This function inserts an 84a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// AlignFragment before pFrag if pAlignConstraint is larger than 1. 85a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// 86a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// @note This function does not update the alignment constraint of LDSection. 87d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn /// 88a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// @param [in, out] pFrag The appended fragment. The offset of the appended 89a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// pFrag is set to the offset in pSD. 90a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// @param [in, out] pSD The section data being appended. 91a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// @param [in] pAlignConstraint The alignment constraint. 92a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears /// @return Total size of the inserted fragments. 93a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears static uint64_t AppendFragment(Fragment& pFrag, SectionData& pSD, 94a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears uint32_t pAlignConstraint = 1); 95a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears 96a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Searsprivate: 97a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears const LinkerConfig& m_Config; 98a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears Module& m_Module; 99a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears}; 100a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears 101a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears} // namespace of mcld 102a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears 103a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears#endif 104a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears 105a8cc0584c60cbe7e880895353d95e9b9cc5c1b62Bart Sears