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