1 //===--- Bitrig.cpp - Bitrig ToolChain Implementations ----------*- C++ -*-===//
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 //===----------------------------------------------------------------------===//
11 #include "CommonArgs.h"
12 #include "clang/Driver/Compilation.h"
13 #include "clang/Driver/Options.h"
14 #include "llvm/Option/ArgList.h"
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;
22 void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
23 const InputInfo &Output,
24 const InputInfoList &Inputs,
26 const char *LinkingOutput) const {
27 claimNoWarnArgs(Args);
28 ArgStringList CmdArgs;
30 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
32 CmdArgs.push_back("-o");
33 CmdArgs.push_back(Output.getFilename());
35 for (const auto &II : Inputs)
36 CmdArgs.push_back(II.getFilename());
38 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
39 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
42 void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
43 const InputInfo &Output,
44 const InputInfoList &Inputs,
46 const char *LinkingOutput) const {
47 const Driver &D = getToolChain().getDriver();
48 ArgStringList CmdArgs;
50 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
51 CmdArgs.push_back("-e");
52 CmdArgs.push_back("__start");
55 if (Args.hasArg(options::OPT_static)) {
56 CmdArgs.push_back("-Bstatic");
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");
65 CmdArgs.push_back("-dynamic-linker");
66 CmdArgs.push_back("/usr/libexec/ld.so");
70 if (Output.isFilename()) {
71 CmdArgs.push_back("-o");
72 CmdArgs.push_back(Output.getFilename());
74 assert(Output.isNothing() && "Invalid output.");
77 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
78 if (!Args.hasArg(options::OPT_shared)) {
79 if (Args.hasArg(options::OPT_pg))
81 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
84 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
86 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
89 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
93 Args.AddAllArgs(CmdArgs,
94 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
96 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs, JA);
98 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
100 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
101 if (Args.hasArg(options::OPT_pg))
102 CmdArgs.push_back("-lm_p");
104 CmdArgs.push_back("-lm");
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");
111 CmdArgs.push_back("-lpthread");
114 if (!Args.hasArg(options::OPT_shared)) {
115 if (Args.hasArg(options::OPT_pg))
116 CmdArgs.push_back("-lc_p");
118 CmdArgs.push_back("-lc");
122 switch (getToolChain().getArch()) {
123 case llvm::Triple::arm:
126 case llvm::Triple::x86:
129 case llvm::Triple::x86_64:
133 llvm_unreachable("Unsupported architecture");
135 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
138 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
139 if (!Args.hasArg(options::OPT_shared))
141 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
144 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
147 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
148 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
151 /// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
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");
159 Tool *Bitrig::buildAssembler() const {
160 return new tools::bitrig::Assembler(*this);
163 Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
165 ToolChain::CXXStdlibType Bitrig::GetDefaultCXXStdlibType() const {
166 return ToolChain::CST_Libcxx;
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);
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");
186 case ToolChain::CST_Libstdcxx:
187 CmdArgs.push_back("-lstdc++");