Linker.cpp revision d0fbbb227051be16931a1aa9b4a7722ac039c698
122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- Linker.cpp ---------------------------------------------------------===// 222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// The MCLinker Project 422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// This file is distributed under the University of Illinois Open Source 622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// License. See LICENSE.TXT for details. 722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Linker.h> 1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LinkerConfig.h> 1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Module.h> 1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/IRBuilder.h> 1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/MsgHandling.h> 1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/TargetRegistry.h> 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/FileHandle.h> 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/MemoryArea.h> 1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/raw_ostream.h> 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Object/ObjectLinker.h> 2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/MC/InputBuilder.h> 2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Target/TargetLDBackend.h> 2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/LDSection.h> 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/LDSymbol.h> 25d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/LD/SectionData.h> 26d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/LD/RelocData.h> 27d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/Fragment/Relocation.h> 2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Fragment/FragmentRef.h> 2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <cassert> 3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaousing namespace mcld; 3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoLinker::Linker() 3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao : m_pConfig(NULL), m_pModule(NULL), m_pIRBuilder(NULL), 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pTarget(NULL), m_pBackend(NULL), m_pObjLinker(NULL) { 3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoLinker::~Linker() 4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao reset(); 4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool Linker::config(LinkerConfig& pConfig) 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pConfig = &pConfig; 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!initTarget()) 4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!initBackend()) 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!initEmulator()) 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!initOStream()) 5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool Linker::link(Module& pModule, IRBuilder& pBuilder) 6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao assert(NULL != m_pConfig); 6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pIRBuilder = &pBuilder; 6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pObjLinker = new ObjectLinker(*m_pConfig, 6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pModule, 70d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao *m_pIRBuilder, 7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *m_pBackend); 7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // 2. - initialize FragmentLinker 7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!m_pObjLinker->initFragmentLinker()) 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // 3. - initialize output's standard sections 7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!m_pObjLinker->initStdSections()) 7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // 4. - normalize the input tree 8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pObjLinker->normalize(); 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (m_pConfig->options().trace()) { 8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static int counter = 0; 8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao mcld::outs() << "** name\ttype\tpath\tsize (" << pModule.getInputTree().size() << ")\n"; 8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao InputTree::const_dfs_iterator input, inEnd = pModule.getInputTree().dfs_end(); 8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao for (input=pModule.getInputTree().dfs_begin(); input!=inEnd; ++input) { 8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao mcld::outs() << counter++ << " * " << (*input)->name(); 9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao switch((*input)->type()) { 9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case Input::Archive: 9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao mcld::outs() << "\tarchive\t("; 9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao break; 9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case Input::Object: 9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao mcld::outs() << "\tobject\t("; 9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao break; 9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case Input::DynObj: 9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao mcld::outs() << "\tshared\t("; 9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao break; 10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case Input::Script: 10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao mcld::outs() << "\tscript\t("; 10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao break; 10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao case Input::External: 10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao mcld::outs() << "\textern\t("; 10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao break; 10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao default: 10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao unreachable(diag::err_cannot_trace_file) << (*input)->type() 10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao << (*input)->name() 10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao << (*input)->path(); 11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao mcld::outs() << (*input)->path() << ")\n"; 11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 11322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // 5. - check if we can do static linking and if we use split-stack. 11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!m_pObjLinker->linkable()) 11722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return Diagnose(); 11822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // 6. - read all relocation entries from input files 12022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pObjLinker->readRelocations(); 12122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // 7. - merge all sections 12322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!m_pObjLinker->mergeSections()) 12422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 12522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // 8. - add standard symbols and target-dependent symbols 12722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // m_pObjLinker->addUndefSymbols(); 12822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!m_pObjLinker->addStandardSymbols() || 12922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao !m_pObjLinker->addTargetSymbols()) 13022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // 9. - scan all relocation entries by output symbols. 13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pObjLinker->scanRelocations(); 13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // 10.a - pre-layout 13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pObjLinker->prelayout(); 13722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // 10.b - linear layout 13922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pObjLinker->layout(); 14022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 14122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // 10.c - post-layout (create segment, instruction relaxing) 14222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pObjLinker->postlayout(); 14322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 14422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // 11. - finalize symbol value 14522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pObjLinker->finalizeSymbolValue(); 14622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 14722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // 12. - apply relocations 14822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pObjLinker->relocation(); 14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 15022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!Diagnose()) 15122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 15222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 15322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 15422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 15522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool Linker::emit(MemoryArea& pOutput) 15622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 15722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // 13. - write out output 15822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pObjLinker->emitOutput(pOutput); 15922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 16022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // 14. - post processing 16122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pObjLinker->postProcessing(pOutput); 16222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 16322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!Diagnose()) 16422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 16522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 16622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 16722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 16822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 16922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool Linker::emit(const std::string& pPath) 17022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 17122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao FileHandle file; 17222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao FileHandle::Permission perm = 0755; 17322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!file.open(pPath, 17422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao FileHandle::ReadWrite | FileHandle::Truncate | FileHandle::Create, 17522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao perm)) { 17622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao error(diag::err_cannot_open_output_file) << "Linker::emit()" << pPath; 17722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 17822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 17922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 18022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao MemoryArea* output = new MemoryArea(file); 18122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 18222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool result = emit(*output); 18322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao delete output; 18522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao file.close(); 18622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return result; 18722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 18822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 18922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool Linker::emit(int pFileDescriptor) 19022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 19122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao FileHandle file; 19222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao file.delegate(pFileDescriptor); 19322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao MemoryArea* output = new MemoryArea(file); 19422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 19522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool result = emit(*output); 19622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 19722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao delete output; 19822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao file.close(); 19922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return result; 20022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 20122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 20222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool Linker::reset() 20322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 20422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pConfig = NULL; 20522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pModule = NULL; 20622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pIRBuilder = NULL; 20722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pTarget = NULL; 20822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 209d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao // Because llvm::iplist will touch the removed node, we must clear 210d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao // RelocData before deleting target backend. 211d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao RelocData::Clear(); 212d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao SectionData::Clear(); 213d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 21422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao delete m_pBackend; 21522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pBackend = NULL; 21622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 21722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao delete m_pObjLinker; 21822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pObjLinker = NULL; 21922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 22022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSection::Clear(); 22122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSymbol::Clear(); 22222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao FragmentRef::Clear(); 223d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao Relocation::Clear(); 22422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 22522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 22622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 22722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool Linker::initTarget() 22822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 22922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao assert(NULL != m_pConfig); 23022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 23122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao std::string error; 232d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_pTarget = mcld::TargetRegistry::lookupTarget(m_pConfig->targets().triple().str(), error); 23322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (NULL == m_pTarget) { 234d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao fatal(diag::fatal_cannot_init_target) << m_pConfig->targets().triple().str() << error; 23522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 23622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 23722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 23822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 23922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 24022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool Linker::initBackend() 24122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 24222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao assert(NULL != m_pTarget); 24322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_pBackend = m_pTarget->createLDBackend(*m_pConfig); 24422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (NULL == m_pBackend) { 245d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao fatal(diag::fatal_cannot_init_backend) << m_pConfig->targets().triple().str(); 24622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 24722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 24822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 24922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 25022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 25122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool Linker::initEmulator() 25222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 25322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao assert(NULL != m_pTarget && NULL != m_pConfig); 254d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao bool result = m_pTarget->emulate(m_pConfig->targets().triple().str(), 255d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao *m_pConfig); 256d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 257d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao // Relocation should be set up after emulation. 258d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao Relocation::SetUp(*m_pConfig); 259d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao return result; 26022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 26122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 26222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool Linker::initOStream() 26322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 26422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao assert(NULL != m_pConfig); 26522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 26622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao mcld::outs().setColor(m_pConfig->options().color()); 26722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao mcld::errs().setColor(m_pConfig->options().color()); 26822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 26922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 27022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 27122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 272