21 #include "llvm/Option/ArgList.h" 22 #include "llvm/Support/Path.h" 23 #include "llvm/Support/raw_ostream.h" 26 using namespace clang;
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)
70 llvm::sys::path::append(Dir,
"lib",
"baremetal");
75 ArgStringList &CC1Args)
const {
76 if (DriverArgs.hasArg(options::OPT_nostdinc))
79 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
81 llvm::sys::path::append(Dir,
"include");
85 if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) {
87 llvm::sys::path::append(Dir,
"include");
93 ArgStringList &CC1Args,
95 CC1Args.push_back(
"-nostdsysteminc");
99 const ArgList &DriverArgs, ArgStringList &CC1Args)
const {
100 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
101 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
102 DriverArgs.hasArg(options::OPT_nostdincxx))
112 llvm::sys::path::append(Dir,
"include",
"c++",
"v1");
118 llvm::sys::path::append(Dir,
"include",
"c++");
124 !EC && LI != LE; LI = LI.increment(EC)) {
125 StringRef VersionText = llvm::sys::path::filename(LI->getName());
127 if (CandidateVersion.Major == -1)
129 if (CandidateVersion <= Version)
131 Version = CandidateVersion;
133 if (Version.
Major == -1)
135 llvm::sys::path::append(Dir, Version.
Text);
143 ArgStringList &CmdArgs)
const {
146 CmdArgs.push_back(
"-lc++");
147 CmdArgs.push_back(
"-lc++abi");
150 CmdArgs.push_back(
"-lstdc++");
151 CmdArgs.push_back(
"-lsupc++");
154 CmdArgs.push_back(
"-lunwind");
158 ArgStringList &CmdArgs)
const {
159 CmdArgs.push_back(Args.MakeArgString(
"-lclang_rt.builtins-" +
167 const char *LinkingOutput)
const {
168 ArgStringList CmdArgs;
174 CmdArgs.push_back(
"-Bstatic");
176 CmdArgs.push_back(Args.MakeArgString(
"-L" + TC.getRuntimesDir()));
178 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
179 options::OPT_e, options::OPT_s, options::OPT_t,
180 options::OPT_Z_Flag, options::OPT_r});
182 if (TC.ShouldLinkCXXStdlib(Args))
183 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
184 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
185 CmdArgs.push_back(
"-lc");
186 CmdArgs.push_back(
"-lm");
188 TC.AddLinkRuntimeLib(Args, CmdArgs);
191 CmdArgs.push_back(
"-o");
194 C.
addCommand(llvm::make_unique<Command>(JA, *
this,
195 Args.MakeArgString(TC.GetLinkerPath()),
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
void addCommand(std::unique_ptr< Command > C)
Dataflow Directional Tag Classes.
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.