mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 15:56:07 +00:00

The DialectResourceBlobManager class provides functionality for managing resource blobs in a generic, dialect-agnostic fashion. In addition to this class, a dialect interface and custom resource handle are provided to simplify referencing and interacting with the manager. These classes intend to simplify the work required for dialects that want to manage resource blobs during compilation, such as for large elements attrs. The old manager for the resource example in the test dialect has been updated to use this, which provides and cleaner and more consistent API. This commit also adds new HeapAsmResourceBlob and ImmortalAsmResourceBlob to simplify creating resource blobs in common scenarios. Differential Revision: https://reviews.llvm.org/D130021
65 lines
2.2 KiB
C++
65 lines
2.2 KiB
C++
//===- DialectResourceBlobManager.cpp - Dialect Blob Management -----------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "mlir/IR/DialectResourceBlobManager.h"
|
|
#include "llvm/ADT/SmallString.h"
|
|
|
|
using namespace mlir;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// DialectResourceBlobManager
|
|
//===---------------------------------------------------------------------===//
|
|
|
|
auto DialectResourceBlobManager::lookup(StringRef name) -> BlobEntry * {
|
|
llvm::sys::SmartScopedReader<true> reader(blobMapLock);
|
|
|
|
auto it = blobMap.find(name);
|
|
return it != blobMap.end() ? &it->second : nullptr;
|
|
}
|
|
|
|
void DialectResourceBlobManager::update(StringRef name,
|
|
AsmResourceBlob &&newBlob) {
|
|
BlobEntry *entry = lookup(name);
|
|
assert(entry && "`update` expects an existing entry for the provided name");
|
|
entry->setBlob(std::move(newBlob));
|
|
}
|
|
|
|
auto DialectResourceBlobManager::insert(StringRef name,
|
|
Optional<AsmResourceBlob> blob)
|
|
-> BlobEntry & {
|
|
llvm::sys::SmartScopedWriter<true> writer(blobMapLock);
|
|
|
|
// Functor used to attempt insertion with a given name.
|
|
auto tryInsertion = [&](StringRef name) -> BlobEntry * {
|
|
auto it = blobMap.try_emplace(name, BlobEntry());
|
|
if (it.second) {
|
|
it.first->second.initialize(it.first->getKey(), std::move(blob));
|
|
return &it.first->second;
|
|
}
|
|
return nullptr;
|
|
};
|
|
|
|
// Try inserting with the name provided by the user.
|
|
if (BlobEntry *entry = tryInsertion(name))
|
|
return *entry;
|
|
|
|
// If an entry already exists for the user provided name, tweak the name and
|
|
// re-attempt insertion until we find one that is unique.
|
|
llvm::SmallString<32> nameStorage(name);
|
|
nameStorage.push_back('_');
|
|
size_t nameCounter = 1;
|
|
do {
|
|
Twine(nameCounter++).toVector(nameStorage);
|
|
|
|
// Try inserting with the new name.
|
|
if (BlobEntry *entry = tryInsertion(name))
|
|
return *entry;
|
|
nameStorage.resize(name.size() + 1);
|
|
} while (true);
|
|
}
|