forked from OSchip/llvm-project
NFC: Keep the dialect list in the context sorted by namespace.
Most dialects are initialized statically, which does not have a guaranteed initialization order. By keeping the dialect list sorted, we can guarantee a deterministic iteration order of dialects. PiperOrigin-RevId: 264522875
This commit is contained in:
parent
5e17730cde
commit
ad8b410f16
|
@ -333,18 +333,26 @@ Dialect *MLIRContext::getRegisteredDialect(StringRef name) {
|
|||
/// takes ownership of the heap allocated dialect.
|
||||
void Dialect::registerDialect(MLIRContext *context) {
|
||||
auto &impl = context->getImpl();
|
||||
std::unique_ptr<Dialect> dialect(this);
|
||||
|
||||
// Lock access to the context registry.
|
||||
llvm::sys::SmartScopedWriter<true> registryLock(impl.contextMutex);
|
||||
|
||||
// Get the correct insertion position sorted by namespace.
|
||||
auto insertPt =
|
||||
llvm::lower_bound(impl.dialects, dialect,
|
||||
[](const std::unique_ptr<Dialect> &lhs,
|
||||
const std::unique_ptr<Dialect> &rhs) {
|
||||
return lhs->getNamespace() < rhs->getNamespace();
|
||||
});
|
||||
|
||||
// Abort if dialect with namespace has already been registered.
|
||||
if (llvm::any_of(impl.dialects, [this](std::unique_ptr<Dialect> &dialect) {
|
||||
return dialect->getNamespace() == getNamespace();
|
||||
})) {
|
||||
llvm::report_fatal_error("a dialect with namespace '" +
|
||||
Twine(getNamespace()) +
|
||||
if (insertPt != impl.dialects.end() &&
|
||||
(*insertPt)->getNamespace() == getNamespace()) {
|
||||
llvm::report_fatal_error("a dialect with namespace '" + getNamespace() +
|
||||
"' has already been registered");
|
||||
}
|
||||
impl.dialects.push_back(std::unique_ptr<Dialect>(this));
|
||||
impl.dialects.insert(insertPt, std::move(dialect));
|
||||
}
|
||||
|
||||
/// Return information about all registered operations. This isn't very
|
||||
|
|
Loading…
Reference in New Issue