12#include <mlir/IR/Builders.h>
13#include <mlir/IR/Diagnostics.h>
14#include <mlir/Support/LLVM.h>
16#include <llvm/ADT/STLExtras.h>
17#include <llvm/ADT/StringSet.h>
28PodType::verify(llvm::function_ref<InFlightDiagnostic()> emitError, ArrayRef<RecordAttr> records) {
29 llvm::StringSet<> seenNames;
31 for (
auto record : records) {
32 auto recordName = record.getName();
33 if (seenNames.contains(recordName)) {
34 emitError() <<
"found duplicated record name '" << recordName.getValue() <<
'\'';
37 seenNames.insert(recordName);
39 return mlir::failure(failed);
43 auto records = llvm::map_to_vector(init, [ctx](
auto record) {
44 return RecordAttr::get(ctx, StringAttr::get(ctx, record.name), record.value.getType());
46 return get(ctx, records);
52 if (record.getName() == recordName) {
53 return record.getType();
56 return emitError() <<
"record '" << recordName <<
"' was not found in plain-old-data type";
60 llvm::StringMap<Type> map;
62 map.insert({record.getName(), record.getType()});
67ParseResult
parsePodType(AsmParser &parser, SmallVector<RecordAttr> &records) {
68 return parser.parseCommaSeparatedList(AsmParser::Delimiter::Square, [&records, &parser]() {
72 if (mlir::succeeded(result)) {
73 records.push_back(RecordAttr::get(parser.getContext(), name, type));
79void printPodType(AsmPrinter &printer, ArrayRef<RecordAttr> records) {
80 auto &os = printer.getStream();
82 printer.printStrippedAttrOrType(records);
::llvm::FailureOr<::mlir::Type > getRecord(::llvm::StringRef name, ::llvm::function_ref<::mlir::InFlightDiagnostic()>) const
Searches a record by name.
static PodType fromInitialValues(::mlir::MLIRContext *ctx, InitializedRecords init)
Creates a new type from a set of initialized records.
static PodType get(::mlir::MLIRContext *context, ::llvm::ArrayRef<::llzk::pod::RecordAttr > records)
::llvm::StringMap<::mlir::Type > getRecordMap() const
Returns the records in map form.
::llvm::ArrayRef<::llzk::pod::RecordAttr > getRecords() const
::llvm::LogicalResult verify(::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError, ::llvm::ArrayRef<::llzk::pod::RecordAttr > records)
mlir::ArrayRef< RecordValue > InitializedRecords
ParseResult parsePodType(AsmParser &parser, SmallVector< RecordAttr > &records)
ParseResult parseRecord(AsmParser &parser, StringAttr &name, Type &type)
void printPodType(AsmPrinter &printer, ArrayRef< RecordAttr > records)