• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
15 using namespace mcld;
16 
17 //===----------------------------------------------------------------------===//
18 // Derived Positional Option
19 //===----------------------------------------------------------------------===//
20 // InputFileAction
21 //===----------------------------------------------------------------------===//
InputFileAction(unsigned int pPosition,const sys::fs::Path & pPath)22 InputFileAction::InputFileAction(unsigned int pPosition,
23                                  const sys::fs::Path &pPath)
24   : InputAction(pPosition), m_Path(pPath) {
25 }
26 
activate(InputBuilder & pBuilder) const27 bool InputFileAction::activate(InputBuilder& pBuilder) const
28 {
29   pBuilder.createNode<InputTree::Positional>(path().stem().native(), path());
30   return true;
31 }
32 
33 //===----------------------------------------------------------------------===//
34 // NamespecAction
35 //===----------------------------------------------------------------------===//
NamespecAction(unsigned int pPosition,const std::string & pNamespec,SearchDirs & pSearchDirs)36 NamespecAction::NamespecAction(unsigned int pPosition,
37                                const std::string &pNamespec,
38                                SearchDirs& pSearchDirs)
39   : InputAction(pPosition), m_Namespec(pNamespec), m_SearchDirs(pSearchDirs) {
40 }
41 
activate(InputBuilder & pBuilder) const42 bool 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 //===----------------------------------------------------------------------===//
BitcodeAction(unsigned int pPosition,const sys::fs::Path & pPath)77 BitcodeAction::BitcodeAction(unsigned int pPosition, const sys::fs::Path &pPath)
78   : InputAction(pPosition), m_Path(pPath) {
79 }
80 
activate(InputBuilder & pBuilder) const81 bool BitcodeAction::activate(InputBuilder& pBuilder) const
82 {
83   pBuilder.createNode<InputTree::Positional>("bitcode", path(), Input::External);
84   return true;
85 }
86 
87 //===----------------------------------------------------------------------===//
88 // StartGroupAction
89 //===----------------------------------------------------------------------===//
StartGroupAction(unsigned int pPosition)90 StartGroupAction::StartGroupAction(unsigned int pPosition)
91   : InputAction(pPosition) {
92 }
93 
activate(InputBuilder & pBuilder) const94 bool 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 //===----------------------------------------------------------------------===//
EndGroupAction(unsigned int pPosition)107 EndGroupAction::EndGroupAction(unsigned int pPosition)
108   : InputAction(pPosition) {
109 }
110 
activate(InputBuilder & pBuilder) const111 bool EndGroupAction::activate(InputBuilder& pBuilder) const
112 {
113   pBuilder.exitGroup();
114   return true;
115 }
116 
117 //===----------------------------------------------------------------------===//
118 // WholeArchiveAction
119 //===----------------------------------------------------------------------===//
WholeArchiveAction(unsigned int pPosition)120 WholeArchiveAction::WholeArchiveAction(unsigned int pPosition)
121   : InputAction(pPosition) {
122 }
123 
activate(InputBuilder & pBuilder) const124 bool WholeArchiveAction::activate(InputBuilder& pBuilder) const
125 {
126   pBuilder.getAttributes().setWholeArchive();
127   return true;
128 }
129 
130 //===----------------------------------------------------------------------===//
131 // NoWholeArchiveAction
132 //===----------------------------------------------------------------------===//
NoWholeArchiveAction(unsigned int pPosition)133 NoWholeArchiveAction::NoWholeArchiveAction(unsigned int pPosition)
134   : InputAction(pPosition) {
135 }
136 
activate(InputBuilder & pBuilder) const137 bool NoWholeArchiveAction::activate(InputBuilder& pBuilder) const
138 {
139   pBuilder.getAttributes().unsetWholeArchive();
140   return true;
141 }
142 
143 //===----------------------------------------------------------------------===//
144 // AsNeededAction
145 //===----------------------------------------------------------------------===//
AsNeededAction(unsigned int pPosition)146 AsNeededAction::AsNeededAction(unsigned int pPosition)
147   : InputAction(pPosition) {
148 }
149 
activate(InputBuilder & pBuilder) const150 bool AsNeededAction::activate(InputBuilder& pBuilder) const
151 {
152   pBuilder.getAttributes().setAsNeeded();
153   return true;
154 }
155 
156 //===----------------------------------------------------------------------===//
157 // NoAsNeededAction
158 //===----------------------------------------------------------------------===//
NoAsNeededAction(unsigned int pPosition)159 NoAsNeededAction::NoAsNeededAction(unsigned int pPosition)
160   : InputAction(pPosition) {
161 }
162 
activate(InputBuilder & pBuilder) const163 bool NoAsNeededAction::activate(InputBuilder& pBuilder) const
164 {
165   pBuilder.getAttributes().unsetAsNeeded();
166   return true;
167 }
168 
169 //===----------------------------------------------------------------------===//
170 // AddNeededAction
171 //===----------------------------------------------------------------------===//
AddNeededAction(unsigned int pPosition)172 AddNeededAction::AddNeededAction(unsigned int pPosition)
173   : InputAction(pPosition) {
174 }
175 
activate(InputBuilder & pBuilder) const176 bool AddNeededAction::activate(InputBuilder& pBuilder) const
177 {
178   pBuilder.getAttributes().setAddNeeded();
179   return true;
180 }
181 
182 //===----------------------------------------------------------------------===//
183 // NoAddNeededAction
184 //===----------------------------------------------------------------------===//
NoAddNeededAction(unsigned int pPosition)185 NoAddNeededAction::NoAddNeededAction(unsigned int pPosition)
186   : InputAction(pPosition) {
187 }
188 
activate(InputBuilder & pBuilder) const189 bool NoAddNeededAction::activate(InputBuilder& pBuilder) const
190 {
191   pBuilder.getAttributes().unsetAddNeeded();
192   return true;
193 }
194 
195 //===----------------------------------------------------------------------===//
196 // BDynamicAction
197 //===----------------------------------------------------------------------===//
BDynamicAction(unsigned int pPosition)198 BDynamicAction::BDynamicAction(unsigned int pPosition)
199   : InputAction(pPosition) {
200 }
201 
activate(InputBuilder & pBuilder) const202 bool BDynamicAction::activate(InputBuilder& pBuilder) const
203 {
204   pBuilder.getAttributes().setDynamic();
205   return true;
206 }
207 
208 //===----------------------------------------------------------------------===//
209 // BStaticAction
210 //===----------------------------------------------------------------------===//
BStaticAction(unsigned int pPosition)211 BStaticAction::BStaticAction(unsigned int pPosition)
212   : InputAction(pPosition) {
213 }
214 
activate(InputBuilder & pBuilder) const215 bool BStaticAction::activate(InputBuilder& pBuilder) const
216 {
217   pBuilder.getAttributes().setStatic();
218   return true;
219 }
220 
221