Skip to content

Commit 94d5235

Browse files
committed
Initial working flow
Signed-off-by: Arvind Sudarsanam <arvind.sudarsanam@intel.com>
1 parent 81fba25 commit 94d5235

File tree

6 files changed

+147
-112
lines changed

6 files changed

+147
-112
lines changed

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11556,13 +11556,13 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA,
1155611556
}
1155711557
}
1155811558
}
11559-
// -sycl-device-libraries=<libs> provides a comma separate list of
11559+
// -device-libraries=<libs> provides a comma separate list of
1156011560
// libraries to add to the device linking step.
1156111561
if (LibList.size())
11562-
CmdArgs.push_back(
11563-
Args.MakeArgString(Twine("-sycl-device-libraries=") + LibList));
11562+
CmdArgs.push_back(Args.MakeArgString(
11563+
Twine("--linker-arg=\"-device-libraries=") + LibList + Twine("\"")));
1156411564

11565-
// -sycl-device-library-location=<dir> provides the location in which the
11565+
// -device-library-location=<dir> provides the location in which the
1156611566
// SYCL device libraries can be found.
1156711567
SmallString<128> DeviceLibDir(D.Dir);
1156811568
llvm::sys::path::append(DeviceLibDir, "..", "lib");
@@ -11586,15 +11586,16 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA,
1158611586
break;
1158711587
}
1158811588
}
11589-
CmdArgs.push_back(Args.MakeArgString(
11590-
Twine("-sycl-device-library-location=") + DeviceLibDir));
11589+
CmdArgs.push_back(
11590+
Args.MakeArgString(Twine("--linker-arg=\"-device-library-location=") +
11591+
DeviceLibDir + Twine("\"")));
1159111592

1159211593
if (C.getDriver().isDumpDeviceCodeEnabled()) {
1159311594
SmallString<128> DumpDir;
1159411595
Arg *A = C.getArgs().getLastArg(options::OPT_fsycl_dump_device_code_EQ);
1159511596
DumpDir = A ? A->getValue() : "";
11596-
CmdArgs.push_back(
11597-
Args.MakeArgString(Twine("-sycl-dump-device-code=") + DumpDir));
11597+
CmdArgs.push_back(Args.MakeArgString(
11598+
Twine("--linker-arg=\"-dump-device-code=") + DumpDir + Twine("\"")));
1159811599
}
1159911600

1160011601
auto appendOption = [](SmallString<128> &OptString, StringRef AddOpt) {
@@ -11615,7 +11616,8 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA,
1161511616
}
1161611617
if (!PostLinkOptString.empty())
1161711618
CmdArgs.push_back(
11618-
Args.MakeArgString("--sycl-post-link-options=" + PostLinkOptString));
11619+
Args.MakeArgString(Twine("--linker-arg=\"-post-link-options=") +
11620+
PostLinkOptString + Twine("\"")));
1161911621

1162011622
// --llvm-spirv-options="options" provides a string of options to be passed
1162111623
// along to the llvm-spirv (translation) step during device link.
@@ -11628,24 +11630,27 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA,
1162811630
getNonTripleBasedSPIRVTransOpts(C, Args, TranslatorArgs);
1162911631
for (const auto &A : TranslatorArgs)
1163011632
appendOption(OptString, A);
11631-
CmdArgs.push_back(Args.MakeArgString("--llvm-spirv-options=" + OptString));
11632-
11633+
CmdArgs.push_back(
11634+
Args.MakeArgString(Twine("--linker-arg=\"-llvm-spirv-options=") +
11635+
OptString + Twine("\"")));
1163311636
if (C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment())
1163411637
CmdArgs.push_back("-sycl-is-windows-msvc-env");
1163511638

1163611639
bool IsUsingLTO = D.isUsingOffloadLTO();
1163711640
auto LTOMode = D.getOffloadLTOMode();
1163811641
if (IsUsingLTO && LTOMode == LTOK_Thin)
11639-
CmdArgs.push_back(Args.MakeArgString("-sycl-thin-lto"));
11642+
CmdArgs.push_back(
11643+
Args.MakeArgString(Twine("--linker-arg=\"-thin-lto\"")));
1164011644

