Skip to content

Commit 3f53118

Browse files
[SYCL] Add state arguments to SYCLBIN options (#18639)
This commit adds the bundle state as an argument to the -fsyclbin driver option (default to executable) and --syclbin clang-linker-wrapper option (no default). This argument is propagated to the SYCLBIN files. --------- Signed-off-by: Larsen, Steffen <[email protected]>
1 parent 5cce004 commit 3f53118

File tree

7 files changed

+127
-38
lines changed

7 files changed

+127
-38
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7300,8 +7300,10 @@ defm sycl_allow_device_image_dependencies: BoolOptionWithoutMarshalling<"f", "sy
73007300
def fsycl_dump_device_code_EQ : Joined<["-"], "fsycl-dump-device-code=">,
73017301
Flags<[NoXarchOption]>,
73027302
HelpText<"Dump device code into the user provided directory.">;
7303-
def fsyclbin : Flag<["-"], "fsyclbin">,
7304-
HelpText<"Create a SYCLBIN file">;
7303+
def fsyclbin_EQ : Joined<["-"], "fsyclbin=">, Values<"executable,object,input">,
7304+
HelpText<"Output in the SYCLBIN binary format in the state specified by <arg> (input, object or executable (default))">;
7305+
def fsyclbin : Flag<["-"], "fsyclbin">, Alias<fsyclbin_EQ>,
7306+
AliasArgs<["executable"]>;
73057307
} // let Group = sycl_Group
73067308

73077309
// FIXME: -fsycl-explicit-simd is deprecated. remove it when support is dropped.

clang/lib/Driver/Driver.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1230,7 +1230,7 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
12301230
bool IsSYCL = C.getInputArgs().hasFlag(options::OPT_fsycl,
12311231
options::OPT_fno_sycl, false) ||
12321232
C.getInputArgs().hasArgNoClaim(options::OPT_fsycl_device_only,
1233-
options::OPT_fsyclbin);
1233+
options::OPT_fsyclbin_EQ);
12341234

