//===- AsmState.h - Assembly State Utilities --------------------*- C++ -*-===// // // Part of the LLVM Project, 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 // //===----------------------------------------------------------------------===// // // This file defines various classes and utilites for interacting with the MLIR // assembly formats. // //===----------------------------------------------------------------------===// #ifndef MLIR_IR_ASMSTATE_H_ #define MLIR_IR_ASMSTATE_H_ #include "mlir/Bytecode/BytecodeReaderConfig.h" #include "mlir/IR/OperationSupport.h" #include "mlir/Support/LLVM.h" #include "llvm/ADT/MapVector.h" #include "llvm/ADT/StringMap.h" #include <memory> #include <variant> namespace mlir { class AsmResourcePrinter; class AsmDialectResourceHandle; class Operation; namespace detail { class AsmStateImpl; } // namespace detail //===----------------------------------------------------------------------===// // Resources //===----------------------------------------------------------------------===// /// The following classes enable support for parsing and printing resources /// within MLIR assembly formats. Resources are a mechanism by which dialects, /// and external clients, may attach additional information when parsing or /// printing IR without that information being encoded in the IR itself. /// Resources are not uniqued within the MLIR context, are not attached directly /// to any operation, and are solely intended to live and be processed outside /// of the immediate IR. /// /// Resources are encoded using a key-value pair nested within dictionaries /// anchored either on a dialect, or an externally registered entity. /// Dictionaries anchored on dialects use the dialect namespace directly, and /// dictionaries anchored on external entities use a provided unique identifier. /// The resource key is an identifier used to disambiguate the data. The /// resource value may be stored in various limited forms, but general encodings /// use a string (human readable) or blob format (binary). Within the textual /// format, an example may be of the form: /// /// {-# /// // The `dialect_resources` section within the file-level metadata /// // dictionary is used to contain any dialect resource entries. /// dialect_resources: { /// // Here is a dictionary anchored on "foo_dialect", which is a dialect /// // namespace. /// foo_dialect: { /// // `some_dialect_resource` is a key to be interpreted by the dialect, /// // and used to initialize/configure/etc. /// some_dialect_resource: "Some important resource value" /// } /// }, /// // The `external_resources` section within the file-level metadata /// // dictionary is used to contain any non-dialect resource entries. /// external_resources: { /// // Here is a dictionary anchored on "mlir_reproducer", which is an /// // external entity representing MLIR's crash reproducer functionality. /// mlir_reproducer: { /// // `pipeline` is an entry that holds a crash reproducer pipeline /// // resource. /// pipeline: "func.func(canonicalize,cse)" /// } /// } /// #-} /// //===----------------------------------------------------------------------===// // Resource Entry /// This class represents a processed binary blob of data. A resource blob is /// essentially a collection of data, potentially mutable, with an associated /// deleter function (used if the data needs to be destroyed). class AsmResourceBlob { … }; /// This class provides a simple utility wrapper for creating heap allocated /// AsmResourceBlobs. class HeapAsmResourceBlob { … }; /// This class provides a simple utility wrapper for creating "unmanaged" /// AsmResourceBlobs. The lifetime of the data provided to these blobs is /// guaranteed to persist beyond the lifetime of this reference. class UnmanagedAsmResourceBlob { … }; /// This class is used to build resource entries for use by the printer. Each /// resource entry is represented using a key/value pair. The provided key must /// be unique within the current context, which allows for a client to provide /// resource entries without worrying about overlap with other clients. class AsmResourceBuilder { … }; /// This enum represents the different kinds of resource values. enum class AsmResourceEntryKind { … }; StringRef toString(AsmResourceEntryKind kind); /// This class represents a single parsed resource entry. class AsmParsedResourceEntry { … }; //===----------------------------------------------------------------------===// // Resource Parser/Printer /// This class represents an instance of a resource parser. This class should be /// implemented by non-dialect clients that want to inject additional resources /// into MLIR assembly formats. class AsmResourceParser { … }; /// This class represents an instance of a resource printer. This class should /// be implemented by non-dialect clients that want to inject additional /// resources into MLIR assembly formats. class AsmResourcePrinter { … }; /// A fallback map containing external resources not explicitly handled by /// another parser/printer. class FallbackAsmResourceMap { … }; //===----------------------------------------------------------------------===// // ParserConfig //===----------------------------------------------------------------------===// /// This class represents a configuration for the MLIR assembly parser. It /// contains all of the necessary state to parse a MLIR source file. class ParserConfig { … }; //===----------------------------------------------------------------------===// // AsmState //===----------------------------------------------------------------------===// /// This class provides management for the lifetime of the state used when /// printing the IR. It allows for alleviating the cost of recomputing the /// internal state of the asm printer. /// /// The IR should not be mutated in-between invocations using this state, and /// the IR being printed must not be an parent of the IR originally used to /// initialize this state. This means that if a child operation is provided, a /// parent operation cannot reuse this state. class AsmState { … }; //===----------------------------------------------------------------------===// // AsmPrinter CommandLine Options //===----------------------------------------------------------------------===// /// Register a set of useful command-line options that can be used to configure /// various flags within the AsmPrinter. void registerAsmPrinterCLOptions(); } // namespace mlir #endif // MLIR_IR_ASMSTATE_H_