19 #include "llvm/Option/ArgList.h" 20 #include "llvm/Support/Path.h" 21 #include "llvm/Support/VirtualFileSystem.h" 22 #include "llvm/Support/raw_ostream.h" 25 using namespace clang;
30 BareMetal::BareMetal(
const Driver &D,
const llvm::Triple &Triple,
42 if (Triple.getArch() != llvm::Triple::arm &&
43 Triple.getArch() != llvm::Triple::thumb)
46 if (Triple.getVendor() != llvm::Triple::UnknownVendor)
49 if (Triple.getOS() != llvm::Triple::UnknownOS)
52 if (Triple.getEnvironment() != llvm::Triple::EABI &&
53 Triple.getEnvironment() != llvm::Triple::EABIHF)
69 llvm::sys::path::append(Dir,
"lib",
"baremetal");
74 ArgStringList &CC1Args)
const {
75 if (DriverArgs.hasArg(options::OPT_nostdinc))
78 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
80 llvm::sys::path::append(Dir,
"include");
84 if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) {
86 llvm::sys::path::append(Dir,
"include");
92 ArgStringList &CC1Args,
94 CC1Args.push_back(
"-nostdsysteminc");
98 const ArgList &DriverArgs, ArgStringList &CC1Args)
const {
99 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
100 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
101 DriverArgs.hasArg(options::OPT_nostdincxx))
111 llvm::sys::path::append(Dir,
"include",
"c++",
"v1");
117 llvm::sys::path::append(Dir,
"include",
"c++");
121 for (llvm::vfs::directory_iterator
124 !EC && LI !=
LE; LI = LI.increment(EC)) {
125 StringRef VersionText = llvm::sys::path::filename(LI->path());
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(std::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
Compilation - A set of tasks to perform for a single driver invocation.
bool LE(InterpState &S, CodePtr OpPC)