blob: 86d0576b985c64722f5f3ffe8a89bec5d5cd665f [file] [log] [blame]
// Copyright 2024 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#include <utility>
#include "iree/compiler/Dialect/Util/Transforms/Passes.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/ToolOutputFile.h"
#include "mlir/Bytecode/BytecodeWriter.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Support/FileUtilities.h"
namespace mlir::iree_compiler::IREE::Util {
#define GEN_PASS_DEF_DUMPMODULEPASS
#include "iree/compiler/Dialect/Util/Transforms/Passes.h.inc"
namespace {
struct DumpModulePass : public impl::DumpModulePassBase<DumpModulePass> {
using Base::Base;
void runOnOperation() override {
// Ensure the parent paths exist.
llvm::sys::fs::create_directories(llvm::sys::path::parent_path(path));
// Attempt to open file - should succeed as long as permissions are ok.
std::string error;
auto file = mlir::openOutputFile(path, &error);
if (!file) {
llvm::errs() << "while dumping to '" << path << "': " << error << "\n";
return signalPassFailure();
}
// If going to binary serialize out and otherwise print as text.
if (llvm::sys::path::extension(path) == ".mlirbc") {
BytecodeWriterConfig config;
if (failed(writeBytecodeToFile(getOperation(), file->os(), config))) {
llvm::errs() << "failed to serialize module to '" << path << "'\n";
return signalPassFailure();
}
} else {
OpPrintingFlags flags;
getOperation().print(file->os(), flags);
}
// Keep the temporary file after the write succeeds.
file->keep();
}
};
} // namespace
std::unique_ptr<Pass> createDumpModulePass(std::string path) {
return createDumpModulePass(DumpModulePassOptions{std::move(path)});
}
} // namespace mlir::iree_compiler::IREE::Util