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