Repository: intel/llvm
Pull request #16763: [SYCL] Link and include LLVMSupport in SYCL library
Author: login: steffenlarsen
Created: 2025-01-24T11:43:02Z | Merged: 2025-05-19T06:46:45Z

These changes propose that the SYCL runtime library privately links against LLVMSupport to avoid the need for replicating common utility code. In the initial version we can use this to remove the property-set names, making it more safely consistent.

These changes intend to aid the implementation of loading SYCL-based kernel binary files at runtime.


Diff:
diff --git a/sycl/source/CMakeLists.txt b/sycl/source/CMakeLists.txt
index e3b62fcea33c6..23688aa02764e 100644
--- a/sycl/source/CMakeLists.txt
+++ b/sycl/source/CMakeLists.txt
@@ -91,15 +91,8 @@ function(add_sycl_rt_library LIB_NAME LIB_OBJ_NAME)
 
   # Feature-specific compilation and link step setup
 
-  # Unlike for sycl library, for LLVMSupport we have only one version for a given build,
-  # so, we link LLVMSupport lib to matching sycl version only.
   if (SYCL_ENABLE_STACK_PRINTING)
-    if(NOT MSVC OR (CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARG_COMPILE_OPTIONS MATCHES ".*MDd.*") OR
-      (NOT CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT ARG_COMPILE_OPTIONS MATCHES ".*MDd.*"))
-        add_dependencies(${LIB_NAME} LLVMSupport)
-        target_compile_definitions(${LIB_OBJ_NAME} PUBLIC ENABLE_STACK_TRACE)
-        target_link_libraries(${LIB_NAME} PRIVATE LLVMSupport)
-    endif()
+    target_compile_definitions(${LIB_OBJ_NAME} PUBLIC ENABLE_STACK_TRACE)
   endif()
 
   # TODO: Enabled for MSVC
@@ -193,6 +186,11 @@ function(add_sycl_rt_library LIB_NAME LIB_OBJ_NAME)
     endif()
   endif()
 
+  # Link with LLVMSupport for shared utilities.
+  add_dependencies(${LIB_NAME} LLVMSupport)
+  target_link_libraries(${LIB_NAME} PRIVATE LLVMSupport)
+  target_include_directories(${LIB_OBJ_NAME} SYSTEM PRIVATE ${LLVM_MAIN_INCLUDE_DIR})
+
   check_linker_flag(CXX "-Wl,--gc-sections" LINKER_SUPPORTS_WL_GC_SECTIONS)
   if(LINKER_SUPPORTS_WL_GC_SECTIONS)
     # Reduces the size of the resulting library by having the linker perform
diff --git a/sycl/source/detail/compiler.hpp b/sycl/source/detail/compiler.hpp
index 056895258e40b..d4c14832f6de0 100644
--- a/sycl/source/detail/compiler.hpp
+++ b/sycl/source/detail/compiler.hpp
@@ -35,45 +35,6 @@
 #define __SYCL_DEVICE_BINARY_TARGET_LLVM_NVPTX64 "llvm_nvptx64"
 #define __SYCL_DEVICE_BINARY_TARGET_LLVM_AMDGCN "llvm_amdgcn"
 
-/// Device binary image property set names recognized by the SYCL runtime.
-/// Name must be consistent with
-/// PropertySetRegistry::SYCL_SPECIALIZATION_CONSTANTS defined in
-/// PropertySetIO.h
-#define __SYCL_PROPERTY_SET_SPEC_CONST_MAP "SYCL/specialization constants"
-/// PropertySetRegistry::SYCL_SPEC_CONSTANTS_DEFAULT_VALUES defined in
-/// PropertySetIO.h
-#define __SYCL_PROPERTY_SET_SPEC_CONST_DEFAULT_VALUES_MAP                      \
-  "SYCL/specialization constants default values"
-/// TODO: remove req mask when sycl devicelib online linking path is removed.
-/// PropertySetRegistry::SYCL_DEVICELIB_REQ_MASK defined in PropertySetIO.h
-#define __SYCL_PROPERTY_SET_DEVICELIB_REQ_MASK "SYCL/devicelib req mask"
-/// PropertySetRegistry::SYCL_DEVICELIB_METADATA defined in PropertySetIO.h
-#define __SYCL_PROPERTY_SET_DEVICELIB_METADATA "SYCL/devicelib metadata"
-/// PropertySetRegistry::SYCL_KERNEL_PARAM_OPT_INFO defined in PropertySetIO.h
-#define __SYCL_PROPERTY_SET_KERNEL_PARAM_OPT_INFO "SYCL/kernel param opt"
-/// PropertySetRegistry::SYCL_KERNEL_PROGRAM_METADATA defined in PropertySetIO.h
-#define __SYCL_PROPERTY_SET_PROGRAM_METADATA "SYCL/program metadata"
-/// PropertySetRegistry::SYCL_MISC_PROP defined in PropertySetIO.h
-#define __SYCL_PROPERTY_SET_SYCL_MISC_PROP "SYCL/misc properties"
-/// PropertySetRegistry::SYCL_ASSERT_USED defined in PropertySetIO.h
-#define __SYCL_PROPERTY_SET_SYCL_ASSERT_USED "SYCL/assert used"
-/// PropertySetRegistry::SYCL_EXPORTED_SYMBOLS defined in PropertySetIO.h
-#define __SYCL_PROPERTY_SET_SYCL_EXPORTED_SYMBOLS "SYCL/exported symbols"
-/// PropertySetRegistry::SYCL_IMPORTED_SYMBOLS defined in PropertySetIO.h
-#define __SYCL_PROPERTY_SET_SYCL_IMPORTED_SYMBOLS "SYCL/imported symbols"
-/// PropertySetRegistry::SYCL_DEVICE_GLOBALS defined in PropertySetIO.h
-#define __SYCL_PROPERTY_SET_SYCL_DEVICE_GLOBALS "SYCL/device globals"
-/// PropertySetRegistry::SYCL_DEVICE_REQUIREMENTS defined in PropertySetIO.h
-#define __SYCL_PROPERTY_SET_SYCL_DEVICE_REQUIREMENTS "SYCL/device requirements"
-/// PropertySetRegistry::SYCL_HOST_PIPES defined in PropertySetIO.h
-#define __SYCL_PROPERTY_SET_SYCL_HOST_PIPES "SYCL/host pipes"
-/// PropertySetRegistry::SYCL_VIRTUAL_FUNCTIONS defined in PropertySetIO.h
-#define __SYCL_PROPERTY_SET_SYCL_VIRTUAL_FUNCTIONS "SYCL/virtual functions"
-/// PropertySetRegistry::SYCL_IMPLICIT_LOCAL_ARG defined in PropertySetIO.h
-#define __SYCL_PROPERTY_SET_SYCL_IMPLICIT_LOCAL_ARG "SYCL/implicit local arg"
-/// PropertySetRegistry::SYCL_REGISTERED_KERNELS defined in PropertySetIO.h
-#define __SYCL_PROPERTY_SET_SYCL_REGISTERED_KERNELS "SYCL/registered kernels"
-
 /// Program metadata tags recognized by the PI backends. For kernels the tag
 /// must appear after the kernel name.
 #define __SYCL_PROGRAM_METADATA_TAG_REQD_WORK_GROUP_SIZE "@reqd_work_group_size"
