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