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