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");
106 llvm::sys::path::append(Dir,
"include",
"c++",
"v1");
111 llvm::sys::path::append(Dir,
"include",
"c++");
117 !EC && LI != LE; LI = LI.increment(EC)) {
118 StringRef VersionText = llvm::sys::path::filename(LI->getName());
120 if (CandidateVersion.Major == -1)
122 if (CandidateVersion <= Version)
124 Version = CandidateVersion;
126 if (Version.
Major == -1)
128 llvm::sys::path::append(Dir, Version.
Text);
132 llvm_unreachable(
"unhandled LibType");
136 const ArgList &DriverArgs, ArgStringList &CC1Args)
const {
137 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
138 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
139 DriverArgs.hasArg(options::OPT_nostdincxx))
148 ArgStringList &CmdArgs)
const {
151 CmdArgs.push_back(
"-lc++");
152 CmdArgs.push_back(
"-lc++abi");
155 CmdArgs.push_back(
"-lstdc++");
156 CmdArgs.push_back(
"-lsupc++");
159 CmdArgs.push_back(
"-lunwind");
163 ArgStringList &CmdArgs)
const {
164 CmdArgs.push_back(Args.MakeArgString(
"-lclang_rt.builtins-" +
172 const char *LinkingOutput)
const {
173 ArgStringList CmdArgs;
179 CmdArgs.push_back(
"-Bstatic");
181 CmdArgs.push_back(Args.MakeArgString(
"-L" + TC.getRuntimesDir()));
183 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
184 options::OPT_e, options::OPT_s, options::OPT_t,
185 options::OPT_Z_Flag, options::OPT_r});
187 if (TC.ShouldLinkCXXStdlib(Args))
188 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
189 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
190 CmdArgs.push_back(
"-lc");
191 CmdArgs.push_back(
"-lm");
193 TC.AddLinkRuntimeLib(Args, CmdArgs);
196 CmdArgs.push_back(
"-o");
199 C.
addCommand(llvm::make_unique<Command>(JA, *
this,
200 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.