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