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