20 #include "llvm/Option/ArgList.h" 21 #include "llvm/Support/Path.h" 22 #include "llvm/Support/VirtualFileSystem.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++");
122 for (llvm::vfs::directory_iterator
125 !EC && LI != LE; LI = LI.increment(EC)) {
126 StringRef VersionText = llvm::sys::path::filename(LI->path());
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);
144 ArgStringList &CmdArgs)
const {
147 CmdArgs.push_back(
"-lc++");
148 CmdArgs.push_back(
"-lc++abi");
151 CmdArgs.push_back(
"-lstdc++");
152 CmdArgs.push_back(
"-lsupc++");
155 CmdArgs.push_back(
"-lunwind");
159 ArgStringList &CmdArgs)
const {
160 CmdArgs.push_back(Args.MakeArgString(
"-lclang_rt.builtins-" +
168 const char *LinkingOutput)
const {
169 ArgStringList CmdArgs;
175 CmdArgs.push_back(
"-Bstatic");
177 CmdArgs.push_back(Args.MakeArgString(
"-L" + TC.getRuntimesDir()));
179 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
180 options::OPT_e, options::OPT_s, options::OPT_t,
181 options::OPT_Z_Flag, options::OPT_r});
183 if (TC.ShouldLinkCXXStdlib(Args))
184 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
185 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
186 CmdArgs.push_back(
"-lc");
187 CmdArgs.push_back(
"-lm");
189 TC.AddLinkRuntimeLib(Args, CmdArgs);
192 CmdArgs.push_back(
"-o");
195 C.
addCommand(llvm::make_unique<Command>(JA, *
this,
196 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.