Skip to content

Commit d6b415f

Browse files
committed
progress
1 parent cd076f5 commit d6b415f

File tree

2 files changed

+40
-37
lines changed

2 files changed

+40
-37
lines changed

llvm/include/llvm/Object/SYCLBIN.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,7 @@ class SYCLBIN {
9191
SmallVector<const OffloadBinary *> NativeDeviceCodeImages;
9292
};
9393

94-
// TODO: enough to keep 1 property set, not entire propertyset registry for global metadata.
95-
std::unique_ptr<llvm::util::PropertySetRegistry> GlobalMetadata;
94+
std::unique_ptr<llvm::util::PropertySet> GlobalMetadata;
9695
SmallVector<AbstractModule, 4> AbstractModules;
9796

9897
private:
@@ -102,7 +101,9 @@ class SYCLBIN {
102101
Error initAbstractModules();
103102

104103
size_t getNumAbstractModules() const {
105-
// TODO!!! reading global metadata.
104+
return GlobalMetadata
105+
->at(llvm::util::PropertySet::key_type{"abstract_modules_num"})
106+
.asUint32();
106107
}
107108

108109
SmallVector<std::unique_ptr<OffloadBinary>> OffloadBinaries;

llvm/lib/Object/SYCLBIN.cpp

Lines changed: 36 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -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(
472456
Error 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

Comments
 (0)