[clang] [llvm] [Offload][SYCL] Refactor OffloadKind implementation (PR #135809)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 15 09:31:14 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Arvind Sudarsanam (asudarsa)
<details>
<summary>Changes</summary>
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
---
Full diff: https://github.com/llvm/llvm-project/pull/135809.diff
2 Files Affected:
- (modified) clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp (+6-4)
- (modified) llvm/include/llvm/Object/OffloadBinary.h (+6-4)
``````````diff
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.
``````````
</details>
https://github.com/llvm/llvm-project/pull/135809
More information about the llvm-commits
mailing list