Home | History | Annotate | Download | only in lib
      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