//===- Format.h - Utilities for String Format -------------------*- 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 declares utilities for formatting strings. They are specially // tailored to the needs of TableGen'ing op definitions and rewrite rules, // so they are not expected to be used as widely applicable utilities. // //===----------------------------------------------------------------------===// #ifndef MLIR_TABLEGEN_FORMAT_H_ #define MLIR_TABLEGEN_FORMAT_H_ #include "mlir/Support/LLVM.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/StringMap.h" #include "llvm/Support/FormatVariadic.h" namespace mlir { namespace tblgen { /// Format context containing substitutions for special placeholders. /// /// This context divides special placeholders into two categories: builtin ones /// and custom ones. /// /// Builtin placeholders are baked into `FmtContext` and each one of them has a /// dedicated setter. They can be used in all dialects. Their names follow the /// convention of `$_<name>`. The rationale of the leading underscore is to /// avoid confusion and name collision: op arguments/attributes/results are /// named as $<name>, and we can potentially support referencing those entities /// directly in the format template in the future. // /// Custom ones are registered by dialect-specific TableGen backends and use the /// same unified setter. class FmtContext { … }; /// Struct representing a replacement segment for the formatted string. It can /// be a segment of the formatting template (for `Literal`) or a replacement /// parameter (for `PositionalPH`, `PositionalRangePH` and `SpecialPH`). struct FmtReplacement { … }; class FmtObjectBase { … }; template <typename Tuple> class FmtObject : public FmtObjectBase { … }; class FmtStrVecObject : public FmtObjectBase { … }; /// Formats text by substituting placeholders in format string with replacement /// parameters. /// /// There are two categories of placeholders accepted, both led by a '$' sign: /// /// 1.a Positional placeholder: $[0-9]+ /// 1.b Positional range placeholder: $[0-9]+... /// 2. Special placeholder: $[a-zA-Z_][a-zA-Z0-9_]* /// /// Replacement parameters for positional placeholders are supplied as the /// `vals` parameter pack with 1:1 mapping. That is, $0 will be replaced by the /// first parameter in `vals`, $1 by the second one, and so on. Note that you /// can use the positional placeholders in any order and repeat any times, for /// example, "$2 $1 $1 $0" is accepted. /// /// Replace parameters for positional range placeholders are supplied as if /// positional placeholders were specified with commas separating them. /// /// Replacement parameters for special placeholders are supplied using the `ctx` /// format context. /// /// The `fmt` is recorded as a `StringRef` inside the returned `FmtObject`. /// The caller needs to make sure the underlying data is available when the /// `FmtObject` is used. /// /// `ctx` accepts a nullptr if there is no special placeholder is used. /// /// If no substitution is provided for a placeholder or any error happens during /// format string parsing or replacement, the placeholder will be outputted /// as-is with an additional marker '<no-subst-found>', to aid debugging. /// /// To print a '$' literally, escape it with '$$'. /// /// This utility function is inspired by LLVM formatv(), with modifications /// specially tailored for TableGen C++ generation usage: /// /// 1. This utility use '$' instead of '{' and '}' for denoting the placeholder /// because '{' and '}' are frequently used in C++ code. /// 2. This utility does not support format layout because it is rarely needed /// in C++ code generation. template <typename... Ts> inline auto tgfmt(StringRef fmt, const FmtContext *ctx, Ts &&...vals) -> FmtObject< decltype(std::make_tuple(llvm::support::detail::build_format_adapter( std::forward<Ts>(vals))...))> { … } inline FmtStrVecObject tgfmt(StringRef fmt, const FmtContext *ctx, ArrayRef<std::string> params) { … } } // namespace tblgen } // namespace mlir #endif // MLIR_TABLEGEN_FORMAT_H_