12351235
auto argSYCLIncompatible = [&](OptSpecifier OptId) {
12361236
if (!IsSYCL)
@@ -3470,7 +3470,8 @@ void Driver::BuildInputs(const ToolChain &TC, DerivedArgList &Args,
34703470
Arg *InputTypeArg = nullptr;
34713471
bool IsSYCL =
34723472
Args.hasFlag(options::OPT_fsycl, options::OPT_fno_sycl, false) ||
3473-
Args.hasArgNoClaim(options::OPT_fsycl_device_only, options::OPT_fsyclbin);
3473+
Args.hasArgNoClaim(options::OPT_fsycl_device_only,
3474+
options::OPT_fsyclbin_EQ);
34743475

34753476
// The last /TC or /TP option sets the input type to C or C++ globally.
34763477
if (Arg *TCTP = Args.getLastArgNoClaim(options::OPT__SLASH_TC,
@@ -7958,7 +7959,7 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
79587959
DDep.add(*FatbinAction, *C.getSingleOffloadToolChain<Action::OFK_HIP>(),
79597960
nullptr, Action::OFK_HIP);
79607961
} else if (C.isOffloadingHostKind(Action::OFK_SYCL) &&
7961-
Args.hasArg(options::OPT_fsyclbin)) {
7962+
Args.hasArg(options::OPT_fsyclbin_EQ)) {
79627963
// With '-fsyclbin', package all the offloading actions into a single output
79637964
// that is sent to the clang-linker-wrapper.
79647965
Action *PackagerAction =
@@ -9382,7 +9383,7 @@ const char *Driver::GetNamedOutputPath(Compilation &C, const JobAction &JA,
93829383
return C.addResultFile(FinalOutput->getValue(), &JA);
93839384
// Output to destination for -fsycl-device-only/-fsyclbin and Windows -o
93849385
if ((offloadDeviceOnly() ||
9385-
C.getArgs().hasArgNoClaim(options::OPT_fsyclbin)) &&
9386+
C.getArgs().hasArgNoClaim(options::OPT_fsyclbin_EQ)) &&
93869387
JA.getOffloadingDeviceKind() == Action::OFK_SYCL)
93879388
if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT__SLASH_o))
93889389
return C.addResultFile(FinalOutput->getValue(), &JA);
@@ -9556,7 +9557,7 @@ const char *Driver::GetNamedOutputPath(Compilation &C, const JobAction &JA,
95569557
// resulting image. A '.syclbin' extension is used to represent the resulting
95579558
// output file.
95589559
if (JA.getOffloadingDeviceKind() == Action::OFK_SYCL &&
9559-
C.getArgs().hasArgNoClaim(options::OPT_fsyclbin) &&
9560+
C.getArgs().hasArgNoClaim(options::OPT_fsyclbin_EQ) &&
95609561
JA.getType() == types::TY_Image) {
95619562
SmallString<128> SYCLBinOutput(getDefaultImageName());
95629563
if (IsCLMode())

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11504,8 +11504,9 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA,
1150411504
Args.MakeArgString("--sycl-target-link-options=" + LinkOptString));
1150511505
}
1150611506
// Add option to enable creating of the .syclbin file.
11507-
if (Args.hasArg(options::OPT_fsyclbin))
11508-
CmdArgs.push_back(Args.MakeArgString("--syclbin"));
11507+
if (Arg *A = Args.getLastArg(options::OPT_fsyclbin_EQ))
11508+
CmdArgs.push_back(
11509+
Args.MakeArgString("--syclbin=" + StringRef{A->getValue()}));
1150911510
}
1151011511

1151111512
// Construct the link job so we can wrap around it.

clang/test/Driver/fsyclbin.cpp

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,47 @@
1414
// SYCLBIN_UNUSED: warning: argument unused during compilation: '-fsyclbin'
1515

1616
/// Check tool invocation contents.
17+
// RUN: %clangxx -fsycl -fsyclbin=input --offload-new-driver %s -### 2>&1 \
18+
// RUN: | FileCheck %s --check-prefix=CHECK_TOOLS_INPUT
19+
// RUN: %clangxx -fsyclbin=input --offload-new-driver %s -### 2>&1 \
20+
// RUN: | FileCheck %s --check-prefix=CHECK_TOOLS_INPUT
21+
// RUN: %clang_cl -fsycl -fsyclbin=input --offload-new-driver %s -### 2>&1 \
22+
// RUN: | FileCheck %s --check-prefix=CHECK_TOOLS_INPUT
23+
// CHECK_TOOLS_INPUT: clang-offload-packager
24+
// CHECK_TOOLS_INPUT-SAME: --image=file={{.*}}.bc,triple=spir64-unknown-unknown
25+
// CHECK_TOOLS_INPUT-SAME: kind=sycl
26+
// CHECK_TOOLS_INPUT: clang-linker-wrapper
27+
// CHECK_TOOLS_INPUT-SAME: --syclbin=input
28+
29+
// RUN: %clangxx -fsycl -fsyclbin=object --offload-new-driver %s -### 2>&1 \
30+
// RUN: | FileCheck %s --check-prefix=CHECK_TOOLS_OBJECT
31+
// RUN: %clangxx -fsyclbin=object --offload-new-driver %s -### 2>&1 \
32+
// RUN: | FileCheck %s --check-prefix=CHECK_TOOLS_OBJECT
33+
// RUN: %clang_cl -fsycl -fsyclbin=object --offload-new-driver %s -### 2>&1 \
34+
// RUN: | FileCheck %s --check-prefix=CHECK_TOOLS_OBJECT
35+
// CHECK_TOOLS_OBJECT: clang-offload-packager
36+
// CHECK_TOOLS_OBJECT-SAME: --image=file={{.*}}.bc,triple=spir64-unknown-unknown
37+
// CHECK_TOOLS_OBJECT-SAME: kind=sycl
38+
// CHECK_TOOLS_OBJECT: clang-linker-wrapper
39+
// CHECK_TOOLS_OBJECT-SAME: --syclbin=object
40+
41+
// RUN: %clangxx -fsycl -fsyclbin=executable --offload-new-driver %s -### 2>&1 \
42+
// RUN: | FileCheck %s --check-prefix=CHECK_TOOLS_EXECUTABLE
43+
// RUN: %clangxx -fsyclbin=executable --offload-new-driver %s -### 2>&1 \
44+
// RUN: | FileCheck %s --check-prefix=CHECK_TOOLS_EXECUTABLE
45+
// RUN: %clang_cl -fsycl -fsyclbin=executable --offload-new-driver %s -### 2>&1 \
46+
// RUN: | FileCheck %s --check-prefix=CHECK_TOOLS_EXECUTABLE
1747
// RUN: %clangxx -fsycl -fsyclbin --offload-new-driver %s -### 2>&1 \
18-
// RUN: | FileCheck %s --check-prefix=CHECK_TOOLS
48+
// RUN: | FileCheck %s --check-prefix=CHECK_TOOLS_EXECUTABLE
1949
// RUN: %clangxx -fsyclbin --offload-new-driver %s -### 2>&1 \
20-
// RUN: | FileCheck %s --check-prefix=CHECK_TOOLS
50+
// RUN: | FileCheck %s --check-prefix=CHECK_TOOLS_EXECUTABLE
2151
// RUN: %clang_cl -fsycl -fsyclbin --offload-new-driver %s -### 2>&1 \
22-
// RUN: | FileCheck %s --check-prefix=CHECK_TOOLS
23-
// CHECK_TOOLS: clang-offload-packager
24-
// CHECK_TOOLS-SAME: --image=file={{.*}}.bc,triple=spir64-unknown-unknown
25-
// CHECK_TOOLS-SAME: kind=sycl
26-
// CHECK_TOOLS: clang-linker-wrapper
27-
// CHECK_TOOLS-SAME: --syclbin
52+
// RUN: | FileCheck %s --check-prefix=CHECK_TOOLS_EXECUTABLE
53+
// CHECK_TOOLS_EXECUTABLE: clang-offload-packager
54+
// CHECK_TOOLS_EXECUTABLE-SAME: --image=file={{.*}}.bc,triple=spir64-unknown-unknown
55+
// CHECK_TOOLS_EXECUTABLE-SAME: kind=sycl
56+
// CHECK_TOOLS_EXECUTABLE: clang-linker-wrapper
57+
// CHECK_TOOLS_EXECUTABLE-SAME: --syclbin=executable
2858

2959
/// Check compilation phases, only device compile should be performed
3060
// RUN: %clangxx --target=x86_64-unknown-linux-gnu -fsycl -fsyclbin \

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

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,9 @@ static std::optional<llvm::module_split::IRSplitMode> SYCLModuleSplitMode;
152152

153153
static bool UseSYCLPostLinkTool;
154154

155-
static bool OutputSYCLBIN;
155+
static bool OutputSYCLBIN = false;
156+
157+
static SYCLBIN::BundleState SYCLBINState = SYCLBIN::BundleState::Input;
156158

157159
static SmallString<128> OffloadImageDumpDir;
158160

@@ -2019,7 +2021,6 @@ Expected<SmallVector<StringRef>> linkAndWrapDeviceFiles(
20192021
// When creating SYCLBIN files, we need to store the compiled modules for
20202022
// combined packaging.
20212023
std::mutex SYCLBINModulesMtx;
2022-
SYCLBIN::BundleState SYCLBINState = SYCLBIN::BundleState::Input;
20232024
SmallVector<SYCLBIN::SYCLBINModuleDesc> SYCLBINModules;
20242025

20252026
// Initialize the images with any overriding inputs.
@@ -2671,7 +2672,25 @@ int main(int Argc, char **Argv) {
26712672
"-no-use-sycl-post-link-tool options can't "
26722673
"be used together."));
26732674

2674-
OutputSYCLBIN = Args.hasArg(OPT_syclbin);
2675+
if (Arg *SYCLBINArg = Args.getLastArg(OPT_syclbin_EQ)) {
2676+
OutputSYCLBIN = true;
2677+
auto MaybeSYCLBINState =
2678+
llvm::StringSwitch<std::optional<SYCLBIN::BundleState>>(
2679+
SYCLBINArg->getValue())
2680+
.Case("input", SYCLBIN::BundleState::Input)
2681+
.Case("object", SYCLBIN::BundleState::Object)
2682+
.Case("executable", SYCLBIN::BundleState::Executable)
2683+
.Default(std::nullopt);
2684+
2685+
if (MaybeSYCLBINState)
2686+
SYCLBINState = *MaybeSYCLBINState;
2687+
else
2688+
reportError(
2689+
createStringError("Invalid argument for -syclbin (" +
2690+
StringRef{SYCLBINArg->getValue()} +
2691+
"). Must be either input, object or executable."));
2692+
}
2693+
26752694
if (OutputSYCLBIN && Args.hasArg(OPT_sycl_embed_ir))
26762695
reportError(createStringError(
26772696
"-sycl-embed_ir and -syclbin can't be used together."));

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,6 @@ def sycl_allow_device_image_dependencies : Flag<["--", "-"], "sycl-allow-device-
238238
HelpText<"Allow dependencies between device code images">;
239239

240240
// Options to force the output to be of the SYCLBIN format.
241-
def syclbin : Flag<["--", "-"], "syclbin">,
241+
def syclbin_EQ : Joined<["--", "-"], "syclbin=">,
242242
Flags<[WrapperOnlyOption]>,
243-
HelpText<"Output in the SYCLBIN binary format">;
243+
HelpText<"Output in the SYCLBIN binary format in the state specified by <arg> (input, object or executable)">;

sycl/test/syclbin/simple_kernel.cpp

Lines changed: 52 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
1-
// RUN: %clangxx --offload-new-driver -fsyclbin -o %t.syclbin %s
2-
// RUN: syclbin-dump %t.syclbin | FileCheck %s
1+
// RUN: %clangxx --offload-new-driver -fsyclbin=input -o %t.input.syclbin %s
2+
// RUN: %clangxx --offload-new-driver -fsyclbin=object -o %t.object.syclbin %s
3+
// RUN: %clangxx --offload-new-driver -fsyclbin=executable -o %t.executable.syclbin %s
4+
// RUN: %clangxx --offload-new-driver -fsyclbin -o %t.default.syclbin %s
5+
// RUN: syclbin-dump %t.input.syclbin | FileCheck %s --check-prefix CHECK-INPUT
6+
// RUN: syclbin-dump %t.object.syclbin | FileCheck %s --check-prefix CHECK-OBJECT
7+
// RUN: syclbin-dump %t.executable.syclbin | FileCheck %s --check-prefix CHECK-EXECUTABLE
8+
// RUN: syclbin-dump %t.default.syclbin | FileCheck %s --check-prefix CHECK-EXECUTABLE
39

410
// Checks the generated SYCLBIN contents of a simple SYCL free function kernel.
511

@@ -14,17 +20,47 @@ void TestKernel(int *Ptr, int Size) {
1420
}
1521
}
1622

