12#include "clang/Config/config.h"
18#include "llvm/Option/ArgList.h"
19#include "llvm/ProfileData/InstrProf.h"
20#include "llvm/Support/FileSystem.h"
21#include "llvm/Support/Path.h"
22#include "llvm/Support/VirtualFileSystem.h"
23#include "llvm/Support/ScopedPrinter.h"
44 Multilib(
"/a7_soft", {}, {}, {
"-mcpu=cortex-a7",
"-mfloat-abi=soft"}));
47 Multilib(
"/a7_softfp_neon-vfpv4", {}, {},
48 {
"-mcpu=cortex-a7",
"-mfloat-abi=softfp",
"-mfpu=neon-vfpv4"}));
51 Multilib(
"/a7_hard_neon-vfpv4", {}, {},
52 {
"-mcpu=cortex-a7",
"-mfloat-abi=hard",
"-mfpu=neon-vfpv4"}));
54 if (Multilibs.
select(
D, Flags, Result.SelectedMultilibs)) {
55 Result.Multilibs = Multilibs;
63 const llvm::Triple &TargetTriple,
64 StringRef
Path,
const ArgList &Args,
68 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
69 IsA7 = A->getValue() == StringRef(
"cortex-a7");
73 if (
const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
74 IsMFPU = A->getValue() == StringRef(
"neon-vfpv4");
79 "-mfloat-abi=soft", Flags);
81 "-mfloat-abi=softfp", Flags);
83 "-mfloat-abi=hard", Flags);
91 switch (
T.getArch()) {
99 case llvm::Triple::arm:
100 case llvm::Triple::thumb:
101 return T.isOSLiteOS() ?
"arm-liteos-ohos" :
"arm-linux-ohos";
102 case llvm::Triple::riscv32:
103 return "riscv32-linux-ohos";
104 case llvm::Triple::riscv64:
105 return "riscv64-linux-ohos";
106 case llvm::Triple::mipsel:
107 return "mipsel-linux-ohos";
108 case llvm::Triple::x86:
109 return "i686-linux-ohos";
110 case llvm::Triple::x86_64:
111 return "x86_64-linux-ohos";
112 case llvm::Triple::aarch64:
113 return "aarch64-linux-ohos";
119 const llvm::Triple &TargetTriple,
120 StringRef SysRoot)
const {
124static std::string
makePath(
const std::initializer_list<std::string> &IL) {
126 for (
const auto &S : IL)
127 llvm::sys::path::append(
P, S);
128 return static_cast<std::string
>(
P.str());
147 if (
getVFS().exists(CandidateLibPath))
160 std::string SysRootLibPath =
makePath({SysRoot,
"usr",
"lib"});
165 makePath({
D.Dir,
"..",
"lib", MultiarchTriple,
176 const ArgList &Args)
const {
177 if (Arg *A = Args.getLastArg(clang::driver::options::OPT_rtlib_EQ)) {
178 StringRef
Value = A->getValue();
179 if (
Value !=
"compiler-rt")
181 << A->getAsString(Args);
189 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
190 StringRef
Value = A->getValue();
191 if (
Value !=
"libc++")
193 << A->getAsString(Args);
200 ArgStringList &CC1Args)
const {
202 const llvm::Triple &Triple =
getTriple();
205 if (DriverArgs.hasArg(options::OPT_nostdinc))
208 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
210 llvm::sys::path::append(
P,
"include");
214 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
218 StringRef CIncludeDirs(C_INCLUDE_DIRS);
219 if (CIncludeDirs !=
"") {
221 CIncludeDirs.split(dirs,
":");
222 for (StringRef dir : dirs) {
224 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) :
"";
231 SysRoot +
"/usr/include/" +
238 ArgStringList &CC1Args)
const {
239 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
240 DriverArgs.hasArg(options::OPT_nostdincxx))
246 std::string IncTargetPath =
248 if (
getVFS().exists(IncTargetPath)) {
256 llvm_unreachable(
"invalid stdlib name");
261 ArgStringList &CmdArgs)
const {
264 CmdArgs.push_back(
"-lc++");
265 CmdArgs.push_back(
"-lc++abi");
266 CmdArgs.push_back(
"-lunwind");
270 llvm_unreachable(
"invalid stdlib name");
275 std::string SysRoot =
279 if (!llvm::sys::fs::exists(SysRoot))
280 return std::string();
283 return llvm::sys::fs::exists(ArchRoot) ? ArchRoot : SysRoot;
290 const llvm::Triple &Triple =
getTriple();
293 P.assign(
D.ResourceDir);
294 llvm::sys::path::append(
P,
"lib",
D.getTargetTriple(), SelectedMultilib.
gccSuffix());
295 Paths.push_back(
P.c_str());
298 P.assign(
D.ResourceDir);
299 llvm::sys::path::append(
P,
"lib", Triple.str(), SelectedMultilib.
gccSuffix());
300 Paths.push_back(
P.c_str());
303 P.assign(
D.ResourceDir);
307 Paths.push_back(
P.c_str());
313 const llvm::Triple &Triple =
getTriple();
314 const llvm::Triple::ArchType Arch =
getArch();
316 assert(Triple.isMusl());
317 std::string ArchName;
321 case llvm::Triple::arm:
322 case llvm::Triple::thumb:
326 case llvm::Triple::armeb:
327 case llvm::Triple::thumbeb:
332 ArchName = Triple.getArchName().str();
338 return "/lib/ld-musl-" + ArchName +
".so.1";
360 llvm::sys::path::append(
361 Path, Prefix + Twine(
"clang_rt.") + Component + Suffix);
362 return static_cast<std::string
>(
Path.str());
366 CmdArgs.push_back(
"-z");
367 CmdArgs.push_back(
"now");
368 CmdArgs.push_back(
"-z");
369 CmdArgs.push_back(
"relro");
370 CmdArgs.push_back(
"-z");
371 CmdArgs.push_back(
"max-page-size=4096");
373 if (
getArch() != llvm::Triple::mipsel)
374 CmdArgs.push_back(
"--hash-style=both");
375#ifdef ENABLE_LINKER_BUILD_ID
376 CmdArgs.push_back(
"--build-id");
378 CmdArgs.push_back(
"--enable-new-dtags");
383 Res |= SanitizerKind::Address;
384 Res |= SanitizerKind::PointerCompare;
385 Res |= SanitizerKind::PointerSubtract;
386 Res |= SanitizerKind::Fuzzer;
387 Res |= SanitizerKind::FuzzerNoLink;
388 Res |= SanitizerKind::Memory;
389 Res |= SanitizerKind::Vptr;
390 Res |= SanitizerKind::SafeStack;
391 Res |= SanitizerKind::Scudo;
399 llvm::opt::ArgStringList &CmdArgs)
const {
403 CmdArgs.push_back(Args.MakeArgString(
404 Twine(
"-u", llvm::getInstrProfRuntimeHookVarName())));
417 if (Args.getLastArg(options::OPT_unwindlib_EQ))
static bool findOHOSMuslMultilibs(const Driver &D, const Multilib::flags_list &Flags, DetectedMultilibs &Result)
static std::string makePath(const std::initializer_list< std::string > &IL)
static bool findOHOSMultilibs(const Driver &D, const ToolChain &TC, const llvm::Triple &TargetTriple, StringRef Path, const ArgList &Args, DetectedMultilibs &Result)
The base class of the type hierarchy.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
std::string SysRoot
sysroot, if present
DiagnosticBuilder Diag(unsigned DiagID) const
std::string ResourceDir
The path to the compiler resource directory.
std::string Dir
The path the driver executable was in, as invoked from the command line.
See also MultilibSetBuilder for combining multilibs into a set.
void push_back(const Multilib &M)
Add a completed Multilib to the set.
bool select(const Driver &D, const Multilib::flags_list &Flags, llvm::SmallVectorImpl< Multilib > &) const
Select compatible variants,.
This corresponds to a single GCC Multilib, or a segment of one controlled by a command line flag.
const std::string & gccSuffix() const
Get the detected GCC installation path suffix for the multi-arch target variant.
std::vector< std::string > flags_list
The JSON file list parser is used to communicate input to InstallAPI.
@ Result
The result type of a method or function.
const FunctionProtoType * T