xref: /llvm-project/mlir/lib/IR/DialectResourceBlobManager.cpp (revision 0a81ace0047a2de93e71c82cdf0977fc989660df)
15f58e14bSRiver Riddle //===- DialectResourceBlobManager.cpp - Dialect Blob Management -----------===//
25f58e14bSRiver Riddle //
35f58e14bSRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45f58e14bSRiver Riddle // See https://llvm.org/LICENSE.txt for license information.
55f58e14bSRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65f58e14bSRiver Riddle //
75f58e14bSRiver Riddle //===----------------------------------------------------------------------===//
85f58e14bSRiver Riddle 
95f58e14bSRiver Riddle #include "mlir/IR/DialectResourceBlobManager.h"
105f58e14bSRiver Riddle #include "llvm/ADT/SmallString.h"
11a1fe1f5fSKazu Hirata #include <optional>
125f58e14bSRiver Riddle 
135f58e14bSRiver Riddle using namespace mlir;
145f58e14bSRiver Riddle 
155f58e14bSRiver Riddle //===----------------------------------------------------------------------===//
165f58e14bSRiver Riddle // DialectResourceBlobManager
175f58e14bSRiver Riddle //===---------------------------------------------------------------------===//
185f58e14bSRiver Riddle 
lookup(StringRef name)195f58e14bSRiver Riddle auto DialectResourceBlobManager::lookup(StringRef name) -> BlobEntry * {
205f58e14bSRiver Riddle   llvm::sys::SmartScopedReader<true> reader(blobMapLock);
215f58e14bSRiver Riddle 
225f58e14bSRiver Riddle   auto it = blobMap.find(name);
235f58e14bSRiver Riddle   return it != blobMap.end() ? &it->second : nullptr;
245f58e14bSRiver Riddle }
255f58e14bSRiver Riddle 
update(StringRef name,AsmResourceBlob && newBlob)265f58e14bSRiver Riddle void DialectResourceBlobManager::update(StringRef name,
275f58e14bSRiver Riddle                                         AsmResourceBlob &&newBlob) {
285f58e14bSRiver Riddle   BlobEntry *entry = lookup(name);
295f58e14bSRiver Riddle   assert(entry && "`update` expects an existing entry for the provided name");
305f58e14bSRiver Riddle   entry->setBlob(std::move(newBlob));
315f58e14bSRiver Riddle }
325f58e14bSRiver Riddle 
insert(StringRef name,std::optional<AsmResourceBlob> blob)335f58e14bSRiver Riddle auto DialectResourceBlobManager::insert(StringRef name,
34*0a81ace0SKazu Hirata                                         std::optional<AsmResourceBlob> blob)
355f58e14bSRiver Riddle     -> BlobEntry & {
365f58e14bSRiver Riddle   llvm::sys::SmartScopedWriter<true> writer(blobMapLock);
375f58e14bSRiver Riddle 
385f58e14bSRiver Riddle   // Functor used to attempt insertion with a given name.
395f58e14bSRiver Riddle   auto tryInsertion = [&](StringRef name) -> BlobEntry * {
405f58e14bSRiver Riddle     auto it = blobMap.try_emplace(name, BlobEntry());
415f58e14bSRiver Riddle     if (it.second) {
425f58e14bSRiver Riddle       it.first->second.initialize(it.first->getKey(), std::move(blob));
435f58e14bSRiver Riddle       return &it.first->second;
445f58e14bSRiver Riddle     }
455f58e14bSRiver Riddle     return nullptr;
465f58e14bSRiver Riddle   };
475f58e14bSRiver Riddle 
485f58e14bSRiver Riddle   // Try inserting with the name provided by the user.
495f58e14bSRiver Riddle   if (BlobEntry *entry = tryInsertion(name))
505f58e14bSRiver Riddle     return *entry;
515f58e14bSRiver Riddle 
525f58e14bSRiver Riddle   // If an entry already exists for the user provided name, tweak the name and
535f58e14bSRiver Riddle   // re-attempt insertion until we find one that is unique.
545f58e14bSRiver Riddle   llvm::SmallString<32> nameStorage(name);
555f58e14bSRiver Riddle   nameStorage.push_back('_');
565f58e14bSRiver Riddle   size_t nameCounter = 1;
575f58e14bSRiver Riddle   do {
585f58e14bSRiver Riddle     Twine(nameCounter++).toVector(nameStorage);
595f58e14bSRiver Riddle 
605f58e14bSRiver Riddle     // Try inserting with the new name.
61995ab929SRiver Riddle     if (BlobEntry *entry = tryInsertion(nameStorage))
625f58e14bSRiver Riddle       return *entry;
635f58e14bSRiver Riddle     nameStorage.resize(name.size() + 1);
645f58e14bSRiver Riddle   } while (true);
655f58e14bSRiver Riddle }
66