[Mlir-commits] [mlir] 93faaf4 - [mlir] Expand error message to include unregistered dialects. (#158028)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Wed Sep 17 23:56:00 PDT 2025
Author: Jacques Pienaar
Date: 2025-09-18T06:55:56Z
New Revision: 93faaf47f334cb144e8204704ad4fa97d7c1a74d
URL: https://github.com/llvm/llvm-project/commit/93faaf47f334cb144e8204704ad4fa97d7c1a74d
DIFF: https://github.com/llvm/llvm-project/commit/93faaf47f334cb144e8204704ad4fa97d7c1a74d.diff
LOG: [mlir] Expand error message to include unregistered dialects. (#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).
---------
Co-authored-by: Mehdi Amini <joker.eph at gmail.com>
Added:
Modified:
mlir/lib/AsmParser/Parser.cpp
mlir/test/IR/invalid.mlir
Removed:
################################################################################
diff --git a/mlir/lib/AsmParser/Parser.cpp b/mlir/lib/AsmParser/Parser.cpp
index 435ff713a1b29..82bdb844480f1 100644
--- a/mlir/lib/AsmParser/Parser.cpp
+++ b/mlir/lib/AsmParser/Parser.cpp
@@ -2076,10 +2076,46 @@ OperationParser::parseCustomOperation(ArrayRef<ResultRecord> resultIDs) {
if (originalOpName != opName)
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 "
+ note << "Available dialects: ";
+ 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 (load < reg) {
+ mergedDialects.emplace_back(load, isOnlyLoaded);
+ ++loadIt;
+ } else {
+ mergedDialects.emplace_back(reg, isRegistered);
+ ++regIt;
+ if (reg == load)
+ ++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;
diff --git a/mlir/test/IR/invalid.mlir b/mlir/test/IR/invalid.mlir
index d0bbf8669b63d..89077ef0f4736 100644
--- a/mlir/test/IR/invalid.mlir
+++ b/mlir/test/IR/invalid.mlir
@@ -114,7 +114,7 @@ func.func @non_operation() {
func.func @unknown_dialect_operation() {
// expected-error at below {{Dialect `foo' not found for custom op 'foo.asd'}}
- // expected-note-re at below {{Registered dialects:{{.*}} test{{.*}}}}
+ // expected-note-re at below {{Available dialects:{{.*}} test{{.*}}}}
foo.asd
}
More information about the Mlir-commits
mailing list