diff --git a/sycl/source/detail/device_binary_image.cpp b/sycl/source/detail/device_binary_image.cpp
index ec8ff0d895ff0..dcf1015ac6f1a 100644
--- a/sycl/source/detail/device_binary_image.cpp
+++ b/sycl/source/detail/device_binary_image.cpp
@@ -12,6 +12,8 @@
 // For device image compression.
 #include <detail/compression.hpp>
 
+#include <llvm/Support/PropertySetIO.h>
+
 #include <algorithm>
 #include <cstdlib>
 #include <cstring>
@@ -185,28 +187,39 @@ void RTDeviceBinaryImage::init(sycl_device_binary Bin) {
     // try to determine the format; may remain "NONE"
     Format = ur::getBinaryImageFormat(Bin->BinaryStart, getSize());
 
-  SpecConstIDMap.init(Bin, __SYCL_PROPERTY_SET_SPEC_CONST_MAP);
+  SpecConstIDMap.init(
+      Bin, llvm::util::PropertySetRegistry::SYCL_SPECIALIZATION_CONSTANTS);
   SpecConstDefaultValuesMap.init(
-      Bin, __SYCL_PROPERTY_SET_SPEC_CONST_DEFAULT_VALUES_MAP);
-  DeviceLibReqMask.init(Bin, __SYCL_PROPERTY_SET_DEVICELIB_REQ_MASK);
-  DeviceLibMetadata.init(Bin, __SYCL_PROPERTY_SET_DEVICELIB_METADATA);
-  KernelParamOptInfo.init(Bin, __SYCL_PROPERTY_SET_KERNEL_PARAM_OPT_INFO);
-  AssertUsed.init(Bin, __SYCL_PROPERTY_SET_SYCL_ASSERT_USED);
-  ImplicitLocalArg.init(Bin, __SYCL_PROPERTY_SET_SYCL_IMPLICIT_LOCAL_ARG);
-  ProgramMetadata.init(Bin, __SYCL_PROPERTY_SET_PROGRAM_METADATA);
+      Bin, llvm::util::PropertySetRegistry::SYCL_SPEC_CONSTANTS_DEFAULT_VALUES);
+  DeviceLibReqMask.init(
+      Bin, llvm::util::PropertySetRegistry::SYCL_DEVICELIB_REQ_MASK);
+  DeviceLibMetadata.init(
+      Bin, llvm::util::PropertySetRegistry::SYCL_DEVICELIB_METADATA);
+  KernelParamOptInfo.init(
+      Bin, llvm::util::PropertySetRegistry::SYCL_KERNEL_PARAM_OPT_INFO);
+  AssertUsed.init(Bin, llvm::util::PropertySetRegistry::SYCL_ASSERT_USED);
+  ImplicitLocalArg.init(
+      Bin, llvm::util::PropertySetRegistry::SYCL_IMPLICIT_LOCAL_ARG);
+  ProgramMetadata.init(Bin,
+                       llvm::util::PropertySetRegistry::SYCL_PROGRAM_METADATA);
   // Convert ProgramMetadata into the UR format
   for (const auto &Prop : ProgramMetadata) {
     ProgramMetadataUR.push_back(
         ur::mapDeviceBinaryPropertyToProgramMetadata(Prop));
   }
-  ExportedSymbols.init(Bin, __SYCL_PROPERTY_SET_SYCL_EXPORTED_SYMBOLS);
-  ImportedSymbols.init(Bin, __SYCL_PROPERTY_SET_SYCL_IMPORTED_SYMBOLS);
-  DeviceGlobals.init(Bin, __SYCL_PROPERTY_SET_SYCL_DEVICE_GLOBALS);
-  DeviceRequirements.init(Bin, __SYCL_PROPERTY_SET_SYCL_DEVICE_REQUIREMENTS);
-  HostPipes.init(Bin, __SYCL_PROPERTY_SET_SYCL_HOST_PIPES);
-  VirtualFunctions.init(Bin, __SYCL_PROPERTY_SET_SYCL_VIRTUAL_FUNCTIONS);
-  RegisteredKernels.init(Bin, __SYCL_PROPERTY_SET_SYCL_REGISTERED_KERNELS);
-  Misc.init(Bin, __SYCL_PROPERTY_SET_SYCL_MISC_PROP);
+  ExportedSymbols.init(Bin,
+                       llvm::util::PropertySetRegistry::SYCL_EXPORTED_SYMBOLS);
+  ImportedSymbols.init(Bin,
+                       llvm::util::PropertySetRegistry::SYCL_IMPORTED_SYMBOLS);
+  DeviceGlobals.init(Bin, llvm::util::PropertySetRegistry::SYCL_DEVICE_GLOBALS);
+  DeviceRequirements.init(
+      Bin, llvm::util::PropertySetRegistry::SYCL_DEVICE_REQUIREMENTS);
+  HostPipes.init(Bin, llvm::util::PropertySetRegistry::SYCL_HOST_PIPES);
+  VirtualFunctions.init(
+      Bin, llvm::util::PropertySetRegistry::SYCL_VIRTUAL_FUNCTIONS);
+  RegisteredKernels.init(
+      Bin, llvm::util::PropertySetRegistry::SYCL_REGISTERED_KERNELS);
+  Misc.init(Bin, llvm::util::PropertySetRegistry::SYCL_MISC_PROP);
 }
 
 std::atomic<uintptr_t> RTDeviceBinaryImage::ImageCounter = 1;
