@@ -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