122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- InputBuilder.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/MC/InputBuilder.h"
1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerConfig.h"
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Config/Config.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/MC/ContextFactory.h"
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/MC/InputFactory.h"
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MemoryAreaFactory.h"
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/Path.h"
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoInputBuilder::InputBuilder(const LinkerConfig& pConfig)
2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    : m_Config(pConfig),
2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pCurrentTree(NULL),
2337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pMove(NULL),
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Root(),
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bOwnFactory(true) {
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pInputFactory = new InputFactory(MCLD_NUM_OF_INPUTS, pConfig);
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pContextFactory = new ContextFactory(MCLD_NUM_OF_INPUTS);
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pMemFactory = new MemoryAreaFactory(MCLD_NUM_OF_INPUTS);
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoInputBuilder::InputBuilder(const LinkerConfig& pConfig,
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                           InputFactory& pInputFactory,
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                           ContextFactory& pContextFactory,
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                           MemoryAreaFactory& pMemoryFactory,
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                           bool pDelegate)
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    : m_Config(pConfig),
3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pInputFactory(&pInputFactory),
3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pMemFactory(&pMemoryFactory),
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pContextFactory(&pContextFactory),
4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pCurrentTree(NULL),
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pMove(NULL),
4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Root(),
4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bOwnFactory(pDelegate) {
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4637b74a387bb3993387029859c2d9d051c41c724eStephen HinesInputBuilder::~InputBuilder() {
4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (m_bOwnFactory) {
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    delete m_pInputFactory;
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    delete m_pContextFactory;
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    delete m_pMemFactory;
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoInput* InputBuilder::createInput(const std::string& pName,
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                 const sys::fs::Path& pPath,
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                 unsigned int pType,
5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                 off_t pFileOffset) {
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return m_pInputFactory->produce(pName, pPath, pType, pFileOffset);
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6137b74a387bb3993387029859c2d9d051c41c724eStephen HinesInputTree& InputBuilder::enterGroup() {
6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(m_pCurrentTree != NULL && m_pMove != NULL);
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pCurrentTree->enterGroup(m_Root, *m_pMove);
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pMove->move(m_Root);
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_ReturnStack.push(m_Root);
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pMove = &InputTree::Downward;
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return *m_pCurrentTree;
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7237b74a387bb3993387029859c2d9d051c41c724eStephen HinesInputTree& InputBuilder::exitGroup() {
7337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(m_pCurrentTree != NULL && m_pMove != NULL);
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_Root = m_ReturnStack.top();
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_ReturnStack.pop();
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pMove = &InputTree::Afterward;
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return *m_pCurrentTree;
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool InputBuilder::isInGroup() const {
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return !m_ReturnStack.empty();
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesconst InputTree& InputBuilder::getCurrentTree() const {
8737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(m_pCurrentTree != NULL && m_pMove != NULL);
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return *m_pCurrentTree;
8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9137b74a387bb3993387029859c2d9d051c41c724eStephen HinesInputTree& InputBuilder::getCurrentTree() {
9237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(m_pCurrentTree != NULL && m_pMove != NULL);
9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return *m_pCurrentTree;
9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid InputBuilder::setCurrentTree(InputTree& pInputTree) {
9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pCurrentTree = &pInputTree;
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_Root = m_pCurrentTree->root();
9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pMove = &InputTree::Downward;
10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool InputBuilder::setContext(Input& pInput, bool pCheck) {
10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // The object files in an archive have common path. Every object files in an
10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // archive needs a individual context. We identify the object files in an
10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // archive by its file offset. Their file offsets are not zero.
10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LDContext* context = NULL;
10737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  if (pInput.fileOffset() != 0 || !pCheck) {
10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // pInput is an object in an archive file. Produce a new context in this
10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // case.
11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    context = m_pContextFactory->produce();
11137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  } else {
11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // Using pInput.path() to avoid from creating context for identical file
11322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    // twice.
11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    context = m_pContextFactory->produce(pInput.path());
11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  pInput.setContext(context);
11822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
12022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
12122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool InputBuilder::setMemory(Input& pInput,
12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                             FileHandle::OpenMode pMode,
12337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             FileHandle::Permission pPerm) {
12437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  MemoryArea* memory = m_pMemFactory->produce(pInput.path(), pMode, pPerm);
12522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  pInput.setMemArea(memory);
12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
12722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
12822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
12937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool InputBuilder::setMemory(Input& pInput, void* pMemBuffer, size_t pSize) {
13037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  MemoryArea* memory = m_pMemFactory->produce(pMemBuffer, pSize);
13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  pInput.setMemArea(memory);
13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return true;
13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
13537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesconst AttrConstraint& InputBuilder::getConstraint() const {
13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return m_Config.attribute().constraint();
13722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
13822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
13937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesconst AttributeProxy& InputBuilder::getAttributes() const {
14022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return m_pInputFactory->attr();
14122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
14222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
14337b74a387bb3993387029859c2d9d051c41c724eStephen HinesAttributeProxy& InputBuilder::getAttributes() {
14422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return m_pInputFactory->attr();
14522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
14622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
14737b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
148