16 #include "llvm/Option/Option.h"
17 #include "llvm/Support/CommandLine.h"
18 #include "llvm/Support/FileSystem.h"
19 #include "llvm/Support/Path.h"
26 using namespace clang;
30 : D(D), InstallationCandidates() {
31 InstallationCandidates.emplace_back(D.
Dir +
"/..");
36 for (
const auto &IC : InstallationCandidates) {
38 InstallLibPath.append(
"/lib");
39 DeviceLibPaths.emplace_back(InstallLibPath);
42 DeviceLibPaths.emplace_back(D.
SysRoot +
"/lib");
46 if (!InstallationCandidates.size())
48 OS <<
"SYCL Installation Candidates: \n";
49 for (
const auto &IC : InstallationCandidates) {
56 const char *Msg = C.getArgs().MakeArgString(
57 "The FPGA image generated during this compile contains timing violations "
58 "and may produce functional errors if used. Refer to the Intel oneAPI "
59 "DPC++ FPGA Optimization Guide section on Timing Failures for more "
61 Cmd->addDiagForErrorCode( 42, Msg);
62 Cmd->addExitForErrorCode( 42,
false);
66 std::unique_ptr<Command> InputCommand,
69 StringRef Increment, StringRef Ext,
70 StringRef ParallelJobs) {
74 ArgStringList ForeachArgs;
75 std::string OutputFileName(
T->getToolChain().getInputFilename(Output));
76 ForeachArgs.push_back(C.getArgs().MakeArgString(
"--out-ext=" + Ext));
77 for (
auto &I : InputFiles) {
78 std::string
Filename(
T->getToolChain().getInputFilename(I));
79 ForeachArgs.push_back(
80 C.getArgs().MakeArgString(
"--in-file-list=" +
Filename));
81 ForeachArgs.push_back(
82 C.getArgs().MakeArgString(
"--in-replace=" +
Filename));
85 ForeachArgs.push_back(
86 C.getArgs().MakeArgString(
"--out-file-list=" + OutputFileName));
87 ForeachArgs.push_back(
88 C.getArgs().MakeArgString(
"--out-replace=" + OutputFileName));
89 if (!Increment.empty())
90 ForeachArgs.push_back(
91 C.getArgs().MakeArgString(
"--out-increment=" + Increment));
92 if (!ParallelJobs.empty())
93 ForeachArgs.push_back(C.getArgs().MakeArgString(
"--jobs=" + ParallelJobs));
95 if (C.getDriver().isSaveTempsEnabled()) {
97 if (C.getDriver().isSaveTempsObj()) {
99 T->getToolChain().GetFilePath(OutputFileName.c_str()).c_str();
100 llvm::sys::path::remove_filename(OutputDirName);
106 if (OutputDirName.empty())
107 llvm::sys::path::native(OutputDirName =
"./");
109 OutputDirName.append(llvm::sys::path::get_separator());
110 ForeachArgs.push_back(
111 C.getArgs().MakeArgString(
"--out-dir=" + OutputDirName));
116 if (
T->getToolChain().getTriple().isNVPTX() &&
117 C.getDriver().isDumpDeviceCodeEnabled() && Ext ==
"s") {
120 Arg *DumpDeviceCodeArg =
121 C.getArgs().getLastArg(options::OPT_fsycl_dump_device_code_EQ);
123 OutputDir = (DumpDeviceCodeArg ? DumpDeviceCodeArg->getValue() :
"");
127 if (OutputDir.empty())
128 llvm::sys::path::native(OutputDir =
"./");
130 OutputDir.append(llvm::sys::path::get_separator());
131 ForeachArgs.push_back(C.getArgs().MakeArgString(
"--out-dir=" + OutputDir));
134 ForeachArgs.push_back(C.getArgs().MakeArgString(
"--"));
135 ForeachArgs.push_back(
136 C.getArgs().MakeArgString(InputCommand->getExecutable()));
138 for (
auto &Arg : InputCommand->getArguments())
139 ForeachArgs.push_back(Arg);
142 llvm::sys::path::append(ForeachPath,
"llvm-foreach");
143 const char *Foreach = C.getArgs().MakeArgString(ForeachPath);
146 Foreach, ForeachArgs, std::nullopt);
151 C.addCommand(std::move(
Cmd));
155 return !C.getArgs().hasFlag(options::OPT_fgpu_rdc, options::OPT_fno_gpu_rdc,
162 const llvm::opt::ArgList &Args = C.getArgs();
163 bool NeedLibs =
false;
169 Triple.getSubArch() != llvm::Triple::NoSubArch && !Triple.isNVPTX();
171 if (NeedLibs && Triple.getSubArch() == llvm::Triple::SPIRSubArch_gen &&
173 ArgStringList TargArgs;
177 for (
auto TI = ToolChains.first, TE = ToolChains.second; TI != TE; ++TI) {
178 llvm::Triple SYCLTriple = TI->second->getTriple();
179 if (SYCLTriple == Triple) {
187 auto checkBF = [](StringRef
Device) {
188 return Device.starts_with(
"pvc") ||
Device.starts_with(
"ats");
192 for (
const auto &Arg : TargArgs) {
196 size_t DevicesPos = Params.find(
"-device ");
198 if (DevicesPos != std::string::npos) {
200 std::istringstream Devices(Params.substr(DevicesPos + 8));
201 for (std::string S; std::getline(Devices, S,
',');)
202 UseNative &= checkBF(S);
212 const llvm::opt::ArgList &Args = C.getArgs();
214 struct DeviceLibOptInfo {
215 StringRef DeviceLibName;
216 StringRef DeviceLibOption;
219 bool NoDeviceLibs =
false;
222 llvm::StringMap<bool> DeviceLibLinkInfo = {
223 {
"libc",
true}, {
"libm-fp32",
true}, {
"libm-fp64",
true},
224 {
"libimf-fp32",
true}, {
"libimf-fp64",
true}, {
"libimf-bf16",
true},
225 {
"libm-bfloat16",
true}, {
"internal",
true}};
226 if (Arg *A = Args.getLastArg(options::OPT_fsycl_device_lib_EQ,
227 options::OPT_fno_sycl_device_lib_EQ)) {
228 if (A->getValues().size() == 0)
229 C.getDriver().Diag(diag::warn_drv_empty_joined_argument)
230 << A->getAsString(Args);
232 if (A->getOption().matches(options::OPT_fno_sycl_device_lib_EQ))
235 for (StringRef Val : A->getValues()) {
237 for (
const auto &K : DeviceLibLinkInfo.keys())
238 DeviceLibLinkInfo[K] =
true && (!NoDeviceLibs || K ==
"internal");
241 auto LinkInfoIter = DeviceLibLinkInfo.find(Val);
242 if (LinkInfoIter == DeviceLibLinkInfo.end() || Val ==
"internal") {
246 C.getDriver().Diag(diag::err_drv_unsupported_option_argument)
247 << A->getSpelling() << Val;
249 DeviceLibLinkInfo[Val] =
true && !NoDeviceLibs;
255 const SYCLDeviceLibsList SYCLDeviceWrapperLibs = {
256 {
"libsycl-crt",
"libc"},
257 {
"libsycl-complex",
"libm-fp32"},
258 {
"libsycl-complex-fp64",
"libm-fp64"},
259 {
"libsycl-cmath",
"libm-fp32"},
260 {
"libsycl-cmath-fp64",
"libm-fp64"},
262 {
"libsycl-msvc-math",
"libm-fp32"},
264 {
"libsycl-imf",
"libimf-fp32"},
265 {
"libsycl-imf-fp64",
"libimf-fp64"},
266 {
"libsycl-imf-bf16",
"libimf-bf16"}};
269 const SYCLDeviceLibsList SYCLDeviceFallbackLibs = {
270 {
"libsycl-fallback-cassert",
"libc"},
271 {
"libsycl-fallback-cstring",
"libc"},
272 {
"libsycl-fallback-complex",
"libm-fp32"},
273 {
"libsycl-fallback-complex-fp64",
"libm-fp64"},
274 {
"libsycl-fallback-cmath",
"libm-fp32"},
275 {
"libsycl-fallback-cmath-fp64",
"libm-fp64"},
276 {
"libsycl-fallback-imf",
"libimf-fp32"},
277 {
"libsycl-fallback-imf-fp64",
"libimf-fp64"},
278 {
"libsycl-fallback-imf-bf16",
"libimf-bf16"}};
279 const SYCLDeviceLibsList SYCLDeviceBfloat16FallbackLib = {
280 {
"libsycl-fallback-bfloat16",
"libm-bfloat16"}};
281 const SYCLDeviceLibsList SYCLDeviceBfloat16NativeLib = {
282 {
"libsycl-native-bfloat16",
"libm-bfloat16"}};
285 const SYCLDeviceLibsList SYCLDeviceAnnotationLibs = {
286 {
"libsycl-itt-user-wrappers",
"internal"},
287 {
"libsycl-itt-compiler-wrappers",
"internal"},
288 {
"libsycl-itt-stubs",
"internal"}};
290 const SYCLDeviceLibsList SYCLDeviceSanitizerLibs = {
291 {
"libsycl-sanitizer",
"internal"}};
293 bool IsWindowsMSVCEnv =
294 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
295 bool IsNewOffload = C.getDriver().getUseNewOffloadingDriver();
296 StringRef LibSuffix =
".bc";
297 if (TargetTriple.isNVPTX() ||
298 (TargetTriple.isSPIR() &&
299 TargetTriple.getSubArch() == llvm::Triple::SPIRSubArch_fpga))
301 LibSuffix = IsWindowsMSVCEnv ?
".obj" :
".o";
304 LibSuffix = IsWindowsMSVCEnv ?
".new.obj" :
".new.o";
305 auto addLibraries = [&](
const SYCLDeviceLibsList &LibsList) {
306 for (
const DeviceLibOptInfo &Lib : LibsList) {
307 if (!DeviceLibLinkInfo[Lib.DeviceLibOption])
310 llvm::sys::path::replace_extension(LibName, LibSuffix);
311 LibraryList.push_back(Args.MakeArgString(LibName));
315 addLibraries(SYCLDeviceWrapperLibs);
316 if (IsSpirvAOT || TargetTriple.isNVPTX())
317 addLibraries(SYCLDeviceFallbackLibs);
319 bool NativeBfloatLibs;
321 if (NeedBfloatLibs) {
323 if (NativeBfloatLibs)
324 addLibraries(SYCLDeviceBfloat16NativeLib);
326 addLibraries(SYCLDeviceBfloat16FallbackLib);
329 if (Args.hasFlag(options::OPT_fsycl_instrument_device_code,
330 options::OPT_fno_sycl_instrument_device_code,
true))
331 addLibraries(SYCLDeviceAnnotationLibs);
334 if (Arg *A = Args.getLastArg(options::OPT_fsanitize_EQ,
335 options::OPT_fno_sanitize_EQ)) {
336 if (A->getOption().matches(options::OPT_fsanitize_EQ) &&
337 A->getValues().size() == 1) {
338 std::string SanitizeVal = A->getValue();
339 if (SanitizeVal ==
"address")
340 addLibraries(SYCLDeviceSanitizerLibs);
346 bool IsDeviceAsanEnabled =
false;
347 auto SyclFEArg = Args.getAllArgValues(options::OPT_Xsycl_frontend);
348 IsDeviceAsanEnabled = (std::count(SyclFEArg.begin(), SyclFEArg.end(),
349 "-fsanitize=address") > 0);
350 if (!IsDeviceAsanEnabled) {
351 auto SyclFEArgEq = Args.getAllArgValues(options::OPT_Xsycl_frontend_EQ);
352 IsDeviceAsanEnabled = (std::count(SyclFEArgEq.begin(), SyclFEArgEq.end(),
353 "-fsanitize=address") > 0);
357 if (!IsDeviceAsanEnabled) {
358 auto DeviceArchVals = Args.getAllArgValues(options::OPT_Xarch_device);
359 for (
auto DArchVal : DeviceArchVals) {
360 if (DArchVal.find(
"-fsanitize=address") != std::string::npos) {
361 IsDeviceAsanEnabled =
true;
367 if (IsDeviceAsanEnabled)
368 addLibraries(SYCLDeviceSanitizerLibs);
392 "itt-compiler-wrappers",
398 "fallback-cmath-fp64",
400 "fallback-complex-fp64",
407 const char *SYCL::Linker::constructLLVMLinkCommand(
409 const ArgList &Args, StringRef SubArchName, StringRef OutputFilePrefix,
430 auto isNoRDCDeviceCodeLink = [&](
const InputInfo &II) {
433 if (II.getType() != clang::driver::types::TY_LLVM_BC)
435 if (InputFiles.size() != 2)
437 return &II == &InputFiles[1];
439 auto isSYCLDeviceLib = [&](
const InputInfo &II) {
441 const bool IsNVPTX = this->getToolChain().getTriple().isNVPTX();
442 const bool IsFPGA = this->getToolChain().getTriple().isSPIR() &&
443 this->getToolChain().getTriple().getSubArch() ==
444 llvm::Triple::SPIRSubArch_fpga;
445 StringRef LibPostfix =
".bc";
446 if (IsNVPTX || IsFPGA) {
448 if (HostTC->
getTriple().isWindowsMSVCEnvironment() &&
449 C.getDriver().IsCLMode())
452 StringRef NewLibPostfix =
".new.o";
453 if (HostTC->
getTriple().isWindowsMSVCEnvironment() &&
454 C.getDriver().IsCLMode())
455 NewLibPostfix =
".new.obj";
456 std::string
FileName = this->getToolChain().getInputFilename(II);
457 StringRef InputFilename = llvm::sys::path::filename(FileName);
458 if (IsNVPTX || IsSYCLNativeCPU) {
460 if ((InputFilename.find(
"libspirv") != InputFilename.npos ||
461 InputFilename.find(
"libdevice") != InputFilename.npos))
464 LibPostfix =
".cubin";
465 NewLibPostfix =
".new.cubin";
468 StringRef LibSyclPrefix(
"libsycl-");
469 if (!InputFilename.starts_with(LibSyclPrefix) ||
470 !InputFilename.ends_with(LibPostfix) ||
471 InputFilename.ends_with(NewLibPostfix))
474 std::string PureLibName =
475 InputFilename.substr(LibSyclPrefix.size()).str();
476 if (isNoRDCDeviceCodeLink(II)) {
479 auto FinalDashPos = PureLibName.find_last_of(
'-');
480 auto DotPos = PureLibName.find_last_of(
'.');
481 assert((FinalDashPos != std::string::npos &&
482 DotPos != std::string::npos) &&
483 "Unexpected filename");
485 PureLibName.substr(0, FinalDashPos) + PureLibName.substr(DotPos);
488 std::string DeviceLibName(L);
489 DeviceLibName.append(LibPostfix);
490 if (StringRef(PureLibName) == DeviceLibName ||
491 (IsNVPTX && StringRef(PureLibName).starts_with(L)))
496 size_t InputFileNum = InputFiles.size();
497 bool LinkSYCLDeviceLibs = (InputFileNum >= 2);
498 LinkSYCLDeviceLibs = LinkSYCLDeviceLibs && !isSYCLDeviceLib(InputFiles[0]);
499 for (
size_t Idx = 1; Idx < InputFileNum; ++Idx)
501 LinkSYCLDeviceLibs && isSYCLDeviceLib(InputFiles[Idx]);
502 if (LinkSYCLDeviceLibs) {
503 Opts.push_back(
"-only-needed");
507 for (
const auto &II : InputFiles) {
508 std::string
FileName = getToolChain().getInputFilename(II);
509 if (II.getType() == types::TY_Tempfilelist) {
512 Libs.push_back(
C.getArgs().MakeArgString(
"@" + FileName));
514 assert(InputFiles.size() == 2 &&
515 "Unexpected inputs for no-RDC with temp file list");
519 Objs.push_back(
C.getArgs().MakeArgString(FileName));
521 }
else if (II.getType() == types::TY_Archive && !LinkSYCLDeviceLibs) {
522 Libs.push_back(
C.getArgs().MakeArgString(FileName));
524 Objs.push_back(
C.getArgs().MakeArgString(FileName));
527 for (
const auto &II : InputFiles)
529 C.getArgs().MakeArgString(getToolChain().getInputFilename(II)));
533 llvm::sys::path::append(ExecPath,
"llvm-link");
534 const char *Exec =
C.getArgs().MakeArgString(ExecPath);
536 auto AddLinkCommand = [
this, &
C, &JA, Exec](
const char *Output,
537 const ArgStringList &Inputs,
538 const ArgStringList &Options) {
539 ArgStringList CmdArgs;
540 llvm::copy(Options, std::back_inserter(CmdArgs));
541 llvm::copy(Inputs, std::back_inserter(CmdArgs));
542 CmdArgs.push_back(
"-o");
543 CmdArgs.push_back(Output);
546 CmdArgs.push_back(
"--suppress-warnings");
547 C.addCommand(std::make_unique<Command>(JA, *
this,
549 Exec, CmdArgs, std::nullopt));
553 const char *OutputFileName =
554 C.getArgs().MakeArgString(getToolChain().getInputFilename(Output));
557 AddLinkCommand(OutputFileName, Objs, Opts);
559 assert(Opts.empty() &&
"unexpected options");
566 std::string TempFile =
567 C.getDriver().GetTemporaryPath(OutputFilePrefix.str() +
"-link",
"bc");
568 const char *LinkOutput =
C.addTempFile(
C.getArgs().MakeArgString(TempFile));
569 AddLinkCommand(LinkOutput, Objs, {});
573 ArgStringList LinkInputs{LinkOutput};
574 llvm::copy(Libs, std::back_inserter(LinkInputs));
575 AddLinkCommand(OutputFileName, LinkInputs, {
"--only-needed"});
577 return OutputFileName;
582 const char *InputFileName)
const {
585 ArgStringList LlcArgs{
"-filetype=obj",
"-o", Output.
getFilename(),
588 llvm::sys::path::append(LlcPath,
"llc");
589 const char *Llc =
C.getArgs().MakeArgString(LlcPath);
590 C.addCommand(std::make_unique<Command>(JA, *
this,
592 LlcArgs, std::nullopt));
602 const char *LinkingOutput)
const {
604 assert((getToolChain().getTriple().isSPIROrSPIRV() ||
605 getToolChain().getTriple().isNVPTX() ||
607 "Unsupported target");
609 std::string SubArchName =
610 std::string(getToolChain().getTriple().getArchName());
613 std::string Prefix = std::string(llvm::sys::path::stem(SubArchName));
617 if (getToolChain().getTriple().isNVPTX() ||
618 getToolChain().getTriple().isAMDGCN()) {
620 for (
const auto &II : Inputs) {
621 if (!II.isFilename())
623 NvptxInputs.push_back(II);
626 constructLLVMLinkCommand(C, JA, Output, Args, SubArchName, Prefix,
632 for (
const auto &II : Inputs) {
633 if (!II.isFilename())
635 SpirvInputs.push_back(II);
638 constructLLVMLinkCommand(C, JA, Output, Args, SubArchName, Prefix,
645 if (HostTC->
getTriple().isWindowsMSVCEnvironment())
646 ExeName.append(
".exe");
647 return C.getArgs().MakeArgString(ExeName);
650 void SYCL::fpga::BackendCompiler::constructOpenCLAOTCommand(
658 ArgStringList CmdArgs{
"-device=fpga_fast_emu"};
660 for (
const auto &II : Inputs) {
661 if (II.getType() == types::TY_TempAOCOfilelist ||
662 II.getType() == types::TY_FPGA_Dependencies ||
663 II.getType() == types::TY_FPGA_Dependencies_List)
665 if (II.getType() == types::TY_Tempfilelist)
666 ForeachInputs.push_back(II);
668 C.getArgs().MakeArgString(
"-spv=" + Twine(II.getFilename())));
671 C.getArgs().MakeArgString(
"-ir=" + Twine(Output.
getFilename())));
673 StringRef ForeachExt =
"aocx";
674 if (Arg *A = Args.getLastArg(options::OPT_fsycl_link_EQ))
675 if (A->getValue() == StringRef(
"early"))
682 llvm::Triple CPUTriple(
"spir64_x86_64");
689 getToolChain().GetProgramPath(
makeExeName(C,
"opencl-aot")));
690 const char *Exec =
C.getArgs().MakeArgString(ExecPath);
692 Exec, CmdArgs, std::nullopt);
693 if (!ForeachInputs.empty()) {
694 StringRef ParallelJobs =
695 Args.getLastArgValue(options::OPT_fsycl_max_parallel_jobs_EQ);
697 this,
"", ForeachExt, ParallelJobs);
699 C.addCommand(std::move(
Cmd));
702 void SYCL::fpga::BackendCompiler::ConstructJob(
705 const char *LinkingOutput)
const {
706 assert(getToolChain().getTriple().isSPIROrSPIRV() &&
"Unsupported target");
711 ArgStringList TargetArgs;
716 if (C.getDriver().IsFPGAEmulationMode()) {
717 constructOpenCLAOTCommand(C, JA, Output, Inputs, Args);
723 StringRef CreatedReportName;
725 for (
const auto &II : Inputs) {
726 std::string
Filename(II.getFilename());
727 if (II.getType() == types::TY_Tempfilelist)
728 ForeachInputs.push_back(II);
729 if (II.getType() == types::TY_TempAOCOfilelist)
731 CmdArgs.push_back(Args.MakeArgString(Twine(
"-library-list=") +
Filename));
732 else if (II.getType() == types::TY_FPGA_Dependencies ||
733 II.getType() == types::TY_FPGA_Dependencies_List)
734 FPGADepFiles.push_back(II);
736 CmdArgs.push_back(C.getArgs().MakeArgString(
Filename));
738 StringRef Ext(llvm::sys::path::extension(
Filename));
741 if (getToolChain().LookupTypeForExtension(Ext.drop_front()) ==
742 types::TY_FPGA_AOCR) {
747 StringRef SuffixFormat(
"-XXXXXX.aocr");
750 NameBase.append(
".prj");
752 Args.MakeArgString(llvm::sys::path::filename(NameBase));
755 CmdArgs.push_back(
"-sycl");
757 StringRef ForeachExt =
"aocx";
758 if (Arg *A = Args.getLastArg(options::OPT_fsycl_link_EQ))
759 if (A->getValue() == StringRef(
"early")) {
760 CmdArgs.push_back(
"-rtl");
764 for (
auto *A : Args) {
767 if (A->getOption().getKind() != Option::InputClass)
770 StringRef Ext(llvm::sys::path::extension(ArgName));
773 types::ID Ty = getToolChain().LookupTypeForExtension(Ext.drop_front());
779 StringRef TrimmedArgName = llvm::sys::path::filename(ArgName);
782 C.getDriver().getFPGATempDepFile(std::string(TrimmedArgName)));
783 if (!DepName.empty())
784 FPGADepFiles.push_back(
InputInfo(types::TY_Dependencies,
785 Args.MakeArgString(DepName),
786 Args.MakeArgString(DepName)));
788 if (CreatedReportName.empty()) {
791 llvm::sys::path::replace_extension(ArgName,
"prj");
792 CreatedReportName = Args.MakeArgString(ArgName);
798 if (!FPGADepFiles.empty()) {
800 for (
unsigned I = 0; I < FPGADepFiles.size(); ++I) {
803 if (FPGADepFiles[I].getType() == types::TY_FPGA_Dependencies_List)
805 DepOpt += FPGADepFiles[I].getFilename();
807 CmdArgs.push_back(C.getArgs().MakeArgString(DepOpt));
812 if (Arg *FinalOutput = Args.getLastArg(options::OPT_o, options::OPT__SLASH_o,
813 options::OPT__SLASH_Fe)) {
820 StringRef Ext = llvm::sys::path::extension(FN);
822 ".obj",
".lib",
".exe"};
823 if (std::find(Exts.begin(), Exts.end(), Ext) != Exts.end())
824 llvm::sys::path::replace_extension(FN,
"prj");
827 const char *FolderName = Args.MakeArgString(FN);
828 ReportOptArg += FolderName;
831 ReportOptArg +=
"a.prj";
833 if (!ReportOptArg.empty())
834 CmdArgs.push_back(C.getArgs().MakeArgString(
835 Twine(
"-output-report-folder=") + ReportOptArg));
847 if (Arg *A = Args.getLastArg(options::OPT_reuse_exe_EQ)) {
848 Args.ClaimAllArgs(options::OPT_reuse_exe_EQ);
849 CmdArgs.push_back(Args.MakeArgString(A->getAsString(Args)));
853 getToolChain().GetProgramPath(
makeExeName(C,
"aoc")));
854 const char *Exec = C.getArgs().MakeArgString(ExecPath);
856 Exec, CmdArgs, std::nullopt);
858 if (!ForeachInputs.empty()) {
859 StringRef ParallelJobs =
860 Args.getLastArgValue(options::OPT_fsycl_max_parallel_jobs_EQ);
862 this, ReportOptArg, ForeachExt, ParallelJobs);
864 C.addCommand(std::move(
Cmd));
880 {
"pvc-sdv",
"gen12+",
"12.60.1", {}},
884 {0x0BD0, 0x0BD5, 0x0BD6, 0x0BD7, 0x0BD8, 0x0BD9, 0x0BDA, 0x0BDB}}};
889 bool DeviceSeen =
false;
891 for (StringRef Arg : CmdArgs) {
895 Arg.split(SplitArgs,
' ');
896 for (StringRef SplitArg : SplitArgs) {
898 DeviceArg = SplitArg;
901 if (SplitArg ==
"-device")
907 if (DeviceArg.empty())
915 DeviceArg.split(SplitArgs,
",");
916 for (
const auto &SingleArg : SplitArgs) {
917 StringRef OclocTarget;
919 bool CheckShortVersion =
true;
920 for (
auto Char : SingleArg.str()) {
921 if (!std::isdigit(Char) && Char !=
'.') {
922 CheckShortVersion =
false;
927 for (
unsigned int I = 0; I < std::size(
PVCDevices); I++) {
929 SingleArg.equals_insensitive(
PVCDevices[I].Version))
933 if (!SingleArg.getAsInteger(0,
Value) &&
Value == HexVal)
936 if (CheckShortVersion &&
937 StringRef(
PVCDevices[I].Version).starts_with(SingleArg))
945 {
"auto",
"-ze-intel-enable-auto-large-GRF-mode"},
946 {
"small",
"-ze-intel-128-GRF-per-thread"},
947 {
"large",
"-ze-opt-large-register-file"}};
960 const char *LinkingOutput)
const {
961 assert(getToolChain().getTriple().isSPIROrSPIRV() &&
"Unsupported target");
962 ArgStringList CmdArgs{
"-output", Output.
getFilename()};
964 for (
const auto &II : Inputs) {
965 CmdArgs.push_back(
"-file");
966 std::string
Filename(II.getFilename());
967 if (II.getType() == types::TY_Tempfilelist)
968 ForeachInputs.push_back(II);
969 CmdArgs.push_back(C.getArgs().MakeArgString(
Filename));
972 CmdArgs.push_back(
"-output_no_suffix");
973 CmdArgs.push_back(
"-spirv_input");
987 getToolChain().GetProgramPath(
makeExeName(C,
"ocloc")));
988 const char *Exec = C.getArgs().MakeArgString(ExecPath);
990 Exec, CmdArgs, std::nullopt);
991 if (!ForeachInputs.empty()) {
992 StringRef ParallelJobs =
993 Args.getLastArgValue(options::OPT_fsycl_max_parallel_jobs_EQ);
995 this,
"",
"out", ParallelJobs);
997 C.addCommand(std::move(
Cmd));
1003 llvm::StringSwitch<StringRef>(DeviceName)
1004 .Cases(
"intel_gpu_bdw",
"intel_gpu_8_0_0",
"bdw")
1005 .Cases(
"intel_gpu_skl",
"intel_gpu_9_0_9",
"skl")
1006 .Cases(
"intel_gpu_kbl",
"intel_gpu_9_1_9",
"kbl")
1007 .Cases(
"intel_gpu_cfl",
"intel_gpu_9_2_9",
"cfl")
1008 .Cases(
"intel_gpu_apl",
"intel_gpu_bxt",
"intel_gpu_9_3_0",
"apl")
1009 .Cases(
"intel_gpu_glk",
"intel_gpu_9_4_0",
"glk")
1010 .Cases(
"intel_gpu_whl",
"intel_gpu_9_5_0",
"whl")
1011 .Cases(
"intel_gpu_aml",
"intel_gpu_9_6_0",
"aml")
1012 .Cases(
"intel_gpu_cml",
"intel_gpu_9_7_0",
"cml")
1013 .Cases(
"intel_gpu_icllp",
"intel_gpu_icl",
"intel_gpu_11_0_0",
1015 .Cases(
"intel_gpu_ehl",
"intel_gpu_jsl",
"intel_gpu_11_2_0",
"ehl")
1016 .Cases(
"intel_gpu_tgllp",
"intel_gpu_tgl",
"intel_gpu_12_0_0",
1018 .Cases(
"intel_gpu_rkl",
"intel_gpu_12_1_0",
"rkl")
1019 .Cases(
"intel_gpu_adl_s",
"intel_gpu_rpl_s",
"intel_gpu_12_2_0",
1021 .Cases(
"intel_gpu_adl_p",
"intel_gpu_12_3_0",
"adl_p")
1022 .Cases(
"intel_gpu_adl_n",
"intel_gpu_12_4_0",
"adl_n")
1023 .Cases(
"intel_gpu_dg1",
"intel_gpu_12_10_0",
"dg1")
1024 .Cases(
"intel_gpu_acm_g10",
"intel_gpu_dg2_g10",
"intel_gpu_12_55_8",
1026 .Cases(
"intel_gpu_acm_g11",
"intel_gpu_dg2_g11",
"intel_gpu_12_56_5",
1028 .Cases(
"intel_gpu_acm_g12",
"intel_gpu_dg2_g12",
"intel_gpu_12_57_0",
1030 .Cases(
"intel_gpu_pvc",
"intel_gpu_12_60_7",
"pvc")
1031 .Cases(
"intel_gpu_pvc_vg",
"intel_gpu_12_61_7",
"pvc_vg")
1032 .Cases(
"intel_gpu_mtl_u",
"intel_gpu_mtl_s",
"intel_gpu_arl_u",
1033 "intel_gpu_arl_s",
"intel_gpu_12_70_4",
"mtl_u")
1034 .Cases(
"intel_gpu_mtl_h",
"intel_gpu_12_71_4",
"mtl_h")
1035 .Cases(
"intel_gpu_arl_h",
"intel_gpu_12_74_4",
"arl_h")
1036 .Cases(
"intel_gpu_bmg_g21",
"intel_gpu_20_1_4",
"bmg_g21")
1037 .Cases(
"intel_gpu_lnl_m",
"intel_gpu_20_4_4",
"lnl_m")
1038 .Case(
"nvidia_gpu_sm_50",
"sm_50")
1039 .Case(
"nvidia_gpu_sm_52",
"sm_52")
1040 .Case(
"nvidia_gpu_sm_53",
"sm_53")
1041 .Case(
"nvidia_gpu_sm_60",
"sm_60")
1042 .Case(
"nvidia_gpu_sm_61",
"sm_61")
1043 .Case(
"nvidia_gpu_sm_62",
"sm_62")
1044 .Case(
"nvidia_gpu_sm_70",
"sm_70")
1045 .Case(
"nvidia_gpu_sm_72",
"sm_72")
1046 .Case(
"nvidia_gpu_sm_75",
"sm_75")
1047 .Case(
"nvidia_gpu_sm_80",
"sm_80")
1048 .Case(
"nvidia_gpu_sm_86",
"sm_86")
1049 .Case(
"nvidia_gpu_sm_87",
"sm_87")
1050 .Case(
"nvidia_gpu_sm_89",
"sm_89")
1051 .Case(
"nvidia_gpu_sm_90",
"sm_90")
1052 .Case(
"nvidia_gpu_sm_90a",
"sm_90a")
1053 .Case(
"amd_gpu_gfx700",
"gfx700")
1054 .Case(
"amd_gpu_gfx701",
"gfx701")
1055 .Case(
"amd_gpu_gfx702",
"gfx702")
1056 .Case(
"amd_gpu_gfx801",
"gfx801")
1057 .Case(
"amd_gpu_gfx802",
"gfx802")
1058 .Case(
"amd_gpu_gfx803",
"gfx803")
1059 .Case(
"amd_gpu_gfx805",
"gfx805")
1060 .Case(
"amd_gpu_gfx810",
"gfx810")
1061 .Case(
"amd_gpu_gfx900",
"gfx900")
1062 .Case(
"amd_gpu_gfx902",
"gfx902")
1063 .Case(
"amd_gpu_gfx904",
"gfx904")
1064 .Case(
"amd_gpu_gfx906",
"gfx906")
1065 .Case(
"amd_gpu_gfx908",
"gfx908")
1066 .Case(
"amd_gpu_gfx909",
"gfx909")
1067 .Case(
"amd_gpu_gfx90a",
"gfx90a")
1068 .Case(
"amd_gpu_gfx90c",
"gfx90c")
1069 .Case(
"amd_gpu_gfx940",
"gfx940")
1070 .Case(
"amd_gpu_gfx941",
"gfx941")
1071 .Case(
"amd_gpu_gfx942",
"gfx942")
1072 .Case(
"amd_gpu_gfx1010",
"gfx1010")
1073 .Case(
"amd_gpu_gfx1011",
"gfx1011")
1074 .Case(
"amd_gpu_gfx1012",
"gfx1012")
1075 .Case(
"amd_gpu_gfx1013",
"gfx1013")
1076 .Case(
"amd_gpu_gfx1030",
"gfx1030")
1077 .Case(
"amd_gpu_gfx1031",
"gfx1031")
1078 .Case(
"amd_gpu_gfx1032",
"gfx1032")
1079 .Case(
"amd_gpu_gfx1033",
"gfx1033")
1080 .Case(
"amd_gpu_gfx1034",
"gfx1034")
1081 .Case(
"amd_gpu_gfx1035",
"gfx1035")
1082 .Case(
"amd_gpu_gfx1036",
"gfx1036")
1083 .Case(
"amd_gpu_gfx1100",
"gfx1100")
1084 .Case(
"amd_gpu_gfx1101",
"gfx1101")
1085 .Case(
"amd_gpu_gfx1102",
"gfx1102")
1086 .Case(
"amd_gpu_gfx1103",
"gfx1103")
1087 .Case(
"amd_gpu_gfx1150",
"gfx1150")
1088 .Case(
"amd_gpu_gfx1151",
"gfx1151")
1089 .Case(
"amd_gpu_gfx1200",
"gfx1200")
1090 .Case(
"amd_gpu_gfx1201",
"gfx1201")
1097 StringRef Ext = llvm::StringSwitch<StringRef>(DeviceName)
1098 .Case(
"bdw",
"INTEL_GPU_BDW")
1099 .Case(
"skl",
"INTEL_GPU_SKL")
1100 .Case(
"kbl",
"INTEL_GPU_KBL")
1101 .Case(
"cfl",
"INTEL_GPU_CFL")
1102 .Case(
"apl",
"INTEL_GPU_APL")
1103 .Case(
"glk",
"INTEL_GPU_GLK")
1104 .Case(
"whl",
"INTEL_GPU_WHL")
1105 .Case(
"aml",
"INTEL_GPU_AML")
1106 .Case(
"cml",
"INTEL_GPU_CML")
1107 .Case(
"icllp",
"INTEL_GPU_ICLLP")
1108 .Case(
"ehl",
"INTEL_GPU_EHL")
1109 .Case(
"tgllp",
"INTEL_GPU_TGLLP")
1110 .Case(
"rkl",
"INTEL_GPU_RKL")
1111 .Case(
"adl_s",
"INTEL_GPU_ADL_S")
1112 .Case(
"adl_p",
"INTEL_GPU_ADL_P")
1113 .Case(
"adl_n",
"INTEL_GPU_ADL_N")
1114 .Case(
"dg1",
"INTEL_GPU_DG1")
1115 .Case(
"acm_g10",
"INTEL_GPU_ACM_G10")
1116 .Case(
"acm_g11",
"INTEL_GPU_ACM_G11")
1117 .Case(
"acm_g12",
"INTEL_GPU_ACM_G12")
1118 .Case(
"pvc",
"INTEL_GPU_PVC")
1119 .Case(
"pvc_vg",
"INTEL_GPU_PVC_VG")
1120 .Case(
"mtl_u",
"INTEL_GPU_MTL_U")
1121 .Case(
"mtl_h",
"INTEL_GPU_MTL_H")
1122 .Case(
"arl_h",
"INTEL_GPU_ARL_H")
1123 .Case(
"bmg_g21",
"INTEL_GPU_BMG_G21")
1124 .Case(
"lnl_m",
"INTEL_GPU_LNL_M")
1125 .Case(
"sm_50",
"NVIDIA_GPU_SM_50")
1126 .Case(
"sm_52",
"NVIDIA_GPU_SM_52")
1127 .Case(
"sm_53",
"NVIDIA_GPU_SM_53")
1128 .Case(
"sm_60",
"NVIDIA_GPU_SM_60")
1129 .Case(
"sm_61",
"NVIDIA_GPU_SM_61")
1130 .Case(
"sm_62",
"NVIDIA_GPU_SM_62")
1131 .Case(
"sm_70",
"NVIDIA_GPU_SM_70")
1132 .Case(
"sm_72",
"NVIDIA_GPU_SM_72")
1133 .Case(
"sm_75",
"NVIDIA_GPU_SM_75")
1134 .Case(
"sm_80",
"NVIDIA_GPU_SM_80")
1135 .Case(
"sm_86",
"NVIDIA_GPU_SM_86")
1136 .Case(
"sm_87",
"NVIDIA_GPU_SM_87")
1137 .Case(
"sm_89",
"NVIDIA_GPU_SM_89")
1138 .Case(
"sm_90",
"NVIDIA_GPU_SM_90")
1139 .Case(
"sm_90a",
"NVIDIA_GPU_SM_90A")
1140 .Case(
"gfx700",
"AMD_GPU_GFX700")
1141 .Case(
"gfx701",
"AMD_GPU_GFX701")
1142 .Case(
"gfx702",
"AMD_GPU_GFX702")
1143 .Case(
"gfx801",
"AMD_GPU_GFX801")
1144 .Case(
"gfx802",
"AMD_GPU_GFX802")
1145 .Case(
"gfx803",
"AMD_GPU_GFX803")
1146 .Case(
"gfx805",
"AMD_GPU_GFX805")
1147 .Case(
"gfx810",
"AMD_GPU_GFX810")
1148 .Case(
"gfx900",
"AMD_GPU_GFX900")
1149 .Case(
"gfx902",
"AMD_GPU_GFX902")
1150 .Case(
"gfx904",
"AMD_GPU_GFX904")
1151 .Case(
"gfx906",
"AMD_GPU_GFX906")
1152 .Case(
"gfx908",
"AMD_GPU_GFX908")
1153 .Case(
"gfx909",
"AMD_GPU_GFX909")
1154 .Case(
"gfx90a",
"AMD_GPU_GFX90A")
1155 .Case(
"gfx90c",
"AMD_GPU_GFX90C")
1156 .Case(
"gfx940",
"AMD_GPU_GFX940")
1157 .Case(
"gfx941",
"AMD_GPU_GFX941")
1158 .Case(
"gfx942",
"AMD_GPU_GFX942")
1159 .Case(
"gfx1010",
"AMD_GPU_GFX1010")
1160 .Case(
"gfx1011",
"AMD_GPU_GFX1011")
1161 .Case(
"gfx1012",
"AMD_GPU_GFX1012")
1162 .Case(
"gfx1013",
"AMD_GPU_GFX1013")
1163 .Case(
"gfx1030",
"AMD_GPU_GFX1030")
1164 .Case(
"gfx1031",
"AMD_GPU_GFX1031")
1165 .Case(
"gfx1032",
"AMD_GPU_GFX1032")
1166 .Case(
"gfx1033",
"AMD_GPU_GFX1033")
1167 .Case(
"gfx1034",
"AMD_GPU_GFX1034")
1168 .Case(
"gfx1035",
"AMD_GPU_GFX1035")
1169 .Case(
"gfx1036",
"AMD_GPU_GFX1036")
1170 .Case(
"gfx1100",
"AMD_GPU_GFX1100")
1171 .Case(
"gfx1101",
"AMD_GPU_GFX1101")
1172 .Case(
"gfx1102",
"AMD_GPU_GFX1102")
1173 .Case(
"gfx1103",
"AMD_GPU_GFX1103")
1174 .Case(
"gfx1150",
"AMD_GPU_GFX1150")
1175 .Case(
"gfx1151",
"AMD_GPU_GFX1151")
1176 .Case(
"gfx1200",
"AMD_GPU_GFX1200")
1177 .Case(
"gfx1201",
"AMD_GPU_GFX1201")
1180 Macro =
"__SYCL_TARGET_";
1187 void SYCL::x86_64::BackendCompiler::ConstructJob(
1190 const char *LinkingOutput)
const {
1191 ArgStringList CmdArgs;
1192 CmdArgs.push_back(Args.MakeArgString(Twine(
"-o=") + Output.
getFilename()));
1193 CmdArgs.push_back(
"--device=cpu");
1195 for (
const auto &II : Inputs) {
1196 std::string
Filename(II.getFilename());
1197 if (II.getType() == types::TY_Tempfilelist)
1198 ForeachInputs.push_back(II);
1199 CmdArgs.push_back(Args.MakeArgString(
Filename));
1210 getToolChain().GetProgramPath(
makeExeName(C,
"opencl-aot")));
1211 const char *Exec = C.getArgs().MakeArgString(ExecPath);
1213 Exec, CmdArgs, std::nullopt);
1214 if (!ForeachInputs.empty()) {
1215 StringRef ParallelJobs =
1216 Args.getLastArgValue(options::OPT_fsycl_max_parallel_jobs_EQ);
1218 this,
"",
"out", ParallelJobs);
1220 C.addCommand(std::move(
Cmd));
1228 std::vector<OptSpecifier> UnsupportedOpts = {
1229 options::OPT_fsanitize_EQ,
1230 options::OPT_fcf_protection_EQ,
1231 options::OPT_fprofile_generate,
1232 options::OPT_fprofile_generate_EQ,
1233 options::OPT_fno_profile_generate,
1234 options::OPT_ftest_coverage,
1235 options::OPT_fno_test_coverage,
1236 options::OPT_fcoverage_mapping,
1237 options::OPT_fno_coverage_mapping,
1238 options::OPT_coverage,
1239 options::OPT_fprofile_instr_generate,
1240 options::OPT_fprofile_instr_generate_EQ,
1241 options::OPT_fprofile_arcs,
1242 options::OPT_fno_profile_arcs,
1243 options::OPT_fno_profile_instr_generate,
1244 options::OPT_fcreate_profile,
1245 options::OPT_fprofile_instr_use,
1246 options::OPT_fprofile_instr_use_EQ,
1247 options::OPT_forder_file_instrumentation,
1248 options::OPT_fcs_profile_generate,
1249 options::OPT_fcs_profile_generate_EQ};
1250 return UnsupportedOpts;
1253 SYCLToolChain::SYCLToolChain(
const Driver &D,
const llvm::Triple &Triple,
1254 const ToolChain &HostTC,
const ArgList &Args)
1255 :
ToolChain(D, Triple, Args), HostTC(HostTC),
1256 IsSYCLNativeCPU(Triple == HostTC.getTriple()) {
1263 if (
const Arg *A = Args.getLastArg(Opt)) {
1266 if (A->getOption().getID() == options::OPT_fsanitize_EQ &&
1267 A->getValues().size() == 1) {
1268 std::string SanitizeVal = A->getValue();
1269 if (SanitizeVal ==
"address")
1272 D.
Diag(clang::diag::warn_drv_unsupported_option_for_target)
1273 << A->getAsString(Args) <<
getTriple().str();
1279 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
1284 llvm::opt::DerivedArgList *
1286 StringRef BoundArch,
1288 DerivedArgList *DAL =
1291 bool IsNewDAL =
false;
1293 DAL =
new DerivedArgList(Args.getBaseArgs());
1297 for (Arg *A : Args) {
1300 auto Opt(A->getOption());
1303 if (Opt.matches(UnsupportedOpt)) {
1304 if (Opt.getID() == options::OPT_fsanitize_EQ &&
1305 A->getValues().size() == 1) {
1306 std::string SanitizeVal = A->getValue();
1307 if (SanitizeVal ==
"address") {
1314 DAL->eraseArg(Opt.getID());
1325 getTriple().getSubArch() == llvm::Triple::SPIRSubArch_fpga)
1326 DAL->eraseArg(options::OPT_O0);
1329 if (!BoundArch.empty()) {
1330 DAL->eraseArg(options::OPT_march_EQ);
1331 DAL->AddJoinedArg(
nullptr, Opts.getOption(options::OPT_march_EQ),
1338 llvm::opt::ArgStringList &CmdArgs) {
1341 llvm::BumpPtrAllocator A;
1342 llvm::StringSaver S(A);
1343 llvm::cl::TokenizeGNUCommandLine(ArgString, S, TargetArgs);
1344 for (StringRef TA : TargetArgs)
1345 CmdArgs.push_back(Args.MakeArgString(TA));
1348 void SYCLToolChain::TranslateGPUTargetOpt(
const llvm::opt::ArgList &Args,
1349 llvm::opt::ArgStringList &CmdArgs,
1350 OptSpecifier Opt_EQ)
const {
1351 for (
auto *A : Args) {
1352 if (A->getOption().matches(Opt_EQ)) {
1353 if (
auto GpuDevice =
1354 tools::SYCL::gen::isGPUTarget<tools::SYCL::gen::AmdGPU>(
1356 StringRef ArgString;
1358 OffloadArch += GpuDevice->data();
1359 ArgString = OffloadArch;
1368 const llvm::Triple &Triple,
1369 StringRef Device, StringRef ArgString,
1370 const llvm::opt::Arg *A) {
1374 if (!ArgString.contains(
"-device pvc") && !
Device.contains(
"pvc"))
1379 if (Triple.isSPIR() && Triple.getSubArch() == llvm::Triple::SPIRSubArch_gen &&
1383 if (ArgString.contains(Flag))
1384 D.
Diag(diag::warn_drv_ftarget_register_alloc_mode_pvc) << Flag << Mode;
1390 const llvm::opt::ArgList &Args,
1391 llvm::opt::ArgStringList &CmdArgs,
1392 OptSpecifier Opt, OptSpecifier Opt_EQ,
1393 StringRef Device)
const {
1394 for (
auto *A : Args) {
1396 OptNoTriple = A->getOption().matches(Opt);
1397 if (A->getOption().matches(Opt_EQ)) {
1400 bool IsGenTriple = Triple.isSPIR() &&
1401 Triple.getSubArch() == llvm::Triple::SPIRSubArch_gen;
1405 if (
getDriver().MakeSYCLDeviceTriple(A->getValue()) != Triple &&
1410 if (
getDriver().MakeSYCLDeviceTriple(A->getValue()) == Triple &&
1414 }
else if (
getDriver().MakeSYCLDeviceTriple(A->getValue()) != Triple)
1416 }
else if (!OptNoTriple)
1422 StringRef ArgString;
1426 const Arg *TargetArg = Args.getLastArg(options::OPT_fsycl_targets_EQ);
1427 if (TargetArg && TargetArg->getValues().size() != 1) {
1429 << A->getSpelling();
1433 ArgString = A->getValue();
1436 ArgString = A->getValue(1);
1444 const llvm::opt::ArgList &Args,
1445 llvm::opt::ArgStringList &CmdArgs,
1448 StringRef Device)
const {
1456 llvm::opt::ArgStringList BeArgs;
1460 bool IsGen = Triple.getSubArch() == llvm::Triple::SPIRSubArch_gen;
1462 Triple.isSPIROrSPIRV() && Triple.getSubArch() == llvm::Triple::NoSubArch;
1463 if (IsGen && Args.hasArg(options::OPT_fsycl_fp64_conv_emu))
1464 BeArgs.push_back(
"-ze-fp64-gen-conv-emu");
1465 if (Arg *A = Args.getLastArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
1466 if (!A->getOption().matches(options::OPT_g0))
1467 BeArgs.push_back(
"-g");
1470 if (Triple.getSubArch() != llvm::Triple::NoSubArch)
1471 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1472 if (A->getOption().matches(options::OPT_O0))
1473 BeArgs.push_back(
"-cl-opt-disable");
1474 StringRef RegAllocModeOptName =
"-ftarget-register-alloc-mode=";
1475 if (Arg *A = Args.getLastArg(options::OPT_ftarget_register_alloc_mode_EQ)) {
1476 StringRef RegAllocModeVal = A->getValue(0);
1477 auto ProcessElement = [&](StringRef Ele) {
1478 auto [DeviceName, RegAllocMode] = Ele.split(
':');
1480 bool IsDefault = RegAllocMode ==
"default";
1481 if (RegAllocMode.empty() || DeviceName !=
"pvc" ||
1482 (BackendOptName.empty() && !IsDefault)) {
1484 << A->getSpelling() << Ele;
1493 PerDeviceArgs.push_back(
1494 {DeviceName, Args.MakeArgString(BackendOptName)});
1498 BeArgs.push_back(Args.MakeArgString(RegAllocModeOptName + DeviceName +
1499 ":" + BackendOptName));
1503 RegAllocModeVal.split(RegAllocModeArgs,
',');
1504 for (StringRef Elem : RegAllocModeArgs)
1505 ProcessElement(Elem);
1510 ArgStringList TargArgs;
1511 Args.AddAllArgValues(TargArgs, options::OPT_Xs, options::OPT_Xs_separate);
1512 Args.AddAllArgValues(TargArgs, options::OPT_Xsycl_backend);
1515 StringRef DeviceName =
"pvc";
1518 PerDeviceArgs.push_back(
1519 {DeviceName, Args.MakeArgString(BackendOptName)});
1521 BeArgs.push_back(Args.MakeArgString(RegAllocModeOptName + DeviceName +
1522 ":" + BackendOptName));
1526 if (Args.hasArg(options::OPT_fintelfpga) &&
getDriver().IsFPGAHWMode() &&
1527 Triple.getSubArch() == llvm::Triple::SPIRSubArch_fpga) {
1528 if (Arg *A = Args.getLastArg(options::OPT_ffp_model_EQ)) {
1529 if (StringRef(A->getValue()) ==
"fast")
1530 BeArgs.push_back(
"-vpfp-relaxed");
1538 if (!DepInfo.empty()) {
1539 ArgStringList TargArgs;
1540 Args.AddAllArgValues(TargArgs, options::OPT_Xs, options::OPT_Xs_separate);
1541 Args.AddAllArgValues(TargArgs, options::OPT_Xsycl_backend);
1543 for (
auto *A : Args) {
1544 if (!A->getOption().matches(options::OPT_Xsycl_backend_EQ))
1546 if (StringRef(A->getValue()).starts_with(
"intel_gpu"))
1547 TargArgs.push_back(A->getValue(1));
1549 if (llvm::find_if(TargArgs, [&](
auto Cur) {
1550 return !strncmp(Cur,
"-device",
sizeof(
"-device") - 1);
1551 }) != TargArgs.end()) {
1557 CmdArgs.push_back(
"-device");
1558 CmdArgs.push_back(Args.MakeArgString(DepInfo));
1561 if (Args.hasArg(options::OPT_ftarget_compile_fast))
1562 BeArgs.push_back(
"-igc_opts 'PartitionUnit=1,SubroutineThreshold=50000'");
1564 if (Args.hasFlag(options::OPT_ftarget_export_symbols,
1565 options::OPT_fno_target_export_symbols,
false))
1566 BeArgs.push_back(
"-library-compilation");
1569 Args.AddLastArg(BeArgs, options::OPT_ftarget_compile_fast);
1571 for (
auto [DeviceName, BackendArgStr] : PerDeviceArgs) {
1572 CmdArgs.push_back(
"-device_options");
1573 CmdArgs.push_back(Args.MakeArgString(DeviceName));
1574 CmdArgs.push_back(Args.MakeArgString(BackendArgStr));
1579 if (Triple.getSubArch() == llvm::Triple::NoSubArch ||
1580 Triple.getSubArch() == llvm::Triple::SPIRSubArch_fpga) {
1581 for (StringRef A : BeArgs)
1582 CmdArgs.push_back(Args.MakeArgString(A));
1587 CmdArgs.push_back(
"-options");
1590 for (
unsigned I = 0; I < BeArgs.size(); ++I) {
1595 CmdArgs.push_back(Args.MakeArgString(BeOpt));
1599 const llvm::Triple &Triple,
const llvm::opt::ArgList &Args,
1600 llvm::opt::ArgStringList &CmdArgs, StringRef Device)
const {
1602 for (
auto *A : Args) {
1613 if ((A->getOption().matches(options::OPT_Xs) ||
1614 A->getOption().matches(options::OPT_Xs_separate)) &&
1615 Triple.getSubArch() == llvm::Triple::NoSubArch &&
1616 Triple.isSPIROrSPIRV() &&
getDriver().isSYCLDefaultTripleImplied())
1619 if (A->getOption().matches(options::OPT_Xs)) {
1621 CmdArgs.push_back(Args.MakeArgString(Twine(
"-") + A->getValue()));
1627 if (A->getOption().matches(options::OPT_Xs_separate)) {
1628 StringRef ArgString(A->getValue());
1636 if (Triple.getSubArch() == llvm::Triple::NoSubArch &&
1637 Triple.isSPIROrSPIRV() &&
getDriver().isSYCLDefaultTripleImplied())
1641 options::OPT_Xsycl_backend_EQ,
Device);
1642 TranslateGPUTargetOpt(Args, CmdArgs, options::OPT_fsycl_targets_EQ);
1646 const llvm::opt::ArgList &Args,
1647 llvm::opt::ArgStringList &CmdArgs,
1648 StringRef Device)
const {
1650 if (Triple.getSubArch() == llvm::Triple::NoSubArch &&
1651 Triple.isSPIROrSPIRV() &&
getDriver().isSYCLDefaultTripleImplied())
1655 options::OPT_Xsycl_linker_EQ,
Device);
1659 if (
getTriple().getSubArch() == llvm::Triple::SPIRSubArch_fpga)
1661 if (
getTriple().getSubArch() == llvm::Triple::SPIRSubArch_gen)
1682 const ArgList &DriverArgs,
1683 ArgStringList &CC1Args) {
1687 llvm::sys::path::append(IncludePath,
"..");
1688 llvm::sys::path::append(IncludePath,
"include");
1690 llvm::sys::path::append(SYCLPath,
"sycl");
1695 llvm::sys::path::append(STLWrappersPath,
"stl_wrappers");
1696 CC1Args.push_back(
"-internal-isystem");
1697 CC1Args.push_back(DriverArgs.MakeArgString(SYCLPath));
1698 CC1Args.push_back(
"-internal-isystem");
1699 CC1Args.push_back(DriverArgs.MakeArgString(STLWrappersPath));
1700 CC1Args.push_back(
"-internal-isystem");
1701 CC1Args.push_back(DriverArgs.MakeArgString(IncludePath));
1705 ArgStringList &CC1Args)
const {
1710 ArgStringList &CC1Args)
const {
1715 return SanitizerKind::Address;
llvm::MachO::Target Target
static bool selectBfloatLibs(const llvm::Triple &Triple, const Compilation &C, bool &UseNative)
static void WarnForDeprecatedBackendOpts(const Driver &D, const llvm::Triple &Triple, StringRef Device, StringRef ArgString, const llvm::opt::Arg *A)
static void addFPGATimingDiagnostic(std::unique_ptr< Command > &Cmd, Compilation &C)
static const char * makeExeName(Compilation &C, StringRef Name)
static llvm::StringMap< StringRef > GRFModeFlagMap
static bool hasPVCDevice(const ArgStringList &CmdArgs)
static OclocInfo PVCDevices[]
static void parseTargetOpts(StringRef ArgString, const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs)
static std::vector< OptSpecifier > getUnsupportedOpts(void)
static llvm::SmallVector< StringRef, 16 > SYCLDeviceLibList
bool isDeviceOffloading(OffloadKind OKind) const
const char * getOffloadingArch() const
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
const llvm::opt::OptTable & getOpts() const
std::string Dir
The path the driver executable was in, as invoked from the command line.
void print(llvm::raw_ostream &OS) const
void getSYCLDeviceLibPath(llvm::SmallVector< llvm::SmallString< 128 >, 4 > &DeviceLibPaths) const
SYCLInstallationDetector(const Driver &D)
bool isSrcFile(ID Id)
isSrcFile - Is this a source file, i.e.
bool isSYCLNativeCPU(const llvm::opt::ArgList &Args)
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T
SmallVector< int, 8 > HexValues
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.
static constexpr ResponseFileSupport AtFileUTF8()