diff --git a/sycl/CMakeLists.txt b/sycl/CMakeLists.txt index 9b98bef1a849c..cd6daaaa89446 100644 --- a/sycl/CMakeLists.txt +++ b/sycl/CMakeLists.txt @@ -400,6 +400,7 @@ add_custom_target( sycl-toolchain ALL DEPENDS sycl-runtime-libraries sycl-compiler sycl-ls + syclbin-dump ${XPTIFW_LIBS} COMMENT "Building SYCL compiler toolchain..." ) @@ -472,6 +473,7 @@ set( SYCL_TOOLCHAIN_DEPLOY_COMPONENTS spirv-to-ir-wrapper sycl-post-link sycl-ls + syclbin-dump clang-resource-headers OpenCL-Headers opencl-aot diff --git a/sycl/test-e2e/SYCLBIN/simple_kernel_aot.cpp b/sycl/test-e2e/SYCLBIN/simple_kernel_aot.cpp new file mode 100644 index 0000000000000..9c2bdc2ffbc43 --- /dev/null +++ b/sycl/test-e2e/SYCLBIN/simple_kernel_aot.cpp @@ -0,0 +1,93 @@ +// UNSUPPORTED: windows +// UNSUPPORTED-TRACKER: https://github.com/intel/llvm/issues/19373 + +// REQUIRES: ocloc + +// RUN: %clangxx --offload-new-driver -fsyclbin=input -fsycl-targets=spir64_gen -Xsycl-target-backend=spir64_gen "-device bmg-g21" -o %t.input_bmg_g21_gpu_device_arch.syclbin %s +// RUN: %clangxx --offload-new-driver -fsyclbin=input -fsycl-targets=spir64_gen -Xsycl-target-backend=spir64_gen "-device *" -o %t.input_all_gpu_device_archs.syclbin %s +// RUN: %clangxx --offload-new-driver -fsyclbin=object -fsycl-targets=spir64_gen -Xsycl-target-backend=spir64_gen "-device bmg-g21" -o %t.object_bmg_g21_gpu_device_arch.syclbin %s +// RUN: %clangxx --offload-new-driver -fsyclbin=executable -fsycl-targets=spir64_gen -Xsycl-target-backend=spir64_gen "-device bmg-g21" -o %t.executable_bmg_g21_gpu_device_arch.syclbin %s +// RUN: %clangxx --offload-new-driver -fsyclbin -fsycl-targets=spir64_gen -Xsycl-target-backend=spir64_gen "-device bmg-g21" -o %t.default_bmg_g21_gpu_device_arch.syclbin %s + +// RUN: syclbin-dump %t.input_bmg_g21_gpu_device_arch.syclbin | FileCheck %s --check-prefix CHECK-INPUT-BMG-G21-GPU-DEVICE-ARCH +// RUN: syclbin-dump %t.input_all_gpu_device_archs.syclbin | FileCheck %s --check-prefix CHECK-INPUT-ALL-GPU-DEVICE-ARCHS +// RUN: syclbin-dump %t.object_bmg_g21_gpu_device_arch.syclbin | FileCheck %s --check-prefix CHECK-OBJECT-BMG-G21-GPU-DEVICE-ARCH +// RUN: syclbin-dump %t.executable_bmg_g21_gpu_device_arch.syclbin | FileCheck %s --check-prefix CHECK-EXECUTABLE-BMG-G21-GPU-DEVICE-ARCH +// RUN: syclbin-dump %t.default_bmg_g21_gpu_device_arch.syclbin | FileCheck %s --check-prefix CHECK-EXECUTABLE-BMG-G21-GPU-DEVICE-ARCH + +// Checks the generated SYCLBIN contents of a simple SYCL free function kernel. + +#include + +extern "C" { +SYCL_EXT_ONEAPI_FUNCTION_PROPERTY( + (sycl::ext::oneapi::experimental::single_task_kernel)) +void TestKernel(int *Ptr, int Size) { + for (size_t I = 0; I < Size; ++I) + Ptr[I] = I; +} +} + +// CHECK-INPUT-BMG-G21-GPU-DEVICE-ARCH: Version: {{[1-9]+}} +// CHECK-INPUT-BMG-G21-GPU-DEVICE-ARCH-NEXT: Global metadata: +// CHECK-INPUT-BMG-G21-GPU-DEVICE-ARCH-NEXT: SYCLBIN/global metadata: +// CHECK-INPUT-BMG-G21-GPU-DEVICE-ARCH-NEXT: state: 0 +// CHECK-INPUT-BMG-G21-GPU-DEVICE-ARCH-NEXT: Number of Abstract Modules: 1 +// CHECK-INPUT-BMG-G21-GPU-DEVICE-ARCH-NEXT: Abstract Module 0: +// CHECK-INPUT-BMG-G21-GPU-DEVICE-ARCH-NEXT: Metadata: +// CHECK-INPUT-BMG-G21-GPU-DEVICE-ARCH: Number of IR Modules: 0 +// CHECK-INPUT-BMG-G21-GPU-DEVICE-ARCH-NEXT: Number of Native Device Code Images: 1 +// CHECK-INPUT-BMG-G21-GPU-DEVICE-ARCH-NEXT: Native device code image 0: +// CHECK-INPUT-BMG-G21-GPU-DEVICE-ARCH-NEXT: Metadata: +// CHECK-INPUT-BMG-G21-GPU-DEVICE-ARCH-NEXT: SYCLBIN/native device code image metadata: +// CHECK-INPUT-BMG-G21-GPU-DEVICE-ARCH-NEXT: arch:{{.*}} +// CHECK-INPUT-BMG-G21-GPU-DEVICE-ARCH-NEXT: target:{{.*}}spir64_gen-unknown +// CHECK-INPUT-BMG-G21-GPU-DEVICE-ARCH-NEXT: Raw native device code image bytes: + +// CHECK-INPUT-ALL-GPU-DEVICE-ARCHS: Version: {{[1-9]+}} +// CHECK-INPUT-ALL-GPU-DEVICE-ARCHS-NEXT: Global metadata: +// CHECK-INPUT-ALL-GPU-DEVICE-ARCHS-NEXT: SYCLBIN/global metadata: +// CHECK-INPUT-ALL-GPU-DEVICE-ARCHS-NEXT: state: 0 +// CHECK-INPUT-ALL-GPU-DEVICE-ARCHS-NEXT: Number of Abstract Modules: 1 +// CHECK-INPUT-ALL-GPU-DEVICE-ARCHS-NEXT: Abstract Module 0: +// CHECK-INPUT-ALL-GPU-DEVICE-ARCHS-NEXT: Metadata: +// CHECK-INPUT-ALL-GPU-DEVICE-ARCHS: Number of IR Modules: 0 +// CHECK-INPUT-ALL-GPU-DEVICE-ARCHS-NEXT: Number of Native Device Code Images: 1 +// CHECK-INPUT-ALL-GPU-DEVICE-ARCHS-NEXT: Native device code image 0: +// CHECK-INPUT-ALL-GPU-DEVICE-ARCHS-NEXT: Metadata: +// CHECK-INPUT-ALL-GPU-DEVICE-ARCHS-NEXT: SYCLBIN/native device code image metadata: +// CHECK-INPUT-ALL-GPU-DEVICE-ARCHS-NEXT: arch:{{.*}} +// CHECK-INPUT-ALL-GPU-DEVICE-ARCHS-NEXT: target:{{.*}}spir64_gen-unknown +// CHECK-INPUT-ALL-GPU-DEVICE-ARCHS-NEXT: Raw native device code image bytes: + +// CHECK-OBJECT-BMG-G21-GPU-DEVICE-ARCH: Version: {{[1-9]+}} +// CHECK-OBJECT-BMG-G21-GPU-DEVICE-ARCH-NEXT: Global metadata: +// CHECK-OBJECT-BMG-G21-GPU-DEVICE-ARCH-NEXT: SYCLBIN/global metadata: +// CHECK-OBJECT-BMG-G21-GPU-DEVICE-ARCH-NEXT: state: 1 +// CHECK-OBJECT-BMG-G21-GPU-DEVICE-ARCH-NEXT: Number of Abstract Modules: 1 +// CHECK-OBJECT-BMG-G21-GPU-DEVICE-ARCH-NEXT: Abstract Module 0: +// CHECK-OBJECT-BMG-G21-GPU-DEVICE-ARCH-NEXT: Metadata: +// CHECK-OBJECT-BMG-G21-GPU-DEVICE-ARCH: Number of IR Modules: 0 +// CHECK-OBJECT-BMG-G21-GPU-DEVICE-ARCH-NEXT: Number of Native Device Code Images: 1 +// CHECK-OBJECT-BMG-G21-GPU-DEVICE-ARCH-NEXT: Native device code image 0: +// CHECK-OBJECT-BMG-G21-GPU-DEVICE-ARCH-NEXT: Metadata: +// CHECK-OBJECT-BMG-G21-GPU-DEVICE-ARCH-NEXT: SYCLBIN/native device code image metadata: +// CHECK-OBJECT-BMG-G21-GPU-DEVICE-ARCH-NEXT: arch:{{.*}} +// CHECK-OBJECT-BMG-G21-GPU-DEVICE-ARCH-NEXT: target:{{.*}}spir64_gen-unknown +// CHECK-OBJECT-BMG-G21-GPU-DEVICE-ARCH-NEXT: Raw native device code image bytes: + +// CHECK-EXECUTABLE-BMG-G21-GPU-DEVICE-ARCH: Version: {{[1-9]+}} +// CHECK-EXECUTABLE-BMG-G21-GPU-DEVICE-ARCH-NEXT: Global metadata: +// CHECK-EXECUTABLE-BMG-G21-GPU-DEVICE-ARCH-NEXT: SYCLBIN/global metadata: +// CHECK-EXECUTABLE-BMG-G21-GPU-DEVICE-ARCH-NEXT: state: 2 +// CHECK-EXECUTABLE-BMG-G21-GPU-DEVICE-ARCH-NEXT: Number of Abstract Modules: 1 +// CHECK-EXECUTABLE-BMG-G21-GPU-DEVICE-ARCH-NEXT: Abstract Module 0: +// CHECK-EXECUTABLE-BMG-G21-GPU-DEVICE-ARCH-NEXT: Metadata: +// CHECK-EXECUTABLE-BMG-G21-GPU-DEVICE-ARCH: Number of IR Modules: 0 +// CHECK-EXECUTABLE-BMG-G21-GPU-DEVICE-ARCH-NEXT: Number of Native Device Code Images: 1 +// CHECK-EXECUTABLE-BMG-G21-GPU-DEVICE-ARCH-NEXT: Native device code image 0: +// CHECK-EXECUTABLE-BMG-G21-GPU-DEVICE-ARCH-NEXT: Metadata: +// CHECK-EXECUTABLE-BMG-G21-GPU-DEVICE-ARCH-NEXT: SYCLBIN/native device code image metadata: +// CHECK-EXECUTABLE-BMG-G21-GPU-DEVICE-ARCH-NEXT: arch:{{.*}} +// CHECK-EXECUTABLE-BMG-G21-GPU-DEVICE-ARCH-NEXT: target:{{.*}}spir64_gen-unknown +// CHECK-EXECUTABLE-BMG-G21-GPU-DEVICE-ARCH-NEXT: Raw native device code image bytes: diff --git a/sycl/test-e2e/lit.cfg.py b/sycl/test-e2e/lit.cfg.py index 99d841a49d391..2f91e68f12f76 100644 --- a/sycl/test-e2e/lit.cfg.py +++ b/sycl/test-e2e/lit.cfg.py @@ -630,6 +630,12 @@ def open_check_file(file_name): if not sycl_ls: lit_config.fatal("can't find `sycl-ls`") +syclbin_dump = FindTool("syclbin-dump").resolve( + llvm_config, os.pathsep.join([config.dpcpp_bin_dir, config.llvm_tools_dir]) +) +if not syclbin_dump: + lit_config.fatal("can't find `syclbin-dump`") + if ( len(config.sycl_build_targets) == 1 and next(iter(config.sycl_build_targets)) == "target-all" @@ -807,6 +813,7 @@ def remove_level_zero_suffix(devices): r"\| \bnot\b", command=FindTool("not"), verbatim=True, unresolved="ignore" ), ToolSubst("sycl-ls", command=sycl_ls, unresolved="ignore"), + ToolSubst("syclbin-dump", command=syclbin_dump, unresolved="ignore"), ] + feature_tools # Try and find each of these tools in the DPC++ bin directory, in the llvm tools directory diff --git a/sycl/test/e2e_test_requirements/no_sycl_hpp_in_e2e_tests.cpp b/sycl/test/e2e_test_requirements/no_sycl_hpp_in_e2e_tests.cpp index 4292342068187..7f3757fc70624 100644 --- a/sycl/test/e2e_test_requirements/no_sycl_hpp_in_e2e_tests.cpp +++ b/sycl/test/e2e_test_requirements/no_sycl_hpp_in_e2e_tests.cpp @@ -6,7 +6,7 @@ // CHECK-DAG: README.md // CHECK-DAG: lit.cfg.py // -// CHECK-NUM-MATCHES: 28 +// CHECK-NUM-MATCHES: 29 // // This test verifies that `` isn't used in E2E tests. Instead, // fine-grained includes should used, see diff --git a/sycl/test/syclbin/Inputs/malformed.syclbin b/sycl/test/syclbin/Inputs/malformed.syclbin new file mode 100644 index 0000000000000..67cce3092daed Binary files /dev/null and b/sycl/test/syclbin/Inputs/malformed.syclbin differ diff --git a/sycl/test/syclbin/input_files.cpp b/sycl/test/syclbin/input_files.cpp new file mode 100644 index 0000000000000..dce1bb0ee5edd --- /dev/null +++ b/sycl/test/syclbin/input_files.cpp @@ -0,0 +1,5 @@ +// RUN: not syclbin-dump nonexistent.syclbin 2>&1 | FileCheck %s --check-prefix CHECK-NONEXISTENT-FILE +// RUN: not syclbin-dump %S/Inputs/malformed.syclbin 2>&1 | FileCheck %s --check-prefix CHECK-MALFORMED-FILE + +// CHECK-NONEXISTENT-FILE: Failed to open or read file nonexistent.syclbin +// CHECK-MALFORMED-FILE: Invalid data was encountered while parsing the file diff --git a/sycl/tools/syclbin-dump/syclbin-dump.cpp b/sycl/tools/syclbin-dump/syclbin-dump.cpp index 6423072c116f5..a3ca1d7c52fae 100644 --- a/sycl/tools/syclbin-dump/syclbin-dump.cpp +++ b/sycl/tools/syclbin-dump/syclbin-dump.cpp @@ -50,19 +50,6 @@ raw_ostream &operator<<(raw_ostream &OS, const ScopedIndent &) { return OS.indent(CurrentIndentationLevel); } -std::string_view StateToString(llvm::object::SYCLBIN::BundleState State) { - switch (State) { - case llvm::object::SYCLBIN::BundleState::Input: - return "input"; - case llvm::object::SYCLBIN::BundleState::Object: - return "object"; - case llvm::object::SYCLBIN::BundleState::Executable: - return "executable"; - default: - return "UNKNOWN"; - } -} - std::string PropertyValueToString(const llvm::util::PropertyValue &PropVal) { switch (PropVal.getType()) { case llvm::util::PropertyValue::UINT32: