21 #include "llvm/Option/ArgList.h"
22 #include "llvm/Support/Path.h"
23 #include "llvm/Support/raw_ostream.h"
25 using namespace llvm::opt;
26 using namespace clang;
27 using namespace clang::driver;
28 using namespace clang::driver::tools;
29 using namespace clang::driver::toolchains;
31 BareMetal::BareMetal(
const Driver &D,
const llvm::Triple &Triple,
43 if (Triple.getArch() != llvm::Triple::arm &&
44 Triple.getArch() != llvm::Triple::thumb)
47 if (Triple.getVendor() != llvm::Triple::UnknownVendor)
50 if (Triple.getOS() != llvm::Triple::UnknownOS)
53 if (Triple.getEnvironment() != llvm::Triple::EABI &&
54 Triple.getEnvironment() != llvm::Triple::EABIHF)
73 return Model ==
"single";
78 llvm::sys::path::append(Dir,
"lib",
"baremetal");
83 ArgStringList &CC1Args)
const {
84 if (DriverArgs.hasArg(options::OPT_nostdinc))
87 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
89 llvm::sys::path::append(Dir,
"include");
93 if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) {
95 llvm::sys::path::append(Dir,
"include");
101 ArgStringList &CC1Args,
103 CC1Args.push_back(
"-nostdsysteminc");
114 llvm::sys::path::append(Dir,
"include",
"c++",
"v1");
119 llvm::sys::path::append(Dir,
"include",
"c++");
125 !EC && LI != LE; LI = LI.increment(EC)) {
126 StringRef VersionText = llvm::sys::path::filename(LI->getName());
128 if (CandidateVersion.Major == -1)
130 if (CandidateVersion <= Version)
132 Version = CandidateVersion;
134 if (Version.
Major == -1)
136 llvm::sys::path::append(Dir, Version.
Text);
140 llvm_unreachable(
"unhandled LibType");
144 const ArgList &DriverArgs, ArgStringList &CC1Args)
const {
145 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
146 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
147 DriverArgs.hasArg(options::OPT_nostdincxx))
156 ArgStringList &CmdArgs)
const {
159 CmdArgs.push_back(
"-lc++");
160 CmdArgs.push_back(
"-lc++abi");
163 CmdArgs.push_back(
"-lstdc++");
164 CmdArgs.push_back(
"-lsupc++");
167 CmdArgs.push_back(
"-lunwind");
171 ArgStringList &CmdArgs)
const {
172 CmdArgs.push_back(Args.MakeArgString(
"-lclang_rt.builtins-" +
180 const char *LinkingOutput)
const {
181 ArgStringList CmdArgs;
187 CmdArgs.push_back(
"-Bstatic");
189 CmdArgs.push_back(Args.MakeArgString(
"-L" + TC.getRuntimesDir()));
191 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
192 options::OPT_e, options::OPT_s, options::OPT_t,
193 options::OPT_Z_Flag, options::OPT_r});
195 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
197 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
199 CmdArgs.push_back(
"-lc");
200 CmdArgs.push_back(
"-lm");
202 TC.AddLinkRuntimeLib(Args, CmdArgs);
205 CmdArgs.push_back(
"-o");
208 C.
addCommand(llvm::make_unique<Command>(JA, *
this,
209 Args.MakeArgString(TC.GetLinkerPath()),
const Driver & getDriver() const
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
void addCommand(std::unique_ptr< Command > C)
std::string SysRoot
sysroot, if present
Defines the virtual file system interface vfs::FileSystem.
Compilation - A set of tasks to perform for a single driver invocation.
An input iterator over the entries in a virtual path, similar to llvm::sys::fs::directory_iterator.