Skip to content

Commit 7ee3043

Browse files
committed
Support dynamic linking on new offloading model
1 parent 52796bc commit 7ee3043

File tree

18 files changed

+568
-0
lines changed

18 files changed

+568
-0
lines changed

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11486,6 +11486,13 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA,
1148611486
if (Args.hasArg(options::OPT_fsycl_embed_ir))
1148711487
CmdArgs.push_back(Args.MakeArgString("-sycl-embed-ir"));
1148811488

11489+
if (Args.hasArg(options::OPT_fsycl_allow_device_image_dependencies))
11490+
CmdArgs.push_back(
11491+
Args.MakeArgString("-sycl-allow-device-image-dependencies"));
11492+
if (Args.hasArg(options::OPT_fno_sycl_allow_device_image_dependencies))
11493+
CmdArgs.push_back(
11494+
Args.MakeArgString("-no-sycl-allow-device-image-dependencies"));
11495+
1148911496
// Formulate and add any offload-wrapper and AOT specific options. These
1149011497
// are additional options passed in via -Xsycl-target-linker and
1149111498
// -Xsycl-target-backend.

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -676,6 +676,8 @@ getTripleBasedSYCLPostLinkOpts(const ArgList &Args,
676676
if ((!Args.hasFlag(OPT_no_sycl_remove_unused_external_funcs,
677677
OPT_sycl_remove_unused_external_funcs, false) &&
678678
!SYCLNativeCPU) &&
679+
!Args.hasFlag(OPT_sycl_allow_device_image_dependencies,
680+
OPT_no_sycl_allow_device_image_dependencies, false) &&
679681
!Triple.isNVPTX() && !Triple.isAMDGPU())
680682
PostLinkArgs.push_back("-emit-only-kernels-as-entry-points");
681683

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,3 +243,11 @@ Flags<[WrapperOnlyOption]>, HelpText<"Embed LLVM IR for runtime kernel fusion">
243243
def sycl_dump_device_code_EQ : Joined<["--", "-"], "sycl-dump-device-code=">,
244244
Flags<[WrapperOnlyOption]>,
245245
HelpText<"Path to the folder where the tool dumps SPIR-V device code. Other formats aren't dumped.">;
246+
247+
// Options to enable/disable device dynamic linking.
248+
def sycl_allow_device_image_dependencies : Flag<["--", "-"], "sycl-allow-device-image-dependencies">,
249+
Flags<[WrapperOnlyOption, HelpHidden]>,
250+
HelpText<"Allow dependencies between device code images">;
251+
def no_sycl_allow_device_image_dependencies : Flag<["--", "-"], "no-sycl-allow-device-image-dependencies">,
252+
Flags<[WrapperOnlyOption, HelpHidden]>,
253+
HelpText<"Dno not allow dependencies between device code images (default)">;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#define A_EXPORT
2+
#include "a.hpp"
3+
#include "b.hpp"
4+
#include <iostream>
5+
6+
A_DECLSPEC SYCL_EXTERNAL int levelA(int val) {
7+
#ifndef __SYCL_DEVICE_ONLY__
8+
std::cerr << "Host symbol used" << std::endl;
9+
val ^= 0x1234;
10+
#endif
11+
val = levelB(val);
12+
return val |= (0xA << 0);
13+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#include <sycl/detail/core.hpp>
2+
3+
#if defined(MAKE_DLL)
4+
#ifdef A_EXPORT
5+
#define A_DECLSPEC __declspec(dllexport)
6+
#else
7+
#define A_DECLSPEC __declspec(dllimport)
8+
#endif
9+
#else
10+
#define A_DECLSPEC
11+
#endif
12+
13+
A_DECLSPEC SYCL_EXTERNAL int levelA(int val);
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#define B_EXPORT
2+
#include "b.hpp"
3+
#include "c.hpp"
4+
#include <iostream>
5+
6+
B_DECLSPEC SYCL_EXTERNAL int levelB(int val) {
7+
#ifndef __SYCL_DEVICE_ONLY__
8+
std::cerr << "Host symbol used" << std::endl;
9+
val ^= 0x2345;
10+
#endif
11+
val = levelC(val);
12+
return val |= (0xB << 4);
13+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#include <sycl/detail/core.hpp>
2+
3+
#if defined(MAKE_DLL)
4+
#ifdef B_EXPORT
5+
#define B_DECLSPEC __declspec(dllexport)
6+
#else
7+
#define B_DECLSPEC __declspec(dllimport)
8+
#endif
9+
#else
10+
#define B_DECLSPEC
11+
#endif
12+
13+
B_DECLSPEC SYCL_EXTERNAL int levelB(int val);
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#define C_EXPORT
2+
#include "c.hpp"
3+
#include "d.hpp"
4+
#include <iostream>
5+
6+
C_DECLSPEC SYCL_EXTERNAL int levelC(int val) {
7+
#ifndef __SYCL_DEVICE_ONLY__
8+
std::cerr << "Host symbol used" << std::endl;
9+
val ^= 0x3456;
10+
#endif
11+
val = levelD(val);
12+
return val |= (0xC << 8);
13+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#include <sycl/detail/core.hpp>
2+
3+
#if defined(MAKE_DLL)
4+
#ifdef C_EXPORT
5+
#define C_DECLSPEC __declspec(dllexport)
6+
#else
7+
#define C_DECLSPEC __declspec(dllimport)
8+
#endif
9+
#else
10+
#define C_DECLSPEC
11+
#endif
12+
13+
C_DECLSPEC SYCL_EXTERNAL int levelC(int val);
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#define D_EXPORT
2+
#include "d.hpp"
3+
#include <iostream>
4+
5+
D_DECLSPEC SYCL_EXTERNAL int levelD(int val) {
6+
#ifndef __SYCL_DEVICE_ONLY__
7+
std::cerr << "Host symbol used" << std::endl;
8+
val ^= 0x4567;
9+
#endif
10+
return val |= (0xD << 12);
11+
}

0 commit comments

Comments
 (0)