Skip to content

Commit d07251d

Browse files
committed
[clang-sycl-linker] Generate SymbolTable for each image
This PR adds extraction of kernel names for each image and stores them to the Image's StringData field.
1 parent 045e09f commit d07251d

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,12 @@ static Error runAOTCompile(StringRef InputFile, StringRef OutputFile,
466466
return createStringError(inconvertibleErrorCode(), "Unsupported arch");
467467
}
468468

469+
bool isKernel(const Function &F) {
470+
const CallingConv::ID CC = F.getCallingConv();
471+
return CC == CallingConv::SPIR_KERNEL || CC == CallingConv::AMDGPU_KERNEL ||
472+
CC == CallingConv::PTX_Kernel;
473+
}
474+
469475
/// Performs the following steps:
470476
/// 1. Link input device code (user code and SYCL device library code).
471477
/// 2. Run SPIR-V code generation.
@@ -486,6 +492,22 @@ Error runSYCLLink(ArrayRef<std::string> Files, const ArgList &Args) {
486492
SmallVector<std::string> SplitModules;
487493
SplitModules.emplace_back(*LinkedFile);
488494

495+
// Generate symbol table.
496+
SmallVector<std::string> SymbolTable;
497+
for (size_t I = 0, E = SplitModules.size(); I != E; ++I) {
498+
Expected<std::unique_ptr<Module>> ModOrErr =
499+
getBitcodeModule(SplitModules[I], C);
500+
if (!ModOrErr)
501+
return ModOrErr.takeError();
502+
503+
SmallVector<StringRef> Symbols;
504+
for (Function &F : **ModOrErr) {
505+
if (isKernel(F))
506+
Symbols.push_back(F.getName());
507+
}
508+
SymbolTable.emplace_back(llvm::join(Symbols.begin(), Symbols.end(), "\n"));
509+
}
510+
489511
bool IsAOTCompileNeeded = IsIntelOffloadArch(
490512
StringToOffloadArch(Args.getLastArgValue(OPT_arch_EQ)));
491513

@@ -523,12 +545,13 @@ Error runSYCLLink(ArrayRef<std::string> Files, const ArgList &Args) {
523545
return createFileError(File, EC);
524546
}
525547
OffloadingImage TheImage{};
526-
TheImage.TheImageKind = IMG_Object;
548+
TheImage.TheImageKind = IMG_None;
527549
TheImage.TheOffloadKind = OFK_SYCL;
528550
TheImage.StringData["triple"] =
529551
Args.MakeArgString(Args.getLastArgValue(OPT_triple_EQ));
530552
TheImage.StringData["arch"] =
531553
Args.MakeArgString(Args.getLastArgValue(OPT_arch_EQ));
554+
TheImage.StringData["symbols"] = SymbolTable[I];
532555
TheImage.Image = std::move(*FileOrErr);
533556

534557
llvm::SmallString<0> Buffer = OffloadBinary::write(TheImage);

0 commit comments

Comments
 (0)