//===- ObjectBuilder.h ----------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_OBJECT_OBJECT_BUILDER_H
#define MCLD_OBJECT_OBJECT_BUILDER_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif
#include <mcld/LD/LDFileFormat.h>
#include <mcld/LD/EhFrame.h>
#include <llvm/Support/DataTypes.h>
#include <string>
namespace mcld {
class LinkerConfig;
class Module;
class LDSection;
class SectionData;
class RelocData;
class Fragment;
class Relocation;
/** \class ObjectBuilder
* \brief ObjectBuilder recieve ObjectAction and build the mcld::Module.
*/
class ObjectBuilder
{
public:
ObjectBuilder(const LinkerConfig& pConfig,
Module& pTheModule);
/// @}
/// @name Section Methods
/// @{
/// CreateSection - To create an output LDSection in mcld::Module.
/// Link scripts and command line options define some SECTIONS commands that
/// specify where input sections are placed into output sections. This function
/// checks SECTIONS commands to change given name to the output section name.
/// This function creates a new LDSection and push the created LDSection into
/// @ref mcld::Module.
///
/// To create an input LDSection in mcld::LDContext, use @ref LDSection::Create().
///
/// @see SectionMap
///
/// @param [in] pName The given name. Returned LDSection used the changed name
/// by SectionMap.
LDSection* CreateSection(const std::string& pInputName,
LDFileFormat::Kind pKind,
uint32_t pType,
uint32_t pFlag,
uint32_t pAlign = 0x0);
/// MergeSection - merge the pInput section to mcld::Module.
/// This function moves all fragments in pInputSection to the corresponding
/// output section of mcld::Module.
///
/// @see SectionMap
/// @param [in] pInputSection The merged input section.
/// @return The merged output section. If the corresponding output sections
/// is not defined, return NULL.
LDSection* MergeSection(LDSection& pInputSection);
/// MoveSectionData - move the fragment of pFrom to pTo section data.
static bool MoveSectionData(SectionData& pFrom, SectionData& pTo);
/// UpdateSectionAlign - update alignment for input section
static void UpdateSectionAlign(LDSection& pTo, const LDSection& pFrom);
/// @}
/// @name Fragment Methods
/// @{
/// AppendFragment - To append pFrag to the given SectionData pSD.
/// In order to keep the alignment of pFrag, This function inserts an
/// AlignFragment before pFrag if pAlignConstraint is larger than 1.
///
/// @note This function does not update the alignment constraint of LDSection.
///
/// @param [in, out] pFrag The appended fragment. The offset of the appended
/// pFrag is set to the offset in pSD.
/// @param [in, out] pSD The section data being appended.
/// @param [in] pAlignConstraint The alignment constraint.
/// @return Total size of the inserted fragments.
static uint64_t AppendFragment(Fragment& pFrag, SectionData& pSD,
uint32_t pAlignConstraint = 1);
private:
const LinkerConfig& m_Config;
Module& m_Module;
};
} // namespace of mcld
#endif