]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/Driver/ToolChains/Bitrig.cpp
Merge llvm, clang, lld, lldb, compiler-rt and libc++ r303197, and update
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / lib / Driver / ToolChains / Bitrig.cpp
1 //===--- Bitrig.cpp - Bitrig ToolChain Implementations ----------*- C++ -*-===//
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 "Bitrig.h"
11 #include "CommonArgs.h"
12 #include "clang/Driver/Compilation.h"
13 #include "clang/Driver/Options.h"
14 #include "llvm/Option/ArgList.h"
15
16 using namespace clang::driver;
17 using namespace clang::driver::toolchains;
18 using namespace clang::driver::tools;
19 using namespace clang;
20 using namespace llvm::opt;
21
22 void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
23                                      const InputInfo &Output,
24                                      const InputInfoList &Inputs,
25                                      const ArgList &Args,
26                                      const char *LinkingOutput) const {
27   claimNoWarnArgs(Args);
28   ArgStringList CmdArgs;
29
30   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
31
32   CmdArgs.push_back("-o");
33   CmdArgs.push_back(Output.getFilename());
34
35   for (const auto &II : Inputs)
36     CmdArgs.push_back(II.getFilename());
37
38   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
39   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
40 }
41
42 void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
43                                   const InputInfo &Output,
44                                   const InputInfoList &Inputs,
45                                   const ArgList &Args,
46                                   const char *LinkingOutput) const {
47   const Driver &D = getToolChain().getDriver();
48   ArgStringList CmdArgs;
49
50   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
51     CmdArgs.push_back("-e");
52     CmdArgs.push_back("__start");
53   }
54
55   if (Args.hasArg(options::OPT_static)) {
56     CmdArgs.push_back("-Bstatic");
57   } else {
58     if (Args.hasArg(options::OPT_rdynamic))
59       CmdArgs.push_back("-export-dynamic");
60     CmdArgs.push_back("--eh-frame-hdr");
61     CmdArgs.push_back("-Bdynamic");
62     if (Args.hasArg(options::OPT_shared)) {
63       CmdArgs.push_back("-shared");
64     } else {
65       CmdArgs.push_back("-dynamic-linker");
66       CmdArgs.push_back("/usr/libexec/ld.so");
67     }
68   }
69
70   if (Output.isFilename()) {
71     CmdArgs.push_back("-o");
72     CmdArgs.push_back(Output.getFilename());
73   } else {
74     assert(Output.isNothing() && "Invalid output.");
75   }
76
77   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
78     if (!Args.hasArg(options::OPT_shared)) {
79       if (Args.hasArg(options::OPT_pg))
80         CmdArgs.push_back(
81             Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
82       else
83         CmdArgs.push_back(
84             Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
85       CmdArgs.push_back(
86           Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
87     } else {
88       CmdArgs.push_back(
89           Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
90     }
91   }
92
93   Args.AddAllArgs(CmdArgs,
94                   {options::OPT_L, options::OPT_T_Group, options::OPT_e});
95
96   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs, JA);
97
98   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
99     if (D.CCCIsCXX()) {
100       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
101       if (Args.hasArg(options::OPT_pg))
102         CmdArgs.push_back("-lm_p");
103       else
104         CmdArgs.push_back("-lm");
105     }
106
107     if (Args.hasArg(options::OPT_pthread)) {
108       if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
109         CmdArgs.push_back("-lpthread_p");
110       else
111         CmdArgs.push_back("-lpthread");
112     }
113
114     if (!Args.hasArg(options::OPT_shared)) {
115       if (Args.hasArg(options::OPT_pg))
116         CmdArgs.push_back("-lc_p");
117       else
118         CmdArgs.push_back("-lc");
119     }
120
121     StringRef MyArch;
122     switch (getToolChain().getArch()) {
123     case llvm::Triple::arm:
124       MyArch = "arm";
125       break;
126     case llvm::Triple::x86:
127       MyArch = "i386";
128       break;
129     case llvm::Triple::x86_64:
130       MyArch = "amd64";
131       break;
132     default:
133       llvm_unreachable("Unsupported architecture");
134     }
135     CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
136   }
137
138   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
139     if (!Args.hasArg(options::OPT_shared))
140       CmdArgs.push_back(
141           Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
142     else
143       CmdArgs.push_back(
144           Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
145   }
146
147   const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
148   C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
149 }
150
151 /// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
152
153 Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
154     : Generic_ELF(D, Triple, Args) {
155   getFilePaths().push_back(getDriver().Dir + "/../lib");
156   getFilePaths().push_back("/usr/lib");
157 }
158
159 Tool *Bitrig::buildAssembler() const {
160   return new tools::bitrig::Assembler(*this);
161 }
162
163 Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
164
165 ToolChain::CXXStdlibType Bitrig::GetDefaultCXXStdlibType() const {
166   return ToolChain::CST_Libcxx;
167 }
168
169 void Bitrig::addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
170                                       llvm::opt::ArgStringList &CC1Args) const {
171   std::string Triple = getTriple().str();
172   if (StringRef(Triple).startswith("amd64"))
173     Triple = "x86_64" + Triple.substr(5);
174   addLibStdCXXIncludePaths(getDriver().SysRoot, "/usr/include/c++/stdc++",
175                            Triple, "", "", "", DriverArgs, CC1Args);
176 }
177
178 void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
179                                  ArgStringList &CmdArgs) const {
180   switch (GetCXXStdlibType(Args)) {
181   case ToolChain::CST_Libcxx:
182     CmdArgs.push_back("-lc++");
183     CmdArgs.push_back("-lc++abi");
184     CmdArgs.push_back("-lpthread");
185     break;
186   case ToolChain::CST_Libstdcxx:
187     CmdArgs.push_back("-lstdc++");
188     break;
189   }
190 }