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