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 Riddleauto 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 Riddlevoid 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 Riddleauto 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