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 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 registered = getContext()->getAvailableDialects(); + auto loaded = getContext()->getLoadedDialects(); + + // Merge the sorted lists of registered and loaded dialects. + SmallVector> 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@below {{Dialect `foo' not found for custom op 'foo.asd'}} - // expected-note-re@below {{Registered dialects:{{.*}} test{{.*}}}} + // expected-note-re@below {{Available dialects:{{.*}} test{{.*}}}} foo.asd }