1 //===--- CrossWindowsToolChain.cpp - Cross Windows Tool Chain -------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
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"
16 using namespace clang::driver;
17 using namespace clang::driver::toolchains;
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;
26 // libstdc++ resides in /usr/lib, but depends on libgcc which is placed in
28 getFilePaths().push_back(SysRoot + "/usr/lib");
29 getFilePaths().push_back(SysRoot + "/usr/lib/gcc");
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;
39 bool CrossWindowsToolChain::isPICDefault() const {
40 return getArch() == llvm::Triple::x86_64;
43 bool CrossWindowsToolChain::isPIEDefault() const {
44 return getArch() == llvm::Triple::x86_64;
47 bool CrossWindowsToolChain::isPICDefaultForced() const {
48 return getArch() == llvm::Triple::x86_64;
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;
57 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
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);
66 for (const auto &P : DriverArgs.getAllArgValues(options::OPT_isystem_after))
67 addSystemInclude(DriverArgs, CC1Args, P);
68 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
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;
77 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
78 DriverArgs.hasArg(options::OPT_nostdincxx))
81 switch (GetCXXStdlibType(DriverArgs)) {
82 case ToolChain::CST_Libcxx:
83 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include/c++/v1");
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");
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++");
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");
113 clang::SanitizerMask CrossWindowsToolChain::getSupportedSanitizers() const {
114 SanitizerMask Res = ToolChain::getSupportedSanitizers();
115 Res |= SanitizerKind::Address;
119 Tool *CrossWindowsToolChain::buildLinker() const {
120 return new tools::CrossWindows::Linker(*this);
123 Tool *CrossWindowsToolChain::buildAssembler() const {
124 return new tools::CrossWindows::Assembler(*this);