Skip to content

Commit 7ef5c4a

Browse files
Merge remote-tracking branch 'origin/sycl' into HEAD
2 parents 961362b + 64928c5 commit 7ef5c4a

File tree

108 files changed

+1481
-466
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

108 files changed

+1481
-466
lines changed

.github/workflows/sycl-linux-precommit.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ jobs:
8181

8282
compat_read_exclude:
8383
name: Read compatibility testing exclude list
84-
runs-on: [Linux, build]
84+
runs-on: [Linux, aux-tasks]
8585
outputs:
8686
FILTER_6_2: ${{ steps.result.outputs.FILTER_6_2 }}
8787
FILTER_6_3: ${{ steps.result.outputs.FILTER_6_3 }}

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
@@ -990,6 +990,9 @@ bool isObjectFile(std::string FileName);
990990
/// \return True if the filename has a static archive/lib extension.
991991
bool isStaticArchiveFile(const StringRef &FileName);
992992

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

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: 17 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,15 @@ 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. When packaging
92+
// preprocessed files, these packaged files will contain both host and device
93+
// files, where the host side does not have any device info to propagate.
94+
bool hasPreprocessJob =
95+
std::any_of(Inputs.begin(), Inputs.end(), [](const Action *A) {
96+
return A->getKind() == PreprocessJobClass;
97+
});
98+
if (Kind == OffloadPackagerJobClass && hasPreprocessJob)
99+
return;
89100

90101
assert((OffloadingDeviceKind == OKind || OffloadingDeviceKind == OFK_None) &&
91102
"Setting device kind to a different device??");
@@ -485,6 +496,12 @@ OffloadPackagerJobAction::OffloadPackagerJobAction(ActionList &Inputs,
485496
types::ID Type)
486497
: JobAction(OffloadPackagerJobClass, Inputs, Type) {}
487498

499+
void OffloadPackagerExtractJobAction::anchor() {}
500+
501+
OffloadPackagerExtractJobAction::OffloadPackagerExtractJobAction(
502+
ActionList &Inputs, types::ID Type)
503+
: JobAction(OffloadPackagerExtractJobClass, Inputs, Type) {}
504+
488505
void OffloadDepsJobAction::anchor() {}
489506

