blob: 4ebbc533232f52347e4ba1771148296b781df560 [file] [log] [blame]
Stephen Hines176edba2014-12-01 14:53:08 -08001//===--- 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
15using namespace clang::driver;
16using namespace clang::driver::toolchains;
17
18CrossWindowsToolChain::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
32bool 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
38bool CrossWindowsToolChain::isPICDefault() const {
39 return getArch() == llvm::Triple::x86_64;
40}
41
42bool CrossWindowsToolChain::isPIEDefault() const {
43 return getArch() == llvm::Triple::x86_64;
44}
45
46bool CrossWindowsToolChain::isPICDefaultForced() const {
47 return getArch() == llvm::Triple::x86_64;
48}
49
50void CrossWindowsToolChain::
51AddClangSystemIncludeArgs(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");
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070063 addSystemInclude(DriverArgs, CC1Args, ResourceDir);
Stephen Hines176edba2014-12-01 14:53:08 -080064 }
Pirama Arumuga Nainar4967a712016-09-19 22:19:55 -070065 for (const auto &P : DriverArgs.getAllArgValues(options::OPT_isystem_after))
66 addSystemInclude(DriverArgs, CC1Args, P);
Stephen Hines176edba2014-12-01 14:53:08 -080067 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
68}
69
70void CrossWindowsToolChain::
71AddClangCXXStdlibIncludeArgs(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
94void CrossWindowsToolChain::
95AddCXXStdlibLibArgs(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
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800112clang::SanitizerMask CrossWindowsToolChain::getSupportedSanitizers() const {
113 SanitizerMask Res = ToolChain::getSupportedSanitizers();
114 Res |= SanitizerKind::Address;
115 return Res;
116}
117
Stephen Hines176edba2014-12-01 14:53:08 -0800118Tool *CrossWindowsToolChain::buildLinker() const {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800119 return new tools::CrossWindows::Linker(*this);
Stephen Hines176edba2014-12-01 14:53:08 -0800120}
121
122Tool *CrossWindowsToolChain::buildAssembler() const {
Pirama Arumuga Nainar87d948e2016-03-03 15:49:35 -0800123 return new tools::CrossWindows::Assembler(*this);
Stephen Hines176edba2014-12-01 14:53:08 -0800124}