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
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/ilist.h>
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/MC/MCAssembler.h>
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/StrSymPool.h>
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/StaticResolver.h>
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDSectionFactory.h>
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDFileFormat.h>
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDContext.h>
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/Relocation.h>
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/SectionMerger.h>
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/Layout.h>
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/MC/MCLDInput.h>
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/MC/SymbolCategory.h>
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Support/GCFactory.h>
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Support/GCFactoryListTraits.h>
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <set>
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <string>
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;
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass SectionMap;
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Output;
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class MCLinker
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \brief MCLinker provides a pass to link object files.
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass MCLinker
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  enum DefinePolicy
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  {
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Force,
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    AsRefered
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  };
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  enum ResolvePolicy
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  {
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Unresolve,
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Resolve
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  };
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  MCLinker(TargetLDBackend& pBackend,
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao           MCLDInfo& pLDInfo,
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao           LDContext& pContext,
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao           SectionMap& pSectionMap,
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao           const Resolver& pResolver = StaticResolver());
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ~MCLinker();
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // ----- about symbols  ----- //
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// addDynSymbol - add a symbol and resolve it immediately
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  template<Input::Type FROM>
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbol* addSymbol(const llvm::StringRef& pName,
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                      ResolveInfo::Type pType,
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                      ResolveInfo::Desc pDesc,
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                      ResolveInfo::Binding pBinding,
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                      ResolveInfo::SizeType pSize,
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                      LDSymbol::ValueType pValue,
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                      MCFragmentRef* pFragmentRef,
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                      ResolveInfo::Visibility pVisibility = ResolveInfo::Default);
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// defineSymbol - add a symbol
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// defineSymbol define a output symbol
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @tparam POLICY idicate how to define the symbol.
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///   - Force
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///     - Define the symbol forcefully. If the symbol has existed, override
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///       it. Otherwise, define it.
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///   - AsRefered
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///     - If the symbol has existed, override it. Otherwise, return NULL
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///       immediately.
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @tparam RESOLVE indicate whether to resolve the symbol or not.
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///   - Unresolve
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///      - Do not resolve the symbol, and override the symbol immediately.
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///   - Resolve
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///      - Resolve the defined symbol.
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @return If the output symbol has existed, return it. Otherwise, create
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///         a new symbol and return the new one.
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  template<DefinePolicy POLICY, ResolvePolicy RESOLVE>
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbol* defineSymbol(const llvm::StringRef& pName,
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                         bool pIsDyn,
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                         ResolveInfo::Type pType,
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                         ResolveInfo::Desc pDesc,
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                         ResolveInfo::Binding pBinding,
1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                         ResolveInfo::SizeType pSize,
1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                         LDSymbol::ValueType pValue,
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                         MCFragmentRef* pFragmentRef,
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                         ResolveInfo::Visibility pVisibility = ResolveInfo::Default);
1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// mergeSymbolTable - merge the symbol table and resolve symbols.
1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///   Since in current design, MCLinker resolves symbols when reading symbol
1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///   tables, this function do nothing.
1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool mergeSymbolTable(Input& pInput)
1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return true; }
1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool finalizeSymbols();
1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  sections  ----- //
1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// getSectionMap - getSectionMap to change the behavior of SectionMerger
1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// SectionMap& getSectionMap()
1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// { return m_SectionMap; }
1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// createSectHdr - for reader and standard/target format to create a section
1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// header. This function will create a new LDSection and return it. If the
1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// output has no related LDSection, this function will also create one and
1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// push into the output.
1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSection& createSectHdr(const std::string& pName,
1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                           LDFileFormat::Kind pKind,
1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                           uint32_t pType,
1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                           uint32_t pFlag);
1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// getOrCreateOutputSectHdr - for reader and standard/target format to get
1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// or create the output's section header
1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSection& getOrCreateOutputSectHdr(const std::string& pName,
1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                      LDFileFormat::Kind pKind,
1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                      uint32_t pType,
1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                      uint32_t pFlag,
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                      uint32_t pAlign = 0x0);
1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// getOrCreateSectData - for reader to map and perform section merging immediately
1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  llvm::MCSectionData& getOrCreateSectData(LDSection& pSection);
1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  relocations ----- //
1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// addRelocation - add a relocation entry in MCLinker (only for object file)
1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param pType - the type of the relocation
1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param pResolveInfo - the symbol should be the symbol in the input file. MCLinker
1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///                  computes the real applied address by the output symbol.
1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param pFragmentRef - the fragment reference of the applied address.
1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// @param pAddend - the addend value for applying relocation
1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Relocation* addRelocation(Relocation::Type pType,
1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                            const LDSymbol& pSym,
1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                            ResolveInfo& pResolveInfo,
1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                            MCFragmentRef& pFragmentRef,
1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                            Relocation::Address pAddend = 0);
1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// applyRelocations - apply all relocation enties.
1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool applyRelocations();
1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// syncRelocationResult - After applying relocation, write back relocation target
1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// data to output file.
1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void syncRelocationResult();
1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  layout  ----- //
1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Layout& getLayout()
1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_Layout; }
1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const Layout& getLayout() const
1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_Layout; }
1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool layout();
1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  output symbols  ----- //
1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  SymbolCategory& getOutputSymbols()
1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_OutputSymbols; }
1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const SymbolCategory& getOutputSymbols() const
1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_OutputSymbols; }
1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  capacity  ----- //
1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  MCLDInfo& getLDInfo()
1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_Info; }
1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const MCLDInfo& getLDInfo() const
1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_Info; }
1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
1915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbol* defineSymbolForcefully(const llvm::StringRef& pName,
1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                   bool pIsDyn,
1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                   ResolveInfo::Type pType,
1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                   ResolveInfo::Desc pDesc,
1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                   ResolveInfo::Binding pBinding,
1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                   ResolveInfo::SizeType pSize,
1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                   LDSymbol::ValueType pValue,
1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                   MCFragmentRef* pFragmentRef,
1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                   ResolveInfo::Visibility pVisibility);
2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbol* defineAndResolveSymbolForcefully(const llvm::StringRef& pName,
2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             bool pIsDyn,
2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             ResolveInfo::Type pType,
2045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             ResolveInfo::Desc pDesc,
2055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             ResolveInfo::Binding pBinding,
2065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             ResolveInfo::SizeType pSize,
2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             LDSymbol::ValueType pValue,
2085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             MCFragmentRef* pFragmentRef,
2095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             ResolveInfo::Visibility pVisibility);
2105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbol* defineSymbolAsRefered(const llvm::StringRef& pName,
2125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  bool pIsDyn,
2135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  ResolveInfo::Type pType,
2145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  ResolveInfo::Desc pDesc,
2155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  ResolveInfo::Binding pBinding,
2165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  ResolveInfo::SizeType pSize,
2175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  LDSymbol::ValueType pValue,
2185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  MCFragmentRef* pFragmentRef,
2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                  ResolveInfo::Visibility pVisibility);
2205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbol* defineAndResolveSymbolAsRefered(const llvm::StringRef& pName,
2225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            bool pIsDyn,
2235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            ResolveInfo::Type pType,
2245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            ResolveInfo::Desc pDesc,
2255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            ResolveInfo::Binding pBinding,
2265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            ResolveInfo::SizeType pSize,
2275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            LDSymbol::ValueType pValue,
2285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            MCFragmentRef* pFragmentRef,
2295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                            ResolveInfo::Visibility pVisibility);
2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool shouldForceLocal(const ResolveInfo& pInfo) const;
2325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbol* addSymbolFromDynObj(const llvm::StringRef& pName,
2345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                ResolveInfo::Type pType,
2355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                ResolveInfo::Desc pDesc,
2365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                ResolveInfo::Binding pBinding,
2375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                ResolveInfo::SizeType pSize,
2385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                LDSymbol::ValueType pValue,
2395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                MCFragmentRef* pFragmentRef,
2405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                ResolveInfo::Visibility pVisibility);
2415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbol* addSymbolFromObject(const llvm::StringRef& pName,
2435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                ResolveInfo::Type pType,
2445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                ResolveInfo::Desc pDesc,
2455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                ResolveInfo::Binding pBinding,
2465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                ResolveInfo::SizeType pSize,
2475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                LDSymbol::ValueType pValue,
2485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                MCFragmentRef* pFragmentRef,
2495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                ResolveInfo::Visibility pVisibility);
2505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
2515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef GCFactory<LDSymbol, 0> LDSymbolFactory;
2525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef GCFactory<llvm::MCSectionData, 0> LDSectionDataFactory;
2535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef llvm::iplist<llvm::MCFragment,
2545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                       GCFactoryListTraits<llvm::MCFragment> > RelocationListType;
2555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef std::set<LDSymbol*> ForceLocalSymbolTable;
2565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef std::vector<LDSymbol*> OutputSymbolTable;
2575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
2595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  TargetLDBackend& m_Backend;
2605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  MCLDInfo& m_Info;
2615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDContext& m_Output;
2625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  SectionMap& m_SectionMap;
2635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSymbolFactory m_LDSymbolFactory;
2645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSectionFactory m_LDSectHdrFactory;
2655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LDSectionDataFactory m_LDSectDataFactory;
2665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  SectionMerger m_SectionMerger;
2675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  StrSymPool m_StrSymPool;
2685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Layout m_Layout;
2695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  RelocationListType m_RelocationList;
2705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  SymbolCategory m_OutputSymbols;
2715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
2735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "MCLinker.tcc"
2755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
2775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
2795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
280