122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- CommandAction.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/CommandAction.h" 1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerConfig.h" 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/MC/Attribute.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/MC/InputBuilder.h" 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/MC/SearchDirs.h" 1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MsgHandling.h" 1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/FileSystem.h" 1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines 1837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// Derived Positional Option 2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// InputFileAction 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoInputFileAction::InputFileAction(unsigned int pPosition, 2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines const sys::fs::Path& pPath) 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines : InputAction(pPosition), m_Path(pPath) { 2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines} 2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines 3037b74a387bb3993387029859c2d9d051c41c724eStephen HinesInputFileAction::InputFileAction(unsigned int pPosition, 3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines const char* pPath) 3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines : InputAction(pPosition), m_Path(pPath) { 3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool InputFileAction::activate(InputBuilder& pBuilder) const { 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pBuilder.createNode<InputTree::Positional>(path().stem().native(), path()); 3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// NamespecAction 4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoNamespecAction::NamespecAction(unsigned int pPosition, 4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines const std::string& pNamespec, 45f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const SearchDirs& pSearchDirs) 4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines : InputAction(pPosition), m_Namespec(pNamespec), m_SearchDirs(pSearchDirs) { 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool NamespecAction::activate(InputBuilder& pBuilder) const { 50f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const sys::fs::Path* path = NULL; 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // find out the real path of the namespec. 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (pBuilder.getConstraint().isSharedSystem()) { 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // In the system with shared object support, we can find both archive 5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // and shared object. 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (pBuilder.getAttributes().isStatic()) { 5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // with --static, we must search an archive. 5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao path = m_SearchDirs.find(namespec(), Input::Archive); 5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines } else { 6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // otherwise, with --Bdynamic, we can find either an archive or a 6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // shared object. 6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao path = m_SearchDirs.find(namespec(), Input::DynObj); 6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines } else { 6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // In the system without shared object support, we only look for an archive 6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao path = m_SearchDirs.find(namespec(), Input::Archive); 6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6937b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (path == NULL) { 7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao fatal(diag::err_cannot_find_namespec) << namespec(); 7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pBuilder.createNode<InputTree::Positional>(namespec(), *path); 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// BitcodeAction 8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 8137b74a387bb3993387029859c2d9d051c41c724eStephen HinesBitcodeAction::BitcodeAction(unsigned int pPosition, const sys::fs::Path& pPath) 8237b74a387bb3993387029859c2d9d051c41c724eStephen Hines : InputAction(pPosition), m_Path(pPath) { 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool BitcodeAction::activate(InputBuilder& pBuilder) const { 8637b74a387bb3993387029859c2d9d051c41c724eStephen Hines pBuilder.createNode<InputTree::Positional>( 8737b74a387bb3993387029859c2d9d051c41c724eStephen Hines "bitcode", path(), Input::External); 8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// StartGroupAction 9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoStartGroupAction::StartGroupAction(unsigned int pPosition) 9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines : InputAction(pPosition) { 9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool StartGroupAction::activate(InputBuilder& pBuilder) const { 9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (pBuilder.isInGroup()) { 10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao fatal(diag::fatal_forbid_nest_group); 10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pBuilder.enterGroup(); 10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// EndGroupAction 10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoEndGroupAction::EndGroupAction(unsigned int pPosition) 11137b74a387bb3993387029859c2d9d051c41c724eStephen Hines : InputAction(pPosition) { 11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 11322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 11437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool EndGroupAction::activate(InputBuilder& pBuilder) const { 11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pBuilder.exitGroup(); 11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 11722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 11822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 12022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// WholeArchiveAction 12122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoWholeArchiveAction::WholeArchiveAction(unsigned int pPosition) 12337b74a387bb3993387029859c2d9d051c41c724eStephen Hines : InputAction(pPosition) { 12422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 12522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 12637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool WholeArchiveAction::activate(InputBuilder& pBuilder) const { 12722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pBuilder.getAttributes().setWholeArchive(); 12822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 12922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 13022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// NoWholeArchiveAction 13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoNoWholeArchiveAction::NoWholeArchiveAction(unsigned int pPosition) 13537b74a387bb3993387029859c2d9d051c41c724eStephen Hines : InputAction(pPosition) { 13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 13722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool NoWholeArchiveAction::activate(InputBuilder& pBuilder) const { 13922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pBuilder.getAttributes().unsetWholeArchive(); 14022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 14122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 14222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 14322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 14422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// AsNeededAction 14522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 14622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoAsNeededAction::AsNeededAction(unsigned int pPosition) 14737b74a387bb3993387029859c2d9d051c41c724eStephen Hines : InputAction(pPosition) { 14822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 15037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool AsNeededAction::activate(InputBuilder& pBuilder) const { 15122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pBuilder.getAttributes().setAsNeeded(); 15222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 15322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 15422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 15522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 15622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// NoAsNeededAction 15722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 15822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoNoAsNeededAction::NoAsNeededAction(unsigned int pPosition) 15937b74a387bb3993387029859c2d9d051c41c724eStephen Hines : InputAction(pPosition) { 16022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 16122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 16237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool NoAsNeededAction::activate(InputBuilder& pBuilder) const { 16322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pBuilder.getAttributes().unsetAsNeeded(); 16422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 16522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 16622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 16722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 16822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// AddNeededAction 16922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 17022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoAddNeededAction::AddNeededAction(unsigned int pPosition) 17137b74a387bb3993387029859c2d9d051c41c724eStephen Hines : InputAction(pPosition) { 17222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 17322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 17437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool AddNeededAction::activate(InputBuilder& pBuilder) const { 17522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pBuilder.getAttributes().setAddNeeded(); 17622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 17722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 17822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 17922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 18022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// NoAddNeededAction 18122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 18222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoNoAddNeededAction::NoAddNeededAction(unsigned int pPosition) 18337b74a387bb3993387029859c2d9d051c41c724eStephen Hines : InputAction(pPosition) { 18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 18522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 18637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool NoAddNeededAction::activate(InputBuilder& pBuilder) const { 18722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pBuilder.getAttributes().unsetAddNeeded(); 18822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 18922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 19022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 19122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 19222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// BDynamicAction 19322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 19422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoBDynamicAction::BDynamicAction(unsigned int pPosition) 19537b74a387bb3993387029859c2d9d051c41c724eStephen Hines : InputAction(pPosition) { 19622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 19722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 19837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool BDynamicAction::activate(InputBuilder& pBuilder) const { 19922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pBuilder.getAttributes().setDynamic(); 20022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 20122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 20222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 20322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 20422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// BStaticAction 20522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 20637b74a387bb3993387029859c2d9d051c41c724eStephen HinesBStaticAction::BStaticAction(unsigned int pPosition) : InputAction(pPosition) { 20722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 20822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 20937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool BStaticAction::activate(InputBuilder& pBuilder) const { 21022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao pBuilder.getAttributes().setStatic(); 21122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 21222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 21322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 214f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 215f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// DefSymAction 216f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 2172bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga NainarDefSymAction::DefSymAction(unsigned int pPosition, 2182bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar const std::string& pAssignment) 21937b74a387bb3993387029859c2d9d051c41c724eStephen Hines : InputAction(pPosition), m_Assignment(pAssignment) { 220f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 221f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 22237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool DefSymAction::activate(InputBuilder& pBuilder) const { 22337b74a387bb3993387029859c2d9d051c41c724eStephen Hines pBuilder.createNode<InputTree::Positional>("defsym", sys::fs::Path("NAN")); 224f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines Input* input = *pBuilder.getCurrentNode(); 225f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines pBuilder.setContext(*input, false); 226f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 2272bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar // FIXME 2282bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar void* base = static_cast<void*>(const_cast<char*>(m_Assignment.data())); 2292bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar pBuilder.setMemory(*input, base, m_Assignment.size()); 230f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return true; 231f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 232f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 233f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 234f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// ScriptAction 235f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 236f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesScriptAction::ScriptAction(unsigned int pPosition, 237f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const std::string& pFileName, 238f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines ScriptFile::Kind pKind, 239f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const SearchDirs& pSearchDirs) 24037b74a387bb3993387029859c2d9d051c41c724eStephen Hines : InputAction(pPosition), 24137b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_FileName(pFileName), 24237b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_Kind(pKind), 24337b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_SearchDirs(pSearchDirs) { 244f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 245f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 24637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ScriptAction::activate(InputBuilder& pBuilder) const { 247f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines sys::fs::Path path(m_FileName); 248f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 249f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (!exists(path)) { 250f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const sys::fs::Path* res = m_SearchDirs.find(m_FileName, Input::Script); 251f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (res == NULL) { 252f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines switch (m_Kind) { 25337b74a387bb3993387029859c2d9d051c41c724eStephen Hines case ScriptFile::LDScript: 25437b74a387bb3993387029859c2d9d051c41c724eStephen Hines fatal(diag::err_cannot_find_scriptfile) << "linker script" 25537b74a387bb3993387029859c2d9d051c41c724eStephen Hines << m_FileName; 25637b74a387bb3993387029859c2d9d051c41c724eStephen Hines break; 25737b74a387bb3993387029859c2d9d051c41c724eStephen Hines case ScriptFile::VersionScript: 25837b74a387bb3993387029859c2d9d051c41c724eStephen Hines fatal(diag::err_cannot_find_scriptfile) << "version script" 25937b74a387bb3993387029859c2d9d051c41c724eStephen Hines << m_FileName; 26037b74a387bb3993387029859c2d9d051c41c724eStephen Hines break; 26137b74a387bb3993387029859c2d9d051c41c724eStephen Hines case ScriptFile::DynamicList: 26237b74a387bb3993387029859c2d9d051c41c724eStephen Hines fatal(diag::err_cannot_find_scriptfile) << "dynamic list" 26337b74a387bb3993387029859c2d9d051c41c724eStephen Hines << m_FileName; 26437b74a387bb3993387029859c2d9d051c41c724eStephen Hines break; 26537b74a387bb3993387029859c2d9d051c41c724eStephen Hines default: 26637b74a387bb3993387029859c2d9d051c41c724eStephen Hines break; 267f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 268f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return false; 269f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 270f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines path.assign(res->native()); 271f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 272f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 273f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines pBuilder.createNode<InputTree::Positional>(path.stem().native(), path); 274f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 275f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return true; 276f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 27737b74a387bb3993387029859c2d9d051c41c724eStephen Hines 27837b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 279