Skip to content

Commit 61793b3

Browse files
committed
[Driver][SYCL] Update preprocessed file generation
When generating preprocessed files for SYCL offloading, create a fully packaged file that contains both the HOST and DEVICE binaries. This will allow for consumption of these binary preprocessed files to be more useful, as opposed to only being able to preprocess and keep the host side of the offloading compilation When the driver encounters preprocessed (file.ii) files on the command line, these are processed in the following way: - Determines if the file is a packaged file (offload binary) - Extracts device side - Compiles device side, packages generated device into offload binary - Extracts host side - Compiles host side, embedding device binary Offload binary determination is performed by checking the magic number associated with the input file. The extraction is done via the clang-offload-packager using a new JobAction. When no output file is given, we will not package the preprocessed files but will just perform the host preprocessing. When output to a file (with an output file option), we will perform the host and device compilation, package and output to that file.
1 parent 2e736fb commit 61793b3

File tree

10 files changed

+217
-9
lines changed

10 files changed

+217
-9
lines changed

clang/include/clang/Driver/Action.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ class Action {
7676
OffloadUnbundlingJobClass,
7777
OffloadWrapperJobClass,
7878
OffloadPackagerJobClass,
79+
OffloadPackagerExtractJobClass,
7980
OffloadDepsJobClass,
8081
SPIRVTranslatorJobClass,
8182
SYCLPostLinkJobClass,
@@ -719,6 +720,17 @@ class OffloadPackagerJobAction : public JobAction {
719720
}
720721
};
721722

