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