490507
OffloadDepsJobAction::OffloadDepsJobAction(

clang/lib/Driver/Driver.cpp

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7780,7 +7780,8 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
77807780
Action *HostAction) const {
77817781
// Don't build offloading actions if explicitly disabled or we do not have a
77827782
// valid source input.
7783-
if (offloadHostOnly() || !types::isSrcFile(Input.first))
7783+
if (offloadHostOnly() ||
7784+
!(types::isSrcFile(Input.first) || Input.first == types::TY_PP_CXX))
77847785
return HostAction;
77857786

77867787
bool HIPNoRDC =
@@ -7845,6 +7846,25 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
78457846
for (const ToolChain *TC : ToolChains) {
78467847
for (StringRef Arch : OffloadArchs.lookup(TC)) {
78477848
TCAndArchs.push_back(std::make_pair(TC, Arch));
7849+
// Check if the InputArg is a preprocessed file that is created by the
7850+
// clang-offload-packager.
7851+
if (InputType == types::TY_PP_CXX &&
7852+
isOffloadBinaryFile(InputArg->getAsString(Args))) {
7853+
// Extract the specific preprocessed file given the current arch
7854+
// and triple. Add to DeviceActions if one was extracted.
7855+
ActionList PPActions;
7856+
OffloadAction::DeviceDependences DDep;
7857+
Action *IA = C.MakeAction<InputAction>(*InputArg, InputType, CUID);
7858+
PPActions.push_back(IA);
7859+
Action *PackagerAction =
7860+
C.MakeAction<OffloadPackagerExtractJobAction>(PPActions,
7861+
types::TY_PP_CXX);
7862+
DDep.add(*PackagerAction,
7863+
*C.getSingleOffloadToolChain<Action::OFK_Host>(), nullptr,
7864+
C.getActiveOffloadKinds());
7865+
DeviceActions.push_back(PackagerAction);
7866+
continue;
7867+
}
78487868
DeviceActions.push_back(
78497869
C.MakeAction<InputAction>(*InputArg, InputType, CUID));
78507870
}
@@ -8002,6 +8022,37 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
80028022
DDep.add(*LinkAction, *C.getSingleOffloadToolChain<Action::OFK_Host>(),
80038023
nullptr, C.getActiveOffloadKinds());
80048024
return C.MakeAction<OffloadAction>(DDep, types::TY_Nothing);
8025+
} else if (C.isOffloadingHostKind(Action::OFK_SYCL) &&
8026+
isa<PreprocessJobAction>(HostAction) &&
8027+
getFinalPhase(Args) == phases::Preprocess &&
8028+
Args.hasArg(options::OPT_o, options::OPT__SLASH_P,
8029+
options::OPT__SLASH_o)) {
8030+
// Performing preprocessing only. Take the host and device preprocessed
8031+
// files and package them together.
8032+
ActionList PackagerActions;
8033+
// Only add the preprocess actions from the device side. When one is
8034+
// found, add an additional compilation to generate the integration
8035+
// header/footer that is used for the host compile.
8036+
for (auto OA : OffloadActions) {
8037+
if (const OffloadAction *CurOA = dyn_cast<OffloadAction>(OA)) {
8038+
CurOA->doOnEachDependence(
8039+
[&](Action *A, const ToolChain *TC, const char *BoundArch) {
8040+
assert(TC && "Unknown toolchain");
8041+
if (isa<PreprocessJobAction>(A)) {
8042+
PackagerActions.push_back(OA);
8043+
A->setCannotBeCollapsedWithNextDependentAction();
8044+
Action *CompileAction =
8045+
C.MakeAction<CompileJobAction>(A, types::TY_Nothing);
8046+
DDeps.add(*CompileAction, *TC, BoundArch, Action::OFK_SYCL);
8047+
}
8048+
});
8049+
}
8050+
}
8051+
PackagerActions.push_back(HostAction);
8052+
Action *PackagerAction = C.MakeAction<OffloadPackagerJobAction>(
8053+
PackagerActions, types::TY_PP_CXX);
8054+
DDeps.add(*PackagerAction, *C.getSingleOffloadToolChain<Action::OFK_Host>(),
8055+
nullptr, C.getActiveOffloadKinds());
80058056
} else if (C.isOffloadingHostKind(Action::OFK_SYCL) &&
80068057
Args.hasArg(options::OPT_fsycl_host_compiler_EQ)) {
80078058
// -fsycl-host-compiler will create a bundled object instead of an
@@ -8150,6 +8201,23 @@ Action *Driver::ConstructPhaseAction(
81508201
return C.MakeAction<VerifyPCHJobAction>(Input, types::TY_Nothing);
81518202
if (Args.hasArg(options::OPT_extract_api))
81528203
return C.MakeAction<ExtractAPIJobAction>(Input, types::TY_API_INFO);
8204+
// New offload driver enabled with a Preprocessed input file - check to make
8205+
// sure that the input file is an offload binary - if so, we need to
8206+
// extract the actual preprocessed file from the package, and that is what
8207+
// we will compile.
8208+
if (getUseNewOffloadingDriver() &&
8209+
TargetDeviceOffloadKind == Action::OFK_None &&
8210+
Input->getType() == types::TY_PP_CXX) {
8211+
const InputAction *IA = dyn_cast<InputAction>(Input);
8212+
if (IA && isOffloadBinaryFile(IA->getInputArg().getAsString(Args))) {
8213+
ActionList PPActions;
8214+
PPActions.push_back(Input);
8215+
Action *PackagerAction = C.MakeAction<OffloadPackagerExtractJobAction>(
8216+
PPActions, types::TY_PP_CXX);
8217+
return C.MakeAction<CompileJobAction>(PackagerAction,
8218+
types::TY_LLVM_BC);
8219+
}
8220+
}
81538221
return C.MakeAction<CompileJobAction>(Input, types::TY_LLVM_BC);
81548222
}
81558223
case phases::Backend: {
@@ -9429,7 +9497,8 @@ const char *Driver::GetNamedOutputPath(Compilation &C, const JobAction &JA,
94299497
// For /P, preprocess to file named after BaseInput.
94309498
if (C.getArgs().hasArg(options::OPT__SLASH_P) &&
94319499
((AtTopLevel && isa<PreprocessJobAction>(JA)) ||
9432-
isa<OffloadBundlingJobAction>(JA))) {
9500+
isa<OffloadBundlingJobAction>(JA) ||
9501+
isa<OffloadPackagerJobAction>(JA))) {
94339502
StringRef BaseName = llvm::sys::path::filename(BaseInput);
94349503
StringRef NameArg;
94359504
if (Arg *A = C.getArgs().getLastArg(options::OPT__SLASH_Fi))
@@ -9465,6 +9534,14 @@ const char *Driver::GetNamedOutputPath(Compilation &C, const JobAction &JA,
94659534
}
94669535
}
94679536

9537+
// When generating preprocessed files (-E) with offloading enabled, redirect
9538+
// the output to a properly named output file.
9539+
if (JA.getType() == types::TY_PP_CXX && isa<OffloadPackagerJobAction>(JA)) {
9540+
if (Arg *FinalOutput =
9541+
C.getArgs().getLastArg(options::OPT_o, options::OPT__SLASH_o))
9542+
return C.addResultFile(FinalOutput->getValue(), &JA);
9543+
}
9544+
94689545
// Default to writing to stdout?
94699546
if (AtTopLevel && !CCGenDiagnostics && HasPreprocessOutput(JA)) {
94709547
return "-";
@@ -10437,6 +10514,12 @@ bool clang::driver::isStaticArchiveFile(const StringRef &FileName) {
1043710514
return (Magic == llvm::file_magic::archive);
1043810515
}
1043910516

10517+
bool clang::driver::isOffloadBinaryFile(const StringRef &FileName) {
10518+
llvm::file_magic Magic;
10519+
llvm::identify_magic(FileName, Magic);
10520+
return (Magic == llvm::file_magic::offload_binary);
10521+
}
10522+
1044010523
bool clang::driver::willEmitRemarks(const ArgList &Args) {
1044110524
// -fsave-optimization-record enables it.
1044210525
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
@@ -10300,6 +10300,8 @@ void OffloadPackager::ConstructJob(Compilation &C, const JobAction &JA,
1030010300
for (const InputInfo &Input : Inputs) {
1030110301
const Action *OffloadAction = Input.getAction();
1030210302
const ToolChain *TC = OffloadAction->getOffloadingToolChain();
10303+
if (!TC)
10304+
TC = &C.getDefaultToolChain();
1030310305
const ArgList &TCArgs =
1030410306
C.getArgsForToolChain(TC, OffloadAction->getOffloadingArch(),
1030510307
OffloadAction->getOffloadingDeviceKind());
@@ -10389,6 +10391,50 @@ void OffloadPackager::ConstructJob(Compilation &C, const JobAction &JA,
1038910391
CmdArgs, Inputs, Output));
1039010392
}
1039110393

10394+
// Use the clang-offload-packager to extract binaries from a packaged
10395+
// binary. This currently only supports single input/single output.
10396+
void OffloadPackagerExtract::ConstructJob(Compilation &C, const JobAction &JA,
10397+
const InputInfo &Output,
10398+
const InputInfoList &Inputs,
10399+
const llvm::opt::ArgList &Args,
10400+
const char *LinkingOutput) const {
10401+
ArgStringList CmdArgs;
10402+
const Action *OffloadAction = Inputs[0].getAction();
10403+
const ToolChain *TC = OffloadAction->getOffloadingToolChain();
10404+
if (!TC)
10405+
TC = &C.getDefaultToolChain();
10406+
const ArgList &TCArgs =
10407+
C.getArgsForToolChain(TC, OffloadAction->getOffloadingArch(),
10408+
OffloadAction->getOffloadingDeviceKind());
10409+
10410+
// Input file name.
10411+
StringRef InFile = C.getArgs().MakeArgString(TC->getInputFilename(Inputs[0]));
10412+
CmdArgs.push_back(Args.MakeArgString(InFile));
10413+
10414+
// Generated --image option containing the output file name, triple, arch
10415+
// and associated offload kind.
10416+
assert(Output.isFilename() && "Invalid output.");
10417+
StringRef File = Output.getFilename();
10418+
StringRef Arch = OffloadAction->getOffloadingArch()
10419+
? OffloadAction->getOffloadingArch()
10420+
: TCArgs.getLastArgValue(options::OPT_march_EQ);
10421+
StringRef Kind =
10422+
Action::GetOffloadKindName(OffloadAction->getOffloadingDeviceKind());
10423+
10424+
SmallVector<std::string> Parts{
10425+
"file=" + File.str(),
10426+
"triple=" + TC->getTripleString(),
10427+
"arch=" + (Arch.empty() ? "generic" : Arch.str()),
10428+
"kind=" + Kind.str(),
10429+
};
10430+
CmdArgs.push_back(Args.MakeArgString("--image=" + llvm::join(Parts, ",")));
10431+
10432+
C.addCommand(std::make_unique<Command>(
10433+
JA, *this, ResponseFileSupport::None(),
10434+
Args.MakeArgString(getToolChain().GetProgramPath(getShortName())),
10435+
CmdArgs, Inputs, Output));
10436+
}
10437+
1039210438
// Begin OffloadDeps
1039310439

1039410440
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

0 commit comments

Comments
 (0)