1164111645
if (Args.hasArg(options::OPT_fsycl_embed_ir))
11642-
CmdArgs.push_back(Args.MakeArgString("-sycl-embed-ir"));
11646+
CmdArgs.push_back(
11647+
Args.MakeArgString(Twine("--linker-arg=\"-embed-ir\"")));
1164311648

1164411649
if (Args.hasFlag(options::OPT_fsycl_allow_device_image_dependencies,
1164511650
options::OPT_fno_sycl_allow_device_image_dependencies,
1164611651
false))
11647-
CmdArgs.push_back(
11648-
Args.MakeArgString("-sycl-allow-device-image-dependencies"));
11652+
CmdArgs.push_back(Args.MakeArgString(
11653+
Twine("--linker-arg=\"-allow-device-image-dependencies\"")));
1164911654

1165011655
// Formulate and add any offload-wrapper and AOT specific options. These
1165111656
// are additional options passed in via -Xsycl-target-linker and

clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -556,11 +556,24 @@ Expected<StringRef> clang(ArrayRef<StringRef> InputFiles, const ArgList &Args,
556556
CmdArgs.push_back("-Wl,--lto-emit-llvm");
557557

558558
if (HasSYCLOffloadKind) {
559-
CmdArgs.push_back("-fsycl");
560559
CmdArgs.push_back("--sycl-link");
561560
CmdArgs.append(
562561
{"-Xlinker", Args.MakeArgString("-triple=" + Triple.getTriple())});
563562
CmdArgs.append({"-Xlinker", Args.MakeArgString("-arch=" + Arch)});
563+
if (Verbose)
564+
CmdArgs.append({"-Xlinker", Args.MakeArgString("--verbose")});
565+
if (SaveTemps)
566+
CmdArgs.append({"-Xlinker", Args.MakeArgString("-save-temps")});
567+
if (DryRun)
568+
CmdArgs.append({"-Xlinker", Args.MakeArgString("--dry-run")});
569+
StringRef OptLevel = Args.getLastArgValue(OPT_opt_level, "O2");
570+
CmdArgs.append({"-Xlinker", Args.MakeArgString("-O" + OptLevel)});
571+
StringRef GPUArgs = Args.getLastArgValue(OPT_gpu_tool_arg_EQ);
572+
CmdArgs.append(
573+
{"-Xlinker", Args.MakeArgString("-gpu-tool-arg=" + GPUArgs)});
574+
StringRef CPUArgs = Args.getLastArgValue(OPT_cpu_tool_arg_EQ);
575+
CmdArgs.append(
576+
{"-Xlinker", Args.MakeArgString("-cpu-tool-arg=" + CPUArgs)});
564577
}
565578

566579
for (StringRef Arg : Args.getAllArgValues(OPT_linker_arg_EQ))
@@ -629,16 +642,16 @@ Expected<StringRef> writeOffloadFile(const OffloadFile &File) {
629642
Expected<StringRef> compileModule(Module &M, OffloadKind Kind) {
630643
llvm::TimeTraceScope TimeScope("Compile module");
631644
std::string Msg;
632-
const Target *T = TargetRegistry::lookupTarget(M.getTargetTriple(), Msg);
645+
llvm::Triple Triple(M.getTargetTriple());
646+
const Target *T = TargetRegistry::lookupTarget(Triple.getTriple(), Msg);
633647
if (!T)
634648
return createStringError(Msg);
635649

636-
auto Options =
637-
codegen::InitTargetOptionsFromCodeGenFlags(M.getTargetTriple());
650+
auto Options = codegen::InitTargetOptionsFromCodeGenFlags(Triple);
638651
StringRef CPU = "";
639652
StringRef Features = "";
640653
std::unique_ptr<TargetMachine> TM(
641-
T->createTargetMachine(M.getTargetTriple(), CPU, Features, Options,
654+
T->createTargetMachine(Triple.getTriple(), CPU, Features, Options,
642655
Reloc::PIC_, M.getCodeModel()));
643656

644657
if (M.getDataLayout().isDefault())
@@ -657,7 +670,7 @@ Expected<StringRef> compileModule(Module &M, OffloadKind Kind) {
657670
auto OS = std::make_unique<llvm::raw_fd_ostream>(FD, true);
658671

659672
legacy::PassManager CodeGenPasses;
660-
TargetLibraryInfoImpl TLII(M.getTargetTriple());
673+
TargetLibraryInfoImpl TLII(Triple);
661674
CodeGenPasses.add(new TargetLibraryInfoWrapperPass(TLII));
662675
if (TM->addPassesToEmitFile(CodeGenPasses, *OS, nullptr,
663676
CodeGenFileType::ObjectFile))
@@ -681,8 +694,8 @@ wrapDeviceImages(ArrayRef<std::unique_ptr<MemoryBuffer>> Buffers,
681694

682695
LLVMContext Context;
683696
Module M("offload.wrapper.module", Context);
684-
M.setTargetTriple(Triple(
685-
Args.getLastArgValue(OPT_host_triple_EQ, sys::getDefaultTargetTriple())));
697+
M.setTargetTriple(
698+
Args.getLastArgValue(OPT_host_triple_EQ, sys::getDefaultTargetTriple()));
686699

687700
switch (Kind) {
688701
case OFK_OpenMP:
@@ -1143,7 +1156,8 @@ Expected<bool> getSymbolsFromBitcode(MemoryBufferRef Buffer, OffloadKind Kind,
11431156

11441157
// If the file gets extracted we update the table with the new symbols.
11451158
if (ShouldExtract)
1146-
Syms.insert_range(TmpSyms);
1159+
Syms.insert(std::begin(TmpSyms), std::end(TmpSyms));
1160+
// Syms.insert_range(TmpSyms);
11471161

11481162
return ShouldExtract;
11491163
}
@@ -1198,7 +1212,8 @@ Expected<bool> getSymbolsFromObject(const ObjectFile &Obj, OffloadKind Kind,
11981212

11991213
// If the file gets extracted we update the table with the new symbols.
12001214
if (ShouldExtract)
1201-
Syms.insert_range(TmpSyms);
1215+
// Syms.insert_range(TmpSyms);
1216+
Syms.insert(std::begin(TmpSyms), std::end(TmpSyms));
12021217

12031218
return ShouldExtract;
12041219
}

clang/tools/clang-linker-wrapper/LinkerWrapperOpts.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ def whole_program : Flag<["--"], "whole-program">,
9292
Flags<[DeviceOnlyOption, HelpHidden]>,
9393
HelpText<"LTO has visibility of all input files">;
9494
def linker_arg_EQ : Joined<["--"], "linker-arg=">,
95-
Flags<[DeviceOnlyOption, HelpHidden]>,
96-
HelpText<"An extra argument to be passed to the linker">;
95+
Flags<[WrapperOnlyOption, DeviceOnlyOption, HelpHidden]>,
96+
HelpText<"An extra argument to be passed to the linker">;
9797
def compiler_arg_EQ : Joined<["--"], "compiler-arg=">,
9898
Flags<[DeviceOnlyOption, HelpHidden]>,
9999
HelpText<"An extra argument to be passed to the compiler">;

clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -598,9 +598,9 @@ Expected<StringRef> linkDeviceInputFiles(SmallVectorImpl<StringRef> &InputFiles,
598598
static Error getSYCLDeviceLibs(SmallVector<std::string, 16> &DeviceLibFiles,
599599
const ArgList &Args) {
600600
StringRef SYCLDeviceLibLoc("");
601-
if (Arg *A = Args.getLastArg(OPT_sycl_device_library_location_EQ))
601+
if (Arg *A = Args.getLastArg(OPT_device_library_location_EQ))
602602
SYCLDeviceLibLoc = A->getValue();
603-
if (Arg *A = Args.getLastArg(OPT_sycl_device_lib_EQ)) {
603+
if (Arg *A = Args.getLastArg(OPT_device_lib_EQ)) {
604604
if (A->getValues().size() == 0)
605605
return createStringError(
606606
inconvertibleErrorCode(),
@@ -706,7 +706,7 @@ static Expected<StringRef> linkDeviceBitcode(ArrayRef<StringRef> InputFiles,
706706

707707
// For NVPTX backend we need to also link libclc and CUDA libdevice.
708708
if (Triple.isNVPTX()) {
709-
if (Arg *A = Args.getLastArg(OPT_sycl_nvptx_device_lib_EQ)) {
709+
if (Arg *A = Args.getLastArg(OPT_nvptx_device_lib_EQ)) {
710710
if (A->getValues().size() == 0)
711711
return createStringError(
712712
inconvertibleErrorCode(),
@@ -773,11 +773,11 @@ getTripleBasedSYCLPostLinkOpts(const ArgList &Args,
773773
// because it only increases amount of code for device compiler to handle,
774774
// without any actual benefits.
775775
// TODO: Try to extend this feature for non-Intel GPUs.
776-
if ((!Args.hasFlag(OPT_no_sycl_remove_unused_external_funcs,
777-
OPT_sycl_remove_unused_external_funcs, false) &&
776+
if ((!Args.hasFlag(OPT_no_remove_unused_external_funcs,
777+
OPT_remove_unused_external_funcs, false) &&
778778
!SYCLNativeCPU) &&
779-
!Args.hasArg(OPT_sycl_allow_device_image_dependencies) &&
780-
!Triple.isNVPTX() && !Triple.isAMDGPU())
779+
!Args.hasArg(OPT_allow_device_image_dependencies) && !Triple.isNVPTX() &&
780+
!Triple.isAMDGPU())
781781
PostLinkArgs.push_back("-emit-only-kernels-as-entry-points");
782782

783783
if (!Triple.isAMDGCN())
@@ -788,9 +788,9 @@ getTripleBasedSYCLPostLinkOpts(const ArgList &Args,
788788

789789
bool SplitEsimdByDefault = Triple.isSPIROrSPIRV();
790790
bool SplitEsimd =
791-
Args.hasFlag(OPT_sycl_device_code_split_esimd,
792-
OPT_no_sycl_device_code_split_esimd, SplitEsimdByDefault);
793-
if (!Args.hasArg(OPT_sycl_thin_lto))
791+
Args.hasFlag(OPT_device_code_split_esimd, OPT_no_device_code_split_esimd,
792+
SplitEsimdByDefault);
793+
if (!Args.hasArg(OPT_thin_lto))
794794
PostLinkArgs.push_back("-symbols");
795795
// Specialization constant info generation is mandatory -
796796
// add options unconditionally
@@ -801,8 +801,8 @@ getTripleBasedSYCLPostLinkOpts(const ArgList &Args,
801801
PostLinkArgs.push_back("-lower-esimd");
802802

803803
bool IsAOT = Triple.isNVPTX() || Triple.isAMDGCN() || Triple.isSPIRAOT();
804-
if (Args.hasFlag(OPT_sycl_add_default_spec_consts_image,
805-
OPT_no_sycl_add_default_spec_consts_image, false) &&
804+
if (Args.hasFlag(OPT_add_default_spec_consts_image,
805+
OPT_no_add_default_spec_consts_image, false) &&
806806
IsAOT)
807807
PostLinkArgs.push_back("-generate-device-image-default-spec-consts");
808808
}
@@ -828,7 +828,7 @@ runSYCLPostLinkTool(ArrayRef<StringRef> InputFiles, const ArgList &Args) {
828828
SmallVector<StringRef, 8> CmdArgs;
829829
CmdArgs.push_back(*SYCLPostLinkPath);
830830
const llvm::Triple Triple(Args.getLastArgValue(OPT_triple_EQ));
831-
Arg *SYCLDeviceLibLoc = Args.getLastArg(OPT_sycl_device_library_location_EQ);
831+
Arg *SYCLDeviceLibLoc = Args.getLastArg(OPT_device_library_location_EQ);
832832
if (SYCLDeviceLibLoc && !Triple.isSPIRAOT()) {
833833
std::string SYCLDeviceLibLocParam = SYCLDeviceLibLoc->getValue();
834834
std::string BF16DeviceLibLoc =
@@ -840,7 +840,7 @@ runSYCLPostLinkTool(ArrayRef<StringRef> InputFiles, const ArgList &Args) {
840840
}
841841
getTripleBasedSYCLPostLinkOpts(Args, CmdArgs, Triple);
842842
StringRef SYCLPostLinkOptions;
843-
if (Arg *A = Args.getLastArg(OPT_sycl_post_link_options_EQ))
843+
if (Arg *A = Args.getLastArg(OPT_post_link_options_EQ))
844844
SYCLPostLinkOptions = A->getValue();
845845
SYCLPostLinkOptions.split(CmdArgs, " ", /* MaxSplit = */ -1,
846846
/* KeepEmpty = */ false);
@@ -1037,10 +1037,9 @@ static Expected<StringRef> runLLVMToSPIRVTranslation(StringRef File,
10371037
static void addBackendOptions(const ArgList &Args,
10381038
SmallVector<StringRef, 8> &CmdArgs, bool IsCPU) {
10391039
StringRef OptC =
1040-
Args.getLastArgValue(OPT_sycl_backend_compile_options_from_image_EQ);
1040+
Args.getLastArgValue(OPT_backend_compile_options_from_image_EQ);
10411041
OptC.split(CmdArgs, " ", /*MaxSplit=*/-1, /*KeepEmpty=*/false);
1042-
StringRef OptL =
1043-
Args.getLastArgValue(OPT_sycl_backend_link_options_from_image_EQ);
1042+
StringRef OptL = Args.getLastArgValue(OPT_backend_link_options_from_image_EQ);
10441043
OptL.split(CmdArgs, " ", /*MaxSplit=*/-1, /*KeepEmpty=*/false);
10451044
StringRef OptTool = (IsCPU) ? Args.getLastArgValue(OPT_cpu_tool_arg_EQ)
10461045
: Args.getLastArgValue(OPT_gpu_tool_arg_EQ);
@@ -1236,8 +1235,7 @@ Error runSYCLLink(ArrayRef<StringRef> Files, const ArgList &Args) {
12361235

12371236
auto &SplitModules = *SplitModulesOrErr;
12381237
const llvm::Triple Triple(Args.getLastArgValue(OPT_triple_EQ));
1239-
if ((Triple.isNVPTX() || Triple.isAMDGCN()) &&
1240-
Args.hasArg(OPT_sycl_embed_ir)) {
1238+
if ((Triple.isNVPTX() || Triple.isAMDGCN()) && Args.hasArg(OPT_embed_ir)) {
12411239
// When compiling for Nvidia/AMD devices and the user requested the
12421240
// IR to be embedded in the application (via option), run the output
12431241
// of sycl-post-link (filetable referencing LLVM Bitcode + symbols)
@@ -1341,20 +1339,20 @@ int main(int argc, char **argv) {
13411339
if (Args.hasArg(OPT_o))
13421340
OutputFile = Args.getLastArgValue(OPT_o);
13431341

1344-
UseSYCLPostLinkTool = Args.hasFlag(OPT_use_sycl_post_link_tool,
1345-
OPT_no_use_sycl_post_link_tool, true);
1346-
if (!UseSYCLPostLinkTool && Args.hasArg(OPT_use_sycl_post_link_tool))
1342+
UseSYCLPostLinkTool =
1343+
Args.hasFlag(OPT_use_post_link_tool, OPT_no_use_post_link_tool, true);
1344+
if (!UseSYCLPostLinkTool && Args.hasArg(OPT_use_post_link_tool))
13471345
reportError(createStringError("-use-sycl-post-link-tool and "
13481346
"-no-use-sycl-post-link-tool options can't "
13491347
"be used together."));
13501348

1351-
if (Args.hasArg(OPT_sycl_module_split_mode_EQ)) {
1349+
if (Args.hasArg(OPT_module_split_mode_EQ)) {
13521350
if (UseSYCLPostLinkTool)
13531351
reportError(createStringError(
13541352
"-sycl-module-split-mode should be used with "
13551353
"the -no-use-sycl-post-link-tool command line option."));
13561354

1357-
StringRef StrMode = Args.getLastArgValue(OPT_sycl_module_split_mode_EQ);
1355+
StringRef StrMode = Args.getLastArgValue(OPT_module_split_mode_EQ);
13581356
SYCLModuleSplitMode = module_split::convertStringToSplitMode(StrMode);
13591357
if (!SYCLModuleSplitMode)
13601358
reportError(createStringError(
@@ -1363,8 +1361,8 @@ int main(int argc, char **argv) {
13631361
StrMode)));
13641362
}
13651363

1366-
if (Args.hasArg(OPT_sycl_dump_device_code_EQ)) {
1367-
Arg *A = Args.getLastArg(OPT_sycl_dump_device_code_EQ);
1364+
if (Args.hasArg(OPT_dump_device_code_EQ)) {
1365+
Arg *A = Args.getLastArg(OPT_dump_device_code_EQ);
13681366
OffloadImageDumpDir = A->getValue();
13691367
if (OffloadImageDumpDir.empty())
13701368
sys::path::native(OffloadImageDumpDir = "./");

0 commit comments

Comments
 (0)