Skip to content

Commit 93faaf4

Browse files
jpienaarjoker-eph
andauthored
[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 <[email protected]>
1 parent 5f76369 commit 93faaf4

File tree

2 files changed

+41
-5
lines changed

2 files changed

+41
-5
lines changed

mlir/lib/AsmParser/Parser.cpp

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2076,10 +2076,46 @@ OperationParser::parseCustomOperation(ArrayRef<ResultRecord> resultIDs) {
20762076
if (originalOpName != opName)
20772077
diag << " (tried '" << opName << "' as well)";
20782078
auto &note = diag.attachNote();
2079-
note << "Registered dialects: ";
2080-
llvm::interleaveComma(getContext()->getAvailableDialects(), note,
2081-
[&](StringRef dialect) { note << dialect; });
2082-
note << " ; for more info on dialect registration see "
2079+
note << "Available dialects: ";
2080+
std::vector<StringRef> registered = getContext()->getAvailableDialects();
2081+
auto loaded = getContext()->getLoadedDialects();
2082+
2083+
// Merge the sorted lists of registered and loaded dialects.
2084+
SmallVector<std::pair<StringRef, bool>> mergedDialects;
2085+
auto regIt = registered.begin(), regEnd = registered.end();
2086+
auto loadIt = loaded.rbegin(), loadEnd = loaded.rend();
2087+
bool isRegistered = false;
2088+
bool isOnlyLoaded = true;
2089+
while (regIt != regEnd && loadIt != loadEnd) {
2090+
StringRef reg = *regIt;
2091+
StringRef load = (*loadIt)->getNamespace();
2092+
if (load < reg) {
2093+
mergedDialects.emplace_back(load, isOnlyLoaded);
2094+
++loadIt;
2095+
} else {
2096+
mergedDialects.emplace_back(reg, isRegistered);
2097+
++regIt;
2098+
if (reg == load)
2099+
++loadIt;
2100+
}
2101+
}
2102+
for (; regIt != regEnd; ++regIt)
2103+
mergedDialects.emplace_back(*regIt, isRegistered);
2104+
for (; loadIt != loadEnd; ++loadIt)
2105+
mergedDialects.emplace_back((*loadIt)->getNamespace(), isOnlyLoaded);
2106+
2107+
bool loadedUnregistered = false;
2108+
llvm::interleaveComma(mergedDialects, note, [&](auto &pair) {
2109+
note << pair.first;
2110+
if (pair.second) {
2111+
loadedUnregistered = true;
2112+
note << " (*)";
2113+
}
2114+
});
2115+
note << " ";
2116+
if (loadedUnregistered)
2117+
note << "(* corresponding to loaded but unregistered dialects)";
2118+
note << "; for more info on dialect registration see "
20832119
"https://mlir.llvm.org/getting_started/Faq/"
20842120
"#registered-loaded-dependent-whats-up-with-dialects-management";
20852121
return nullptr;

mlir/test/IR/invalid.mlir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ func.func @non_operation() {
114114

115115
func.func @unknown_dialect_operation() {
116116
// expected-error@below {{Dialect `foo' not found for custom op 'foo.asd'}}
117-
// expected-note-re@below {{Registered dialects:{{.*}} test{{.*}}}}
117+
// expected-note-re@below {{Available dialects:{{.*}} test{{.*}}}}
118118
foo.asd
119119
}
120120

0 commit comments

Comments
 (0)