// Tablegen tests for the automatic generation of OpenMP clause operand // structure definitions. // Run tablegen to generate OmpCommon.td in temp directory first. // RUN: mkdir -p %t/mlir/Dialect/OpenMP // RUN: mlir-tblgen --gen-directive-decl --directives-dialect=OpenMP \ // RUN: %S/../../../llvm/include/llvm/Frontend/OpenMP/OMP.td \ // RUN: -I %S/../../../llvm/include > %t/mlir/Dialect/OpenMP/OmpCommon.td // RUN: mlir-tblgen -gen-openmp-clause-ops -I %S/../../include -I %t %s 2>&1 | FileCheck %s include "mlir/Dialect/OpenMP/OpenMPOpBase.td" def OpenMP_MyFirstClause : OpenMP_Clause< /*skipTraits=*/false, /*skipArguments=*/false, /*skipAssemblyFormat=*/false, /*skipDescription=*/false, /*skipExtraClassDeclaration=*/false> { let arguments = (ins // Simple attributes I32Attr:$int_attr, TypeAttr:$type_attr, DeclareTargetAttr:$omp_attr, // Array attributes F32ArrayAttr:$float_array_attr, StrArrayAttr:$str_array_attr, AnyIntElementsAttr:$anyint_elems_attr, RankedF32ElementsAttr<[3, 4, 5]>:$float_nd_elems_attr, // Optional attributes OptionalAttr:$opt_bool_attr, OptionalAttr:$opt_int_array_attr, OptionalAttr:$opt_int_elems_attr, // Multi-level composition ConfinedAttr, [IntMinValue<0>]>:$complex_opt_int_attr, // ElementsAttrBase-related edge cases. // CHECK: warning: could not infer array-like attribute element type for argument 'elements_attr', will use bare `storageType` ElementsAttr:$elements_attr, // CHECK: warning: could not infer array-like attribute element type for argument 'string_elements_attr', will use bare `storageType` StringElementsAttr:$string_elements_attr ); } // CHECK: struct MyFirstClauseOps { // CHECK-NEXT: ::mlir::IntegerAttr intAttr; // CHECK-NEXT: ::mlir::TypeAttr typeAttr; // CHECK-NEXT: ::mlir::omp::DeclareTargetAttr ompAttr; // CHECK-NEXT: ::llvm::SmallVector<::mlir::Attribute> floatArrayAttr; // CHECK-NEXT: ::llvm::SmallVector<::mlir::Attribute> strArrayAttr; // CHECK-NEXT: ::llvm::SmallVector<::llvm::APInt> anyintElemsAttr; // CHECK-NEXT: ::llvm::SmallVector<::llvm::APFloat> floatNdElemsAttr; // CHECK-NEXT: ::mlir::BoolAttr optBoolAttr; // CHECK-NEXT: ::llvm::SmallVector<::mlir::Attribute> optIntArrayAttr; // CHECK-NEXT: ::llvm::SmallVector optIntElemsAttr; // CHECK-NEXT: ::mlir::IntegerAttr complexOptIntAttr; // CHECK-NEXT: ::mlir::ElementsAttr elementsAttr; // CHECK-NEXT: ::mlir::DenseElementsAttr stringElementsAttr; // CHECK-NEXT: } def OpenMP_MySecondClause : OpenMP_Clause< /*skipTraits=*/false, /*skipArguments=*/false, /*skipAssemblyFormat=*/false, /*skipDescription=*/false, /*skipExtraClassDeclaration=*/false> { let arguments = (ins I32:$int_val, Optional:$opt_any_val, Variadic:$variadic_index_val ); } // CHECK: struct MySecondClauseOps { // CHECK-NEXT: ::mlir::Value intVal; // CHECK-NEXT: ::mlir::Value optAnyVal; // CHECK-NEXT: ::llvm::SmallVector<::mlir::Value> variadicIndexVal; // CHECK-NEXT: } def OpenMP_MyFirstOp : OpenMP_Op<"op", clauses=[OpenMP_MyFirstClause]>; // CHECK: using MyFirstOperands = detail::Clauses; def OpenMP_MySecondOp : OpenMP_Op<"op", clauses=[OpenMP_MyFirstClause, OpenMP_MySecondClause]>; // CHECK: using MySecondOperands = detail::Clauses;