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
CrossWindowsToolChain(const Driver & D,const llvm::Triple & T,const llvm::opt::ArgList & Args)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
IsUnwindTablesDefault() const32 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
isPICDefault() const38 bool CrossWindowsToolChain::isPICDefault() const {
39 return getArch() == llvm::Triple::x86_64;
40 }
41
isPIEDefault() const42 bool CrossWindowsToolChain::isPIEDefault() const {
43 return getArch() == llvm::Triple::x86_64;
44 }
45
isPICDefaultForced() const46 bool CrossWindowsToolChain::isPICDefaultForced() const {
47 return getArch() == llvm::Triple::x86_64;
48 }
49
50 void CrossWindowsToolChain::
AddClangSystemIncludeArgs(const llvm::opt::ArgList & DriverArgs,llvm::opt::ArgStringList & CC1Args) const51 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.str());
64 }
65 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
66 }
67
68 void CrossWindowsToolChain::
AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList & DriverArgs,llvm::opt::ArgStringList & CC1Args) const69 AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
70 llvm::opt::ArgStringList &CC1Args) const {
71 const llvm::Triple &Triple = getTriple();
72 const std::string &SysRoot = getDriver().SysRoot;
73
74 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
75 DriverArgs.hasArg(options::OPT_nostdincxx))
76 return;
77
78 switch (GetCXXStdlibType(DriverArgs)) {
79 case ToolChain::CST_Libcxx:
80 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include/c++/v1");
81 break;
82
83 case ToolChain::CST_Libstdcxx:
84 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include/c++");
85 addSystemInclude(DriverArgs, CC1Args,
86 SysRoot + "/usr/include/c++/" + Triple.str());
87 addSystemInclude(DriverArgs, CC1Args,
88 SysRoot + "/usr/include/c++/backwards");
89 }
90 }
91
92 void CrossWindowsToolChain::
AddCXXStdlibLibArgs(const llvm::opt::ArgList & DriverArgs,llvm::opt::ArgStringList & CC1Args) const93 AddCXXStdlibLibArgs(const llvm::opt::ArgList &DriverArgs,
94 llvm::opt::ArgStringList &CC1Args) const {
95 switch (GetCXXStdlibType(DriverArgs)) {
96 case ToolChain::CST_Libcxx:
97 CC1Args.push_back("-lc++");
98 break;
99 case ToolChain::CST_Libstdcxx:
100 CC1Args.push_back("-lstdc++");
101 CC1Args.push_back("-lmingw32");
102 CC1Args.push_back("-lmingwex");
103 CC1Args.push_back("-lgcc");
104 CC1Args.push_back("-lmoldname");
105 CC1Args.push_back("-lmingw32");
106 break;
107 }
108 }
109
buildLinker() const110 Tool *CrossWindowsToolChain::buildLinker() const {
111 return new tools::CrossWindows::Link(*this);
112 }
113
buildAssembler() const114 Tool *CrossWindowsToolChain::buildAssembler() const {
115 return new tools::CrossWindows::Assemble(*this);
116 }
117
118