Skip to content

Commit f6d6baa

Browse files
author
Artem Gindinson
authored
[SYCL][Driver] Do not store AOT-specific options in the image descriptor (#1428)
The OpenCL specification explicitly states that clProgramBuild must be called after clProgramCreateWithBinary. Thus, AOT-compiler specific options, if present in the image descriptor, may not be understood by the RT implementation. This has shown up in FPGA Emulator execution, and could potentially affect other targets. Short-term: only store -compile-opts and -link-opts for SPIR-V images, which will undergo JIT compilation. Long-term: consider providing a mechanism for passing specification-defined compile/link options separately from offline compiler UI-specific ones. Signed-off-by: Artem Gindinson <[email protected]>
1 parent 7ad300d commit f6d6baa

File tree

2 files changed

+31
-11
lines changed

2 files changed

+31
-11
lines changed

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7378,11 +7378,22 @@ void OffloadWrapper::ConstructJob(Compilation &C, const JobAction &JA,
73787378
};
73797379
const toolchains::SYCLToolChain &TC =
73807380
static_cast<const toolchains::SYCLToolChain &>(getToolChain());
7381-
TC.TranslateBackendTargetArgs(TCArgs, BuildArgs);
7382-
createArgString("-compile-opts=");
7383-
BuildArgs.clear();
7384-
TC.TranslateLinkerTargetArgs(TCArgs, BuildArgs);
7385-
createArgString("-link-opts=");
7381+
// TODO: Consider separating the mechanisms for:
7382+
// - passing standard-defined options to AOT/JIT compilation steps;
7383+
// - passing AOT-compiler specific options.
7384+
// This would allow retaining standard language options in the
7385+
// image descriptor, while excluding tool-specific options that
7386+
// have been known to confuse RT implementations.
7387+
if (TC.getTriple().getSubArch() == llvm::Triple::NoSubArch) {
7388+
// Only store compile/link opts in the image descriptor for the SPIR-V
7389+
// target; AOT compilation has already been performed otherwise.
7390+
TC.TranslateBackendTargetArgs(TCArgs, BuildArgs);
7391+
createArgString("-compile-opts=");
7392+
BuildArgs.clear();
7393+
TC.TranslateLinkerTargetArgs(TCArgs, BuildArgs);
7394+
createArgString("-link-opts=");
7395+
}
7396+
73867397
WrapperArgs.push_back(
73877398
C.getArgs().MakeArgString(Twine("-target=") + TargetTripleOpt));
73887399

clang/test/Driver/sycl-offload.c

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -659,17 +659,17 @@
659659
// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fintelfpga -Xs "-DFOO1 -DFOO2" %s 2>&1 \
660660
// RUN: | FileCheck -check-prefix=CHK-TOOLS-FPGA-OPTS %s
661661
// CHK-TOOLS-FPGA-OPTS: aoc{{.*}} "-o" {{.*}} "-DFOO1" "-DFOO2"
662-
// CHK-TOOLS-FPGA-OPTS: clang-offload-wrapper{{.*}} "-compile-opts=\"-DFOO1 -DFOO2\""
662+
// CHK-TOOLS-FPGA-OPTS-NOT: clang-offload-wrapper{{.*}} "-compile-opts={{.*}}
663663

664664
// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-DFOO1 -DFOO2" %s 2>&1 \
665665
// RUN: | FileCheck -check-prefix=CHK-TOOLS-GEN-OPTS %s
666666
// CHK-TOOLS-GEN-OPTS: ocloc{{.*}} "-output" {{.*}} "-output_no_suffix" {{.*}} "-DFOO1" "-DFOO2"
667-
// CHK-TOOLS-GEN-OPTS: clang-offload-wrapper{{.*}} "-compile-opts=\"-DFOO1 -DFOO2\""
667+
// CHK-TOOLS-GEN-OPTS-NOT: clang-offload-wrapper{{.*}} "-compile-opts={{.*}}
668668

669669
// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice -Xsycl-target-backend "-DFOO1 -DFOO2" %s 2>&1 \
670670
// RUN: | FileCheck -check-prefix=CHK-TOOLS-CPU-OPTS %s
671671
// CHK-TOOLS-CPU-OPTS: opencl-aot{{.*}} "-DFOO1" "-DFOO2"
672-
// CHK-TOOLS-CPU-OPTS: clang-offload-wrapper{{.*}} "-compile-opts=\"-DFOO1 -DFOO2\""
672+
// CHK-TOOLS-CPU-OPTS-NOT: clang-offload-wrapper{{.*}} "-compile-opts={{.*}}
673673

674674
// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice -Xsycl-target-backend "-DFOO1 -DFOO2" %s 2>&1 \
675675
// RUN: | FileCheck -check-prefix=CHK-TOOLS-OPTS %s
@@ -679,22 +679,31 @@
679679
// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice -Xsycl-target-linker "-DFOO1 -DFOO2" %s 2>&1 \
680680
// RUN: | FileCheck -check-prefix=CHK-TOOLS-FPGA-OPTS2 %s
681681
// CHK-TOOLS-FPGA-OPTS2: aoc{{.*}} "-o" {{.*}} "-DFOO1" "-DFOO2"
682-
// CHK-TOOLS-FPGA-OPTS2: clang-offload-wrapper{{.*}} "-link-opts=\"-DFOO1 -DFOO2\""
682+
// CHK-TOOLS-FPGA-OPTS2-NOT: clang-offload-wrapper{{.*}} "-link-opts={{.*}}
683683

684684
// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-linker "-DFOO1 -DFOO2" %s 2>&1 \
685685
// RUN: | FileCheck -check-prefix=CHK-TOOLS-GEN-OPTS2 %s
686686
// CHK-TOOLS-GEN-OPTS2: ocloc{{.*}} "-output" {{.*}} "-output_no_suffix" {{.*}} "-DFOO1" "-DFOO2"
687-
// CHK-TOOLS-GEN-OPTS2: clang-offload-wrapper{{.*}} "-link-opts=\"-DFOO1 -DFOO2\""
687+
// CHK-TOOLS-GEN-OPTS2-NOT: clang-offload-wrapper{{.*}} "-link-opts={{.*}}
688688

689689
// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice -Xsycl-target-linker "-DFOO1 -DFOO2" %s 2>&1 \
690690
// RUN: | FileCheck -check-prefix=CHK-TOOLS-CPU-OPTS2 %s
691691
// CHK-TOOLS-CPU-OPTS2: opencl-aot{{.*}} "-DFOO1" "-DFOO2"
692-
// CHK-TOOLS-CPU-OPTS2: clang-offload-wrapper{{.*}} "-link-opts=\"-DFOO1 -DFOO2\""
692+
// CHK-TOOLS-CPU-OPTS2-NOT: clang-offload-wrapper{{.*}} "-link-opts=\"-DFOO1 -DFOO2\""
693693

694694
// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice -Xsycl-target-linker "-DFOO1 -DFOO2" %s 2>&1 \
695695
// RUN: | FileCheck -check-prefix=CHK-TOOLS-OPTS2 %s
696696
// CHK-TOOLS-OPTS2: clang-offload-wrapper{{.*}} "-link-opts=\"-DFOO1 -DFOO2\""
697697

698+
// Sane-check "-compile-opts" and "-link-opts" passing for multiple targets
699+
// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice,spir64_gen-unknown-unknown-sycldevice \
700+
// RUN: -Xsycl-target-backend=spir64_gen-unknown-unknown-sycldevice "-device skl -cl-opt-disable" -Xsycl-target-linker=spir64-unknown-unknown-sycldevice "-cl-denorms-are-zero" %s 2>&1 \
701+
// RUN: | FileCheck -check-prefixes=CHK-TOOLS-MULT-OPTS,CHK-TOOLS-MULT-OPTS-NEG %s
702+
// CHK-TOOLS-MULT-OPTS: clang-offload-wrapper{{.*}} "-link-opts=\"-cl-denorms-are-zero\""{{.*}} "-target=spir64"
703+
// CHK-TOOLS-MULT-OPTS: ocloc{{.*}} "-device" "skl"{{.*}} "-cl-opt-disable"
704+
// CHK-TOOLS-MULT-OPTS-NEG-NOT: clang-offload-wrapper{{.*}} "-compile-opts=\"-device skl -cl-opt-disable\""{{.*}} "-target=spir64"
705+
// CHK-TOOLS-MULT-OPTS-NEG-NOT: clang-offload-wrapper{{.*}} "-link-opts=\"-cl-denorms-are-zero\""{{.*}} "-target=spir64_gen"
706+
698707
/// ###########################################################################
699708

700709
/// offload with multiple targets, including AOT

0 commit comments

Comments
 (0)