1 //===- PreferenceOptions.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/PreferenceOptions.h> 10 #include <mcld/LinkerConfig.h> 11 #include <mcld/Support/CommandLine.h> 12 #include <mcld/Support/raw_ostream.h> 13 #include <llvm/Support/Process.h> 14 15 #if defined(HAVE_UNISTD_H) 16 # include <unistd.h> 17 #endif 18 19 #if defined(_MSC_VER) || defined(__MINGW32__) 20 #include <io.h> 21 #ifndef STDIN_FILENO 22 # define STDIN_FILENO 0 23 #endif 24 #ifndef STDOUT_FILENO 25 # define STDOUT_FILENO 1 26 #endif 27 #ifndef STDERR_FILENO 28 # define STDERR_FILENO 2 29 #endif 30 #endif 31 32 namespace { 33 34 llvm::cl::opt<bool> ArgTrace("t", 35 llvm::cl::desc("Print the names of the input files as ld processes them.")); 36 37 llvm::cl::alias ArgTraceAlias("trace", 38 llvm::cl::desc("alias for -t"), 39 llvm::cl::aliasopt(ArgTrace)); 40 41 llvm::cl::opt<int> ArgVerbose("verbose", 42 llvm::cl::init(-1), 43 llvm::cl::desc("Display the version number for ld and list the\n" 44 "linker emulations supported.")); 45 46 llvm::cl::opt<bool> ArgVersion("V", 47 llvm::cl::init(false), 48 llvm::cl::desc("Display the version number for MCLinker.")); 49 50 llvm::cl::opt<int> ArgMaxErrorNum("error-limit", 51 llvm::cl::init(-1), 52 llvm::cl::desc("limits the maximum number of erros.")); 53 54 llvm::cl::opt<int> ArgMaxWarnNum("warning-limit", 55 llvm::cl::init(-1), 56 llvm::cl::desc("limits the maximum number of warnings.")); 57 58 llvm::cl::opt<mcld::PreferenceOptions::Color> ArgColor("color", 59 llvm::cl::value_desc("When"), 60 llvm::cl::desc("Surround the result strings with the marker"), 61 llvm::cl::init(mcld::PreferenceOptions::COLOR_Auto), 62 llvm::cl::values( 63 clEnumValN(mcld::PreferenceOptions::COLOR_Never, "never", 64 "do not surround result"), 65 clEnumValN(mcld::PreferenceOptions::COLOR_Always, "always", 66 "always surround results, even the output is a plain file"), 67 clEnumValN(mcld::PreferenceOptions::COLOR_Auto, "auto", 68 "surround result strings only if the output is a tty"), 69 clEnumValEnd)); 70 71 llvm::cl::opt<bool> ArgPrintMap("M", 72 llvm::cl::desc("Print a link map to the standard output."), 73 llvm::cl::init(false)); 74 75 llvm::cl::alias ArgPrintMapAlias("print-map", 76 llvm::cl::desc("alias for -M"), 77 llvm::cl::aliasopt(ArgPrintMap)); 78 79 bool ArgFatalWarnings; 80 81 llvm::cl::opt<bool, true, llvm::cl::FalseParser> ArgNoFatalWarnings("no-fatal-warnings", 82 llvm::cl::location(ArgFatalWarnings), 83 llvm::cl::desc("do not turn warnings into errors"), 84 llvm::cl::init(false), 85 llvm::cl::ValueDisallowed); 86 87 llvm::cl::opt<bool, true> ArgFatalWarningsFlag("fatal-warnings", 88 llvm::cl::ZeroOrMore, 89 llvm::cl::location(ArgFatalWarnings), 90 llvm::cl::desc("turn all warnings into errors"), 91 llvm::cl::init(false), 92 llvm::cl::ValueDisallowed); 93 94 llvm::cl::opt<std::string> ArgUseLD("fuse-ld", 95 llvm::cl::desc("Ignored for GCC/collect2 linker compatibility."), 96 llvm::cl::init("mcld")); 97 98 llvm::cl::opt<std::string> ArgUseMCLD("use-mcld", 99 llvm::cl::desc("Ignored for GCC/collect2 linker compatibility."), 100 llvm::cl::init("mcld")); 101 102 //===----------------------------------------------------------------------===// 103 // Non-member functions 104 //===----------------------------------------------------------------------===// 105 inline bool ShouldColorize() 106 { 107 const char* term = getenv("TERM"); 108 return term && (0 != strcmp(term, "dumb")); 109 } 110 111 } // anonymous namespace 112 113 using namespace mcld; 114 115 //===----------------------------------------------------------------------===// 116 // PreferenceOptions 117 //===----------------------------------------------------------------------===// 118 PreferenceOptions::PreferenceOptions() 119 : m_Trace(ArgTrace), 120 m_Verbose(ArgVerbose), 121 m_Version(ArgVersion), 122 m_MaxErrorNum(ArgMaxErrorNum), 123 m_MaxWarnNum(ArgMaxWarnNum), 124 m_Color(ArgColor), 125 m_PrintMap(ArgPrintMap), 126 m_FatalWarnings(ArgFatalWarnings) { 127 } 128 129 bool PreferenceOptions::parse(LinkerConfig& pConfig) 130 { 131 // set -t 132 pConfig.options().setTrace(m_Trace); 133 134 // set --verbose 135 pConfig.options().setVerbose(m_Verbose); 136 137 // set --error-limit [number] 138 pConfig.options().setMaxErrorNum(m_MaxErrorNum); 139 140 // set --warning-limit [number] 141 pConfig.options().setMaxWarnNum(m_MaxWarnNum); 142 143 // set --color [mode] 144 switch (m_Color) { 145 case COLOR_Never: 146 pConfig.options().setColor(false); 147 break; 148 case COLOR_Always: 149 pConfig.options().setColor(true); 150 break; 151 case COLOR_Auto: 152 bool color_option = ShouldColorize() && 153 llvm::sys::Process::FileDescriptorIsDisplayed(STDOUT_FILENO); 154 pConfig.options().setColor(color_option); 155 break; 156 } 157 158 mcld::outs().setColor(pConfig.options().color()); 159 mcld::errs().setColor(pConfig.options().color()); 160 161 return true; 162 } 163 164