ObjectLinker.cpp revision d0fbbb227051be16931a1aa9b4a7722ac039c698
122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- ObjectLinker.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/Object/ObjectLinker.h>
1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LinkerConfig.h>
1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Module.h>
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/InputTree.h>
14d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/IRBuilder.h>
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/LDSection.h>
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/LDContext.h>
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/Archive.h>
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/ArchiveReader.h>
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/ObjectReader.h>
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/DynObjReader.h>
2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/GroupReader.h>
22d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/LD/BinaryReader.h>
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/ObjectWriter.h>
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/DynObjWriter.h>
2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/ExecWriter.h>
26d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/LD/BinaryWriter.h>
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/ResolveInfo.h>
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/RelocData.h>
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/RealPath.h>
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/MemoryArea.h>
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/MsgHandling.h>
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Target/TargetLDBackend.h>
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Fragment/FragmentLinker.h>
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Object/ObjectBuilder.h>
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/Casting.h>
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaousing namespace llvm;
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaousing namespace mcld;
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoObjectLinker::ObjectLinker(const LinkerConfig& pConfig,
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                           Module& pModule,
43d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                           IRBuilder& pBuilder,
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                           TargetLDBackend& pLDBackend)
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  : m_Config(pConfig),
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_Module(pModule),
47d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    m_Builder(pBuilder),
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_pLinker(NULL),
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_LDBackend(pLDBackend),
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_pObjectReader(NULL),
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_pDynObjReader(NULL),
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_pArchiveReader(NULL),
53d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    m_pGroupReader(NULL),
54d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    m_pBinaryReader(NULL),
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_pObjectWriter(NULL),
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_pDynObjWriter(NULL),
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_pExecWriter(NULL),
58d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    m_pBinaryWriter(NULL)
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // set up soname
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (!m_Config.options().soname().empty()) {
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_Module.setName(m_Config.options().soname());
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoObjectLinker::~ObjectLinker()
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pLinker;
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pObjectReader;
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pDynObjReader;
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pArchiveReader;
72d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  delete m_pGroupReader;
73d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  delete m_pBinaryReader;
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pObjectWriter;
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pDynObjWriter;
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pExecWriter;
77d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  delete m_pBinaryWriter;
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// initFragmentLinker - initialize FragmentLinker
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao///  Connect all components with FragmentLinker
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::initFragmentLinker()
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (NULL == m_pLinker) {
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_pLinker = new FragmentLinker(m_Config,
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                   m_Module,
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                   m_LDBackend);
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // initialize the readers and writers
9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // Because constructor can not be failed, we initalize all readers and
9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // writers outside the FragmentLinker constructors.
93d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  m_pObjectReader  = m_LDBackend.createObjectReader(m_Builder);
9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pArchiveReader = m_LDBackend.createArchiveReader(m_Module);
95d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  m_pDynObjReader  = m_LDBackend.createDynObjReader(m_Builder);
9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pGroupReader   = new GroupReader(m_Module, *m_pObjectReader,
9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                     *m_pDynObjReader, *m_pArchiveReader);
98d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  m_pBinaryReader  = m_LDBackend.createBinaryReader(m_Builder);
99d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  m_pObjectWriter  = m_LDBackend.createObjectWriter();
100d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  m_pDynObjWriter  = m_LDBackend.createDynObjWriter();
101d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  m_pExecWriter    = m_LDBackend.createExecWriter();
102d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  m_pBinaryWriter  = m_LDBackend.createBinaryWriter();
10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
104d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  // initialize Relocator
105d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  m_LDBackend.initRelocator(*m_pLinker);
10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // initialize BranchIslandFactory
10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_LDBackend.initBRIslandFactory();
10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // initialize StubFactory
11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_LDBackend.initStubFactory();
11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // initialize target stubs
11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_LDBackend.initTargetStubs(*m_pLinker);
11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
11722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// initStdSections - initialize standard sections
11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::initStdSections()
12022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
12122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ObjectBuilder builder(m_Config, m_Module);
12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
12322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // initialize standard sections
12422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (!m_LDBackend.initStdSections(builder))
12522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    return false;
12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
12722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // initialize target-dependent sections
12822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_LDBackend.initTargetSections(m_Module, builder);
12922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
13022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid ObjectLinker::normalize()
13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
13522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  set up inputs  ----- //
13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Module::input_iterator input, inEnd = m_Module.input_end();
13722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (input = m_Module.input_begin(); input!=inEnd; ++input) {
13822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // is a group node
13922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if (isGroup(input)) {
140d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao      getGroupReader()->readGroup(input, m_Builder.getInputBuilder(), m_Config);
14122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      continue;
14222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    }
14322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
14422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // already got type - for example, bitcode or external OIR (object
14522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // intermediate representation)
14622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if ((*input)->type() == Input::Script ||
14722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        (*input)->type() == Input::Archive ||
14822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        (*input)->type() == Input::External)
14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      continue;
15022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
15122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if (Input::Object == (*input)->type()) {
15222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      m_Module.getObjectList().push_back(*input);
15322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      continue;
15422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    }
15522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
15622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if (Input::DynObj == (*input)->type()) {
15722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      m_Module.getLibraryList().push_back(*input);
15822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      continue;
15922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    }
16022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
161d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    // read input as a binary file
162d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    if (m_Config.options().isBinaryInput()) {
163d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao      (*input)->setType(Input::Object);
164d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao      getBinaryReader()->readBinary(**input);
165d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao      m_Module.getObjectList().push_back(*input);
166d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    }
16722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // is a relocatable object file
168d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    else if (getObjectReader()->isMyFormat(**input)) {
16922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      (*input)->setType(Input::Object);
17022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      getObjectReader()->readHeader(**input);
17122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      getObjectReader()->readSections(**input);
17222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      getObjectReader()->readSymbols(**input);
17322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      m_Module.getObjectList().push_back(*input);
17422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    }
17522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // is a shared object file
17622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    else if (getDynObjReader()->isMyFormat(**input)) {
17722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      (*input)->setType(Input::DynObj);
17822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      getDynObjReader()->readHeader(**input);
17922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      getDynObjReader()->readSymbols(**input);
18022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      m_Module.getLibraryList().push_back(*input);
18122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    }
18222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // is an archive
18322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    else if (getArchiveReader()->isMyFormat(**input)) {
18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      (*input)->setType(Input::Archive);
185d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao      Archive archive(**input, m_Builder.getInputBuilder());
18622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      getArchiveReader()->readArchive(archive);
18722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      if(archive.numOfObjectMember() > 0) {
18822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        m_Module.getInputTree().merge<InputTree::Inclusive>(input,
18922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                                            archive.inputs());
19022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      }
19122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    }
19222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    else {
19322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      fatal(diag::err_unrecognized_input_file) << (*input)->path()
194d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                                          << m_Config.targets().triple().str();
19522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    }
19622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  } // end of for
19722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
19822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
19922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::linkable() const
20022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
20122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // check we have input and output files
20222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (m_Module.getInputTree().empty()) {
20322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    error(diag::err_no_inputs);
20422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    return false;
20522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
20622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
20722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // can not mix -static with shared objects
20822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Module::const_lib_iterator lib, libEnd = m_Module.lib_end();
20922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (lib = m_Module.lib_begin(); lib != libEnd; ++lib) {
21022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if((*lib)->attribute()->isStatic()) {
21122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      error(diag::err_mixed_shared_static_objects)
21222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                      << (*lib)->name() << (*lib)->path();
21322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      return false;
21422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    }
21522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
21622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
21722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // can not mix -r with shared objects
21822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
21922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
22022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
22122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// readRelocations - read all relocation entries
22222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao///
22322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// All symbols should be read and resolved before this function.
22422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::readRelocations()
22522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
22622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // Bitcode is read by the other path. This function reads relocation sections
22722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // in object files.
22822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  mcld::InputTree::bfs_iterator input, inEnd = m_Module.getInputTree().bfs_end();
22922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (input=m_Module.getInputTree().bfs_begin(); input!=inEnd; ++input) {
23022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if ((*input)->type() == Input::Object && (*input)->hasMemArea()) {
23122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      if (!getObjectReader()->readRelocations(**input))
23222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        return false;
23322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    }
23422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // ignore the other kinds of files.
23522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
23622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
23722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
23822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
23922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// mergeSections - put allinput sections into output sections
24022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::mergeSections()
24122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
24222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ObjectBuilder builder(m_Config, m_Module);
24322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Module::obj_iterator obj, objEnd = m_Module.obj_end();
24422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (obj = m_Module.obj_begin(); obj != objEnd; ++obj) {
24522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    LDContext::sect_iterator sect, sectEnd = (*obj)->context()->sectEnd();
24622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    for (sect = (*obj)->context()->sectBegin(); sect != sectEnd; ++sect) {
24722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      switch ((*sect)->kind()) {
24822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        // Some *INPUT sections should not be merged.
24922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        case LDFileFormat::Ignore:
25022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        case LDFileFormat::Null:
25122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        case LDFileFormat::Relocation:
25222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        case LDFileFormat::NamePool:
25322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        case LDFileFormat::Group:
25422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        case LDFileFormat::StackNote:
25522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          // skip
25622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          continue;
25722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        case LDFileFormat::Target:
25822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          if (!m_LDBackend.mergeSection(m_Module, **sect)) {
25922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao            error(diag::err_cannot_merge_section) << (*sect)->name()
26022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                                  << (*obj)->name();
26122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao            return false;
26222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          }
26322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          break;
26422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        case LDFileFormat::EhFrame: {
26522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          if (!(*sect)->hasEhFrame())
26622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao            continue; // skip
26722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
26822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          if (!builder.MergeSection(**sect)) {
26922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao            error(diag::err_cannot_merge_section) << (*sect)->name()
27022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                                  << (*obj)->name();
27122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao            return false;
27222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          }
27322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          break;
27422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        }
27522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        default: {
27622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          if (!(*sect)->hasSectionData())
27722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao            continue; // skip
27822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
27922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          if (!builder.MergeSection(**sect)) {
28022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao            error(diag::err_cannot_merge_section) << (*sect)->name()
28122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                                  << (*obj)->name();
28222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao            return false;
28322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          }
28422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          break;
28522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        }
28622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      } // end of switch
28722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    } // for each section
28822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  } // for each obj
28922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
29022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
29122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
29222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// addStandardSymbols - shared object and executable files need some
29322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// standard symbols
29422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao///   @return if there are some input symbols with the same name to the
29522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao///   standard symbols, return false
29622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::addStandardSymbols()
29722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
29822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // create and add section symbols for each output section
29922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Module::iterator iter, iterEnd = m_Module.end();
30022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (iter = m_Module.begin(); iter != iterEnd; ++iter) {
30122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_Module.getSectionSymbolSet().add(**iter, m_Module.getNamePool());
30222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
30322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
30422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return m_LDBackend.initStandardSymbols(*m_pLinker, m_Module);
30522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
30622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
30722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// addTargetSymbols - some targets, such as MIPS and ARM, need some
30822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// target-dependent symbols
30922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao///   @return if there are some input symbols with the same name to the
31022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao///   target symbols, return false
31122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::addTargetSymbols()
31222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
31322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_LDBackend.initTargetSymbols(*m_pLinker);
31422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
31522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
31622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
31722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::scanRelocations()
31822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
31922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // apply all relocations of all inputs
32022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Module::obj_iterator input, inEnd = m_Module.obj_end();
32122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (input = m_Module.obj_begin(); input != inEnd; ++input) {
32222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    LDContext::sect_iterator rs, rsEnd = (*input)->context()->relocSectEnd();
32322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    for (rs = (*input)->context()->relocSectBegin(); rs != rsEnd; ++rs) {
32422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      // bypass the reloc section if
32522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      // 1. its section kind is changed to Ignore. (The target section is a
32622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      // discarded group section.)
32722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      // 2. it has no reloc data. (All symbols in the input relocs are in the
32822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      // discarded group sections)
32922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      if (LDFileFormat::Ignore == (*rs)->kind() || !(*rs)->hasRelocData())
33022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        continue;
33122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      RelocData::iterator reloc, rEnd = (*rs)->getRelocData()->end();
33222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      for (reloc = (*rs)->getRelocData()->begin(); reloc != rEnd; ++reloc) {
33322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        Relocation* relocation = llvm::cast<Relocation>(reloc);
33422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        // scan relocation
33522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        if (LinkerConfig::Object != m_Config.codeGenType()) {
33622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          m_LDBackend.scanRelocation(*relocation,
33722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                     *m_pLinker,
33822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                     m_Module,
33922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                     *(*rs)->getLink());
34022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        }
34122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        else {
34222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          m_LDBackend.partialScanRelocation(*relocation,
34322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                     *m_pLinker,
34422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                     m_Module,
34522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                     *(*rs)->getLink());
34622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        }
34722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      } // for all relocations
34822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    } // for all relocation section
34922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  } // for all inputs
35022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
35122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
35222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
35322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// prelayout - help backend to do some modification before layout
35422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::prelayout()
35522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
35622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // finalize the section symbols, set their fragment reference and push them
35722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // into output symbol table
358d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  Module::iterator sect, sEnd = m_Module.end();
359d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  for (sect = m_Module.begin(); sect != sEnd; ++sect) {
360d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    m_Module.getSectionSymbolSet().finalize(**sect, m_Module.getSymbolTable());
36122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
36222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
36322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_LDBackend.preLayout(m_Module, *m_pLinker);
36422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
365d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  if (LinkerConfig::Object != m_Config.codeGenType() ||
366d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao      m_Config.options().isDefineCommon())
367d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    m_LDBackend.allocateCommonSymbols(m_Module);
36822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
36922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// check program interpreter - computer the name size of the runtime dyld
37022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (!m_pLinker->isStaticLink() &&
37122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      (LinkerConfig::Exec == m_Config.codeGenType() ||
37222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao       m_Config.options().isPIE() ||
37322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao       m_Config.options().hasDyld()))
37422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_LDBackend.sizeInterp();
37522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
37622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// measure NamePools - compute the size of name pool sections
37722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// In ELF, will compute  the size of.symtab, .strtab, .dynsym, .dynstr,
37822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// .hash and .shstrtab sections.
37922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///
38022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// dump all symbols and strings from FragmentLinker and build the format-dependent
38122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// hash table.
38222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_LDBackend.sizeNamePools(m_Module, m_pLinker->isStaticLink());
38322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
38422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
38522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
38622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
38722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// layout - linearly layout all output sections and reserve some space
38822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// for GOT/PLT
38922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao///   Because we do not support instruction relaxing in this early version,
39022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao///   if there is a branch can not jump to its target, we return false
39122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao///   directly
39222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::layout()
39322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
394d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  m_LDBackend.layout(m_Module, *m_pLinker);
395d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  return true;
39622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
39722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
39822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// prelayout - help backend to do some modification after layout
39922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::postlayout()
40022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
40122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_LDBackend.postLayout(m_Module, *m_pLinker);
40222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
40322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
40422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
40522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// finalizeSymbolValue - finalize the resolved symbol value.
40622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao///   Before relocate(), after layout(), FragmentLinker should correct value of all
40722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao///   symbol.
40822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::finalizeSymbolValue()
40922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
41022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return m_pLinker->finalizeSymbols();
41122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
41222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
41322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// relocate - applying relocation entries and create relocation
41422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// section in the output files
41522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// Create relocation section, asking TargetLDBackend to
41622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// read the relocation information into RelocationEntry
41722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// and push_back into the relocation section
41822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::relocation()
41922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
42022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return m_pLinker->applyRelocations();
42122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
42222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
42322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// emitOutput - emit the output file.
42422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::emitOutput(MemoryArea& pOutput)
42522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
42622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  switch(m_Config.codeGenType()) {
42722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    case LinkerConfig::Object:
42822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      getObjectWriter()->writeObject(m_Module, pOutput);
42922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      return true;
43022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    case LinkerConfig::DynObj:
43122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      getDynObjWriter()->writeDynObj(m_Module, pOutput);
43222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      return true;
43322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    case LinkerConfig::Exec:
43422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      getExecWriter()->writeExecutable(m_Module, pOutput);
43522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      return true;
436d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    case LinkerConfig::Binary:
437d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao      getBinaryWriter()->writeBinary(m_Module, pOutput);
438d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao      return true;
43922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    default:
44022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      fatal(diag::unrecognized_output_file) << m_Config.codeGenType();
44122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
44222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return false;
44322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
44422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
44522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// postProcessing - do modification after all processes
44622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool ObjectLinker::postProcessing(MemoryArea& pOutput)
44722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
44822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pLinker->syncRelocationResult(pOutput);
44922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
45022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // emit .eh_frame_hdr
45122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // eh_frame_hdr should be emitted after syncRelocation, because eh_frame_hdr
45222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // needs FDE PC value, which will be corrected at syncRelocation
45322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_LDBackend.postProcessing(*m_pLinker, pOutput);
45422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
45522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
45622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
457