Home | History | Annotate | Download | only in Driver
      1 //===--- CrossWindowsToolChain.cpp - Cross Windows Tool Chain -------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "ToolChains.h"
     11 #include "clang/Driver/Driver.h"
     12 #include "clang/Driver/Options.h"
     13 #include "llvm/Option/ArgList.h"
     14 
     15 using namespace clang::driver;
     16 using namespace clang::driver::toolchains;
     17 
     18 CrossWindowsToolChain::CrossWindowsToolChain(const Driver &D,
     19                                              const llvm::Triple &T,
     20                                              const llvm::opt::ArgList &Args)
     21     : Generic_GCC(D, T, Args) {
     22   if (GetCXXStdlibType(Args) == ToolChain::CST_Libstdcxx) {
     23     const std::string &SysRoot = D.SysRoot;
     24 
     25     // libstdc++ resides in /usr/lib, but depends on libgcc which is placed in
     26     // /usr/lib/gcc.
     27     getFilePaths().push_back(SysRoot + "/usr/lib");
     28     getFilePaths().push_back(SysRoot + "/usr/lib/gcc");
     29   }
     30 }
     31 
     32 bool CrossWindowsToolChain::IsUnwindTablesDefault() const {
     33   // FIXME: all non-x86 targets need unwind tables, however, LLVM currently does
     34   // not know how to emit them.
     35   return getArch() == llvm::Triple::x86_64;
     36 }
     37 
     38 bool CrossWindowsToolChain::isPICDefault() const {
     39   return getArch() == llvm::Triple::x86_64;
     40 }
     41 
     42 bool CrossWindowsToolChain::isPIEDefault() const {
     43   return getArch() == llvm::Triple::x86_64;
     44 }
     45 
     46 bool CrossWindowsToolChain::isPICDefaultForced() const {
     47   return getArch() == llvm::Triple::x86_64;
     48 }
     49 
     50 void CrossWindowsToolChain::
     51 AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
     52                           llvm::opt::ArgStringList &CC1Args) const {
     53   const Driver &D = getDriver();
     54   const std::string &SysRoot = D.SysRoot;
     55 
     56   if (DriverArgs.hasArg(options::OPT_nostdlibinc))
     57     return;
     58 
     59   addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
     60   if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
     61     SmallString<128> ResourceDir(D.ResourceDir);
     62     llvm::sys::path::append(ResourceDir, "include");
     63     addSystemInclude(DriverArgs, CC1Args, ResourceDir);
     64   }
     65   for (const auto &P : DriverArgs.getAllArgValues(options::OPT_isystem_after))
     66     addSystemInclude(DriverArgs, CC1Args, P);
     67   addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
     68 }
     69 
     70 void CrossWindowsToolChain::
     71 AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
     72                              llvm::opt::ArgStringList &CC1Args) const {
     73   const llvm::Triple &Triple = getTriple();
     74   const std::string &SysRoot = getDriver().SysRoot;
     75 
     76   if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
     77       DriverArgs.hasArg(options::OPT_nostdincxx))
     78     return;
     79 
     80   switch (GetCXXStdlibType(DriverArgs)) {
     81   case ToolChain::CST_Libcxx:
     82     addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include/c++/v1");
     83     break;
     84 
     85   case ToolChain::CST_Libstdcxx:
     86     addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include/c++");
     87     addSystemInclude(DriverArgs, CC1Args,
     88                      SysRoot + "/usr/include/c++/" + Triple.str());
     89     addSystemInclude(DriverArgs, CC1Args,
     90                      SysRoot + "/usr/include/c++/backwards");
     91   }
     92 }
     93 
     94 void CrossWindowsToolChain::
     95 AddCXXStdlibLibArgs(const llvm::opt::ArgList &DriverArgs,
     96                     llvm::opt::ArgStringList &CC1Args) const {
     97   switch (GetCXXStdlibType(DriverArgs)) {
     98   case ToolChain::CST_Libcxx:
     99     CC1Args.push_back("-lc++");
    100     break;
    101   case ToolChain::CST_Libstdcxx:
    102     CC1Args.push_back("-lstdc++");
    103     CC1Args.push_back("-lmingw32");
    104     CC1Args.push_back("-lmingwex");
    105     CC1Args.push_back("-lgcc");
    106     CC1Args.push_back("-lmoldname");
    107     CC1Args.push_back("-lmingw32");
    108     break;
    109   }
    110 }
    111 
    112 clang::SanitizerMask CrossWindowsToolChain::getSupportedSanitizers() const {
    113   SanitizerMask Res = ToolChain::getSupportedSanitizers();
    114   Res |= SanitizerKind::Address;
    115   return Res;
    116 }
    117 
    118 Tool *CrossWindowsToolChain::buildLinker() const {
    119   return new tools::CrossWindows::Linker(*this);
    120 }
    121 
    122 Tool *CrossWindowsToolChain::buildAssembler() const {
    123   return new tools::CrossWindows::Assembler(*this);
    124 }
    125