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

>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 1/2] [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());
     }
 

>From 99e69bcbcee91e2c0aafb0e31dc440805799a837 Mon Sep 17 00:00:00 2001
From: "Plyakhin, Yury" <[email protected]>
Date: Tue, 10 Feb 2026 04:03:57 +0100
Subject: [PATCH 2/2] std::string -> SmallString

---
 clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp 
b/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp
index baf8f8501dcc3..84e0a15d2c498 100644
--- a/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp
+++ b/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp
@@ -491,17 +491,19 @@ Error runSYCLLink(ArrayRef<std::string> Files, const 
ArgList &Args) {
   SplitModules.emplace_back(*LinkedFile);
 
   // Generate symbol table.
-  SmallVector<std::string> SymbolTable;
+  SmallVector<SmallString<0>> SymbolTable;
   for (size_t I = 0, E = SplitModules.size(); I != E; ++I) {
     Expected<std::unique_ptr<Module>> ModOrErr =
         getBitcodeModule(SplitModules[I], C);
     if (!ModOrErr)
       return ModOrErr.takeError();
 
-    std::string SymbolData;
+    SmallString<0> SymbolData;
     for (Function &F : **ModOrErr) {
-      if (isKernel(F))
-        SymbolData.append(F.getName().data(), F.getName().size() + 1);
+      if (isKernel(F)) {
+        SymbolData.append(F.getName());
+        SymbolData.push_back('\0');
+      }
     }
     SymbolTable.emplace_back(std::move(SymbolData));
   }

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

Reply via email to