11#include "clang/Config/config.h"
17#include "llvm/Option/ArgList.h"
18#include "llvm/Support/FileSystem.h"
19#include "llvm/Support/Path.h"
27static const char *
makeArgString(
const ArgList &Args,
const char *Prefix,
28 const char *
Base,
const char *Suffix) {
30 return Args.MakeArgString(Twine(StringRef(Prefix),
Base) + Suffix);
34 ArgStringList &CmdArgs) {
38 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
40 Args.hasFlag(options::OPT_fprofile_generate,
41 options::OPT_fno_profile_generate,
false) ||
42 Args.hasFlag(options::OPT_fprofile_generate_EQ,
43 options::OPT_fno_profile_generate,
false) ||
44 Args.hasFlag(options::OPT_fprofile_instr_generate,
45 options::OPT_fno_profile_instr_generate,
false) ||
46 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
47 options::OPT_fno_profile_instr_generate,
false) ||
48 Args.hasFlag(options::OPT_fcs_profile_generate,
49 options::OPT_fno_profile_generate,
false) ||
50 Args.hasFlag(options::OPT_fcs_profile_generate_EQ,
51 options::OPT_fno_profile_generate,
false) ||
52 Args.hasArg(options::OPT_fcreate_profile) ||
53 Args.hasArg(options::OPT_coverage)))
55 Args,
"--dependent-lib=", PSTC.getProfileRTLibName(),
""));
62 const char *LinkingOutput)
const {
65 ArgStringList CmdArgs;
67 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
69 CmdArgs.push_back(
"-o");
72 assert(Inputs.size() == 1 &&
"Unexpected number of inputs.");
74 assert(Input.
isFilename() &&
"Invalid input.");
77 std::string AsName = TC.qualifyPSCmdName(
"as");
78 const char *Exec = Args.MakeArgString(TC.
GetProgramPath(AsName.c_str()));
79 C.addCommand(std::make_unique<Command>(JA, *
this,
81 Exec, CmdArgs, Inputs, Output));
85 ArgStringList &CmdArgs) {
92 ArgStringList &CmdArgs,
94 const char *Suffix)
const {
95 auto arg = [&](
const char *Name) ->
const char * {
100 CmdArgs.push_back(arg(
"SceDbgUBSanitizer_stub_weak"));
102 CmdArgs.push_back(arg(
"SceDbgAddressSanitizer_stub_weak"));
106 ArgStringList &CmdArgs,
108 const char *Suffix)
const {
109 auto arg = [&](
const char *Name) ->
const char * {
114 CmdArgs.push_back(arg(
"SceUBSanitizer_nosubmission_stub_weak"));
116 CmdArgs.push_back(arg(
"SceAddressSanitizer_nosubmission_stub_weak"));
118 CmdArgs.push_back(arg(
"SceThreadSanitizer_nosubmission_stub_weak"));
125 const char *LinkingOutput)
const {
128 ArgStringList CmdArgs;
131 Args.ClaimAllArgs(options::OPT_g_Group);
133 Args.ClaimAllArgs(options::OPT_emit_llvm);
136 Args.ClaimAllArgs(options::OPT_w);
139 CmdArgs.push_back(Args.MakeArgString(
"--sysroot=" + D.
SysRoot));
141 if (Args.hasArg(options::OPT_pie))
142 CmdArgs.push_back(
"-pie");
144 if (Args.hasArg(options::OPT_rdynamic))
145 CmdArgs.push_back(
"-export-dynamic");
146 if (Args.hasArg(options::OPT_shared))
147 CmdArgs.push_back(
"--shared");
151 CmdArgs.push_back(
"-o");
157 Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false);
158 const bool IsPS4 = TC.
getTriple().isPS4();
160 const char *PS4LTOArgs =
"";
161 auto AddCodeGenFlag = [&](Twine Flag) {
163 PS4LTOArgs = Args.MakeArgString(Twine(PS4LTOArgs) +
" " + Flag);
165 CmdArgs.push_back(Args.MakeArgString(Twine(
"-plugin-opt=") + Flag));
171 AddCodeGenFlag(
"-generate-arange-section");
175 AddCodeGenFlag(
"-enable-jmc-instrument");
177 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
178 AddCodeGenFlag(Twine(
"-crash-diagnostics-dir=") + A->getValue());
181 if (!Parallelism.empty()) {
183 AddCodeGenFlag(Twine(
"-threads=") + Parallelism);
185 CmdArgs.push_back(Args.MakeArgString(Twine(
"-plugin-opt=jobs=") + Parallelism));
189 const char *Prefix =
nullptr;
191 Prefix =
"-lto-thin-debug-options=";
193 Prefix =
"-lto-debug-options=";
195 llvm_unreachable(
"new LTO mode?");
197 CmdArgs.push_back(Args.MakeArgString(Twine(Prefix) + PS4LTOArgs));
201 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
202 TC.addSanitizerArgs(Args, CmdArgs,
"-l",
"");
204 if (D.
isUsingLTO() && Args.hasArg(options::OPT_funified_lto)) {
206 CmdArgs.push_back(
"--lto=thin");
208 CmdArgs.push_back(
"--lto=full");
211 Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
212 options::OPT_s, options::OPT_t});
214 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
215 CmdArgs.push_back(
"--no-demangle");
219 if (Args.hasArg(options::OPT_pthread)) {
220 CmdArgs.push_back(
"-lpthread");
224 CmdArgs.push_back(
"--whole-archive");
226 CmdArgs.push_back(
"-lSceDbgJmc");
228 CmdArgs.push_back(
"-lSceJmc_nosubmission");
229 CmdArgs.push_back(
"--no-whole-archive");
232 if (Args.hasArg(options::OPT_fuse_ld_EQ)) {
233 D.
Diag(diag::err_drv_unsupported_opt_for_target)
237 std::string LdName = TC.qualifyPSCmdName(TC.getLinkerBaseName());
238 const char *Exec = Args.MakeArgString(TC.
GetProgramPath(LdName.c_str()));
240 C.addCommand(std::make_unique<Command>(JA, *
this,
242 Exec, CmdArgs, Inputs, Output));
246 const ArgList &Args, StringRef Platform,
249 if (Args.hasArg(clang::driver::options::OPT_static))
250 D.
Diag(clang::diag::err_drv_unsupported_opt_for_target)
251 <<
"-static" << Platform;
258 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
259 SDKRootDir = A->getValue();
260 if (!llvm::sys::fs::exists(SDKRootDir))
261 D.
Diag(clang::diag::warn_missing_sysroot) << SDKRootDir;
262 Whence = A->getSpelling();
263 }
else if (
const char *EnvValue = getenv(EnvVar)) {
264 SDKRootDir = EnvValue;
265 Whence = {
"environment variable '", EnvVar,
"'" };
267 SDKRootDir = D.
Dir +
"/../../";
268 Whence =
"compiler's location";
272 llvm::sys::path::append(SDKIncludeDir,
"target/include");
273 if (!Args.hasArg(options::OPT_nostdinc) &&
274 !Args.hasArg(options::OPT_nostdlibinc) &&
275 !Args.hasArg(options::OPT_isysroot) &&
276 !Args.hasArg(options::OPT__sysroot_EQ) &&
277 !llvm::sys::fs::exists(SDKIncludeDir)) {
278 D.
Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
279 << Twine(Platform,
" system headers").str() << SDKIncludeDir << Whence;
283 llvm::sys::path::append(SDKLibDir,
"target/lib");
284 if (!Args.hasArg(options::OPT_nostdlib) &&
285 !Args.hasArg(options::OPT_nodefaultlibs) &&
286 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
287 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
288 !Args.hasArg(options::OPT_emit_ast) &&
289 !llvm::sys::fs::exists(SDKLibDir)) {
290 D.
Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
291 << Twine(Platform,
" system libraries").str() << SDKLibDir << Whence;
298 const ArgList &DriverArgs,
299 ArgStringList &CC1Args)
const {
300 const Driver &D = getDriver();
302 if (DriverArgs.hasArg(options::OPT_nostdinc))
305 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
307 llvm::sys::path::append(Dir,
"include");
308 addSystemInclude(DriverArgs, CC1Args, Dir.str());
311 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
314 addExternCSystemInclude(DriverArgs, CC1Args,
315 SDKRootDir +
"/target/include");
316 addExternCSystemInclude(DriverArgs, CC1Args,
317 SDKRootDir +
"/target/include_common");
326 getDriver().Diag(clang::diag::err_no_external_assembler);
336 Res |= SanitizerKind::Address;
337 Res |= SanitizerKind::PointerCompare;
338 Res |= SanitizerKind::PointerSubtract;
339 Res |= SanitizerKind::Vptr;
345 Res |= SanitizerKind::Thread;
350 const ArgList &DriverArgs, ArgStringList &CC1Args,
353 if (DriverArgs.hasArg(options::OPT_fuse_init_array)) {
354 Arg *A = DriverArgs.getLastArg(options::OPT_fuse_init_array);
355 getDriver().Diag(clang::diag::err_drv_unsupported_opt_for_target)
356 << A->getAsString(DriverArgs) << getTriple().str();
359 CC1Args.push_back(
"-fno-use-init-array");
362 if (getTriple().isPS5() &&
363 !DriverArgs.hasArg(options::OPT_fvisibility_global_new_delete_EQ,
364 options::OPT_fvisibility_global_new_delete_hidden))
365 CC1Args.push_back(
"-fvisibility-global-new-delete=source");
368 DriverArgs.getLastArg(options::OPT_fvisibility_from_dllstorageclass,
369 options::OPT_fno_visibility_from_dllstorageclass);
371 A->getOption().matches(options::OPT_fvisibility_from_dllstorageclass)) {
372 CC1Args.push_back(
"-fvisibility-from-dllstorageclass");
374 if (DriverArgs.hasArg(options::OPT_fvisibility_dllexport_EQ))
375 DriverArgs.AddLastArg(CC1Args, options::OPT_fvisibility_dllexport_EQ);
377 CC1Args.push_back(
"-fvisibility-dllexport=protected");
379 if (DriverArgs.hasArg(options::OPT_fvisibility_nodllstorageclass_EQ))
380 DriverArgs.AddLastArg(CC1Args,
381 options::OPT_fvisibility_nodllstorageclass_EQ);
383 CC1Args.push_back(
"-fvisibility-nodllstorageclass=hidden");
385 if (DriverArgs.hasArg(options::OPT_fvisibility_externs_dllimport_EQ))
386 DriverArgs.AddLastArg(CC1Args,
387 options::OPT_fvisibility_externs_dllimport_EQ);
389 CC1Args.push_back(
"-fvisibility-externs-dllimport=default");
391 if (DriverArgs.hasArg(
392 options::OPT_fvisibility_externs_nodllstorageclass_EQ))
393 DriverArgs.AddLastArg(
394 CC1Args, options::OPT_fvisibility_externs_nodllstorageclass_EQ);
396 CC1Args.push_back(
"-fvisibility-externs-nodllstorageclass=default");
402 const llvm::opt::ArgList &Args)
403 :
PS4PS5Base(D, Triple, Args,
"PS4",
"SCE_ORBIS_SDK_DIR") {}
407 const llvm::opt::ArgList &Args)
408 :
PS4PS5Base(D, Triple, Args,
"PS5",
"SCE_PROSPERO_SDK_DIR") {}
static const char * makeArgString(const ArgList &Args, const char *Prefix, const char *Base, const char *Suffix)
Compilation - A set of tasks to perform for a single driver invocation.
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
LTOKind getLTOMode(bool IsOffload=false) const
Get the specific kind of LTO being performed.
std::string ResourceDir
The path to the compiler resource directory.
bool isUsingLTO(bool IsOffload=false) const
Returns true if we are performing any kind of LTO.
std::string Dir
The path the driver executable was in, as invoked from the command line.
bool needsUbsanRt() const
The JSON file list parser is used to communicate input to InstallAPI.
static constexpr ResponseFileSupport AtFileUTF8()