diff --git a/sycl/source/detail/jit_compiler.cpp b/sycl/source/detail/jit_compiler.cpp
index ffce162ecbab4..4aaf79d9f8c71 100644
--- a/sycl/source/detail/jit_compiler.cpp
+++ b/sycl/source/detail/jit_compiler.cpp
@@ -12,6 +12,8 @@
 #include <sycl/detail/os_util.hpp>
 #include <sycl/detail/ur.hpp>
 
+#include <llvm/Support/PropertySetIO.h>
+
 namespace sycl {
 inline namespace _V1 {
 namespace detail {
@@ -265,7 +267,7 @@ sycl_device_binaries jit_compiler::createDeviceBinaries(
 
     for (const auto &FPS : DevImgInfo.Properties) {
       bool IsDeviceGlobalsPropSet =
-          FPS.Name == __SYCL_PROPERTY_SET_SYCL_DEVICE_GLOBALS;
+          FPS.Name == llvm::util::PropertySetRegistry::SYCL_DEVICE_GLOBALS;
       PropertySetContainer PropSet{FPS.Name.c_str()};
       for (const auto &FPV : FPS.Values) {
         if (FPV.IsUIntValue) {
diff --git a/sycl/source/detail/program_manager/program_manager.cpp b/sycl/source/detail/program_manager/program_manager.cpp
index 96d62df4c046d..8e4ca6d164b9c 100644
--- a/sycl/source/detail/program_manager/program_manager.cpp
+++ b/sycl/source/detail/program_manager/program_manager.cpp
@@ -33,6 +33,8 @@
 
 #include <sycl/ext/oneapi/matrix/query-types.hpp>
 
+#include <llvm/Support/PropertySetIO.h>
+
 #include <algorithm>
 #include <cassert>
 #include <cstdint>
@@ -1860,7 +1862,8 @@ static bool isBfloat16DeviceLibImage(sycl_device_binary RawImg,
   for (ImgPS = RawImg->PropertySetsBegin; ImgPS != RawImg->PropertySetsEnd;
        ++ImgPS) {
     if (ImgPS->Name &&
-        !strcmp(__SYCL_PROPERTY_SET_DEVICELIB_METADATA, ImgPS->Name)) {
+        !strcmp(llvm::util::PropertySetRegistry::SYCL_DEVICELIB_METADATA,
+                ImgPS->Name)) {
       if (!LibVersion)
         return true;
 
@@ -1888,7 +1891,8 @@ getExportedSymbolPS(sycl_device_binary RawImg) {
   for (ImgPS = RawImg->PropertySetsBegin; ImgPS != RawImg->PropertySetsEnd;
        ++ImgPS) {
     if (ImgPS->Name &&
-        !strcmp(__SYCL_PROPERTY_SET_SYCL_EXPORTED_SYMBOLS, ImgPS->Name))
+        !strcmp(llvm::util::PropertySetRegistry::SYCL_EXPORTED_SYMBOLS,
+                ImgPS->Name))
       return ImgPS;
   }
 
diff --git a/sycl/test/CMakeLists.txt b/sycl/test/CMakeLists.txt
index c0a02a874b962..5ec912eb29635 100644
--- a/sycl/test/CMakeLists.txt
+++ b/sycl/test/CMakeLists.txt
@@ -16,6 +16,7 @@ set(SYCL_THREADS_LIB ${CMAKE_THREAD_LIBS_INIT})
 # TEST_INCLUDE_PATH is used for syntax-only verification of type information.
 list(APPEND test_includes ${SYCL_INCLUDE})
 list(APPEND test_includes ${SYCL_SOURCE_DIR}/source)
+list(APPEND test_includes ${LLVM_MAIN_INCLUDE_DIR})
 list(APPEND test_includes ${BOOST_UNORDERED_INCLUDE_DIRS})
 if(SYCL_ENABLE_EXTENSION_JIT)
   list(APPEND test_includes ${LLVM_EXTERNAL_SYCL_JIT_SOURCE_DIR}/jit-compiler/include)
diff --git a/sycl/unittests/Extensions/DeviceGlobal.cpp b/sycl/unittests/Extensions/DeviceGlobal.cpp
index 222970aa1d959..9c6af0db977ee 100644
--- a/sycl/unittests/Extensions/DeviceGlobal.cpp
+++ b/sycl/unittests/Extensions/DeviceGlobal.cpp
@@ -8,6 +8,8 @@
 
 #include <sycl/sycl.hpp>
 
+#include <llvm/Support/PropertySetIO.h>
+
 #include "detail/context_impl.hpp"
 #include "detail/kernel_program_cache.hpp"
 
@@ -64,7 +66,7 @@ static sycl::unittest::MockDeviceImage generateDeviceGlobalImage() {
   MockPropertySet PropSet;
   MockProperty DevGlobInfo =
       makeDeviceGlobalInfo(DeviceGlobalName, sizeof(int) * 2, 0);
-  PropSet.insert(__SYCL_PROPERTY_SET_SYCL_DEVICE_GLOBALS,
+  PropSet.insert(llvm::util::PropertySetRegistry::SYCL_DEVICE_GLOBALS,
                  std::vector<MockProperty>{std::move(DevGlobInfo)});
 
   std::vector<MockOffloadEntry> Entries =
@@ -87,7 +89,7 @@ static sycl::unittest::MockDeviceImage generateDeviceGlobalImgScopeImage() {
   MockPropertySet PropSet;
   MockProperty DevGlobInfo =
       makeDeviceGlobalInfo(DeviceGlobalImgScopeName, sizeof(int) * 2, 1);
-  PropSet.insert(__SYCL_PROPERTY_SET_SYCL_DEVICE_GLOBALS,
+  PropSet.insert(llvm::util::PropertySetRegistry::SYCL_DEVICE_GLOBALS,
                  std::vector<MockProperty>{std::move(DevGlobInfo)});
 
   std::vector<MockOffloadEntry> Entries =
diff --git a/sycl/unittests/Extensions/VirtualFunctions/RuntimeLinking.cpp b/sycl/unittests/Extensions/VirtualFunctions/RuntimeLinking.cpp
index 61e0c5f5f32a5..4c6c8b4c59c03 100644
--- a/sycl/unittests/Extensions/VirtualFunctions/RuntimeLinking.cpp
+++ b/sycl/unittests/Extensions/VirtualFunctions/RuntimeLinking.cpp
@@ -2,6 +2,8 @@
 #include "ur_mock_helpers.hpp"
 #include <sycl/sycl.hpp>
 
+#include <llvm/Support/PropertySetIO.h>
+
 #include <helpers/MockDeviceImage.hpp>
 #include <helpers/MockKernelInfo.hpp>
 #include <helpers/RuntimeLinkingCommon.hpp>
@@ -65,7 +67,8 @@ generateImage(std::initializer_list<std::string> KernelNames,
                                     SYCL_PROPERTY_TYPE_BYTE_ARRAY);
 
   Props.push_back(Prop);
-  PropSet.insert(__SYCL_PROPERTY_SET_SYCL_VIRTUAL_FUNCTIONS, std::move(Props));
+  PropSet.insert(llvm::util::PropertySetRegistry::SYCL_VIRTUAL_FUNCTIONS,
+                 std::move(Props));
 
   std::vector<unsigned char> Bin{Magic};
 
diff --git a/sycl/unittests/helpers/MockDeviceImage.hpp b/sycl/unittests/helpers/MockDeviceImage.hpp
index 9ecf730cc6c1d..5eceb46f1da5c 100644
--- a/sycl/unittests/helpers/MockDeviceImage.hpp
+++ b/sycl/unittests/helpers/MockDeviceImage.hpp
@@ -20,6 +20,8 @@
 
 #include <sycl/detail/defines_elementary.hpp>
 
+#include <llvm/Support/PropertySetIO.h>
+
 namespace sycl {
 inline namespace _V1 {
 namespace unittest {
@@ -191,7 +193,8 @@ class MockPropertySet {
     // Value must be an all-zero 32-bit mask, which would mean that no fallback
     // libraries are needed to be loaded.
     MockProperty DeviceLibReqMask("", Data, SYCL_PROPERTY_TYPE_UINT32);
-    insert(__SYCL_PROPERTY_SET_DEVICELIB_REQ_MASK, std::move(DeviceLibReqMask));
+    insert(llvm::util::PropertySetRegistry::SYCL_DEVICELIB_REQ_MASK,
+           std::move(DeviceLibReqMask));
   }
 
   /// Adds a new property to the set.
@@ -461,7 +464,8 @@ inline void setKernelUsesAssert(const std::vector<std::string> &Names,
   std::vector<MockProperty> Value;
   for (const std::string &N : Names)
     Value.push_back({N, {0, 0, 0, 0}, SYCL_PROPERTY_TYPE_UINT32});
-  Set.insert(__SYCL_PROPERTY_SET_SYCL_ASSERT_USED, std::move(Value));
+  Set.insert(llvm::util::PropertySetRegistry::SYCL_ASSERT_USED,
+             std::move(Value));
 }
 
 /// Utility function to add specialization constants to property set.
@@ -470,12 +474,14 @@ inline void setKernelUsesAssert(const std::vector<std::string> &Names,
 inline void addSpecConstants(std::vector<MockProperty> &&SpecConstants,
                              std::vector<char> ValData,
                              MockPropertySet &Props) {
-  Props.insert(__SYCL_PROPERTY_SET_SPEC_CONST_MAP, std::move(SpecConstants));
+  Props.insert(llvm::util::PropertySetRegistry::SYCL_SPECIALIZATION_CONSTANTS,
+               std::move(SpecConstants));
 
   MockProperty Prop{"all", std::move(ValData), SYCL_PROPERTY_TYPE_BYTE_ARRAY};
 
-  Props.insert(__SYCL_PROPERTY_SET_SPEC_CONST_DEFAULT_VALUES_MAP,
-               std::move(Prop));
+  Props.insert(
+      llvm::util::PropertySetRegistry::SYCL_SPEC_CONSTANTS_DEFAULT_VALUES,
+      std::move(Prop));
 }
 
 /// Utility function to add ESIMD kernel flag to property set.
@@ -484,7 +490,8 @@ inline void addESIMDFlag(MockPropertySet &Props) {
   ValData[0] = 1;
   MockProperty Prop{"isEsimdImage", ValData, SYCL_PROPERTY_TYPE_UINT32};
 
-  Props.insert(__SYCL_PROPERTY_SET_SYCL_MISC_PROP, std::move(Prop));
+  Props.insert(llvm::util::PropertySetRegistry::SYCL_MISC_PROP,
+               std::move(Prop));
 }
 
 /// Utility function to generate offload entries for kernels without arguments.
@@ -597,7 +604,8 @@ addDeviceRequirementsProps(MockPropertySet &Props,
   std::vector<MockProperty> Value{makeAspectsProp(Aspects)};
   if (!ReqdWGSize.empty())
     Value.push_back(makeReqdWGSizeProp(ReqdWGSize));
-  Props.insert(__SYCL_PROPERTY_SET_SYCL_DEVICE_REQUIREMENTS, std::move(Value));
+  Props.insert(llvm::util::PropertySetRegistry::SYCL_DEVICE_REQUIREMENTS,
+               std::move(Value));
 }
 
 inline MockDeviceImage
diff --git a/sycl/unittests/pipes/host_pipe_registration.cpp b/sycl/unittests/pipes/host_pipe_registration.cpp
index c821ddf4e09e9..12054c5321b26 100644
--- a/sycl/unittests/pipes/host_pipe_registration.cpp
+++ b/sycl/unittests/pipes/host_pipe_registration.cpp
@@ -9,6 +9,8 @@
 #include <cstring>
 #include <sycl/sycl.hpp>
 
+#include <llvm/Support/PropertySetIO.h>
+
 #include <detail/device_binary_image.hpp>
 #include <detail/host_pipe_map_entry.hpp>
 #include <gtest/gtest.h>
@@ -38,7 +40,7 @@ static sycl::unittest::MockDeviceImage generateDefaultImage() {
   MockPropertySet PropSet;
   MockProperty HostPipeInfo =
       makeHostPipeInfo("test_host_pipe_unique_id", sizeof(int));
-  PropSet.insert(__SYCL_PROPERTY_SET_SYCL_HOST_PIPES,
+  PropSet.insert(llvm::util::PropertySetRegistry::SYCL_HOST_PIPES,
                  std::vector<MockProperty>{std::move(HostPipeInfo)});
 
   std::vector<MockOffloadEntry> Entries = makeEmptyKernels({"TestKernel"});
diff --git a/sycl/unittests/program_manager/Cleanup.cpp b/sycl/unittests/program_manager/Cleanup.cpp
index 91cc890cc99fd..739a8d6bae45f 100644
--- a/sycl/unittests/program_manager/Cleanup.cpp
+++ b/sycl/unittests/program_manager/Cleanup.cpp
@@ -169,28 +169,29 @@ sycl::unittest::MockDeviceImage generateImage(const std::string &ImageId) {
                                              KernelEAM);
   std::vector<sycl::unittest::MockProperty> ImgKPOI{std::move(EAMKernelPOI)};
 
-  PropSet.insert(__SYCL_PROPERTY_SET_SYCL_EXPORTED_SYMBOLS,
+  PropSet.insert(llvm::util::PropertySetRegistry::SYCL_EXPORTED_SYMBOLS,
                  createPropertySet(ExportedSymbols));
 
-  PropSet.insert(__SYCL_PROPERTY_SET_SYCL_IMPORTED_SYMBOLS,
+  PropSet.insert(llvm::util::PropertySetRegistry::SYCL_IMPORTED_SYMBOLS,
                  createPropertySet(ImportedSymbols));
 
-  PropSet.insert(__SYCL_PROPERTY_SET_SYCL_VIRTUAL_FUNCTIONS,
+  PropSet.insert(llvm::util::PropertySetRegistry::SYCL_VIRTUAL_FUNCTIONS,
                  createVFPropertySet(VirtualFunctions));
   setKernelUsesAssert(std::vector<std::string>{KernelNames.begin()[0]},
                       PropSet);
 
-  PropSet.insert(__SYCL_PROPERTY_SET_SYCL_IMPLICIT_LOCAL_ARG,
+  PropSet.insert(llvm::util::PropertySetRegistry::SYCL_IMPLICIT_LOCAL_ARG,
                  createPropertySet(ImplicitLocalArg));
-  PropSet.insert(__SYCL_PROPERTY_SET_KERNEL_PARAM_OPT_INFO, std::move(ImgKPOI));
+  PropSet.insert(llvm::util::PropertySetRegistry::SYCL_KERNEL_PARAM_OPT_INFO,
+                 std::move(ImgKPOI));
 
   PropSet.insert(
-      __SYCL_PROPERTY_SET_SYCL_DEVICE_GLOBALS,
+      llvm::util::PropertySetRegistry::SYCL_DEVICE_GLOBALS,
       std::vector<sycl::unittest::MockProperty>{
           sycl::unittest::makeDeviceGlobalInfo(
               generateRefName(ImageId, "DeviceGlobal"), sizeof(int), 0)});
 
-  PropSet.insert(__SYCL_PROPERTY_SET_SYCL_HOST_PIPES,
+  PropSet.insert(llvm::util::PropertySetRegistry::SYCL_HOST_PIPES,
                  std::vector<sycl::unittest::MockProperty>{
                      sycl::unittest::makeHostPipeInfo(
                          generateRefName(ImageId, "HostPipe"), sizeof(int))});
diff --git a/sycl/unittests/program_manager/CompileTarget.cpp b/sycl/unittests/program_manager/CompileTarget.cpp
index 9e5e1f8f8e369..756a07b806fc3 100644
--- a/sycl/unittests/program_manager/CompileTarget.cpp
+++ b/sycl/unittests/program_manager/CompileTarget.cpp
@@ -9,6 +9,8 @@
 #include <helpers/MockKernelInfo.hpp>
 #include <helpers/UrMock.hpp>
 
+#include <llvm/Support/PropertySetIO.h>
+
 #include <gtest/gtest.h>
 
 using namespace sycl;
@@ -24,7 +26,7 @@ generateImageWithCompileTarget(std::string KernelName,
   MockProperty CompileTargetProperty("compile_target", Data,
                                      SYCL_PROPERTY_TYPE_BYTE_ARRAY);
   MockPropertySet PropSet;
-  PropSet.insert(__SYCL_PROPERTY_SET_SYCL_DEVICE_REQUIREMENTS,
+  PropSet.insert(llvm::util::PropertySetRegistry::SYCL_DEVICE_REQUIREMENTS,
                  std::move(CompileTargetProperty));
 
   std::vector<unsigned char> Bin(CompileTarget.begin(), CompileTarget.end());
diff --git a/sycl/unittests/program_manager/DynamicLinking/DynamicLinking.cpp b/sycl/unittests/program_manager/DynamicLinking/DynamicLinking.cpp
index c48a5c1626c69..8b278a0e18c89 100644
--- a/sycl/unittests/program_manager/DynamicLinking/DynamicLinking.cpp
+++ b/sycl/unittests/program_manager/DynamicLinking/DynamicLinking.cpp
@@ -1,5 +1,7 @@
 #include <sycl/sycl.hpp>
 
+#include <llvm/Support/PropertySetIO.h>
+
 #include <detail/device_image_impl.hpp>
 #include <helpers/MockDeviceImage.hpp>
 #include <helpers/MockKernelInfo.hpp>
@@ -76,10 +78,10 @@ generateImage(std::initializer_list<std::string> KernelNames,
               const char *DeviceTargetSpec,
               sycl::unittest::MockPropertySet PropSet) {
   if (!ExportedSymbols.empty())
-    PropSet.insert(__SYCL_PROPERTY_SET_SYCL_EXPORTED_SYMBOLS,
+    PropSet.insert(llvm::util::PropertySetRegistry::SYCL_EXPORTED_SYMBOLS,
                    createPropertySet(ExportedSymbols));
   if (!ImportedSymbols.empty())
-    PropSet.insert(__SYCL_PROPERTY_SET_SYCL_IMPORTED_SYMBOLS,
+    PropSet.insert(llvm::util::PropertySetRegistry::SYCL_IMPORTED_SYMBOLS,
                    createPropertySet(ImportedSymbols));
 
   std::vector<unsigned char> Bin{Magic};
diff --git a/sycl/unittests/program_manager/arg_mask/EliminatedArgMask.cpp b/sycl/unittests/program_manager/arg_mask/EliminatedArgMask.cpp
index 1f983aea8bd54..a772812b169dc 100644
--- a/sycl/unittests/program_manager/arg_mask/EliminatedArgMask.cpp
+++ b/sycl/unittests/program_manager/arg_mask/EliminatedArgMask.cpp
@@ -14,6 +14,8 @@
 #include <detail/scheduler/commands.hpp>
 #include <sycl/sycl.hpp>
 
+#include <llvm/Support/PropertySetIO.h>
+
 #include <helpers/MockDeviceImage.hpp>
 #include <helpers/MockKernelInfo.hpp>
 #include <helpers/ScopedEnvVar.hpp>
@@ -82,7 +84,8 @@ static sycl::unittest::MockDeviceImage generateEAMTestKernelImage() {
   std::vector<MockProperty> ImgKPOI{std::move(EAMKernelPOI)};
 
   MockPropertySet PropSet;
-  PropSet.insert(__SYCL_PROPERTY_SET_KERNEL_PARAM_OPT_INFO, std::move(ImgKPOI));
+  PropSet.insert(llvm::util::PropertySetRegistry::SYCL_KERNEL_PARAM_OPT_INFO,
+                 std::move(ImgKPOI));
 
   std::vector<MockOffloadEntry> Entries = makeEmptyKernels({EAMTestKernelName});
 
@@ -101,7 +104,8 @@ static sycl::unittest::MockDeviceImage generateEAMTestKernel3Image() {
   std::vector<MockProperty> ImgKPOI{std::move(EAMKernelPOI)};
 
   MockPropertySet PropSet;
-  PropSet.insert(__SYCL_PROPERTY_SET_KERNEL_PARAM_OPT_INFO, std::move(ImgKPOI));
+  PropSet.insert(llvm::util::PropertySetRegistry::SYCL_KERNEL_PARAM_OPT_INFO,
+                 std::move(ImgKPOI));
 
   std::vector<MockOffloadEntry> Entries =
       makeEmptyKernels({EAMTestKernel3Name});
diff --git a/sycl/unittests/program_manager/passing_link_and_compile_options.cpp b/sycl/unittests/program_manager/passing_link_and_compile_options.cpp
index 4deac120a133e..c743a7da77017 100644
--- a/sycl/unittests/program_manager/passing_link_and_compile_options.cpp
+++ b/sycl/unittests/program_manager/passing_link_and_compile_options.cpp
@@ -14,6 +14,8 @@
 #include <helpers/MockKernelInfo.hpp>
 #include <helpers/UrMock.hpp>
 
+#include <llvm/Support/PropertySetIO.h>
+
 #include <gtest/gtest.h>
 
 std::string current_link_options, current_compile_options, current_build_opts;
@@ -67,7 +69,8 @@ generateEAMTestKernelImage(std::string _cmplOptions, std::string _lnkOptions) {
   std::vector<MockProperty> ImgKPOI{std::move(EAMKernelPOI)};
 
   MockPropertySet PropSet;
-  PropSet.insert(__SYCL_PROPERTY_SET_KERNEL_PARAM_OPT_INFO, std::move(ImgKPOI));
+  PropSet.insert(llvm::util::PropertySetRegistry::SYCL_KERNEL_PARAM_OPT_INFO,
+                 std::move(ImgKPOI));
 
   std::vector<unsigned char> Bin{0, 1, 2, 3, 4, 5}; // Random data
 


Reviews:
user: login: uditagarwal97
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-01-24T16:58:36Z
user: login: steffenlarsen
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-01-24T17:09:48Z
user: login: bader
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-01-24T17:59:55Z
user: login: bader
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-01-24T18:06:53Z
user: login: steffenlarsen
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-01-27T05:53:48Z
user: login: steffenlarsen
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-01-27T06:07:19Z
user: login: sommerlukas
body: The general idea of sharing headers between compiler and runtime to avoid duplication that requires manual maintenance is good, I think. 

Did you measure increase in library size? When we initially added `sycl-jit`, the library binary of `libsycl.so` was a concern, which is why we eventually switched to loading it dynamically.
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-01-27T09:05:27Z
user: login: steffenlarsen
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-01-27T13:55:13Z
user: login: sommerlukas
body: LGTM, just one minor nit/question.
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-05T08:10:41Z
user: login: steffenlarsen
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-06T06:37:21Z
user: login: jopperm
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-06T13:19:07Z
user: login: bader
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-09T16:09:43Z
user: login: steffenlarsen
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-12T06:27:33Z
user: login: aelovikov-intel
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-15T14:13:39Z

Review comments:
diff_hunk: @@ -147,6 +145,18 @@ function(add_sycl_rt_library LIB_NAME LIB_OBJ_NAME)
     PRIVATE OpenCL-Headers
   )
 
+  # Link with LLVMSupport and LLVMObject for shared utilities.
+  add_dependencies(${LIB_OBJ_NAME} LLVMSupport LLVMObject)
+  target_include_directories(${LIB_OBJ_NAME} PRIVATE ${LLVM_MAIN_INCLUDE_DIR})
+  target_link_libraries(${LIB_OBJ_NAME} PRIVATE LLVMSupport LLVMObject)
+  target_compile_definitions(${LIB_OBJ_NAME} PRIVATE LLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING=1)
+  
+  if (NOT MSVC)
path: sycl/source/CMakeLists.txt
user: login: sommerlukas
body: IIRC, you can mark headers as `SYSTEM` in CMake to avoid warning being emitted for them. We do this with the LLVM headers in SYCL-JIT: https://github.com/intel/llvm/blob/sycl/sycl-jit/jit-compiler/CMakeLists.txt#L57-L63
created_at: 2025-01-24T13:34:37Z
author_association: CONTRIBUTOR
diff_hunk: @@ -147,6 +145,18 @@ function(add_sycl_rt_library LIB_NAME LIB_OBJ_NAME)
     PRIVATE OpenCL-Headers
   )
 
+  # Link with LLVMSupport and LLVMObject for shared utilities.
path: sycl/source/CMakeLists.txt
user: login: uditagarwal97
body: I'm skeptical about linking LLVM libraries with SYCL RT. I had a similar discussion with @stdale-intel and @AlexeySachkov while implementing device image compression (like: https://github.com/intel/llvm/pull/15124#discussion_r1740981751) and one of the major concerns was potential version mismatch between LLVM libraries linked to SYCL RT and other components like `ocloc`.
created_at: 2025-01-24T16:58:35Z
author_association: CONTRIBUTOR
diff_hunk: @@ -147,6 +145,18 @@ function(add_sycl_rt_library LIB_NAME LIB_OBJ_NAME)
     PRIVATE OpenCL-Headers
   )
 
+  # Link with LLVMSupport and LLVMObject for shared utilities.
path: sycl/source/CMakeLists.txt
user: login: steffenlarsen
body: I spoke to @AlexeySachkov about this and I agree that it could potentially be a problem if we were to link with it dynamically, but I doubt we would ever want to do that. We already ship enough libraries, and I don't imagine `ocloc` links dynamically with the LLVM libraries either. The only reason we want to link with these are to have some common utilities, so the binary size increase should also be minor as we link privately and won't leak any of the symbols from the libraries.
created_at: 2025-01-24T17:09:48Z
author_association: CONTRIBUTOR
diff_hunk: @@ -147,6 +145,18 @@ function(add_sycl_rt_library LIB_NAME LIB_OBJ_NAME)
     PRIVATE OpenCL-Headers
   )
 
+  # Link with LLVMSupport and LLVMObject for shared utilities.
+  add_dependencies(${LIB_OBJ_NAME} LLVMSupport LLVMObject)
+  target_include_directories(${LIB_OBJ_NAME} PRIVATE ${LLVM_MAIN_INCLUDE_DIR})
path: sycl/source/CMakeLists.txt
user: login: bader
body: Is using `PRIVATE` keyword here enough to protect us from accidentally including LLVM headers into SYCL headers?
created_at: 2025-01-24T17:59:55Z
author_association: CONTRIBUTOR
diff_hunk: @@ -147,6 +145,18 @@ function(add_sycl_rt_library LIB_NAME LIB_OBJ_NAME)
     PRIVATE OpenCL-Headers
   )
 
+  # Link with LLVMSupport and LLVMObject for shared utilities.
path: sycl/source/CMakeLists.txt
user: login: bader
body: Linking LLVM libraries statically still can be a problem if we export any LLVM symbols from the SYCL runtime library. AFAIK, we have some measures to force SYCL runtime to export only explicitly marked symbols, but I would explicitly test compatibly with the projects linking against both SYCL runtime and LLVM libraries.
created_at: 2025-01-24T18:06:53Z
author_association: CONTRIBUTOR
diff_hunk: @@ -147,6 +145,18 @@ function(add_sycl_rt_library LIB_NAME LIB_OBJ_NAME)
     PRIVATE OpenCL-Headers
   )
 
+  # Link with LLVMSupport and LLVMObject for shared utilities.
path: sycl/source/CMakeLists.txt
user: login: steffenlarsen
body: > Linking LLVM libraries statically still can be a problem if we export any LLVM symbols from the SYCL runtime library. AFAIK, we have some measures to force SYCL runtime to export only explicitly marked symbols, but I would explicitly test compatibly with the projects linking against both SYCL runtime and LLVM libraries.

I do believe that should be avoided due to the `PRIVATE` linkage. We should also see it in our ABI symbols tests if there were any new symbols added to the binary after this link, but it seems to not be the case on neither Windows nor Linux.
created_at: 2025-01-27T05:53:48Z
author_association: CONTRIBUTOR
diff_hunk: @@ -147,6 +145,18 @@ function(add_sycl_rt_library LIB_NAME LIB_OBJ_NAME)
     PRIVATE OpenCL-Headers
   )
 
+  # Link with LLVMSupport and LLVMObject for shared utilities.
+  add_dependencies(${LIB_OBJ_NAME} LLVMSupport LLVMObject)
+  target_include_directories(${LIB_OBJ_NAME} PRIVATE ${LLVM_MAIN_INCLUDE_DIR})
path: sycl/source/CMakeLists.txt
user: login: steffenlarsen
body: Based on local testing, 384 check-sycl tests start failing with "fatal error: 'llvm/X.h' file not found" if I introduce an include of an LLVM header in the non-source headers. 
created_at: 2025-01-27T06:07:19Z
author_association: CONTRIBUTOR
diff_hunk: @@ -147,6 +145,18 @@ function(add_sycl_rt_library LIB_NAME LIB_OBJ_NAME)
     PRIVATE OpenCL-Headers
   )
 
+  # Link with LLVMSupport and LLVMObject for shared utilities.
+  add_dependencies(${LIB_OBJ_NAME} LLVMSupport LLVMObject)
+  target_include_directories(${LIB_OBJ_NAME} PRIVATE ${LLVM_MAIN_INCLUDE_DIR})
+  target_link_libraries(${LIB_OBJ_NAME} PRIVATE LLVMSupport LLVMObject)
+  target_compile_definitions(${LIB_OBJ_NAME} PRIVATE LLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING=1)
+  
+  if (NOT MSVC)
path: sycl/source/CMakeLists.txt
user: login: steffenlarsen
body: Oh neat! Much better. 😄 
created_at: 2025-01-27T13:55:13Z
author_association: CONTRIBUTOR
diff_hunk: @@ -187,6 +185,18 @@ function(add_sycl_rt_library LIB_NAME LIB_OBJ_NAME)
     endif()
   endif()
 
+  # Link with LLVMSupport for shared utilities.
+  add_dependencies(${LIB_NAME} LLVMSupport)
+  target_link_libraries(${LIB_NAME} PRIVATE LLVMSupport)
+  target_include_directories(${LIB_OBJ_NAME} SYSTEM PRIVATE ${LLVM_MAIN_INCLUDE_DIR})
+  target_compile_definitions(${LIB_OBJ_NAME} PRIVATE LLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING=1)
path: sycl/source/CMakeLists.txt
user: login: sommerlukas
body: What is this needed for? Should we add an explanatory comment here?
created_at: 2025-05-05T08:05:22Z
author_association: CONTRIBUTOR
diff_hunk: @@ -187,6 +185,18 @@ function(add_sycl_rt_library LIB_NAME LIB_OBJ_NAME)
     endif()
   endif()
 
+  # Link with LLVMSupport for shared utilities.
+  add_dependencies(${LIB_NAME} LLVMSupport)
+  target_link_libraries(${LIB_NAME} PRIVATE LLVMSupport)
+  target_include_directories(${LIB_OBJ_NAME} SYSTEM PRIVATE ${LLVM_MAIN_INCLUDE_DIR})
+  target_compile_definitions(${LIB_OBJ_NAME} PRIVATE LLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING=1)
path: sycl/source/CMakeLists.txt
user: login: steffenlarsen
body: I don't fully remember the reason it was needed, but it does not seem to be needed anymore, likely because it was coming from LLVMObject. When/if we get LLVMObject back in here we can reevaluate, but until then I'll just remove it.
created_at: 2025-05-06T06:37:21Z
author_association: CONTRIBUTOR
diff_hunk: @@ -95,9 +95,7 @@ function(add_sycl_rt_library LIB_NAME LIB_OBJ_NAME)
   if (SYCL_ENABLE_STACK_PRINTING)
     if(NOT MSVC OR (CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARG_COMPILE_OPTIONS MATCHES ".*MDd.*") OR
path: sycl/source/CMakeLists.txt
user: login: bader
body: Please, update the comment above this code block as well.
created_at: 2025-05-09T16:07:23Z
author_association: CONTRIBUTOR
diff_hunk: @@ -95,9 +95,7 @@ function(add_sycl_rt_library LIB_NAME LIB_OBJ_NAME)
   if (SYCL_ENABLE_STACK_PRINTING)
     if(NOT MSVC OR (CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARG_COMPILE_OPTIONS MATCHES ".*MDd.*") OR
path: sycl/source/CMakeLists.txt
user: login: steffenlarsen
body: Actually, I think we can enable this in general. It doesn't seem like LLVMSupport is conflicting with UCRT anymore, and once https://github.com/intel/llvm/pull/18200 is merged, problems with UCRT in relation to situations like this will be a thing of the past.
created_at: 2025-05-12T06:27:33Z
author_association: CONTRIBUTOR

PR comments:
user: login: steffenlarsen
created_at: 2025-01-24T11:44:55Z
body: @jopperm @bader @sommerlukas @cperkinsintel @AlexeySachkov @uditagarwal97 @sergey-semenov @aelovikov-intel - I realize that this change can be somewhat controversial, so please raise any concerns and we can discuss them.
author_association: CONTRIBUTOR
user: login: cperkinsintel
created_at: 2025-01-24T19:34:32Z
body: Besides `PropertySetRegistry` are there other LLVM utils you think we might/should leverage in the future?
author_association: CONTRIBUTOR
user: login: steffenlarsen
created_at: 2025-01-27T05:57:52Z
body: > Besides `PropertySetRegistry` are there other LLVM utils you think we might/should leverage in the future?

A future extension is going to introduce a file-format that both the runtime and the compiler tooling will need to be able to read/write. Being able to share the logic will simplify the code immensely.
author_association: CONTRIBUTOR
user: login: steffenlarsen
created_at: 2025-01-27T13:43:37Z
body: > Did you measure increase in library size? When we initially added `sycl-jit`, the library binary of `libsycl.so` was a concern, which is why we eventually switched to loading it dynamically.

I did initially try to, but must have failed. It does indeed seem like the library size increases quite a bit (~4x). However, if we add 
```
    target_link_options(${LIB_NAME} PRIVATE -Wl,--gc-sections)
```
that seems to drop down to only an increase in size of about 8%. I can play with a few more options to see if there's more of it we can cut. I also need to check what the effect is on Windows and if there's a corresponding option there.
author_association: CONTRIBUTOR
user: login: steffenlarsen
created_at: 2025-05-02T03:22:40Z
body: @jopperm @bader @sommerlukas @cperkinsintel @AlexeySachkov @uditagarwal97 @sergey-semenov @aelovikov-intel - I am going to wake this sleeping bear.

Note that I've removed LLVMObject for now, as it is causing some problems due to inconsistent Windows debug library dependencies (https://github.com/intel/llvm/pull/18200 should allow us to avoid these problems.) So for now it is only LLVMSupport.

As @sommerlukas pointed out, there is a size difference in the resulting libsycl.so files, but with the `-Wl,--gc-sections` link options, the resulting libsycl.so file is actually smaller than the one we currently produce. If we want, I can add this option in a separate patch for the sake of logical separation. On Windows I observe no difference in the library size.
author_association: CONTRIBUTOR
user: login: steffenlarsen
created_at: 2025-05-02T04:15:30Z
body: > As @sommerlukas pointed out, there is a size difference in the resulting libsycl.so files, but with the `-Wl,--gc-sections` link options, the resulting libsycl.so file is actually smaller than the one we currently produce. If we want, I can add this option in a separate patch for the sake of logical separation. On Windows I observe no difference in the library size.

https://github.com/intel/llvm/pull/18293 splits it into a separate PR.
author_association: CONTRIBUTOR
user: login: steffenlarsen
created_at: 2025-05-09T11:06:17Z
body: @bader @cperkinsintel @AlexeySachkov @uditagarwal97 @sergey-semenov @aelovikov-intel - Any objections to this going in?
author_association: CONTRIBUTOR
user: login: steffenlarsen
created_at: 2025-05-13T10:14:03Z
body: Looks like we have no objections. I will go ahead with it to unblock future work.

Arc failures:
Failed Tests (4):
  SYCL :: KernelAndProgram/cache_env_vars.cpp
  SYCL :: KernelAndProgram/cache_env_vars_lin.cpp
  SYCL :: KernelCompiler/opencl.cpp
  SYCL :: KernelCompiler/sycl_cache_pm.cpp

https://github.com/intel/llvm/issues/18416
author_association: CONTRIBUTOR
user: login: steffenlarsen
created_at: 2025-05-13T10:15:08Z
body: @cperkinsintel / @aelovikov-intel / @uditagarwal97 / @intel/llvm-reviewers-runtime - Could you please have a look and give an approval if you are alright with the changes?
author_association: CONTRIBUTOR
user: login: steffenlarsen
created_at: 2025-05-15T13:24:46Z
body: @cperkinsintel / @aelovikov-intel / @uditagarwal97 / @intel/llvm-reviewers-runtime - Friendly ping.
author_association: CONTRIBUTOR