brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.2 KiB · 8489cff Raw
133 lines · plain
1// RUN: mlir-tblgen -gen-enum-decls -I %S/../../include %s | FileCheck %s --check-prefix=DECL2// RUN: mlir-tblgen -gen-enum-defs -I %S/../../include %s | FileCheck %s --check-prefix=DEF3 4include "mlir/IR/EnumAttr.td"5include "mlir/IR/OpBase.td"6 7// Test bit enums8def None: I32BitEnumCaseNone<"None", "none">;9def Bit0: I32BitEnumCaseBit<"Bit0", 0, "tagged">;10def Bit1: I32BitEnumCaseBit<"Bit1", 1>;11def Bit2: I32BitEnumCaseBit<"Bit2", 2>;12def Bit3: I32BitEnumAttrCaseBit<"Bit3", 3>;13def BitGroup: BitEnumCaseGroup<"BitGroup", [14  Bit0, Bit115]>;16 17def MyBitEnum: I32BitEnumAttr<"MyBitEnum", "An example bit enum",18                           [None, Bit0, Bit1, Bit2, Bit3, BitGroup]> {19  let genSpecializedAttr = 0;20}21 22// DECL-LABEL: enum class MyBitEnum : uint32_t23// DECL: None = 0,24// DECL: Bit0 = 1,25// DECL: Bit1 = 2,26// DECL: Bit2 = 4,27// DECL: Bit3 = 8,28// DECL: }29 30// DECL: ::std::optional<MyBitEnum> symbolizeMyBitEnum(uint32_t);31// DECL: std::string stringifyMyBitEnum(MyBitEnum);32// DECL: ::std::optional<MyBitEnum> symbolizeMyBitEnum(::llvm::StringRef);33 34// DECL: struct FieldParser<::MyBitEnum, ::MyBitEnum> {35// DECL:   template <typename ParserT>36// DECL:   static FailureOr<::MyBitEnum> parse(ParserT &parser) {37// DECL:     // Parse the keyword/string containing the enum.38// DECL:     std::string enumKeyword;39// DECL:     auto loc = parser.getCurrentLocation();40// DECL:     if (failed(parser.parseOptionalKeywordOrString(&enumKeyword)))41// DECL:       return parser.emitError(loc, "expected keyword for An example bit enum");42// DECL:     // Symbolize the keyword.43// DECL:     if (::std::optional<::MyBitEnum> attr = ::symbolizeEnum<::MyBitEnum>(enumKeyword))44// DECL:       return *attr;45// DECL:     return parser.emitError(loc, "expected one of [none, tagged, Bit1, Bit2, Bit3, BitGroup] for An example bit enum, got: ") << enumKeyword;46// DECL:   }47 48// DECL: inline ::llvm::raw_ostream &operator<<(::llvm::raw_ostream &p, ::MyBitEnum value) {49// DECL:   auto valueStr = stringifyEnum(value);50// DECL:   switch (value) {51// DECL:   case ::MyBitEnum::BitGroup:52// DECL:     return p << valueStr;53// DECL:   default:54// DECL:     break;55// DECL:   }56// DECL:   auto underlyingValue = static_cast<std::make_unsigned_t<::MyBitEnum>>(value);57// DECL:   if (underlyingValue && !llvm::has_single_bit(underlyingValue))58// DECL:     return p << '"' << valueStr << '"';59// DECL:   return p << valueStr;60 61// DEF-LABEL: std::string stringifyMyBitEnum62// DEF: auto val = static_cast<uint32_t>63// DEF: if (val == 0) return "none";64// DEF: if (1u == (1u & val))65// DEF-NEXT: push_back("tagged")66// DEF: if (2u == (2u & val))67// DEF-NEXT: push_back("Bit1")68 69// DEF-LABEL: ::std::optional<MyBitEnum> symbolizeMyBitEnum(::llvm::StringRef str)70// DEF: if (str == "none") return MyBitEnum::None;71// DEF: .Case("tagged", 1)72// DEF: .Case("Bit1", 2)73 74// Test enum printer generation for non non-keyword enums.75 76def NonKeywordBit: I32BitEnumCaseBit<"Bit0", 0, "tag-ged">;77def MyMixedNonKeywordBitEnum: I32BitEnumAttr<"MyMixedNonKeywordBitEnum", "An example bit enum", [78    NonKeywordBit,79    Bit180  ]> {81  let genSpecializedAttr = 0;82}83 84def MyNonKeywordBitEnum: I32BitEnumAttr<"MyNonKeywordBitEnum", "An example bit enum", [85    NonKeywordBit86  ]> {87  let genSpecializedAttr = 0;88}89 90// DECL: inline ::llvm::raw_ostream &operator<<(::llvm::raw_ostream &p, ::MyMixedNonKeywordBitEnum value) {91// DECL: auto valueStr = stringifyEnum(value);92// DECL:   switch (value) {93// DECL:   case ::MyMixedNonKeywordBitEnum::Bit1:94// DECL:     break;95// DECL:   default:96// DECL:     return p << '"' << valueStr << '"';97// DECL:   }98// DECL:   return p << valueStr;99// DECL: }100 101// DECL: inline ::llvm::raw_ostream &operator<<(::llvm::raw_ostream &p, ::MyNonKeywordBitEnum value) {102// DECL:   auto valueStr = stringifyEnum(value);103// DECL:   return p << '"' << valueStr << '"';104 105def MyNonQuotedPrintBitEnum106  : I32BitEnum<"MyNonQuotedPrintBitEnum", "Example new-style bit enum",107    [None, Bit0, Bit1, Bit2, Bit3, BitGroup]>;108 109// DECL: struct FieldParser<::MyNonQuotedPrintBitEnum, ::MyNonQuotedPrintBitEnum> {110// DECL:   template <typename ParserT>111// DECL:   static FailureOr<::MyNonQuotedPrintBitEnum> parse(ParserT &parser) {112// DECL:     ::MyNonQuotedPrintBitEnum flags = {};113// DECL:     do {114  // DECL:     // Parse the keyword containing a part of the enum.115// DECL:       ::llvm::StringRef enumKeyword;116// DECL:       auto loc = parser.getCurrentLocation();117// DECL:       if (failed(parser.parseOptionalKeyword(&enumKeyword))) {118// DECL:         return parser.emitError(loc, "expected keyword for Example new-style bit enum");119// DECL:       }120// DECL:       // Symbolize the keyword.121// DECL:       if (::std::optional<::MyNonQuotedPrintBitEnum> flag = ::symbolizeEnum<::MyNonQuotedPrintBitEnum>(enumKeyword))122// DECL:         flags = flags | *flag;123// DECL:       } else {124// DECL:         return parser.emitError(loc, "expected one of [none, tagged, Bit1, Bit2, Bit3, BitGroup] for Example new-style bit enum, got: ") << enumKeyword;125// DECL:       }126// DECL:     } while (::mlir::succeeded(parser.parseOptionalVerticalBar()));127// DECL:     return flags;128// DECL:   }129 130// DECL: inline ::llvm::raw_ostream &operator<<(::llvm::raw_ostream &p, ::MyNonQuotedPrintBitEnum value) {131// DECL:   auto valueStr = stringifyEnum(value);132// DECL-NEXT:   return p << valueStr;133