blob: 74203e88f8d266402e92e41fe037d918767b10f1 [file] [log] [blame]
// 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_