@@ -133,8 +133,8 @@ Error SYCLBIN::write(const SYCLBIN::SYCLBINDesc &Desc, raw_ostream &OS) {
133133
134134 // For each abstract module: 1 for AbstractModuleID + metadata entries.
135135 for (const SYCLBINDesc::AbstractModuleDesc &AMD : Desc.AbstractModuleDescs ) {
136- // AbstractModuleID, NumJITBinaries, NumNativeBinaries .
137- TotalBuffersNeeded += 3 ;
136+ // AbstractModuleID.
137+ TotalBuffersNeeded += 1 ;
138138 // Each IR module and native device code image needs metadata entries.
139139 size_t NumImages =
140140 AMD.IRModuleDescs .size () + AMD.NativeDeviceCodeImageDescs .size ();
@@ -154,10 +154,6 @@ Error SYCLBIN::write(const SYCLBIN::SYCLBINDesc &Desc, raw_ostream &OS) {
154154 for (const SYCLBINDesc::AbstractModuleDesc &AMD : Desc.AbstractModuleDescs ) {
155155 SmallString<128 > &AbstractModuleID =
156156 Buffers.emplace_back (std::to_string (AbstractModuleIndex));
157- SmallString<128 > &NumIRModules =
158- Buffers.emplace_back (std::to_string (AMD.IRModuleDescs .size ()));
159- SmallString<128 > &NumNativeImages = Buffers.emplace_back (
160- std::to_string (AMD.NativeDeviceCodeImageDescs .size ()));
161157
162158 // Store IR modules.
163159 for (const SYCLBINDesc::ImageDesc &IRMD : AMD.IRModuleDescs ) {
@@ -167,8 +163,6 @@ Error SYCLBIN::write(const SYCLBIN::SYCLBINDesc &Desc, raw_ostream &OS) {
167163 OI.TheOffloadKind = OffloadKind::OFK_SYCL;
168164
169165 OI.StringData [" syclbin_abstract_module_id" ] = AbstractModuleID;
170- OI.StringData [" syclbin_num_ir_modules" ] = NumIRModules;
171- OI.StringData [" syclbin_num_native_images" ] = NumNativeImages;
172166 OI.StringData [" triple" ] = IRMD.TargetTriple .str ();
173167 AMD.Metadata ->write (OI.StringData , Buffers);
174168
@@ -190,8 +184,6 @@ Error SYCLBIN::write(const SYCLBIN::SYCLBINDesc &Desc, raw_ostream &OS) {
190184
191185 OI.StringData [" syclbin_abstract_module_id" ] = AbstractModuleID;
192186 // TODO: this maybe not needed after all...
193- OI.StringData [" syclbin_num_ir_modules" ] = NumIRModules;
194- OI.StringData [" syclbin_num_native_images" ] = NumNativeImages;
195187 OI.StringData [" triple" ] = NDCID.TargetTriple .str ();
196188 OI.StringData [" arch" ] = NDCID.ArchString ;
197189 AMD.Metadata ->write (OI.StringData , Buffers);
@@ -315,8 +307,8 @@ Expected<std::unique_ptr<SYCLBIN>> SYCLBIN::read(MemoryBufferRef Source) {
315307
316308 // For each abstract module: 1 for AbstractModuleID + metadata entries.
317309 for (uint32_t I = 0 ; I < FileHeader->AbstractModuleCount ; ++I) {
318- // AbstractModuleID, NumJITBinaries, NumNativeBinaries .
319- TotalBuffersNeeded += 3 ;
310+ // AbstractModuleID.
311+ TotalBuffersNeeded += 1 ;
320312
321313 // Each IR module and native device code image needs metadata entries.
322314 size_t NumImages =
@@ -339,10 +331,6 @@ Expected<std::unique_ptr<SYCLBIN>> SYCLBIN::read(MemoryBufferRef Source) {
339331 for (uint32_t I = 0 ; I < FileHeader->AbstractModuleCount ; ++I) {
340332 SmallString<128 > &AbstractModuleID =
341333 Buffers.emplace_back (std::to_string (AbstractModuleIndex));
342- SmallString<128 > &NumIRModules =
343- Buffers.emplace_back (std::to_string (AMHeaders[I]->IRModuleCount ));
344- SmallString<128 > &NumNativeImages = Buffers.emplace_back (
345- std::to_string (AMHeaders[I]->NativeDeviceCodeImageCount ));
346334
347335 // Read the IR modules of the current abstract module.
348336 for (uint32_t J = 0 ; J < AMHeaders[I]->IRModuleCount ; ++J) {
@@ -353,8 +341,6 @@ Expected<std::unique_ptr<SYCLBIN>> SYCLBIN::read(MemoryBufferRef Source) {
353341
354342 OI.TheOffloadKind = OffloadKind::OFK_SYCL;
355343 OI.StringData [" syclbin_abstract_module_id" ] = AbstractModuleID;
356- OI.StringData [" syclbin_num_ir_modules" ] = NumIRModules;
357- OI.StringData [" syclbin_num_native_images" ] = NumNativeImages;
358344 AMMetadataVector[I]->write (OI.StringData , Buffers);
359345
360346 // Read the header for the current IR module.
@@ -400,8 +386,6 @@ Expected<std::unique_ptr<SYCLBIN>> SYCLBIN::read(MemoryBufferRef Source) {
400386 OI.TheImageKind = ImageKind::IMG_Object;
401387 OI.TheOffloadKind = OffloadKind::OFK_SYCL;
402388 OI.StringData [" syclbin_abstract_module_id" ] = AbstractModuleID;
403- OI.StringData [" syclbin_num_ir_modules" ] = NumIRModules;
404- OI.StringData [" syclbin_num_native_images" ] = NumNativeImages;
405389 AMMetadataVector[I]->write (OI.StringData , Buffers);
406390
407391 // Read the header for the current native device code image.
@@ -472,30 +456,48 @@ bool SYCLBIN::isSYCLBIN(
472456Error SYCLBIN::initAbstractModules () {
473457 // First init global metadata.
474458 for (const std::unique_ptr<OffloadBinary> &OBPtr : OffloadBinaries) {
475- if (OBPtr->getFlags () & OIF_NoImage) {
476- auto ErrorOrProperties =
477- llvm::util::PropertySetRegistry::read (OBPtr->strings ());
478- if (!ErrorOrProperties)
479- return ErrorOrProperties.takeError ();
459+ if ((OBPtr->getFlags () & OIF_NoImage) == 0 )
460+ continue ;
461+ auto ErrorOrProperties =
462+ llvm::util::PropertySetRegistry::read (OBPtr->strings ());
463+ if (!ErrorOrProperties)
464+ return ErrorOrProperties.takeError ();
480465
481- GlobalMetadata = std::move (*ErrorOrProperties);
482- break ;
483- }
466+ std::unique_ptr<llvm::util::PropertySetRegistry> GlobalMetadataRegistry =
467+ std::move (*ErrorOrProperties);
468+ GlobalMetadata = std::make_unique<llvm::util::PropertySet>(
469+ (*GlobalMetadataRegistry)
470+ [llvm::util::PropertySetRegistry::SYCLBIN_GLOBAL_METADATA]);
471+ break ;
484472 }
485473
486474 // If no global metadata entry was found - it is not SYCLBIN...
487475 if (!GlobalMetadata)
488476 return createStringError (inconvertibleErrorCode (),
489477 " Unexpected SYCLBIN: no global metadata found." );
490478
491- // TODO: implement reading abstract modules...
479+ // Pre-allocate AbstractModules vector with the correct size.
480+ size_t NumAbstractModules = getNumAbstractModules ();
481+ AbstractModules.resize (NumAbstractModules);
482+
492483 for (const std::unique_ptr<OffloadBinary> &OBPtr : OffloadBinaries) {
493- auto ErrorOrProperties =
494- llvm::util::PropertySetRegistry::read (OBPtr->strings ());
495- if (!ErrorOrProperties)
496- return ErrorOrProperties.takeError ();
484+ if (OBPtr->getFlags () & OIF_NoImage)
485+ continue ;
486+
487+ uint32_t ID;
488+ OBPtr->getString (" syclbin_abstract_module_id" ).getAsInteger (10 , ID);
489+ AbstractModule &AM = AbstractModules[ID];
490+
491+ if (!AM.Metadata ) {
492+ auto ErrorOrProperties =
493+ llvm::util::PropertySetRegistry::read (OBPtr->strings ());
494+ if (!ErrorOrProperties)
495+ return ErrorOrProperties.takeError ();
496+
497+ AM.Metadata = std::move (*ErrorOrProperties);
498+ }
497499
498- Metadata[OBPtr. get ()] = std::move (*ErrorOrProperties);
500+ // TODO: populate either ir or native module with pointer.
499501 }
500502
501503 return Error::success ();
0 commit comments