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