ObjectBuilder.h revision 6f75755c9204b1d8817ae5a65a2f7e5af0ec3f70
137cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara//===- ObjectBuilder.h ----------------------------------------------------===// 237cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara// 3ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara// The MCLinker Project 437cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara// 537cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara// This file is distributed under the University of Illinois Open Source 6ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara// License. See LICENSE.TXT for details. 7ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara// 8ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara//===----------------------------------------------------------------------===// 9ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara#ifndef MCLD_OBJECT_OBJECT_BUILDER_H 10ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara#define MCLD_OBJECT_OBJECT_BUILDER_H 1137cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara#ifdef ENABLE_UNITTEST 12ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara#include <gtest.h> 13ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara#endif 14ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara#include <mcld/LD/LDFileFormat.h> 15ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara#include <mcld/LD/EhFrame.h> 16ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara 1737cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara#include <llvm/Support/DataTypes.h> 18ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara 19ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara#include <string> 2037cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara 21ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoaranamespace mcld { 2237cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara 2337cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoaraclass LinkerConfig; 2437cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoaraclass Module; 2537cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoaraclass LDSection; 2637cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoaraclass SectionData; 2737cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoaraclass RelocData; 28ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoaraclass Fragment; 29ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoaraclass Relocation; 30ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara 31ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara/** \class ObjectBuilder 32736b6058d8c91ec4ad295c0a04c7b81d8119268cDaniel Nicoara * \brief ObjectBuilder recieve ObjectAction and build the mcld::Module. 33ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara */ 3437cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoaraclass ObjectBuilder 3537cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara{ 3637cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoarapublic: 3737cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara ObjectBuilder(const LinkerConfig& pConfig, 3837cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara Module& pTheModule); 3937cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara 4037cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara/// @} 4137cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara/// @name Section Methods 4237cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara/// @{ 43ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara /// CreateSection - To create an output LDSection in mcld::Module. 44ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara /// Link scripts and command line options define some SECTIONS commands that 45ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara /// specify where input sections are placed into output sections. This function 46730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk /// checks SECTIONS commands to change given name to the output section name. 47730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk /// This function creates a new LDSection and push the created LDSection into 48730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk /// @ref mcld::Module. 49730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk /// 50730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk /// To create an input LDSection in mcld::LDContext, use @ref LDSection::Create(). 51730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk /// 52730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk /// @see SectionMap 53736b6058d8c91ec4ad295c0a04c7b81d8119268cDaniel Nicoara /// 54ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara /// @param [in] pName The given name. Returned LDSection used the changed name 55ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara /// by SectionMap. 56ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara LDSection* CreateSection(const std::string& pInputName, 57ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara LDFileFormat::Kind pKind, 58ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara uint32_t pType, 59ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara uint32_t pFlag, 60ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara uint32_t pAlign = 0x0); 61ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara 62ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara /// MergeSection - merge the pInput section to mcld::Module. 63ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara /// This function moves all fragments in pInputSection to the corresponding 64ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara /// output section of mcld::Module. 65ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara /// 66ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara /// @see SectionMap 67ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara /// @param [in] pInputSection The merged input section. 68736b6058d8c91ec4ad295c0a04c7b81d8119268cDaniel Nicoara /// @return The merged output section. If the corresponding output sections 69736b6058d8c91ec4ad295c0a04c7b81d8119268cDaniel Nicoara /// is not defined, return NULL. 70ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara LDSection* MergeSection(LDSection& pInputSection); 71736b6058d8c91ec4ad295c0a04c7b81d8119268cDaniel Nicoara 72ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara /// MoveSectionData - move the fragment of pFrom to pTo section data. 73736b6058d8c91ec4ad295c0a04c7b81d8119268cDaniel Nicoara static bool MoveSectionData(SectionData& pFrom, SectionData& pTo); 74736b6058d8c91ec4ad295c0a04c7b81d8119268cDaniel Nicoara 75ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara /// UpdateSectionAlign - update alignment for input section 76ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara static void UpdateSectionAlign(LDSection& pTo, const LDSection& pFrom); 77ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara 78ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara/// @} 79ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara/// @name Fragment Methods 80ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara/// @{ 81ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara /// AppendFragment - To append pFrag to the given SectionData pSD. 82ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara /// In order to keep the alignment of pFrag, This function inserts an 83730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk /// AlignFragment before pFrag if pAlignConstraint is larger than 1. 84730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk /// 85730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk /// @note This function does not update the alignment constraint of LDSection. 86730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk /// 87730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk /// @param [in, out] pFrag The appended fragment. The offset of the appended 88730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk /// pFrag is set to the offset in pSD. 89730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk /// @param [in, out] pSD The section data being appended. 90730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk /// @param [in] pAlignConstraint The alignment constraint. 91730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk /// @return Total size of the inserted fragments. 92730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk static uint64_t AppendFragment(Fragment& pFrag, SectionData& pSD, 93730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk uint32_t pAlignConstraint = 1); 94730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 95730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulkprivate: 96730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk const LinkerConfig& m_Config; 97730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk Module& m_Module; 98730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk}; 99730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 100730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk} // namespace of mcld 101730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 102730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk#endif 103ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara 104ba2ce39b8e81e7816cc462eb690c9b066b007ae4Daniel Nicoara