15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- MCLinker.h -------------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file provides a number of APIs used by SectLinker.
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// These APIs do the things which a linker should do.
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef MCLD_MCLINKER_H
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MCLD_MCLINKER_H
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h>
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
20cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <set>
21cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <string>
22cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/ilist.h>
24cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/StaticResolver.h>
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDSectionFactory.h>
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDFileFormat.h>
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDContext.h>
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/Relocation.h>
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/SectionMerger.h>
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/Layout.h>
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/MC/MCLDInput.h>
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/MC/SymbolCategory.h>
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Support/GCFactory.h>
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Support/GCFactoryListTraits.h>
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld {
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass TargetLDBackend;
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass MCLDInfo;
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass LDSection;
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass LDSectionFactory;
43cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass SectionData;
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass SectionMap;
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Output;
46affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass EhFrame;
47affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass EhFrameHdr;
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class MCLinker
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \brief MCLinker provides a pass to link object files.
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass MCLinker
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  enum DefinePolicy
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  {
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Force,
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    AsRefered
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  };
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  enum ResolvePolicy
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  {
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Unresolve,
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Resolve
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  };
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  MCLinker(TargetLDBackend& pBackend,
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao           MCLDInfo& pLDInfo,
70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang           SectionMap& pSectionMap);
71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ~MCLinker();
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // ----- about symbols  ----- //
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// addDynSymbol - add a symbol and resolve it immediately
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  template<Input::Type FROM>
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbol* addSymbol(const llvm::StringRef& pName,
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                      ResolveInfo::Type pType,
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                      ResolveInfo::Desc pDesc,
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                      ResolveInfo::Binding pBinding,
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                      ResolveInfo::SizeType pSize,
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                      LDSymbol::ValueType pValue,
83cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                      FragmentRef* pFragmentRef,
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                      ResolveInfo::Visibility pVisibility = ResolveInfo::Default);
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// defineSymbol - add a symbol
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// defineSymbol define a output symbol
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @tparam POLICY idicate how to define the symbol.
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///   - Force
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///     - Define the symbol forcefully. If the symbol has existed, override
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///       it. Otherwise, define it.
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///   - AsRefered
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///     - If the symbol has existed, override it. Otherwise, return NULL
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///       immediately.
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @tparam RESOLVE indicate whether to resolve the symbol or not.
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///   - Unresolve
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///      - Do not resolve the symbol, and override the symbol immediately.
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///   - Resolve
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///      - Resolve the defined symbol.
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @return If the output symbol has existed, return it. Otherwise, create
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///         a new symbol and return the new one.
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  template<DefinePolicy POLICY, ResolvePolicy RESOLVE>
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbol* defineSymbol(const llvm::StringRef& pName,
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                         bool pIsDyn,
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                         ResolveInfo::Type pType,
1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                         ResolveInfo::Desc pDesc,
1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                         ResolveInfo::Binding pBinding,
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                         ResolveInfo::SizeType pSize,
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                         LDSymbol::ValueType pValue,
113cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                         FragmentRef* pFragmentRef,
1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                         ResolveInfo::Visibility pVisibility = ResolveInfo::Default);
1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool finalizeSymbols();
1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  sections  ----- //
1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// getSectionMap - getSectionMap to change the behavior of SectionMerger
1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// SectionMap& getSectionMap()
1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// { return m_SectionMap; }
1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// createSectHdr - for reader and standard/target format to create a section
1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// header. This function will create a new LDSection and return it. If the
1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// output has no related LDSection, this function will also create one and
1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// push into the output.
1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSection& createSectHdr(const std::string& pName,
1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                           LDFileFormat::Kind pKind,
1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                           uint32_t pType,
1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                           uint32_t pFlag);
1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// getOrCreateOutputSectHdr - for reader and standard/target format to get
1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// or create the output's section header
1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSection& getOrCreateOutputSectHdr(const std::string& pName,
1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                      LDFileFormat::Kind pKind,
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                      uint32_t pType,
1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                      uint32_t pFlag,
1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                      uint32_t pAlign = 0x0);
1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// getOrCreateSectData - for reader to map and perform section merging immediately
141cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  SectionData& getOrCreateSectData(LDSection& pSection);
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
143affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // -----  eh_frame sections  ----- //
144affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// addEhFrame - add an exception handling section
14567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  /// @param pInput - the Input contains this section
146affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// @param pSection - the input section
147affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// @param pArea - the memory area which pSection is within.
14867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  uint64_t addEhFrame(const Input& pInput,
14967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao                      LDSection& pSection,
15067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao                      MemoryArea& pArea);
151affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
152affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // -----  relocations  ----- //
1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// addRelocation - add a relocation entry in MCLinker (only for object file)
1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param pType - the type of the relocation
1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param pResolveInfo - the symbol should be the symbol in the input file. MCLinker
1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///                  computes the real applied address by the output symbol.
1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param pFragmentRef - the fragment reference of the applied address.
1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param pAddend - the addend value for applying relocation
1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Relocation* addRelocation(Relocation::Type pType,
1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                            const LDSymbol& pSym,
1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                            ResolveInfo& pResolveInfo,
162cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                            FragmentRef& pFragmentRef,
163affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                            const LDSection& pSection,
1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                            Relocation::Address pAddend = 0);
1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// applyRelocations - apply all relocation enties.
1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool applyRelocations();
1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// syncRelocationResult - After applying relocation, write back relocation target
1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// data to output file.
1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void syncRelocationResult();
1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  layout  ----- //
174affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void initSectionMap();
175affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Layout& getLayout()
1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_Layout; }
1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const Layout& getLayout() const
1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_Layout; }
1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool layout();
1835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  output symbols  ----- //
1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  SymbolCategory& getOutputSymbols()
1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_OutputSymbols; }
1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const SymbolCategory& getOutputSymbols() const
1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_OutputSymbols; }
1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  capacity  ----- //
1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  MCLDInfo& getLDInfo()
193affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return m_LDInfo; }
1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const MCLDInfo& getLDInfo() const
196affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return m_LDInfo; }
1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbol* defineSymbolForcefully(const llvm::StringRef& pName,
2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                   bool pIsDyn,
2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                   ResolveInfo::Type pType,
2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                   ResolveInfo::Desc pDesc,
2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                   ResolveInfo::Binding pBinding,
2045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                   ResolveInfo::SizeType pSize,
2055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                   LDSymbol::ValueType pValue,
206cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                                   FragmentRef* pFragmentRef,
2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                   ResolveInfo::Visibility pVisibility);
2085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbol* defineAndResolveSymbolForcefully(const llvm::StringRef& pName,
2105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             bool pIsDyn,
2115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             ResolveInfo::Type pType,
2125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             ResolveInfo::Desc pDesc,
2135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             ResolveInfo::Binding pBinding,
2145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             ResolveInfo::SizeType pSize,
2155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             LDSymbol::ValueType pValue,
216cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                                             FragmentRef* pFragmentRef,
2175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             ResolveInfo::Visibility pVisibility);
2185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbol* defineSymbolAsRefered(const llvm::StringRef& pName,
2205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  bool pIsDyn,
2215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  ResolveInfo::Type pType,
2225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  ResolveInfo::Desc pDesc,
2235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  ResolveInfo::Binding pBinding,
2245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  ResolveInfo::SizeType pSize,
2255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  LDSymbol::ValueType pValue,
226cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                                  FragmentRef* pFragmentRef,
2275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  ResolveInfo::Visibility pVisibility);
2285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbol* defineAndResolveSymbolAsRefered(const llvm::StringRef& pName,
2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            bool pIsDyn,
2315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            ResolveInfo::Type pType,
2325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            ResolveInfo::Desc pDesc,
2335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            ResolveInfo::Binding pBinding,
2345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            ResolveInfo::SizeType pSize,
2355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            LDSymbol::ValueType pValue,
236cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                                            FragmentRef* pFragmentRef,
2375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            ResolveInfo::Visibility pVisibility);
2385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool shouldForceLocal(const ResolveInfo& pInfo) const;
2405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbol* addSymbolFromDynObj(const llvm::StringRef& pName,
2425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                ResolveInfo::Type pType,
2435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                ResolveInfo::Desc pDesc,
2445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                ResolveInfo::Binding pBinding,
2455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                ResolveInfo::SizeType pSize,
2465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                LDSymbol::ValueType pValue,
247cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                                FragmentRef* pFragmentRef,
2485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                ResolveInfo::Visibility pVisibility);
2495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbol* addSymbolFromObject(const llvm::StringRef& pName,
2515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                ResolveInfo::Type pType,
2525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                ResolveInfo::Desc pDesc,
2535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                ResolveInfo::Binding pBinding,
2545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                ResolveInfo::SizeType pSize,
2555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                LDSymbol::ValueType pValue,
256cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                                FragmentRef* pFragmentRef,
2575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                ResolveInfo::Visibility pVisibility);
2585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
2595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef GCFactory<LDSymbol, 0> LDSymbolFactory;
260cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  typedef GCFactory<SectionData, 0> LDSectionDataFactory;
261cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  typedef llvm::iplist<Fragment,
262cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                       GCFactoryListTraits<Fragment> > RelocationListType;
2635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef std::set<LDSymbol*> ForceLocalSymbolTable;
2645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef std::vector<LDSymbol*> OutputSymbolTable;
2655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
2675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  TargetLDBackend& m_Backend;
268affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  MCLDInfo& m_LDInfo;
2695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  SectionMap& m_SectionMap;
2705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbolFactory m_LDSymbolFactory;
2715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSectionFactory m_LDSectHdrFactory;
2725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSectionDataFactory m_LDSectDataFactory;
273affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  SectionMerger* m_pSectionMerger;
2745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Layout m_Layout;
2755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  RelocationListType m_RelocationList;
2765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  SymbolCategory m_OutputSymbols;
2775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
2785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "MCLinker.tcc"
2805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
2825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
2845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
285