17-
// CHECK: Version: {{[1-9]+}}
18-
// CHECK-NEXT: Global metadata:
19-
// CHECK-NEXT: SYCLBIN/global metadata:
20-
// CHECK-NEXT: state: 0
21-
// CHECK-NEXT: Number of Abstract Modules: 1
22-
// CHECK-NEXT: Abstract Module 0:
23-
// CHECK-NEXT: Metadata:
24-
// CHECK: Number of IR Modules: 1
25-
// CHECK-NEXT: IR module 0:
26-
// CHECK-NEXT: Metadata:
27-
// CHECK-NEXT: SYCLBIN/ir module metadata:
28-
// CHECK-NEXT: type: 0
29-
// CHECK-NEXT: Raw IR bytes: <Binary blob of {{.*}} bytes>
30-
// CHECK-NEXT: Number of Native Device Code Images: 0
23+
// CHECK-INPUT: Version: {{[1-9]+}}
24+
// CHECK-INPUT-NEXT: Global metadata:
25+
// CHECK-INPUT-NEXT: SYCLBIN/global metadata:
26+
// CHECK-INPUT-NEXT: state: 0
27+
// CHECK-INPUT-NEXT: Number of Abstract Modules: 1
28+
// CHECK-INPUT-NEXT: Abstract Module 0:
29+
// CHECK-INPUT-NEXT: Metadata:
30+
// CHECK-INPUT: Number of IR Modules: 1
31+
// CHECK-INPUT-NEXT: IR module 0:
32+
// CHECK-INPUT-NEXT: Metadata:
33+
// CHECK-INPUT-NEXT: SYCLBIN/ir module metadata:
34+
// CHECK-INPUT-NEXT: type: 0
35+
// CHECK-INPUT-NEXT: Raw IR bytes: <Binary blob of {{.*}} bytes>
36+
// CHECK-INPUT-NEXT: Number of Native Device Code Images: 0
37+
38+
// CHECK-OBJECT: Version: {{[1-9]+}}
39+
// CHECK-OBJECT-NEXT: Global metadata:
40+
// CHECK-OBJECT-NEXT: SYCLBIN/global metadata:
41+
// CHECK-OBJECT-NEXT: state: 1
42+
// CHECK-OBJECT-NEXT: Number of Abstract Modules: 1
43+
// CHECK-OBJECT-NEXT: Abstract Module 0:
44+
// CHECK-OBJECT-NEXT: Metadata:
45+
// CHECK-OBJECT: Number of IR Modules: 1
46+
// CHECK-OBJECT-NEXT: IR module 0:
47+
// CHECK-OBJECT-NEXT: Metadata:
48+
// CHECK-OBJECT-NEXT: SYCLBIN/ir module metadata:
49+
// CHECK-OBJECT-NEXT: type: 0
50+
// CHECK-OBJECT-NEXT: Raw IR bytes: <Binary blob of {{.*}} bytes>
51+
// CHECK-OBJECT-NEXT: Number of Native Device Code Images: 0
52+
53+
// CHECK-EXECUTABLE: Version: {{[1-9]+}}
54+
// CHECK-EXECUTABLE-NEXT: Global metadata:
55+
// CHECK-EXECUTABLE-NEXT: SYCLBIN/global metadata:
56+
// CHECK-EXECUTABLE-NEXT: state: 2
57+
// CHECK-EXECUTABLE-NEXT: Number of Abstract Modules: 1
58+
// CHECK-EXECUTABLE-NEXT: Abstract Module 0:
59+
// CHECK-EXECUTABLE-NEXT: Metadata:
60+
// CHECK-EXECUTABLE: Number of IR Modules: 1
61+
// CHECK-EXECUTABLE-NEXT: IR module 0:
62+
// CHECK-EXECUTABLE-NEXT: Metadata:
63+
// CHECK-EXECUTABLE-NEXT: SYCLBIN/ir module metadata:
64+
// CHECK-EXECUTABLE-NEXT: type: 0
65+
// CHECK-EXECUTABLE-NEXT: Raw IR bytes: <Binary blob of {{.*}} bytes>
66+
// CHECK-EXECUTABLE-NEXT: Number of Native Device Code Images: 0

0 commit comments

Comments
 (0)