summaryrefslogtreecommitdiff
path: root/mlir
diff options
context:
space:
mode:
authorTobias Gysi <tobias.gysi@nextsilicon.com>2023-05-16 07:21:22 +0000
committerTobias Gysi <tobias.gysi@nextsilicon.com>2023-05-16 07:32:13 +0000
commit1ade6f36e3b4652a17499ae261e60d5b0de52ce0 (patch)
tree3a99bdbbcb4aeeb885df7005af262d475b632387 /mlir
parent258c9bebbdfa793493b71db555f5deb5ade499b4 (diff)
downloadllvm-1ade6f36e3b4652a17499ae261e60d5b0de52ce0.tar.gz
[mlir] Add mlir translate flag to print errors only.
The revision adds a flag to mlir translate that suppresses any non-error diagnostics. The flag is useful when importing LLVM IR to LLVM dialect, which produces a lot of warnings due to dropped metadata and debug intrinsics. Reviewed By: Dinistro Differential Revision: https://reviews.llvm.org/D150547
Diffstat (limited to 'mlir')
-rw-r--r--mlir/lib/Tools/mlir-translate/MlirTranslateMain.cpp36
-rw-r--r--mlir/test/mlir-translate/import-error-only.ll27
2 files changed, 60 insertions, 3 deletions
diff --git a/mlir/lib/Tools/mlir-translate/MlirTranslateMain.cpp b/mlir/lib/Tools/mlir-translate/MlirTranslateMain.cpp
index a79f6afae25b..92adb8d6ac97 100644
--- a/mlir/lib/Tools/mlir-translate/MlirTranslateMain.cpp
+++ b/mlir/lib/Tools/mlir-translate/MlirTranslateMain.cpp
@@ -24,7 +24,26 @@
using namespace mlir;
//===----------------------------------------------------------------------===//
-// Translation Parser
+// Diagnostic Filter
+//===----------------------------------------------------------------------===//
+
+namespace {
+/// A scoped diagnostic handler that marks non-error diagnostics as handled. As
+/// a result, the main diagnostic handler does not print non-error diagnostics.
+class ErrorDiagnosticFilter : public ScopedDiagnosticHandler {
+public:
+ ErrorDiagnosticFilter(MLIRContext *ctx) : ScopedDiagnosticHandler(ctx) {
+ setHandler([](Diagnostic &diag) {
+ if (diag.getSeverity() != DiagnosticSeverity::Error)
+ return success();
+ return failure();
+ });
+ }
+};
+} // namespace
+
+//===----------------------------------------------------------------------===//
+// Translate Entry Point
//===----------------------------------------------------------------------===//
LogicalResult mlir::mlirTranslateMain(int argc, char **argv,
@@ -55,6 +74,12 @@ LogicalResult mlir::mlirTranslateMain(int argc, char **argv,
"expected-* lines on the corresponding line"),
llvm::cl::init(false));
+ static llvm::cl::opt<bool> errorDiagnosticsOnly(
+ "error-diagnostics-only",
+ llvm::cl::desc("Filter all non-error diagnostics "
+ "(discouraged: testing only!)"),
+ llvm::cl::init(false));
+
llvm::InitLLVM y(argc, argv);
// Add flags for all the registered translations.
@@ -121,12 +146,17 @@ LogicalResult mlir::mlirTranslateMain(int argc, char **argv,
if (verifyDiagnostics) {
// In the diagnostic verification flow, we ignore whether the
- // translation failed (in most cases, it is expected to fail).
- // Instead, we check if the diagnostics were produced as expected.
+ // translation failed (in most cases, it is expected to fail) and we do
+ // not filter non-error diagnostics even if `errorDiagnosticsOnly` is
+ // set. Instead, we check if the diagnostics were produced as expected.
SourceMgrDiagnosticVerifierHandler sourceMgrHandler(*sourceMgr,
&context);
(void)(*translationRequested)(sourceMgr, os, &context);
result = sourceMgrHandler.verify();
+ } else if (errorDiagnosticsOnly) {
+ SourceMgrDiagnosticHandler sourceMgrHandler(*sourceMgr, &context);
+ ErrorDiagnosticFilter diagnosticFilter(&context);
+ result = (*translationRequested)(sourceMgr, *stream, &context);
} else {
SourceMgrDiagnosticHandler sourceMgrHandler(*sourceMgr, &context);
result = (*translationRequested)(sourceMgr, *stream, &context);
diff --git a/mlir/test/mlir-translate/import-error-only.ll b/mlir/test/mlir-translate/import-error-only.ll
new file mode 100644
index 000000000000..b5a4132f4777
--- /dev/null
+++ b/mlir/test/mlir-translate/import-error-only.ll
@@ -0,0 +1,27 @@
+; RUN: not mlir-translate %s -import-llvm -split-input-file -error-diagnostics-only 2>&1 | FileCheck %s --check-prefix=ERROR
+; RUN: not mlir-translate %s -import-llvm -split-input-file 2>&1 | FileCheck %s --check-prefix=ALL
+
+; ERROR-NOT: warning:
+; ALL: warning:
+define void @warning(i64 %n, ptr %A) {
+entry:
+ br label %end, !llvm.loop !0
+end:
+ ret void
+}
+
+!0 = distinct !{!0, !1, !2}
+!1 = !{!"llvm.loop.disable_nonforced"}
+!2 = !{!"llvm.loop.typo"}
+
+; // -----
+
+; ERROR: error:
+; ALL: error:
+define i32 @error(ptr %dst) {
+ indirectbr ptr %dst, [label %bb1, label %bb2]
+bb1:
+ ret i32 0
+bb2:
+ ret i32 1
+}