Skip to content

Commit d35976d

Browse files
committed
[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).
1 parent 71f7f8a commit d35976d

File tree

1 file changed

+39
-3
lines changed

1 file changed

+39
-3
lines changed

mlir/lib/AsmParser/Parser.cpp

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2077,9 +2077,45 @@ OperationParser::parseCustomOperation(ArrayRef<ResultRecord> resultIDs) {
20772077
diag << " (tried '" << opName << "' as well)";
20782078
auto &note = diag.attachNote();
20792079
note << "Registered dialects: ";
2080-
llvm::interleaveComma(getContext()->getAvailableDialects(), note,
2081-
[&](StringRef dialect) { note << dialect; });
2082-
note << " ; for more info on dialect registration see "
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 (reg < load) {
2093+
mergedDialects.emplace_back(*regIt++, isRegistered);
2094+
} else if (load < reg) {
2095+
mergedDialects.emplace_back(load, isOnlyLoaded);
2096+
loadIt++;
2097+
} else {
2098+
mergedDialects.emplace_back(*regIt++, isRegistered);
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;

0 commit comments

Comments
 (0)