723+
class OffloadPackagerExtractJobAction : public JobAction {
724+
void anchor() override;
725+
726+
public:
727+
OffloadPackagerExtractJobAction(ActionList &Inputs, types::ID Type);
728+
729+
static bool classof(const Action *A) {
730+
return A->getKind() == OffloadPackagerExtractJobClass;
731+
}
732+
};
733+
722734
class OffloadDepsJobAction final : public JobAction {
723735
void anchor() override;
724736

clang/include/clang/Driver/Driver.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -991,6 +991,9 @@ bool isObjectFile(std::string FileName);
991991
/// \return True if the filename has a static archive/lib extension.
992992
bool isStaticArchiveFile(const StringRef &FileName);
993993

994+
/// \return True if the filename is an Offload Binary file.
995+
bool isOffloadBinaryFile(const StringRef &FileName);
996+
994997
/// \return True if the argument combination will end up generating remarks.
995998
bool willEmitRemarks(const llvm::opt::ArgList &Args);
996999

clang/include/clang/Driver/ToolChain.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ class ToolChain {
166166
mutable std::unique_ptr<Tool> OffloadBundler;
167167
mutable std::unique_ptr<Tool> OffloadWrapper;
168168
mutable std::unique_ptr<Tool> OffloadPackager;
169+
mutable std::unique_ptr<Tool> OffloadPackagerExtract;
169170
mutable std::unique_ptr<Tool> OffloadDeps;
170171
mutable std::unique_ptr<Tool> SPIRVTranslator;
171172
mutable std::unique_ptr<Tool> SYCLPostLink;
@@ -185,6 +186,7 @@ class ToolChain {
185186
Tool *getOffloadBundler() const;
186187
Tool *getOffloadWrapper() const;
187188
Tool *getOffloadPackager() const;
189+
Tool *getOffloadPackagerExtract() const;
188190
Tool *getOffloadDeps() const;
189191
Tool *getSPIRVTranslator() const;
190192
Tool *getSYCLPostLink() const;

clang/lib/Driver/Action.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ const char *Action::getClassName(ActionClass AC) {
4646
return "clang-offload-wrapper";
4747
case OffloadPackagerJobClass:
4848
return "clang-offload-packager";
49+
case OffloadPackagerExtractJobClass:
50+
return "clang-offload-packager-extract";
4951
case OffloadDepsJobClass:
5052
return "clang-offload-deps";
5153
case SPIRVTranslatorJobClass:
@@ -86,6 +88,13 @@ void Action::propagateDeviceOffloadInfo(OffloadKind OKind, const char *OArch,
8688
// Deps job uses the host kinds.
8789
if (Kind == OffloadDepsJobClass)
8890
return;
91+
// Packaging actions can use host kinds for preprocessing.
92+
bool hasPreprocessJob =
93+
std::any_of(Inputs.begin(), Inputs.end(), [](const Action *A) {
94+
return A->getKind() == PreprocessJobClass;
95+
});
96+
if (Kind == OffloadPackagerJobClass && hasPreprocessJob)
97+
return;
8998

9099
assert((OffloadingDeviceKind == OKind || OffloadingDeviceKind == OFK_None) &&
91100
"Setting device kind to a different device??");
@@ -485,6 +494,12 @@ OffloadPackagerJobAction::OffloadPackagerJobAction(ActionList &Inputs,
485494
types::ID Type)
486495
: JobAction(OffloadPackagerJobClass, Inputs, Type) {}
487496

497+
void OffloadPackagerExtractJobAction::anchor() {}
498+
499+
OffloadPackagerExtractJobAction::OffloadPackagerExtractJobAction(
500+
ActionList &Inputs, types::ID Type)
501+
: JobAction(OffloadPackagerExtractJobClass, Inputs, Type) {}
502+
488503
void OffloadDepsJobAction::anchor() {}
489504

490505
OffloadDepsJobAction::OffloadDepsJobAction(

clang/lib/Driver/Driver.cpp

Lines changed: 90 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7730,7 +7730,8 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
77307730
Action *HostAction) const {
77317731
// Don't build offloading actions if explicitly disabled or we do not have a
77327732
// valid source input.
7733-
if (offloadHostOnly() || !types::isSrcFile(Input.first))
7733+
if (offloadHostOnly() ||
7734+
!(types::isSrcFile(Input.first) || Input.first == types::TY_PP_CXX))
77347735
return HostAction;
77357736

77367737
bool HIPNoRDC =
@@ -7795,6 +7796,25 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
77957796
llvm::sort(Sorted);
77967797
for (StringRef Arch : Sorted) {
77977798
TCAndArchs.push_back(std::make_pair(TC, Arch));
7799+
// Check if the InputArg is a preprocessed file that is created by the
7800+
// clang-offload-packager.
7801+
if (InputType == types::TY_PP_CXX &&
7802+
isOffloadBinaryFile(InputArg->getAsString(Args))) {
7803+
// Extract the specific preprocessed file given the current arch
7804+
// and triple. Add to DeviceActions if one was extracted.
7805+
ActionList PPActions;
7806+
OffloadAction::DeviceDependences DDep;
7807+
Action *IA = C.MakeAction<InputAction>(*InputArg, InputType, CUID);
7808+
PPActions.push_back(IA);
7809+
Action *PackagerAction =
7810+
C.MakeAction<OffloadPackagerExtractJobAction>(PPActions,
7811+
types::TY_PP_CXX);
7812+
DDep.add(*PackagerAction,
7813+
*C.getSingleOffloadToolChain<Action::OFK_Host>(), nullptr,
7814+
C.getActiveOffloadKinds());
7815+
DeviceActions.push_back(PackagerAction);
7816+
continue;
7817+
}
77987818
DeviceActions.push_back(
77997819
C.MakeAction<InputAction>(*InputArg, InputType, CUID));
78007820
}
@@ -7952,6 +7972,41 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
79527972
DDep.add(*LinkAction, *C.getSingleOffloadToolChain<Action::OFK_Host>(),
79537973
nullptr, C.getActiveOffloadKinds());
79547974
return C.MakeAction<OffloadAction>(DDep, types::TY_Nothing);
7975+
} else if (C.isOffloadingHostKind(Action::OFK_SYCL) &&
7976+
isa<PreprocessJobAction>(HostAction) &&
7977+
getFinalPhase(Args) == phases::Preprocess &&
7978+
Args.hasArg(options::OPT_o, options::OPT__SLASH_P,
7979+
options::OPT__SLASH_o)) {
7980+
// Performing preprocessing only. Take the host and device preprocessed
7981+
// files and package them together.
7982+
ActionList PackagerActions;
7983+
// Only add the preprocess actions from the device side. When one is
7984+
// found, add an additional compilation to generate the integration
7985+
// header/footer that is used for the host compile.
7986+
for (auto OA : OffloadActions) {
7987+
if (const OffloadAction *CurOA = dyn_cast<OffloadAction>(OA)) {
7988+
CurOA->doOnEachDependence(
7989+
[&](Action *A, const ToolChain *TC, const char *BoundArch) {
7990+
assert(TC && "Unknown toolchain");
7991+
if (isa<PreprocessJobAction>(A)) {
7992+
PackagerActions.push_back(OA);
7993+
// DDep.add(*A, *TC, BoundArch, Action::OFK_SYCL);
7994+
// Action *AA = C.MakeAction<OffloadAction>(DDep,
7995+
// types::TY_PP_CXX);
7996+
A->setCannotBeCollapsedWithNextDependentAction();
7997+
Action *CompileAction =
7998+
C.MakeAction<CompileJobAction>(A, types::TY_Nothing);
7999+
DDeps.add(*CompileAction, *TC, BoundArch, Action::OFK_SYCL);
8000+
// PackagerActions.push_back(AA);
8001+
}
8002+
});
8003+
}
8004+
}
8005+
PackagerActions.push_back(HostAction);
8006+
Action *PackagerAction = C.MakeAction<OffloadPackagerJobAction>(
8007+
PackagerActions, types::TY_PP_CXX);
8008+
DDeps.add(*PackagerAction, *C.getSingleOffloadToolChain<Action::OFK_Host>(),
8009+
nullptr, C.getActiveOffloadKinds());
79558010
} else if (C.isOffloadingHostKind(Action::OFK_SYCL) &&
79568011
Args.hasArg(options::OPT_fsycl_host_compiler_EQ)) {
79578012
// -fsycl-host-compiler will create a bundled object instead of an
@@ -7974,7 +8029,7 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
79748029
// add each device output as a host dependency to ensure they are still built.
79758030
bool SingleDeviceOutput = !llvm::any_of(OffloadActions, [](Action *A) {
79768031
return A->getType() == types::TY_Nothing;
7977-
}) && isa<CompileJobAction>(HostAction);
8032+
}) && (isa<CompileJobAction>(HostAction));
79788033
OffloadAction::HostDependence HDep(
79798034
*HostAction, *C.getSingleOffloadToolChain<Action::OFK_Host>(),
79808035
/*BoundArch=*/nullptr, SingleDeviceOutput ? DDep : DDeps);
@@ -8100,6 +8155,23 @@ Action *Driver::ConstructPhaseAction(
81008155
return C.MakeAction<VerifyPCHJobAction>(Input, types::TY_Nothing);
81018156
if (Args.hasArg(options::OPT_extract_api))
81028157
return C.MakeAction<ExtractAPIJobAction>(Input, types::TY_API_INFO);
8158+
// New offload driver enabled with a Preprocessed input file - check to make
8159+
// sure that the input file is an offload binary - if so, we need to
8160+
// extract the actual preprocessed file from the package, and that is what
8161+
// we will compile.
8162+
if (getUseNewOffloadingDriver() &&
8163+
TargetDeviceOffloadKind == Action::OFK_None &&
8164+
Input->getType() == types::TY_PP_CXX) {
8165+
const InputAction *IA = dyn_cast<InputAction>(Input);
8166+
if (IA && isOffloadBinaryFile(IA->getInputArg().getAsString(Args))) {
8167+
ActionList PPActions;
8168+
PPActions.push_back(Input);
8169+
Action *PackagerAction = C.MakeAction<OffloadPackagerExtractJobAction>(
8170+
PPActions, types::TY_PP_CXX);
8171+
return C.MakeAction<CompileJobAction>(PackagerAction,
8172+
types::TY_LLVM_BC);
8173+
}
8174+
}
81038175
return C.MakeAction<CompileJobAction>(Input, types::TY_LLVM_BC);
81048176
}
81058177
case phases::Backend: {
@@ -9379,7 +9451,8 @@ const char *Driver::GetNamedOutputPath(Compilation &C, const JobAction &JA,
93799451
// For /P, preprocess to file named after BaseInput.
93809452
if (C.getArgs().hasArg(options::OPT__SLASH_P) &&
93819453
((AtTopLevel && isa<PreprocessJobAction>(JA)) ||
9382-
isa<OffloadBundlingJobAction>(JA))) {
9454+
isa<OffloadBundlingJobAction>(JA) ||
9455+
isa<OffloadPackagerJobAction>(JA))) {
93839456
StringRef BaseName = llvm::sys::path::filename(BaseInput);
93849457
StringRef NameArg;
93859458
if (Arg *A = C.getArgs().getLastArg(options::OPT__SLASH_Fi))
@@ -9415,6 +9488,14 @@ const char *Driver::GetNamedOutputPath(Compilation &C, const JobAction &JA,
94159488
}
94169489
}
94179490

9491+
// When generating preprocessed files (-E) with offloading enabled, redirect
9492+
// the output to a properly named output file.
9493+
if (JA.getType() == types::TY_PP_CXX && isa<OffloadPackagerJobAction>(JA)) {
9494+
if (Arg *FinalOutput =
9495+
C.getArgs().getLastArg(options::OPT_o, options::OPT__SLASH_o))
9496+
return C.addResultFile(FinalOutput->getValue(), &JA);
9497+
}
9498+
94189499
// Default to writing to stdout?
94199500
if (AtTopLevel && !CCGenDiagnostics && HasPreprocessOutput(JA)) {
94209501
return "-";
@@ -10383,6 +10464,12 @@ bool clang::driver::isStaticArchiveFile(const StringRef &FileName) {
1038310464
return (Magic == llvm::file_magic::archive);
1038410465
}
1038510466

10467+
bool clang::driver::isOffloadBinaryFile(const StringRef &FileName) {
10468+
llvm::file_magic Magic;
10469+
llvm::identify_magic(FileName, Magic);
10470+
return (Magic == llvm::file_magic::offload_binary);
10471+
}
10472+
1038610473
bool clang::driver::willEmitRemarks(const ArgList &Args) {
1038710474
// -fsave-optimization-record enables it.
1038810475
if (Args.hasFlag(options::OPT_fsave_optimization_record,

clang/lib/Driver/ToolChain.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -617,6 +617,12 @@ Tool *ToolChain::getOffloadPackager() const {
617617
return OffloadPackager.get();
618618
}
619619

620+
Tool *ToolChain::getOffloadPackagerExtract() const {
621+
if (!OffloadPackagerExtract)
622+
OffloadPackagerExtract.reset(new tools::OffloadPackagerExtract(*this));
623+
return OffloadPackagerExtract.get();
624+
}
625+
620626
Tool *ToolChain::getOffloadDeps() const {
621627
if (!OffloadDeps)
622628
OffloadDeps.reset(new tools::OffloadDeps(*this));
@@ -707,6 +713,8 @@ Tool *ToolChain::getTool(Action::ActionClass AC) const {
707713
return getOffloadWrapper();
708714
case Action::OffloadPackagerJobClass:
709715
return getOffloadPackager();
716+
case Action::OffloadPackagerExtractJobClass:
717+
return getOffloadPackagerExtract();
710718

711719
case Action::OffloadDepsJobClass:
712720
return getOffloadDeps();

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10400,6 +10400,8 @@ void OffloadPackager::ConstructJob(Compilation &C, const JobAction &JA,
1040010400
for (const InputInfo &Input : Inputs) {
1040110401
const Action *OffloadAction = Input.getAction();
1040210402
const ToolChain *TC = OffloadAction->getOffloadingToolChain();
10403+
if (!TC)
10404+
TC = &C.getDefaultToolChain();
1040310405
const ArgList &TCArgs =
1040410406
C.getArgsForToolChain(TC, OffloadAction->getOffloadingArch(),
1040510407
OffloadAction->getOffloadingDeviceKind());
@@ -10481,6 +10483,50 @@ void OffloadPackager::ConstructJob(Compilation &C, const JobAction &JA,
1048110483
CmdArgs, Inputs, Output));
1048210484
}
1048310485

10486+
// Use the clang-offload-packager to extract binaries from an packaged
10487+
// binary. This currently only supports single input/single output.
10488+
void OffloadPackagerExtract::ConstructJob(Compilation &C, const JobAction &JA,
10489+
const InputInfo &Output,
10490+
const InputInfoList &Inputs,
10491+
const llvm::opt::ArgList &Args,
10492+
const char *LinkingOutput) const {
10493+
ArgStringList CmdArgs;
10494+
const Action *OffloadAction = Inputs[0].getAction();
10495+
const ToolChain *TC = OffloadAction->getOffloadingToolChain();
10496+
if (!TC)
10497+
TC = &C.getDefaultToolChain();
10498+
const ArgList &TCArgs =
10499+
C.getArgsForToolChain(TC, OffloadAction->getOffloadingArch(),
10500+
OffloadAction->getOffloadingDeviceKind());
10501+
10502+
// Input file name.
10503+
StringRef InFile = C.getArgs().MakeArgString(TC->getInputFilename(Inputs[0]));
10504+
CmdArgs.push_back(Args.MakeArgString(InFile));
10505+
10506+
// Generated --image option containing the output file name, triple, arch
10507+
// and associated offload kind.
10508+
assert(Output.isFilename() && "Invalid output.");
10509+
StringRef File = Output.getFilename();
10510+
StringRef Arch = OffloadAction->getOffloadingArch()
10511+
? OffloadAction->getOffloadingArch()
10512+
: TCArgs.getLastArgValue(options::OPT_march_EQ);
10513+
StringRef Kind =
10514+
Action::GetOffloadKindName(OffloadAction->getOffloadingDeviceKind());
10515+
10516+
SmallVector<std::string> Parts{
10517+
"file=" + File.str(),
10518+
"triple=" + TC->getTripleString(),
10519+
"arch=" + (Arch.empty() ? "generic" : Arch.str()),
10520+
"kind=" + Kind.str(),
10521+
};
10522+
CmdArgs.push_back(Args.MakeArgString("--image=" + llvm::join(Parts, ",")));
10523+
10524+
C.addCommand(std::make_unique<Command>(
10525+
JA, *this, ResponseFileSupport::None(),
10526+
Args.MakeArgString(getToolChain().GetProgramPath(getShortName())),
10527+
CmdArgs, Inputs, Output));
10528+
}
10529+
1048410530
// Begin OffloadDeps
1048510531

1048610532
void OffloadDeps::constructJob(Compilation &C, const JobAction &JA,

clang/lib/Driver/ToolChains/Clang.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,19 @@ class LLVM_LIBRARY_VISIBILITY OffloadPackager final : public Tool {
190190
const char *LinkingOutput) const override;
191191
};
192192

193+
/// Offload binary extract tool.
194+
class LLVM_LIBRARY_VISIBILITY OffloadPackagerExtract final : public Tool {
195+
public:
196+
OffloadPackagerExtract(const ToolChain &TC)
197+
: Tool("Offload::PackagerExtract", "clang-offload-packager", TC) {}
198+
199+
bool hasIntegratedCPP() const override { return false; }
200+
void ConstructJob(Compilation &C, const JobAction &JA,
201+
const InputInfo &Output, const InputInfoList &Inputs,
202+
const llvm::opt::ArgList &TCArgs,
203+
const char *LinkingOutput) const override;
204+
};
205+
193206
/// Offload deps tool.
194207
class LLVM_LIBRARY_VISIBILITY OffloadDeps final : public Tool {
195208
void constructJob(Compilation &C, const JobAction &JA,

clang/test/Driver/sycl-int-header-footer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
// FOOTER_PREPROC_GEN-SAME: "-dependency-filter" "[[INTHEADER]]"
1818
// FOOTER_PREPROC_GEN-SAME: "-include-internal-footer" "[[INTFOOTER]]"
1919
// FOOTER_PREPROC_GEN-SAME: "-dependency-filter" "[[INTFOOTER]]"
20-
// FOOTER_PREPROC_GEN-SAME: "-E"{{.*}} "-o" "-"
20+
// FOOTER_PREPROC_GEN-SAME: "-E"
2121

2222
/// Preprocessed file use with integration footer
2323
// RUN: touch %t.ii
Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
/// Test preprocessing capabilities when using -fsycl
1+
// Test the behaviors when enabling SYCL offloading with preprocessed files.
2+
23
/// Creating a preprocessed file is expected to do an integration header
34
/// creation step.
45
// RUN: %clangxx -fsycl --offload-new-driver -E -o %t_output.ii %s -### 2>&1 \
56
// RUN: | FileCheck -check-prefix PREPROC_ONLY %s
6-
// RUN: %clang_cl -fsycl --offload-new-driver -P -Fi%t_output.ii %s -### 2>&1 \
7+
// RUN: %clang_cl -fsycl --offload-new-driver -P %s -### 2>&1 \
78
// RUN: | FileCheck -check-prefix PREPROC_ONLY %s
89
// PREPROC_ONLY: clang{{.*}} "-fsycl-is-device"{{.*}} "-fsycl-int-header=[[INTHEADER:.+\.h]]" "-fsycl-int-footer=[[INTFOOTER:.+\.h]]"{{.*}} "-E"
910
// PREPROC_ONLY: clang{{.*}} "-fsycl-is-host"{{.*}} "-include-internal-header" "[[INTHEADER]]"{{.*}} "-include-internal-footer" "[[INTFOOTER]]"{{.*}} "-o" "[[HOST_OUT:.+\.ii]]"
@@ -14,10 +15,31 @@
1415
// PREPROC_IN-NOT: "-fsycl-int-header={{.*}}"
1516
// PREPROC_IN: clang{{.*}} "-fsycl-is-host"
1617

17-
// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl --offload-new-driver -E %s -ccc-print-phases 2>&1 \
18-
// RUN: | FileCheck -check-prefix PREPROC_PHASES %s
18+
/// When generating preprocessed files, verify the compilation phases.
19+
// RUN: %clangxx --target=x86_64-unknown-linux-gnu --offload-new-driver -fsycl -E %s -o %t.ii -ccc-print-phases 2>&1 \
20+
// RUN: | FileCheck %s -check-prefix PREPROC_PHASES
21+
// RUN: %clang_cl --target=x86_64-unknown-linux-gnu --offload-new-driver -fsycl -P %s -Fi%t.ii -ccc-print-phases 2>&1 \
22+
// RUN: | FileCheck %s -check-prefix PREPROC_PHASES
1923
// PREPROC_PHASES: 0: input, "[[INPUT:.+\.cpp]]", c++, (host-sycl)
2024
// PREPROC_PHASES: 1: preprocessor, {0}, c++-cpp-output, (host-sycl)
2125
// PREPROC_PHASES: 2: input, "[[INPUT]]", c++, (device-sycl)
2226
// PREPROC_PHASES: 3: preprocessor, {2}, c++-cpp-output, (device-sycl)
23-
// PREPROC_PHASES: 4: offload, "host-sycl (x86_64-unknown-linux-gnu)" {1}, "device-sycl (spir64-unknown-unknown)" {3}, c++-cpp-output
27+
// PREPROC_PHASES: 4: compiler, {3}, none, (device-sycl)
28+
// PREPROC_PHASES: 5: offload, "device-sycl (spir64-unknown-unknown)" {3}, c++-cpp-output
29+
// PREPROC_PHASES: 6: clang-offload-packager, {5, 1}, c++-cpp-output
30+
// PREPROC_PHASES: 7: offload, "host-sycl (x86_64-unknown-linux-gnu)" {1}, "device-sycl (spir64-unknown-unknown)" {3}, "device-sycl (spir64-unknown-unknown)" {4}, " (x86_64-unknown-linux-gnu)" {6}, c++-cpp-output
31+
32+
/// When generating preprocessed files, verify the tools called and the expected
33+
/// output file name.
34+
// RUN: %clangxx --offload-new-driver -fsycl -E %s -o sycl-preprocess.ii -### 2>&1 \
35+
// RUN: | FileCheck %s -check-prefix PREPROC_TOOLS
36+
// RUN: %clang_cl --offload-new-driver -fsycl -P %s -Fisycl-preprocess.ii -### 2>&1 \
37+
// RUN: | FileCheck %s -check-prefix PREPROC_TOOLS
38+
// RUN: %clang_cl --offload-new-driver -fsycl -E %s -o sycl-preprocess.ii -### 2>&1 \
39+
// RUN: | FileCheck %s -check-prefix PREPROC_TOOLS
40+
// PREPROC_TOOLS: clang{{.*}} "-fsycl-is-device"
41+
// PREPROC_TOOLS-SAME: "-o" "[[DEVICE_PP_FILE:.+\.ii]]
42+
// PREPROC_TOOLS: clang{{.*}} "-fsycl-is-host"
43+
// PREPROC_TOOLS-SAME: "-o" "[[HOST_PP_FILE:.+\.ii]]
44+
// PREPROC_TOOLS: clang-offload-packager{{.*}} "-o" "sycl-preprocess.ii"
45+
// PREPROC_TOOLS-SAME: "--image=file=[[DEVICE_PP_FILE]],triple=spir64-unknown-unknown,arch=generic,kind=sycl{{.*}}" "--image=file=[[HOST_PP_FILE]],triple={{.*}},arch=generic,kind=host"

0 commit comments

Comments
 (0)