CommandAction.cpp revision 22add6ff3426df1a85089fe6a6e1597ee3b6f300
1//===- CommandAction.cpp --------------------------------------------------===//
2//
3//                     The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#include <mcld/MC/CommandAction.h>
10#include <mcld/MC/InputBuilder.h>
11#include <mcld/MC/SearchDirs.h>
12#include <mcld/MC/Attribute.h>
13#include <mcld/Support/MsgHandling.h>
14
15using namespace mcld;
16
17//===----------------------------------------------------------------------===//
18// Derived Positional Option
19//===----------------------------------------------------------------------===//
20// InputFileAction
21//===----------------------------------------------------------------------===//
22InputFileAction::InputFileAction(unsigned int pPosition,
23                                 const sys::fs::Path &pPath)
24  : InputAction(pPosition), m_Path(pPath) {
25}
26
27bool InputFileAction::activate(InputBuilder& pBuilder) const
28{
29  pBuilder.createNode<InputTree::Positional>(path().stem().native(), path());
30  return true;
31}
32
33//===----------------------------------------------------------------------===//
34// NamespecAction
35//===----------------------------------------------------------------------===//
36NamespecAction::NamespecAction(unsigned int pPosition,
37                               const std::string &pNamespec,
38                               SearchDirs& pSearchDirs)
39  : InputAction(pPosition), m_Namespec(pNamespec), m_SearchDirs(pSearchDirs) {
40}
41
42bool NamespecAction::activate(InputBuilder& pBuilder) const
43{
44  sys::fs::Path* path = NULL;
45  // find out the real path of the namespec.
46  if (pBuilder.getConstraint().isSharedSystem()) {
47    // In the system with shared object support, we can find both archive
48    // and shared object.
49
50    if (pBuilder.getAttributes().isStatic()) {
51      // with --static, we must search an archive.
52      path = m_SearchDirs.find(namespec(), Input::Archive);
53    }
54    else {
55      // otherwise, with --Bdynamic, we can find either an archive or a
56      // shared object.
57      path = m_SearchDirs.find(namespec(), Input::DynObj);
58    }
59  }
60  else {
61    // In the system without shared object support, we only look for an archive
62    path = m_SearchDirs.find(namespec(), Input::Archive);
63  }
64
65  if (NULL == path) {
66    fatal(diag::err_cannot_find_namespec) << namespec();
67    return false;
68  }
69
70  pBuilder.createNode<InputTree::Positional>(namespec(), *path);
71  return true;
72}
73
74//===----------------------------------------------------------------------===//
75// BitcodeAction
76//===----------------------------------------------------------------------===//
77BitcodeAction::BitcodeAction(unsigned int pPosition, const sys::fs::Path &pPath)
78  : InputAction(pPosition), m_Path(pPath) {
79}
80
81bool BitcodeAction::activate(InputBuilder& pBuilder) const
82{
83  pBuilder.createNode<InputTree::Positional>("bitcode", path(), Input::External);
84  return true;
85}
86
87//===----------------------------------------------------------------------===//
88// StartGroupAction
89//===----------------------------------------------------------------------===//
90StartGroupAction::StartGroupAction(unsigned int pPosition)
91  : InputAction(pPosition) {
92}
93
94bool StartGroupAction::activate(InputBuilder& pBuilder) const
95{
96  if (pBuilder.isInGroup()) {
97    fatal(diag::fatal_forbid_nest_group);
98    return false;
99  }
100  pBuilder.enterGroup();
101  return true;
102}
103
104//===----------------------------------------------------------------------===//
105// EndGroupAction
106//===----------------------------------------------------------------------===//
107EndGroupAction::EndGroupAction(unsigned int pPosition)
108  : InputAction(pPosition) {
109}
110
111bool EndGroupAction::activate(InputBuilder& pBuilder) const
112{
113  pBuilder.exitGroup();
114  return true;
115}
116
117//===----------------------------------------------------------------------===//
118// WholeArchiveAction
119//===----------------------------------------------------------------------===//
120WholeArchiveAction::WholeArchiveAction(unsigned int pPosition)
121  : InputAction(pPosition) {
122}
123
124bool WholeArchiveAction::activate(InputBuilder& pBuilder) const
125{
126  pBuilder.getAttributes().setWholeArchive();
127  return true;
128}
129
130//===----------------------------------------------------------------------===//
131// NoWholeArchiveAction
132//===----------------------------------------------------------------------===//
133NoWholeArchiveAction::NoWholeArchiveAction(unsigned int pPosition)
134  : InputAction(pPosition) {
135}
136
137bool NoWholeArchiveAction::activate(InputBuilder& pBuilder) const
138{
139  pBuilder.getAttributes().unsetWholeArchive();
140  return true;
141}
142
143//===----------------------------------------------------------------------===//
144// AsNeededAction
145//===----------------------------------------------------------------------===//
146AsNeededAction::AsNeededAction(unsigned int pPosition)
147  : InputAction(pPosition) {
148}
149
150bool AsNeededAction::activate(InputBuilder& pBuilder) const
151{
152  pBuilder.getAttributes().setAsNeeded();
153  return true;
154}
155
156//===----------------------------------------------------------------------===//
157// NoAsNeededAction
158//===----------------------------------------------------------------------===//
159NoAsNeededAction::NoAsNeededAction(unsigned int pPosition)
160  : InputAction(pPosition) {
161}
162
163bool NoAsNeededAction::activate(InputBuilder& pBuilder) const
164{
165  pBuilder.getAttributes().unsetAsNeeded();
166  return true;
167}
168
169//===----------------------------------------------------------------------===//
170// AddNeededAction
171//===----------------------------------------------------------------------===//
172AddNeededAction::AddNeededAction(unsigned int pPosition)
173  : InputAction(pPosition) {
174}
175
176bool AddNeededAction::activate(InputBuilder& pBuilder) const
177{
178  pBuilder.getAttributes().setAddNeeded();
179  return true;
180}
181
182//===----------------------------------------------------------------------===//
183// NoAddNeededAction
184//===----------------------------------------------------------------------===//
185NoAddNeededAction::NoAddNeededAction(unsigned int pPosition)
186  : InputAction(pPosition) {
187}
188
189bool NoAddNeededAction::activate(InputBuilder& pBuilder) const
190{
191  pBuilder.getAttributes().unsetAddNeeded();
192  return true;
193}
194
195//===----------------------------------------------------------------------===//
196// BDynamicAction
197//===----------------------------------------------------------------------===//
198BDynamicAction::BDynamicAction(unsigned int pPosition)
199  : InputAction(pPosition) {
200}
201
202bool BDynamicAction::activate(InputBuilder& pBuilder) const
203{
204  pBuilder.getAttributes().setDynamic();
205  return true;
206}
207
208//===----------------------------------------------------------------------===//
209// BStaticAction
210//===----------------------------------------------------------------------===//
211BStaticAction::BStaticAction(unsigned int pPosition)
212  : InputAction(pPosition) {
213}
214
215bool BStaticAction::activate(InputBuilder& pBuilder) const
216{
217  pBuilder.getAttributes().setStatic();
218  return true;
219}
220
221