https://github.com/YuriPlyakhin created 
https://github.com/llvm/llvm-project/pull/180274

Previously, kernel symbols in offload binaries for SYCL had to be stored as 
newline-separated strings and we had to use llvm::join and line_iterator. It 
was needed because Offload Binary v1 format did not store string value sizes. 
It is not necessary with Offload Binary v2 format, which stores string value 
size and hence eliminates the need for newline separators.

>From dca51505f46c541991e7d90582542bffde1627a7 Mon Sep 17 00:00:00 2001
From: "Plyakhin, Yury" <[email protected]>
Date: Fri, 6 Feb 2026 20:35:27 +0100
Subject: [PATCH] [Offload][SYCL] Refactoring: get rid of newline separators

Previously, kernel symbols in offload binaries for SYCL had to be stored as
newline-separated strings and we had to use llvm::join and line_iterator.
It was needed because Offload Binary v1 format did not store string value sizes.
It is not necessary with Offload Binary v2 format,
which stores string value size and hence eliminates the need for newline
separators.
---
 .../clang-sycl-linker/ClangSYCLLinker.cpp     |  6 +++---
 .../Frontend/Offloading/OffloadWrapper.cpp    | 21 ++++++++++++-------
 2 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp 
b/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp
index 6c400e39405f6..baf8f8501dcc3 100644
--- a/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp
+++ b/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp
@@ -498,12 +498,12 @@ Error runSYCLLink(ArrayRef<std::string> Files, const 
ArgList &Args) {
     if (!ModOrErr)
       return ModOrErr.takeError();
 
-    SmallVector<StringRef> Symbols;
+    std::string SymbolData;
     for (Function &F : **ModOrErr) {
       if (isKernel(F))
-        Symbols.push_back(F.getName());
+        SymbolData.append(F.getName().data(), F.getName().size() + 1);
     }
-    SymbolTable.emplace_back(llvm::join(Symbols.begin(), Symbols.end(), "\n"));
+    SymbolTable.emplace_back(std::move(SymbolData));
   }
 
   bool IsAOTCompileNeeded = IsIntelOffloadArch(
diff --git a/llvm/lib/Frontend/Offloading/OffloadWrapper.cpp 
b/llvm/lib/Frontend/Offloading/OffloadWrapper.cpp
index 5e341ada1889e..190f23770b736 100644
--- a/llvm/lib/Frontend/Offloading/OffloadWrapper.cpp
+++ b/llvm/lib/Frontend/Offloading/OffloadWrapper.cpp
@@ -916,14 +916,19 @@ class SYCLWrapper {
   std::pair<Constant *, Constant *>
   initOffloadEntriesPerImage(StringRef Entries, const Twine &OffloadKindTag) {
     SmallVector<Constant *> EntriesInits;
-    std::unique_ptr<MemoryBuffer> MB = MemoryBuffer::getMemBuffer(
-        Entries, /*BufferName*/ "", /*RequiresNullTerminator*/ false);
-    for (line_iterator LI(*MB); !LI.is_at_eof(); ++LI) {
-      GlobalVariable *GV =
-          emitOffloadingEntry(M, /*Kind*/ OffloadKind::OFK_SYCL,
-                              
Constant::getNullValue(PointerType::getUnqual(C)),
-                              /*Name*/ *LI, /*Size*/ 0,
-                              /*Flags*/ 0, /*Data*/ 0);
+    const char *Current = Entries.data();
+    const char *End = Current + Entries.size();
+    while (Current < End) {
+      StringRef Name(Current);
+      Current += Name.size() + 1;
+
+      if (Name.empty())
+        continue;
+
+      GlobalVariable *GV = emitOffloadingEntry(
+          M, /*Kind*/ OffloadKind::OFK_SYCL,
+          Constant::getNullValue(PointerType::getUnqual(C)), Name, /*Size*/ 0,
+          /*Flags*/ 0, /*Data*/ 0);
       EntriesInits.push_back(GV->getInitializer());
     }
 

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to