https://github.com/asudarsa created https://github.com/llvm/llvm-project/pull/135809
Following are the changes: 1. Make OffloadKind enum values to be powers of two so we can use them like a bitfield 2. Include OFK_SYCL enum value 3. Modify ActiveOffloadKinds support in clang-linker-wrapper to use bitfields instead of a vector. Thanks >From ec072a0ef5b699c58dd2ac404c90a5078f4a774a Mon Sep 17 00:00:00 2001 From: Arvind Sudarsanam <arvind.sudarsa...@intel.com> Date: Tue, 15 Apr 2025 09:27:27 -0700 Subject: [PATCH] [Offload][SYCL] Refactor OffloadKind implementation Signed-off-by: Arvind Sudarsanam <arvind.sudarsa...@intel.com> --- .../tools/clang-linker-wrapper/ClangLinkerWrapper.cpp | 10 ++++++---- llvm/include/llvm/Object/OffloadBinary.h | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp index 52d922abbcaec..a76b6f1da1e1d 100644 --- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp @@ -923,10 +923,9 @@ Expected<SmallVector<StringRef>> linkAndWrapDeviceFiles( }); auto LinkerArgs = getLinkerArgs(Input, BaseArgs); - DenseSet<OffloadKind> ActiveOffloadKinds; + uint16_t ActiveOffloadKindMask = 0u; for (const auto &File : Input) - if (File.getBinary()->getOffloadKind() != OFK_None) - ActiveOffloadKinds.insert(File.getBinary()->getOffloadKind()); + ActiveOffloadKindMask |= File.getBinary()->getOffloadKind(); // Write any remaining device inputs to an output file. SmallVector<StringRef> InputFiles; @@ -943,7 +942,10 @@ Expected<SmallVector<StringRef>> linkAndWrapDeviceFiles( return OutputOrErr.takeError(); // Store the offloading image for each linked output file. - for (OffloadKind Kind : ActiveOffloadKinds) { + for (OffloadKind Kind = OFK_FIRST; Kind != OFK_LAST; + Kind = static_cast<OffloadKind>((uint16_t)(Kind) << 1)) { + if ((ActiveOffloadKindMask & Kind) == 0) + continue; llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> FileOrErr = llvm::MemoryBuffer::getFileOrSTDIN(*OutputOrErr); if (std::error_code EC = FileOrErr.getError()) { diff --git a/llvm/include/llvm/Object/OffloadBinary.h b/llvm/include/llvm/Object/OffloadBinary.h index c02aec8d956ed..858c7a59bce4a 100644 --- a/llvm/include/llvm/Object/OffloadBinary.h +++ b/llvm/include/llvm/Object/OffloadBinary.h @@ -32,10 +32,12 @@ namespace object { /// The producer of the associated offloading image. enum OffloadKind : uint16_t { OFK_None = 0, - OFK_OpenMP, - OFK_Cuda, - OFK_HIP, - OFK_LAST, + OFK_OpenMP = (1 << 1), + OFK_FIRST = OFK_OpenMP, + OFK_Cuda = (1 << 2), + OFK_HIP = (1 << 3), + OFK_SYCL = (1 << 4), + OFK_LAST = (1 << 5), }; /// The type of contents the offloading image contains. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits