[Mlir-commits] [mlir] [mlir] Expand error message to include unregistered dialects. (PR #158028)
Jacques Pienaar
llvmlistbot at llvm.org
Thu Sep 11 03:39:57 PDT 2025
https://github.com/jpienaar created https://github.com/llvm/llvm-project/pull/158028
It is possible to load unregistered dialects, this can result in a confusing error message. Mark unregistered but loaded dialects.
This is currently done as a merged list as that is most concise but requires some additional preprocessing (did merge sort given the other two lists are, could do it shorter and probably at not too much extra cost if I just used SetVectors - so alternative which uses less code and may be preferred as performance not critical here).
>From d35976d0f8a0ceaa56a5c025ea0747028604e367 Mon Sep 17 00:00:00 2001
From: Jacques Pienaar <jacques+gh at japienaar.info>
Date: Thu, 11 Sep 2025 10:30:34 +0000
Subject: [PATCH] [mlir] Expand error message to include unregistered dialects.
It is possible to load unregistered dialects, this can result in
a confusing error message. Mark unregistered but loaded dialects.
This is currently done as a merged list as that is most concise but
requires some additional preprocessing (did merge sort given the other
two lists are, could do it shorter and probably at not too much extra
cost if I just used SetVectors).
---
mlir/lib/AsmParser/Parser.cpp | 42 ++++++++++++++++++++++++++++++++---
1 file changed, 39 insertions(+), 3 deletions(-)
diff --git a/mlir/lib/AsmParser/Parser.cpp b/mlir/lib/AsmParser/Parser.cpp
index 435ff713a1b29..86ffe41092547 100644
--- a/mlir/lib/AsmParser/Parser.cpp
+++ b/mlir/lib/AsmParser/Parser.cpp
@@ -2077,9 +2077,45 @@ OperationParser::parseCustomOperation(ArrayRef<ResultRecord> resultIDs) {
diag << " (tried '" << opName << "' as well)";
auto ¬e = diag.attachNote();
note << "Registered dialects: ";
- llvm::interleaveComma(getContext()->getAvailableDialects(), note,
- [&](StringRef dialect) { note << dialect; });
- note << " ; for more info on dialect registration see "
+ std::vector<StringRef> registered = getContext()->getAvailableDialects();
+ auto loaded = getContext()->getLoadedDialects();
+
+ // Merge the sorted lists of registered and loaded dialects.
+ SmallVector<std::pair<StringRef, bool>> mergedDialects;
+ auto regIt = registered.begin(), regEnd = registered.end();
+ auto loadIt = loaded.rbegin(), loadEnd = loaded.rend();
+ bool isRegistered = false;
+ bool isOnlyLoaded = true;
+ while (regIt != regEnd && loadIt != loadEnd) {
+ StringRef reg = *regIt;
+ StringRef load = (*loadIt)->getNamespace();
+ if (reg < load) {
+ mergedDialects.emplace_back(*regIt++, isRegistered);
+ } else if (load < reg) {
+ mergedDialects.emplace_back(load, isOnlyLoaded);
+ loadIt++;
+ } else {
+ mergedDialects.emplace_back(*regIt++, isRegistered);
+ loadIt++;
+ }
+ }
+ for (; regIt != regEnd; ++regIt)
+ mergedDialects.emplace_back(*regIt, isRegistered);
+ for (; loadIt != loadEnd; ++loadIt)
+ mergedDialects.emplace_back((*loadIt)->getNamespace(), isOnlyLoaded);
+
+ bool loadedUnregistered = false;
+ llvm::interleaveComma(mergedDialects, note, [&](auto &pair) {
+ note << pair.first;
+ if (pair.second) {
+ loadedUnregistered = true;
+ note << " (*)";
+ }
+ });
+ note << " ";
+ if (loadedUnregistered)
+ note << "(* corresponding to loaded but unregistered dialects)";
+ note << "; for more info on dialect registration see "
"https://mlir.llvm.org/getting_started/Faq/"
"#registered-loaded-dependent-whats-up-with-dialects-management";
return nullptr;
More information about the Mlir-commits
mailing list