| // Copyright 2023 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 | |
| #ifndef IREE_PJRT_PLUGIN_PJRT_DEBUGGING_H_ | |
| #define IREE_PJRT_PLUGIN_PJRT_DEBUGGING_H_ | |
| #include <atomic> | |
| #include <functional> | |
| #include <memory> | |
| #include <optional> | |
| #include <string> | |
| #include <string_view> | |
| namespace iree::pjrt { | |
| //===----------------------------------------------------------------------===// | |
| // Logger | |
| // The plugin API currently does not have any logging facilities, but since | |
| // these are easier added later, we have a placeholder Logger that we thread | |
| // through. It can be extended later. | |
| //===----------------------------------------------------------------------===// | |
| class Logger { | |
| public: | |
| Logger() = default; | |
| void debug(std::string_view message); | |
| void error(std::string_view message); | |
| }; | |
| //===----------------------------------------------------------------------===// | |
| // ArtifactDumper | |
| // The typical modes of operation are: | |
| // - Completely disabled | |
| // - Enabled to persist all artifacts | |
| // - Enabled to persist artifacts on recoverable errors (i.e. compile errors, | |
| // etc) | |
| // - Enabled to persist artifacts on crash only | |
| // Since we often don't know what the outcome of a transaction will be right | |
| // away, the transaction can be held open for some period of time and cancelled | |
| // later. | |
| // | |
| // In general, since this is a debugging facility, it swallows any errors, | |
| // reporting them to the Logger. | |
| // | |
| // The default implementation can be instantiated and is hard-coded to | |
| // !enabled(). | |
| //===----------------------------------------------------------------------===// | |
| class ArtifactDumper { | |
| public: | |
| class Transaction { | |
| public: | |
| virtual ~Transaction() = default; | |
| // Writes an artifact with a transaction-unique label/index. | |
| virtual void WriteArtifact(std::string_view label, | |
| std::string_view extension, int index, | |
| std::string_view contents) = 0; | |
| // Allocates an artifact which can be written to a path externally. | |
| // Since not all dumpers may support writing to such a location on a local | |
| // filesystem, this returns an optional. If calling this function, it | |
| // is expected that the path is actually written to. | |
| virtual std::optional<std::string> AllocateArtifactPath( | |
| std::string_view label, std::string_view extension, int index) = 0; | |
| // Completes the transaction and retains all artifacts. | |
| virtual void Retain() = 0; | |
| // Completes the transaction and removes all artifacts. | |
| virtual void Cancel() = 0; | |
| }; | |
| virtual ~ArtifactDumper(); | |
| // Not virtual for quick checks in disabled state. | |
| bool enabled() { return enabled_; } | |
| // Allocates a new transaction which can be used to append related | |
| // artifacts. All artifacts associated with a transaction can be removed upon | |
| // a successful transaction, or they will be retained upon crash or | |
| // recoverable error. | |
| // Must only be called if enabled(). May return nullptr if saving should not | |
| // be done. | |
| virtual std::unique_ptr<Transaction> CreateTransaction(); | |
| // Returns a string suitable for emitting to the debug log, describing | |
| // where and how artifacts will be retained. | |
| virtual std::string DebugString(); | |
| protected: | |
| bool enabled_ = false; | |
| }; | |
| // Dumps artifacts to a path on the file system. | |
| class FilesArtifactDumper : public ArtifactDumper { | |
| public: | |
| class FilesTransaction; | |
| using PathCallback = std::function<std::optional<std::string>()>; | |
| FilesArtifactDumper(Logger& logger, PathCallback path_callback, | |
| bool retain_all); | |
| ~FilesArtifactDumper() override; | |
| std::unique_ptr<Transaction> CreateTransaction() override; | |
| std::string DebugString() override; | |
| private: | |
| Logger& logger_; | |
| std::atomic<int64_t> next_transaction_id_{0}; | |
| PathCallback path_callback_; | |
| bool retain_all_; | |
| }; | |
| } // namespace iree::pjrt | |
| #endif // IREE_PJRT_PLUGIN_PJRT_DEBUGGING_H_ |