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
