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