Author: Yury Plyakhin Date: 2026-02-10T12:01:13-08:00 New Revision: 81a8363ae3144e4c59322492ac5f08a6ceeb106d
URL: https://github.com/llvm/llvm-project/commit/81a8363ae3144e4c59322492ac5f08a6ceeb106d DIFF: https://github.com/llvm/llvm-project/commit/81a8363ae3144e4c59322492ac5f08a6ceeb106d.diff LOG: [Offload][SYCL] Refactoring: get rid of newline separators (#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. Added: Modified: clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp llvm/lib/Frontend/Offloading/OffloadWrapper.cpp Removed: ################################################################################ diff --git a/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp b/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp index 6c400e39405f6..84e0a15d2c498 100644 --- a/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp +++ b/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp @@ -491,19 +491,21 @@ 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(); - SmallVector<StringRef> Symbols; + SmallString<0> SymbolData; for (Function &F : **ModOrErr) { - if (isKernel(F)) - Symbols.push_back(F.getName()); + if (isKernel(F)) { + SymbolData.append(F.getName()); + SymbolData.push_back('\0'); + } } - 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
