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//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Object/ObjectLinker.h"
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/InputTree.h"
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/IRBuilder.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerConfig.h"
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerScript.h"
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Module.h"
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/Relocation.h"
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/Archive.h"
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ArchiveReader.h"
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/BinaryReader.h"
2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/BranchIslandFactory.h"
2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/DebugString.h"
2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/DynObjReader.h"
2337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/GarbageCollection.h"
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/GroupReader.h"
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/IdenticalCodeFolding.h"
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDContext.h"
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDSection.h"
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ObjectReader.h"
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ObjectWriter.h"
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/Relocator.h"
3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/RelocData.h"
3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ResolveInfo.h"
3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/SectionData.h"
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Object/ObjectBuilder.h"
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/Assignment.h"
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/Operand.h"
3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/RpnEvaluator.h"
3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/ScriptFile.h"
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/ScriptReader.h"
4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/FileOutputBuffer.h"
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MsgHandling.h"
4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/RealPath.h"
4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/TargetLDBackend.h"
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/Casting.h>
4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/Support/Host.h>
4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines
480dea6bc96bb52346737966839ac68644f7939f58Stephen Hines#include <system_error>
496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
5037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===----------------------------------------------------------------------===//
5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// ObjectLinker
5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===----------------------------------------------------------------------===//
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoObjectLinker::ObjectLinker(const LinkerConfig& pConfig,
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                           TargetLDBackend& pLDBackend)
5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    : m_Config(pConfig),
5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pModule(NULL),
5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pBuilder(NULL),
6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_LDBackend(pLDBackend),
6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pObjectReader(NULL),
6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pDynObjReader(NULL),
6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pArchiveReader(NULL),
6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pGroupReader(NULL),
6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pBinaryReader(NULL),
6637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pScriptReader(NULL),
6737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pWriter(NULL) {
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7037b74a387bb3993387029859c2d9d051c41c724eStephen HinesObjectLinker::~ObjectLinker() {
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pObjectReader;
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pDynObjReader;
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pArchiveReader;
74d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  delete m_pGroupReader;
75d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  delete m_pBinaryReader;
7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  delete m_pScriptReader;
776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  delete m_pWriter;
786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
8037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::initialize(Module& pModule, IRBuilder& pBuilder) {
816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  m_pModule = &pModule;
826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  m_pBuilder = &pBuilder;
83f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // initialize the readers and writers
8537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pObjectReader = m_LDBackend.createObjectReader(*m_pBuilder);
866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  m_pArchiveReader = m_LDBackend.createArchiveReader(*m_pModule);
8737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pDynObjReader = m_LDBackend.createDynObjReader(*m_pBuilder);
8837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pBinaryReader = m_LDBackend.createBinaryReader(*m_pBuilder);
8937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pGroupReader = new GroupReader(*m_pModule,
9037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                   *m_pObjectReader,
9137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                   *m_pDynObjReader,
9237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                   *m_pArchiveReader,
9337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                   *m_pBinaryReader);
9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pScriptReader = new ScriptReader(
9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      *m_pObjectReader, *m_pArchiveReader, *m_pDynObjReader, *m_pGroupReader);
9637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pWriter = m_LDBackend.createWriter();
9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
98d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  // initialize Relocator
996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  m_LDBackend.initRelocator();
10087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// initStdSections - initialize standard sections
10537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::initStdSections() {
106533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  ObjectBuilder builder(*m_pModule);
10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // initialize standard sections
10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (!m_LDBackend.initStdSections(builder))
11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    return false;
11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // initialize target-dependent sections
1136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  m_LDBackend.initTargetSections(*m_pModule, builder);
11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
11722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ObjectLinker::addUndefinedSymbols() {
1190dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  // Add the symbol set by -u as an undefind global symbol into symbol pool
1200dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  GeneralOptions::const_undef_sym_iterator usym;
1210dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  GeneralOptions::const_undef_sym_iterator usymEnd =
12237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Config.options().undef_sym_end();
1230dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  for (usym = m_Config.options().undef_sym_begin(); usym != usymEnd; ++usym) {
1240dea6bc96bb52346737966839ac68644f7939f58Stephen Hines    Resolver::Result result;
12537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    m_pModule->getNamePool().insertSymbol(*usym,  // name
12637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                          false,  // isDyn
1270dea6bc96bb52346737966839ac68644f7939f58Stephen Hines                                          ResolveInfo::NoType,
1280dea6bc96bb52346737966839ac68644f7939f58Stephen Hines                                          ResolveInfo::Undefined,
1290dea6bc96bb52346737966839ac68644f7939f58Stephen Hines                                          ResolveInfo::Global,
13037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                          0x0,  // size
13137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                          0x0,  // value
1320dea6bc96bb52346737966839ac68644f7939f58Stephen Hines                                          ResolveInfo::Default,
1330dea6bc96bb52346737966839ac68644f7939f58Stephen Hines                                          NULL,
1340dea6bc96bb52346737966839ac68644f7939f58Stephen Hines                                          result);
1350dea6bc96bb52346737966839ac68644f7939f58Stephen Hines
1360dea6bc96bb52346737966839ac68644f7939f58Stephen Hines    LDSymbol* output_sym = result.info->outSymbol();
1370dea6bc96bb52346737966839ac68644f7939f58Stephen Hines    // create the output symbol if it dose not have one
13837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    if (!result.existent || (output_sym != NULL)) {
1390dea6bc96bb52346737966839ac68644f7939f58Stephen Hines      output_sym = LDSymbol::Create(*result.info);
1400dea6bc96bb52346737966839ac68644f7939f58Stephen Hines      result.info->setSymPtr(output_sym);
1410dea6bc96bb52346737966839ac68644f7939f58Stephen Hines      output_sym->setFragmentRef(FragmentRef::Null());
1420dea6bc96bb52346737966839ac68644f7939f58Stephen Hines    }
1430dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  }
1440dea6bc96bb52346737966839ac68644f7939f58Stephen Hines}
1450dea6bc96bb52346737966839ac68644f7939f58Stephen Hines
14637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ObjectLinker::normalize() {
14722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  set up inputs  ----- //
1486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Module::input_iterator input, inEnd = m_pModule->input_end();
14937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (input = m_pModule->input_begin(); input != inEnd; ++input) {
15022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // is a group node
15122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if (isGroup(input)) {
15237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      getGroupReader()->readGroup(
15337b74a387bb3993387029859c2d9d051c41c724eStephen Hines          input, inEnd, m_pBuilder->getInputBuilder(), m_Config);
15422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      continue;
15522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    }
15622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
15722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // already got type - for example, bitcode or external OIR (object
15822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // intermediate representation)
15922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if ((*input)->type() == Input::Script ||
16022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        (*input)->type() == Input::Archive ||
16122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        (*input)->type() == Input::External)
16222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      continue;
16322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
16422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if (Input::Object == (*input)->type()) {
1656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines      m_pModule->getObjectList().push_back(*input);
16622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      continue;
16722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    }
16822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
16922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if (Input::DynObj == (*input)->type()) {
1706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines      m_pModule->getLibraryList().push_back(*input);
17122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      continue;
17222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    }
17322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
17487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    bool doContinue = false;
175d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    // read input as a binary file
17687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    if (getBinaryReader()->isMyFormat(**input, doContinue)) {
177d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao      (*input)->setType(Input::Object);
178d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao      getBinaryReader()->readBinary(**input);
1796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines      m_pModule->getObjectList().push_back(*input);
18037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    } else if (doContinue &&
18137b74a387bb3993387029859c2d9d051c41c724eStephen Hines               getObjectReader()->isMyFormat(**input, doContinue)) {
18237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      // is a relocatable object file
18322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      (*input)->setType(Input::Object);
18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      getObjectReader()->readHeader(**input);
18522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      getObjectReader()->readSections(**input);
18622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      getObjectReader()->readSymbols(**input);
1876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines      m_pModule->getObjectList().push_back(*input);
18837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    } else if (doContinue &&
18937b74a387bb3993387029859c2d9d051c41c724eStephen Hines               getDynObjReader()->isMyFormat(**input, doContinue)) {
19037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      // is a shared object file
19122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      (*input)->setType(Input::DynObj);
19222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      getDynObjReader()->readHeader(**input);
19322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      getDynObjReader()->readSymbols(**input);
1946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines      m_pModule->getLibraryList().push_back(*input);
19537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    } else if (doContinue &&
19637b74a387bb3993387029859c2d9d051c41c724eStephen Hines               getArchiveReader()->isMyFormat(**input, doContinue)) {
19737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      // is an archive
19822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      (*input)->setType(Input::Archive);
1990dea6bc96bb52346737966839ac68644f7939f58Stephen Hines      if (m_Config.options().isInExcludeLIBS(**input)) {
2000dea6bc96bb52346737966839ac68644f7939f58Stephen Hines        (*input)->setNoExport();
2010dea6bc96bb52346737966839ac68644f7939f58Stephen Hines      }
2026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines      Archive archive(**input, m_pBuilder->getInputBuilder());
20387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      getArchiveReader()->readArchive(m_Config, archive);
20437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      if (archive.numOfObjectMember() > 0) {
2056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines        m_pModule->getInputTree().merge<InputTree::Inclusive>(input,
20687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                                              archive.inputs());
20787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
20837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    } else if (doContinue &&
20937b74a387bb3993387029859c2d9d051c41c724eStephen Hines               getScriptReader()->isMyFormat(**input, doContinue)) {
21037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      // try to parse input as a linker script
21137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      ScriptFile script(
21237b74a387bb3993387029859c2d9d051c41c724eStephen Hines          ScriptFile::LDScript, **input, m_pBuilder->getInputBuilder());
21387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      if (getScriptReader()->readScript(m_Config, script)) {
21487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        (*input)->setType(Input::Script);
21587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        script.activate(*m_pModule);
21687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        if (script.inputs().size() > 0) {
21737b74a387bb3993387029859c2d9d051c41c724eStephen Hines          m_pModule->getInputTree().merge<InputTree::Inclusive>(
21837b74a387bb3993387029859c2d9d051c41c724eStephen Hines              input, script.inputs());
21987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        }
22022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      }
22137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    } else {
22287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      if (m_Config.options().warnMismatch())
22337b74a387bb3993387029859c2d9d051c41c724eStephen Hines        warning(diag::warn_unrecognized_input_file)
22437b74a387bb3993387029859c2d9d051c41c724eStephen Hines            << (*input)->path() << m_Config.targets().triple().str();
22522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    }
22637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }  // end of for
22722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
22822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
22937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::linkable() const {
23022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // check we have input and output files
2316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  if (m_pModule->getInputTree().empty()) {
23222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    error(diag::err_no_inputs);
23322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    return false;
23422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
23522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
23622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // can not mix -static with shared objects
2376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Module::const_lib_iterator lib, libEnd = m_pModule->lib_end();
2386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  for (lib = m_pModule->lib_begin(); lib != libEnd; ++lib) {
23937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    if ((*lib)->attribute()->isStatic()) {
24037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      error(diag::err_mixed_shared_static_objects) << (*lib)->name()
24137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                                   << (*lib)->path();
24222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      return false;
24322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    }
24422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
24522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  // --nmagic and --omagic options lead to static executable program.
2476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  // These options turn off page alignment of sections. Because the
2486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  // sections are not aligned to pages, these sections can not contain any
2496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  // exported functions. Also, because the two options disable linking
2506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  // against shared libraries, the output absolutely does not call outside
2516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  // functions.
2526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  if (m_Config.options().nmagic() && !m_Config.isCodeStatic()) {
2536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    error(diag::err_nmagic_not_static);
2546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    return false;
2556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  }
2566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  if (m_Config.options().omagic() && !m_Config.isCodeStatic()) {
2576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    error(diag::err_omagic_not_static);
2586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    return false;
2596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  }
2606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
26122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
26222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
26322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
26437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ObjectLinker::dataStrippingOpt() {
26537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  if (m_Config.codeGenType() == LinkerConfig::Object) {
26637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    return;
26737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
26837b74a387bb3993387029859c2d9d051c41c724eStephen Hines
26987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // Garbege collection
27087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  if (m_Config.options().GCSections()) {
27187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    GarbageCollection GC(m_Config, m_LDBackend, *m_pModule);
27287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    GC.run();
27387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  }
2740dea6bc96bb52346737966839ac68644f7939f58Stephen Hines
2750dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  // Identical code folding
2762bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar  if (m_Config.options().getICFMode() != GeneralOptions::ICF::None) {
2770dea6bc96bb52346737966839ac68644f7939f58Stephen Hines    IdenticalCodeFolding icf(m_Config, m_LDBackend, *m_pModule);
2780dea6bc96bb52346737966839ac68644f7939f58Stephen Hines    icf.foldIdenticalCode();
2790dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  }
28087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  return;
28187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}
28287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
28322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// readRelocations - read all relocation entries
28422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao///
28522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// All symbols should be read and resolved before this function.
28637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::readRelocations() {
28722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // Bitcode is read by the other path. This function reads relocation sections
28822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // in object files.
28937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  mcld::InputTree::bfs_iterator input,
29037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      inEnd = m_pModule->getInputTree().bfs_end();
29137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (input = m_pModule->getInputTree().bfs_begin(); input != inEnd; ++input) {
29222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if ((*input)->type() == Input::Object && (*input)->hasMemArea()) {
29322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      if (!getObjectReader()->readRelocations(**input))
29422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        return false;
29522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    }
29622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // ignore the other kinds of files.
29722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
29822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
29922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
30022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
30122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// mergeSections - put allinput sections into output sections
30237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::mergeSections() {
303a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines  // run the target-dependent hooks before merging sections
304a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines  m_LDBackend.preMergeSections(*m_pModule);
305a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines
30637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  // Set up input/output from ldscript requirement if any
30737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  {
30837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    RpnEvaluator evaluator(*m_pModule, m_LDBackend);
30937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    SectionMap::iterator out, outBegin, outEnd;
31037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    outBegin = m_pModule->getScript().sectionMap().begin();
31137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    outEnd = m_pModule->getScript().sectionMap().end();
31237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    for (out = outBegin; out != outEnd; ++out) {
31337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      uint64_t out_align = 0x0, in_align = 0x0;
31437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      LDSection* out_sect = (*out)->getSection();
31537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      SectionMap::Output::iterator in, inBegin, inEnd;
31637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      inBegin = (*out)->begin();
31737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      inEnd = (*out)->end();
31837b74a387bb3993387029859c2d9d051c41c724eStephen Hines
31937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      // force input alignment from ldscript if any
32037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      if ((*out)->prolog().hasSubAlign()) {
32137b74a387bb3993387029859c2d9d051c41c724eStephen Hines        evaluator.eval((*out)->prolog().subAlign(), in_align);
32237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      }
32337b74a387bb3993387029859c2d9d051c41c724eStephen Hines
32437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      for (in = inBegin; in != inEnd; ++in) {
32537b74a387bb3993387029859c2d9d051c41c724eStephen Hines        LDSection* in_sect = (*in)->getSection();
32637b74a387bb3993387029859c2d9d051c41c724eStephen Hines        if ((*out)->prolog().hasSubAlign())
32737b74a387bb3993387029859c2d9d051c41c724eStephen Hines          in_sect->setAlign(in_align);
32837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      }  // for each input section description
32937b74a387bb3993387029859c2d9d051c41c724eStephen Hines
33037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      // force output alignment from ldscript if any
33137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      if ((*out)->prolog().hasAlign()) {
33237b74a387bb3993387029859c2d9d051c41c724eStephen Hines        evaluator.eval((*out)->prolog().align(), out_align);
33337b74a387bb3993387029859c2d9d051c41c724eStephen Hines        out_sect->setAlign(out_align);
33437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      }
33537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    }  // for each output section description
33637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
33737b74a387bb3993387029859c2d9d051c41c724eStephen Hines
338533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  ObjectBuilder builder(*m_pModule);
3396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Module::obj_iterator obj, objEnd = m_pModule->obj_end();
3406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  for (obj = m_pModule->obj_begin(); obj != objEnd; ++obj) {
34122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    LDContext::sect_iterator sect, sectEnd = (*obj)->context()->sectEnd();
34222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    for (sect = (*obj)->context()->sectBegin(); sect != sectEnd; ++sect) {
34322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      switch ((*sect)->kind()) {
34422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        // Some *INPUT sections should not be merged.
3450dea6bc96bb52346737966839ac68644f7939f58Stephen Hines        case LDFileFormat::Folded:
34622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        case LDFileFormat::Ignore:
34722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        case LDFileFormat::Null:
34822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        case LDFileFormat::NamePool:
34922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        case LDFileFormat::Group:
35022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        case LDFileFormat::StackNote:
35122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          // skip
35222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          continue;
35337b74a387bb3993387029859c2d9d051c41c724eStephen Hines        case LDFileFormat::Relocation:
35487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          if (!(*sect)->hasRelocData())
35537b74a387bb3993387029859c2d9d051c41c724eStephen Hines            continue;  // skip
35687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
3570dea6bc96bb52346737966839ac68644f7939f58Stephen Hines          if ((*sect)->getLink()->kind() == LDFileFormat::Ignore ||
3580dea6bc96bb52346737966839ac68644f7939f58Stephen Hines              (*sect)->getLink()->kind() == LDFileFormat::Folded)
35987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            (*sect)->setKind(LDFileFormat::Ignore);
36087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          break;
36122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        case LDFileFormat::Target:
36287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          if (!m_LDBackend.mergeSection(*m_pModule, **obj, **sect)) {
36322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao            error(diag::err_cannot_merge_section) << (*sect)->name()
36422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                                  << (*obj)->name();
36522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao            return false;
36622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          }
36722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          break;
36822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        case LDFileFormat::EhFrame: {
36922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          if (!(*sect)->hasEhFrame())
37037b74a387bb3993387029859c2d9d051c41c724eStephen Hines            continue;  // skip
37122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
372f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines          LDSection* out_sect = NULL;
37337b74a387bb3993387029859c2d9d051c41c724eStephen Hines          if ((out_sect = builder.MergeSection(**obj, **sect)) != NULL) {
37487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            if (!m_LDBackend.updateSectionFlags(*out_sect, **sect)) {
37587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              error(diag::err_cannot_merge_section) << (*sect)->name()
37687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                                    << (*obj)->name();
37787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              return false;
37887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            }
37922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          }
38022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          break;
38122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        }
38237b74a387bb3993387029859c2d9d051c41c724eStephen Hines        case LDFileFormat::DebugString: {
38337b74a387bb3993387029859c2d9d051c41c724eStephen Hines          // FIXME: disable debug string merge when doing partial link.
38437b74a387bb3993387029859c2d9d051c41c724eStephen Hines          if (LinkerConfig::Object == m_Config.codeGenType())
38537b74a387bb3993387029859c2d9d051c41c724eStephen Hines            (*sect)->setKind(LDFileFormat::Debug);
38604c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines        }
38704c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines        // Fall through
38822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        default: {
38922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          if (!(*sect)->hasSectionData())
39037b74a387bb3993387029859c2d9d051c41c724eStephen Hines            continue;  // skip
39122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
392f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines          LDSection* out_sect = NULL;
39337b74a387bb3993387029859c2d9d051c41c724eStephen Hines          if ((out_sect = builder.MergeSection(**obj, **sect)) != NULL) {
39487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            if (!m_LDBackend.updateSectionFlags(*out_sect, **sect)) {
39587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              error(diag::err_cannot_merge_section) << (*sect)->name()
39687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                                    << (*obj)->name();
39787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              return false;
39887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            }
39922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          }
40022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao          break;
40122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        }
40237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      }  // end of switch
40337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    }    // for each section
40437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }      // for each obj
40537b74a387bb3993387029859c2d9d051c41c724eStephen Hines
40637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  {
40737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    SectionMap::iterator out, outBegin, outEnd;
40837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    outBegin = m_pModule->getScript().sectionMap().begin();
40937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    outEnd = m_pModule->getScript().sectionMap().end();
41037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    for (out = outBegin; out != outEnd; ++out) {
41137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      LDSection* out_sect = (*out)->getSection();
41237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      SectionMap::Output::iterator in, inBegin, inEnd;
41337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      inBegin = (*out)->begin();
41437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      inEnd = (*out)->end();
41537b74a387bb3993387029859c2d9d051c41c724eStephen Hines
41637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      for (in = inBegin; in != inEnd; ++in) {
41737b74a387bb3993387029859c2d9d051c41c724eStephen Hines        LDSection* in_sect = (*in)->getSection();
41837b74a387bb3993387029859c2d9d051c41c724eStephen Hines        if (builder.MoveSectionData(*in_sect->getSectionData(),
41937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    *out_sect->getSectionData())) {
42037b74a387bb3993387029859c2d9d051c41c724eStephen Hines          builder.UpdateSectionAlign(*out_sect, *in_sect);
42137b74a387bb3993387029859c2d9d051c41c724eStephen Hines          m_LDBackend.updateSectionFlags(*out_sect, *in_sect);
42237b74a387bb3993387029859c2d9d051c41c724eStephen Hines        }
42337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      }  // for each input section description
42437b74a387bb3993387029859c2d9d051c41c724eStephen Hines
42537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      if ((*out)->hasContent()) {
42637b74a387bb3993387029859c2d9d051c41c724eStephen Hines        LDSection* target = m_pModule->getSection((*out)->name());
42737b74a387bb3993387029859c2d9d051c41c724eStephen Hines        assert(target != NULL && target->hasSectionData());
42837b74a387bb3993387029859c2d9d051c41c724eStephen Hines        if (builder.MoveSectionData(*out_sect->getSectionData(),
42937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    *target->getSectionData())) {
43037b74a387bb3993387029859c2d9d051c41c724eStephen Hines          builder.UpdateSectionAlign(*target, *out_sect);
43137b74a387bb3993387029859c2d9d051c41c724eStephen Hines          m_LDBackend.updateSectionFlags(*target, *out_sect);
43237b74a387bb3993387029859c2d9d051c41c724eStephen Hines        }
43387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
43437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    }  // for each output section description
43537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
43687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
437a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines  // run the target-dependent hooks after merging sections
438a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines  m_LDBackend.postMergeSections(*m_pModule);
439a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines
44022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
44122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
44222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
44337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ObjectLinker::addSymbolToOutput(ResolveInfo& pInfo, Module& pModule) {
44487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // section symbols will be defined by linker later, we should not add section
44587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // symbols to output here
44637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  if (ResolveInfo::Section == pInfo.type() || pInfo.outSymbol() == NULL)
44787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    return;
44887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
44987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // if the symbols defined in the Ignore sections (e.g. discared by GC), then
45087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // not to put them to output
45137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  // make sure that symbols defined in .debug_str won't add into output
45237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  // symbol table. Since these symbols has fragRef to input fragments, which
45337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  // will refer to input LDSection and has bad result when emitting their
45437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  // section index. However, .debug_str actually does not need symobl in
45537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  // shrad/executable objects, so it's fine to do so.
45637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  if (pInfo.outSymbol()->hasFragRef() &&
45737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      (LDFileFormat::Ignore ==
45837b74a387bb3993387029859c2d9d051c41c724eStephen Hines           pInfo.outSymbol()
45937b74a387bb3993387029859c2d9d051c41c724eStephen Hines               ->fragRef()
46037b74a387bb3993387029859c2d9d051c41c724eStephen Hines               ->frag()
46137b74a387bb3993387029859c2d9d051c41c724eStephen Hines               ->getParent()
46237b74a387bb3993387029859c2d9d051c41c724eStephen Hines               ->getSection()
46337b74a387bb3993387029859c2d9d051c41c724eStephen Hines               .kind() ||
46437b74a387bb3993387029859c2d9d051c41c724eStephen Hines       LDFileFormat::DebugString ==
46537b74a387bb3993387029859c2d9d051c41c724eStephen Hines           pInfo.outSymbol()
46637b74a387bb3993387029859c2d9d051c41c724eStephen Hines               ->fragRef()
46737b74a387bb3993387029859c2d9d051c41c724eStephen Hines               ->frag()
46837b74a387bb3993387029859c2d9d051c41c724eStephen Hines               ->getParent()
46937b74a387bb3993387029859c2d9d051c41c724eStephen Hines               ->getSection()
47037b74a387bb3993387029859c2d9d051c41c724eStephen Hines               .kind()))
47187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    return;
47287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
47387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  if (pInfo.shouldForceLocal(m_Config))
47487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    pModule.getSymbolTable().forceLocal(*pInfo.outSymbol());
47587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  else
47687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    pModule.getSymbolTable().add(*pInfo.outSymbol());
47787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}
47887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
47937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ObjectLinker::addSymbolsToOutput(Module& pModule) {
48087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // Traverse all the free ResolveInfo and add the output symobols to output
48187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  NamePool::freeinfo_iterator free_it,
48237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      free_end = pModule.getNamePool().freeinfo_end();
48387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  for (free_it = pModule.getNamePool().freeinfo_begin(); free_it != free_end;
48437b74a387bb3993387029859c2d9d051c41c724eStephen Hines       ++free_it)
48587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    addSymbolToOutput(**free_it, pModule);
48687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
48787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // Traverse all the resolveInfo and add the output symbol to output
48887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  NamePool::syminfo_iterator info_it,
48937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      info_end = pModule.getNamePool().syminfo_end();
49087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  for (info_it = pModule.getNamePool().syminfo_begin(); info_it != info_end;
49137b74a387bb3993387029859c2d9d051c41c724eStephen Hines       ++info_it)
49287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    addSymbolToOutput(*info_it.getEntry(), pModule);
49387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}
49487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
49522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// addStandardSymbols - shared object and executable files need some
49622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// standard symbols
49722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao///   @return if there are some input symbols with the same name to the
49822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao///   standard symbols, return false
49937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::addStandardSymbols() {
50022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // create and add section symbols for each output section
5016f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Module::iterator iter, iterEnd = m_pModule->end();
5026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  for (iter = m_pModule->begin(); iter != iterEnd; ++iter) {
5036f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    m_pModule->getSectionSymbolSet().add(**iter, m_pModule->getNamePool());
50422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
50522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return m_LDBackend.initStandardSymbols(*m_pBuilder, *m_pModule);
50722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
50822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
50922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// addTargetSymbols - some targets, such as MIPS and ARM, need some
51022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// target-dependent symbols
51122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao///   @return if there are some input symbols with the same name to the
51222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao///   target symbols, return false
51337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::addTargetSymbols() {
5146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  m_LDBackend.initTargetSymbols(*m_pBuilder, *m_pModule);
5156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return true;
5166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
5176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
5186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// addScriptSymbols - define symbols from the command line option or linker
5196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// scripts.
52037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::addScriptSymbols() {
52187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  LinkerScript& script = m_pModule->getScript();
52287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  LinkerScript::Assignments::iterator it, ie = script.assignments().end();
52387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // go through the entire symbol assignments
52487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  for (it = script.assignments().begin(); it != ie; ++it) {
52587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    LDSymbol* symbol = NULL;
52687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    assert((*it).second.symbol().type() == Operand::SYMBOL);
52737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    const llvm::StringRef symName = (*it).second.symbol().name();
52837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ResolveInfo::Type type = ResolveInfo::NoType;
52937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ResolveInfo::Visibility vis = ResolveInfo::Default;
53087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    size_t size = 0;
53187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ResolveInfo* old_info = m_pModule->getNamePool().findInfo(symName);
532f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    // if the symbol does not exist, we can set type to NOTYPE
533f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    // else we retain its type, same goes for size - 0 or retain old value
534f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    // and visibility - Default or retain
535f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    if (old_info != NULL) {
53687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      type = static_cast<ResolveInfo::Type>(old_info->type());
53787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      vis = old_info->visibility();
53887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      size = old_info->size();
539f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    }
54087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
54187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    // Add symbol and refine the visibility if needed
54287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    // FIXME: bfd linker would change the binding instead, but currently
54387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    //        ABS is also a kind of Binding in ResolveInfo.
54487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    switch ((*it).second.type()) {
54537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      case Assignment::HIDDEN:
54637b74a387bb3993387029859c2d9d051c41c724eStephen Hines        vis = ResolveInfo::Hidden;
54787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // Fall through
54837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      case Assignment::DEFAULT:
54937b74a387bb3993387029859c2d9d051c41c724eStephen Hines        symbol = m_pBuilder->AddSymbol<IRBuilder::Force, IRBuilder::Unresolve>(
55037b74a387bb3993387029859c2d9d051c41c724eStephen Hines            symName,
55137b74a387bb3993387029859c2d9d051c41c724eStephen Hines            type,
55237b74a387bb3993387029859c2d9d051c41c724eStephen Hines            ResolveInfo::Define,
55337b74a387bb3993387029859c2d9d051c41c724eStephen Hines            ResolveInfo::Absolute,
55437b74a387bb3993387029859c2d9d051c41c724eStephen Hines            size,
55537b74a387bb3993387029859c2d9d051c41c724eStephen Hines            0x0,
55637b74a387bb3993387029859c2d9d051c41c724eStephen Hines            FragmentRef::Null(),
55737b74a387bb3993387029859c2d9d051c41c724eStephen Hines            vis);
55837b74a387bb3993387029859c2d9d051c41c724eStephen Hines        break;
55937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      case Assignment::PROVIDE_HIDDEN:
56037b74a387bb3993387029859c2d9d051c41c724eStephen Hines        vis = ResolveInfo::Hidden;
56187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // Fall through
56237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      case Assignment::PROVIDE:
56337b74a387bb3993387029859c2d9d051c41c724eStephen Hines        symbol =
56437b74a387bb3993387029859c2d9d051c41c724eStephen Hines            m_pBuilder->AddSymbol<IRBuilder::AsReferred, IRBuilder::Unresolve>(
56537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                symName,
56637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                type,
56737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                ResolveInfo::Define,
56837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                ResolveInfo::Absolute,
56937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                size,
57037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                0x0,
57137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                FragmentRef::Null(),
57237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                vis);
57337b74a387bb3993387029859c2d9d051c41c724eStephen Hines        break;
574f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    }
57587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    // Set symbol of this assignment.
57687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    (*it).first = symbol;
577f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  }
57822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
57922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
58022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
58137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::scanRelocations() {
58222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // apply all relocations of all inputs
5836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Module::obj_iterator input, inEnd = m_pModule->obj_end();
5846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  for (input = m_pModule->obj_begin(); input != inEnd; ++input) {
585f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    m_LDBackend.getRelocator()->initializeScan(**input);
58622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    LDContext::sect_iterator rs, rsEnd = (*input)->context()->relocSectEnd();
58722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    for (rs = (*input)->context()->relocSectBegin(); rs != rsEnd; ++rs) {
58822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      // bypass the reloc section if
58922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      // 1. its section kind is changed to Ignore. (The target section is a
59022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      // discarded group section.)
59122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      // 2. it has no reloc data. (All symbols in the input relocs are in the
59222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      // discarded group sections)
59322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      if (LDFileFormat::Ignore == (*rs)->kind() || !(*rs)->hasRelocData())
59422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        continue;
59522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      RelocData::iterator reloc, rEnd = (*rs)->getRelocData()->end();
59622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      for (reloc = (*rs)->getRelocData()->begin(); reloc != rEnd; ++reloc) {
59722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        Relocation* relocation = llvm::cast<Relocation>(reloc);
59887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
59987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        // bypass the reloc if the symbol is in the discarded input section
60087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        ResolveInfo* info = relocation->symInfo();
60187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        if (!info->outSymbol()->hasFragRef() &&
60287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            ResolveInfo::Section == info->type() &&
60387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            ResolveInfo::Undefined == info->desc())
60437b74a387bb3993387029859c2d9d051c41c724eStephen Hines          continue;
60587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
60622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        // scan relocation
60737b74a387bb3993387029859c2d9d051c41c724eStephen Hines        if (LinkerConfig::Object != m_Config.codeGenType()) {
608f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines          m_LDBackend.getRelocator()->scanRelocation(
60937b74a387bb3993387029859c2d9d051c41c724eStephen Hines              *relocation, *m_pBuilder, *m_pModule, **rs, **input);
61037b74a387bb3993387029859c2d9d051c41c724eStephen Hines        } else {
611f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines          m_LDBackend.getRelocator()->partialScanRelocation(
61237b74a387bb3993387029859c2d9d051c41c724eStephen Hines              *relocation, *m_pModule);
61337b74a387bb3993387029859c2d9d051c41c724eStephen Hines        }
61437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      }  // for all relocations
61537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    }    // for all relocation section
616f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    m_LDBackend.getRelocator()->finalizeScan(**input);
61737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }  // for all inputs
61822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
61922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
62022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// initStubs - initialize stub-related stuff.
62237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::initStubs() {
6236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  // initialize BranchIslandFactory
6246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  m_LDBackend.initBRIslandFactory();
6256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
6266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  // initialize StubFactory
6276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  m_LDBackend.initStubFactory();
6286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
6296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  // initialize target stubs
6306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  m_LDBackend.initTargetStubs();
6316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return true;
6326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
6336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
6346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// allocateCommonSymobols - allocate fragments for common symbols to the
6356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// corresponding sections
63637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::allocateCommonSymbols() {
6376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  if (LinkerConfig::Object != m_Config.codeGenType() ||
6386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines      m_Config.options().isDefineCommon())
6396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    return m_LDBackend.allocateCommonSymbols(*m_pModule);
6406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return true;
6416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
6426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
64322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// prelayout - help backend to do some modification before layout
64437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::prelayout() {
64522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // finalize the section symbols, set their fragment reference and push them
64622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // into output symbol table
6476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Module::iterator sect, sEnd = m_pModule->end();
6486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  for (sect = m_pModule->begin(); sect != sEnd; ++sect) {
64937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    m_pModule->getSectionSymbolSet().finalize(
65037b74a387bb3993387029859c2d9d051c41c724eStephen Hines        **sect,
651f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines        m_pModule->getSymbolTable(),
652f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines        m_Config.codeGenType() == LinkerConfig::Object);
65322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
65422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  m_LDBackend.preLayout(*m_pModule, *m_pBuilder);
65622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
65722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// check program interpreter - computer the name size of the runtime dyld
6586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  if (!m_Config.isCodeStatic() &&
65922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      (LinkerConfig::Exec == m_Config.codeGenType() ||
66037b74a387bb3993387029859c2d9d051c41c724eStephen Hines       m_Config.options().isPIE() || m_Config.options().hasDyld()))
66122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_LDBackend.sizeInterp();
66222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
66322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// measure NamePools - compute the size of name pool sections
66422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// In ELF, will compute  the size of.symtab, .strtab, .dynsym, .dynstr,
66522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// .hash and .shstrtab sections.
66622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///
66737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  /// dump all symbols and strings from ObjectLinker and build the
66837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  /// format-dependent
66922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// hash table.
670f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// @note sizeNamePools replies on LinkerConfig::CodePosition. Must determine
671f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// code position model before calling GNULDBackend::sizeNamePools()
672f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  m_LDBackend.sizeNamePools(*m_pModule);
67322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
67487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // Do this after backend prelayout since it may add eh_frame entries.
67587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  LDSection* eh_frame_sect = m_pModule->getSection(".eh_frame");
67687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  if (eh_frame_sect && eh_frame_sect->hasEhFrame())
67787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    eh_frame_sect->getEhFrame()->computeOffsetSize();
67887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  m_LDBackend.createAndSizeEhFrameHdr(*m_pModule);
67987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
68037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  // size debug string table and set up the debug string offset
68137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  // we set the .debug_str size here so that there won't be a section symbol for
68237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  // .debug_str. While actually it doesn't matter that .debug_str has section
68337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  // symbol or not.
68437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  // FIXME: disable debug string merge when doing partial link.
68537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  if (LinkerConfig::Object != m_Config.codeGenType()) {
68637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    LDSection* debug_str_sect = m_pModule->getSection(".debug_str");
68737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    if (debug_str_sect && debug_str_sect->hasDebugString())
68837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      debug_str_sect->getDebugString()->computeOffsetSize();
68937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
69022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
69122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
69222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
69322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// layout - linearly layout all output sections and reserve some space
69422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// for GOT/PLT
69522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao///   Because we do not support instruction relaxing in this early version,
69622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao///   if there is a branch can not jump to its target, we return false
69722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao///   directly
69837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::layout() {
6996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  m_LDBackend.layout(*m_pModule);
700d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  return true;
70122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
70222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
70322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// prelayout - help backend to do some modification after layout
70437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::postlayout() {
7056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  m_LDBackend.postLayout(*m_pModule, *m_pBuilder);
70622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
70722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
70822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
70922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// finalizeSymbolValue - finalize the resolved symbol value.
71037b74a387bb3993387029859c2d9d051c41c724eStephen Hines///   Before relocate(), after layout(), ObjectLinker should correct value of
71137b74a387bb3993387029859c2d9d051c41c724eStephen Hines///   all
71222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao///   symbol.
71337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::finalizeSymbolValue() {
71487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Module::sym_iterator symbol, symEnd = m_pModule->sym_end();
71587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  for (symbol = m_pModule->sym_begin(); symbol != symEnd; ++symbol) {
71687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    if ((*symbol)->resolveInfo()->isAbsolute() ||
71787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        (*symbol)->resolveInfo()->type() == ResolveInfo::File) {
71887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // absolute symbols should just use its value directly (i.e., the result
71987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // of symbol resolution)
72087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      continue;
72187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    }
72287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
72387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    if ((*symbol)->resolveInfo()->type() == ResolveInfo::ThreadLocal) {
72487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      m_LDBackend.finalizeTLSSymbol(**symbol);
72587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      continue;
72687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    }
72787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
72887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    if ((*symbol)->hasFragRef()) {
72987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // set the virtual address of the symbol. If the output file is
73087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // relocatable object file, the section's virtual address becomes zero.
73187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // And the symbol's value become section relative offset.
73287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      uint64_t value = (*symbol)->fragRef()->getOutputOffset();
73337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      assert((*symbol)->fragRef()->frag() != NULL);
73487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      uint64_t addr =
73537b74a387bb3993387029859c2d9d051c41c724eStephen Hines          (*symbol)->fragRef()->frag()->getParent()->getSection().addr();
73687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      (*symbol)->setValue(value + addr);
73787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      continue;
73887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    }
739f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  }
74087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
74187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  RpnEvaluator evaluator(*m_pModule, m_LDBackend);
74287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool finalized = m_LDBackend.finalizeSymbols();
74387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool scriptSymsFinalized = true;
74487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  LinkerScript& script = m_pModule->getScript();
74587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  LinkerScript::Assignments::iterator assign, assignEnd;
74687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  assignEnd = script.assignments().end();
74787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  for (assign = script.assignments().begin(); assign != assignEnd; ++assign) {
74887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    LDSymbol* symbol = (*assign).first;
74987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    Assignment& assignment = (*assign).second;
75087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
75187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    if (symbol == NULL)
75287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      continue;
75387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
75487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    scriptSymsFinalized &= assignment.assign(evaluator);
75587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    if (!scriptSymsFinalized)
75687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      break;
75787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
75887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    symbol->setValue(assignment.symbol().value());
75937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }  // for each script symbol assignment
76087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
76187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool assertionsPassed = true;
76287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  LinkerScript::Assertions::iterator assert, assertEnd;
76387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  assertEnd = script.assertions().end();
76487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  for (assert = script.assertions().begin(); assert != assertEnd; ++assert) {
76587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    uint64_t res = 0x0;
76687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    evaluator.eval((*assert).getRpnExpr(), res);
76787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    if (res == 0x0)
76887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      fatal(diag::err_assert_failed) << (*assert).message();
76937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }  // for each assertion in ldscript
77087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
77187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  return finalized && scriptSymsFinalized && assertionsPassed;
77222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
77322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
77422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// relocate - applying relocation entries and create relocation
77522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// section in the output files
77622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// Create relocation section, asking TargetLDBackend to
77722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// read the relocation information into RelocationEntry
77822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// and push_back into the relocation section
77937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::relocation() {
78087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // when producing relocatables, no need to apply relocation
78187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  if (LinkerConfig::Object == m_Config.codeGenType())
78287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    return true;
78387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
78437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  LDSection* debug_str_sect = m_pModule->getSection(".debug_str");
78537b74a387bb3993387029859c2d9d051c41c724eStephen Hines
78687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // apply all relocations of all inputs
78787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Module::obj_iterator input, inEnd = m_pModule->obj_end();
78887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  for (input = m_pModule->obj_begin(); input != inEnd; ++input) {
78987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    m_LDBackend.getRelocator()->initializeApply(**input);
79087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    LDContext::sect_iterator rs, rsEnd = (*input)->context()->relocSectEnd();
79187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    for (rs = (*input)->context()->relocSectBegin(); rs != rsEnd; ++rs) {
79287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // bypass the reloc section if
79387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // 1. its section kind is changed to Ignore. (The target section is a
79487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // discarded group section.)
79587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // 2. it has no reloc data. (All symbols in the input relocs are in the
79687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // discarded group sections)
79787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      if (LDFileFormat::Ignore == (*rs)->kind() || !(*rs)->hasRelocData())
79887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        continue;
79987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      RelocData::iterator reloc, rEnd = (*rs)->getRelocData()->end();
80087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      for (reloc = (*rs)->getRelocData()->begin(); reloc != rEnd; ++reloc) {
80187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        Relocation* relocation = llvm::cast<Relocation>(reloc);
80287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
80387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        // bypass the reloc if the symbol is in the discarded input section
80487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        ResolveInfo* info = relocation->symInfo();
80587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        if (!info->outSymbol()->hasFragRef() &&
80687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            ResolveInfo::Section == info->type() &&
80787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            ResolveInfo::Undefined == info->desc())
80887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          continue;
80987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
81037b74a387bb3993387029859c2d9d051c41c724eStephen Hines        // apply the relocation aginst symbol on DebugString
81137b74a387bb3993387029859c2d9d051c41c724eStephen Hines        if (info->outSymbol()->hasFragRef() &&
81237b74a387bb3993387029859c2d9d051c41c724eStephen Hines            info->outSymbol()->fragRef()->frag()->getKind()
81337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                == Fragment::Region &&
81437b74a387bb3993387029859c2d9d051c41c724eStephen Hines            info->outSymbol()->fragRef()->frag()->getParent()->getSection()
81537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                .kind() == LDFileFormat::DebugString) {
81637b74a387bb3993387029859c2d9d051c41c724eStephen Hines          assert(debug_str_sect != NULL);
81737b74a387bb3993387029859c2d9d051c41c724eStephen Hines          assert(debug_str_sect->hasDebugString());
81837b74a387bb3993387029859c2d9d051c41c724eStephen Hines          debug_str_sect->getDebugString()->applyOffset(*relocation,
81937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                                        m_LDBackend);
82037b74a387bb3993387029859c2d9d051c41c724eStephen Hines          continue;
82137b74a387bb3993387029859c2d9d051c41c724eStephen Hines        }
82237b74a387bb3993387029859c2d9d051c41c724eStephen Hines
82387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        relocation->apply(*m_LDBackend.getRelocator());
82437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      }  // for all relocations
82537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    }    // for all relocation section
82687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    m_LDBackend.getRelocator()->finalizeApply(**input);
82737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }  // for all inputs
82887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
82987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // apply relocations created by relaxation
83087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  BranchIslandFactory* br_factory = m_LDBackend.getBRIslandFactory();
83187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  BranchIslandFactory::iterator facIter, facEnd = br_factory->end();
83287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  for (facIter = br_factory->begin(); facIter != facEnd; ++facIter) {
83387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    BranchIsland& island = *facIter;
83487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    BranchIsland::reloc_iterator iter, iterEnd = island.reloc_end();
83587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    for (iter = island.reloc_begin(); iter != iterEnd; ++iter)
83687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      (*iter)->apply(*m_LDBackend.getRelocator());
83787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  }
83837b74a387bb3993387029859c2d9d051c41c724eStephen Hines
83904c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines  // apply relocations created by LD backend
84004c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines  for (TargetLDBackend::extra_reloc_iterator
84104c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines       iter = m_LDBackend.extra_reloc_begin(),
84204c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines       end = m_LDBackend.extra_reloc_end(); iter != end; ++iter) {
84304c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines    iter->apply(*m_LDBackend.getRelocator());
84404c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines  }
84504c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines
84687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  return true;
84722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
84822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
84922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// emitOutput - emit the output file.
85037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::emitOutput(FileOutputBuffer& pOutput) {
8510dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  return std::error_code() == getWriter()->writeObject(*m_pModule, pOutput);
85222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
85322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
85422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// postProcessing - do modification after all processes
85537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ObjectLinker::postProcessing(FileOutputBuffer& pOutput) {
85687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  if (LinkerConfig::Object != m_Config.codeGenType())
85787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    normalSyncRelocationResult(pOutput);
85887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  else
85987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    partialSyncRelocationResult(pOutput);
86022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
86122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // emit .eh_frame_hdr
86222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // eh_frame_hdr should be emitted after syncRelocation, because eh_frame_hdr
86322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // needs FDE PC value, which will be corrected at syncRelocation
8646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  m_LDBackend.postProcessing(pOutput);
86522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
86622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
86722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
86837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ObjectLinker::normalSyncRelocationResult(FileOutputBuffer& pOutput) {
86987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  uint8_t* data = pOutput.getBufferStart();
87087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
87187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // sync all relocations of all inputs
87287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Module::obj_iterator input, inEnd = m_pModule->obj_end();
87387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  for (input = m_pModule->obj_begin(); input != inEnd; ++input) {
87487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    LDContext::sect_iterator rs, rsEnd = (*input)->context()->relocSectEnd();
87587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    for (rs = (*input)->context()->relocSectBegin(); rs != rsEnd; ++rs) {
87687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // bypass the reloc section if
87787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // 1. its section kind is changed to Ignore. (The target section is a
87887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // discarded group section.)
87987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // 2. it has no reloc data. (All symbols in the input relocs are in the
88087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // discarded group sections)
88187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      if (LDFileFormat::Ignore == (*rs)->kind() || !(*rs)->hasRelocData())
88287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        continue;
88387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      RelocData::iterator reloc, rEnd = (*rs)->getRelocData()->end();
88487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      for (reloc = (*rs)->getRelocData()->begin(); reloc != rEnd; ++reloc) {
88587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        Relocation* relocation = llvm::cast<Relocation>(reloc);
88687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
88787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        // bypass the reloc if the symbol is in the discarded input section
88887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        ResolveInfo* info = relocation->symInfo();
88987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        if (!info->outSymbol()->hasFragRef() &&
89087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            ResolveInfo::Section == info->type() &&
89187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            ResolveInfo::Undefined == info->desc())
89287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          continue;
89387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
89487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        // bypass the relocation with NONE type. This is to avoid overwrite the
89587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        // target result by NONE type relocation if there is a place which has
89687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        // two relocations to apply to, and one of it is NONE type. The result
89787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        // we want is the value of the other relocation result. For example,
89887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        // in .exidx, there are usually an R_ARM_NONE and R_ARM_PREL31 apply to
89987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        // the same place
90037b74a387bb3993387029859c2d9d051c41c724eStephen Hines        if (relocation->type() == 0x0)
90187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          continue;
90287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        writeRelocationResult(*relocation, data);
90337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      }  // for all relocations
90437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    }    // for all relocation section
90537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }      // for all inputs
90687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
90787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // sync relocations created by relaxation
90887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  BranchIslandFactory* br_factory = m_LDBackend.getBRIslandFactory();
90987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  BranchIslandFactory::iterator facIter, facEnd = br_factory->end();
91087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  for (facIter = br_factory->begin(); facIter != facEnd; ++facIter) {
91187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    BranchIsland& island = *facIter;
91287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    BranchIsland::reloc_iterator iter, iterEnd = island.reloc_end();
91387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    for (iter = island.reloc_begin(); iter != iterEnd; ++iter) {
91487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      Relocation* reloc = *iter;
91587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      writeRelocationResult(*reloc, data);
91687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    }
91787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  }
91804c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines
91904c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines  // sync relocations created by LD backend
92004c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines  for (TargetLDBackend::extra_reloc_iterator
92104c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines       iter = m_LDBackend.extra_reloc_begin(),
92204c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines       end = m_LDBackend.extra_reloc_end(); iter != end; ++iter) {
92304c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines    writeRelocationResult(*iter, data);
92404c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines  }
92587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}
92687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
92737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ObjectLinker::partialSyncRelocationResult(FileOutputBuffer& pOutput) {
92887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  uint8_t* data = pOutput.getBufferStart();
92987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
93087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // traverse outputs' LDSection to get RelocData
93187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Module::iterator sectIter, sectEnd = m_pModule->end();
93287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  for (sectIter = m_pModule->begin(); sectIter != sectEnd; ++sectIter) {
93387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    if (LDFileFormat::Relocation != (*sectIter)->kind())
93487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      continue;
93587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
93687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    RelocData* reloc_data = (*sectIter)->getRelocData();
93787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    RelocData::iterator relocIter, relocEnd = reloc_data->end();
93887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    for (relocIter = reloc_data->begin(); relocIter != relocEnd; ++relocIter) {
93987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      Relocation* reloc = llvm::cast<Relocation>(relocIter);
94087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
94187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // bypass the relocation with NONE type. This is to avoid overwrite the
94287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // target result by NONE type relocation if there is a place which has
94387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // two relocations to apply to, and one of it is NONE type. The result
94487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // we want is the value of the other relocation result. For example,
94587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // in .exidx, there are usually an R_ARM_NONE and R_ARM_PREL31 apply to
94687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      // the same place
94737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      if (reloc->type() == 0x0)
94887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        continue;
94987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      writeRelocationResult(*reloc, data);
95087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    }
95187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  }
95287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}
95387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
95437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ObjectLinker::writeRelocationResult(Relocation& pReloc, uint8_t* pOutput) {
95587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // get output file offset
95687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  size_t out_offset =
95737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      pReloc.targetRef().frag()->getParent()->getSection().offset() +
95837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      pReloc.targetRef().getOutputOffset();
95987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
96087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  uint8_t* target_addr = pOutput + out_offset;
96187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // byte swapping if target and host has different endian, and then write back
96237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  if (llvm::sys::IsLittleEndianHost != m_Config.targets().isLittleEndian()) {
96337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    uint64_t tmp_data = 0;
96437b74a387bb3993387029859c2d9d051c41c724eStephen Hines
96537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    switch (pReloc.size(*m_LDBackend.getRelocator())) {
96637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      case 8u:
96737b74a387bb3993387029859c2d9d051c41c724eStephen Hines        std::memcpy(target_addr, &pReloc.target(), 1);
96837b74a387bb3993387029859c2d9d051c41c724eStephen Hines        break;
96937b74a387bb3993387029859c2d9d051c41c724eStephen Hines
97037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      case 16u:
97137b74a387bb3993387029859c2d9d051c41c724eStephen Hines        tmp_data = mcld::bswap16(pReloc.target());
97237b74a387bb3993387029859c2d9d051c41c724eStephen Hines        std::memcpy(target_addr, &tmp_data, 2);
97337b74a387bb3993387029859c2d9d051c41c724eStephen Hines        break;
97437b74a387bb3993387029859c2d9d051c41c724eStephen Hines
97537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      case 32u:
97637b74a387bb3993387029859c2d9d051c41c724eStephen Hines        tmp_data = mcld::bswap32(pReloc.target());
97737b74a387bb3993387029859c2d9d051c41c724eStephen Hines        std::memcpy(target_addr, &tmp_data, 4);
97837b74a387bb3993387029859c2d9d051c41c724eStephen Hines        break;
97937b74a387bb3993387029859c2d9d051c41c724eStephen Hines
98037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      case 64u:
98137b74a387bb3993387029859c2d9d051c41c724eStephen Hines        tmp_data = mcld::bswap64(pReloc.target());
98237b74a387bb3993387029859c2d9d051c41c724eStephen Hines        std::memcpy(target_addr, &tmp_data, 8);
98337b74a387bb3993387029859c2d9d051c41c724eStephen Hines        break;
98437b74a387bb3993387029859c2d9d051c41c724eStephen Hines
98537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      default:
98637b74a387bb3993387029859c2d9d051c41c724eStephen Hines        break;
98787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    }
98837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  } else {
989b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines    std::memcpy(target_addr, &pReloc.target(),
990b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines                (pReloc.size(*m_LDBackend.getRelocator()) + 7) / 8);
99187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  }
99287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}
99387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
99437b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
995