From 4ff440b0efb0a9dbfd6786d16e6e5d4dfeca2bde Mon Sep 17 00:00:00 2001 From: Simon Camphausen Date: Mon, 5 Jul 2021 16:39:28 +0200 Subject: [PATCH] [mlir] Change custom syntax of emitc.include op to resemble C This changes the custom syntax of the emitc.include operation for standard includes. Reviewed By: marbre Differential Revision: https://reviews.llvm.org/D105281 --- mlir/include/mlir/Dialect/EmitC/IR/EmitC.td | 12 +++++----- mlir/lib/Dialect/EmitC/IR/EmitC.cpp | 35 +++++++++++++++++++++++++++++ mlir/test/Dialect/EmitC/ops.mlir | 6 ++--- 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td b/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td index 78c682a..93e67f3 100644 --- a/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td +++ b/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td @@ -126,12 +126,15 @@ def EmitC_IncludeOp ```mlir // Custom form defining the inclusion of ``. - emitc.include "myheader.h" is_standard_include + emitc.include <"myheader.h"> // Generic form of the same operation. "emitc.include" (){include = "myheader.h", is_standard_include} : () -> () - // Generic form defining the inclusion of `"myheader"`. + // Custom form defining the inclusion of `"myheader"`. + emitc.include "myheader.h" + + // Generic form of the same operation. "emitc.include" (){include = "myheader.h"} : () -> () ``` }]; @@ -139,9 +142,8 @@ def EmitC_IncludeOp Arg:$include, UnitAttr:$is_standard_include ); - let assemblyFormat = [{ - $include attr-dict (`is_standard_include` $is_standard_include^)? - }]; + let printer = [{ return ::print(p, *this); }]; + let parser = [{ return ::parse$cppClass(parser, result); }]; let verifier = ?; } diff --git a/mlir/lib/Dialect/EmitC/IR/EmitC.cpp b/mlir/lib/Dialect/EmitC/IR/EmitC.cpp index c0fa749..e99eb7b 100644 --- a/mlir/lib/Dialect/EmitC/IR/EmitC.cpp +++ b/mlir/lib/Dialect/EmitC/IR/EmitC.cpp @@ -117,6 +117,41 @@ OpFoldResult emitc::ConstantOp::fold(ArrayRef operands) { } //===----------------------------------------------------------------------===// +// IncludeOp +//===----------------------------------------------------------------------===// + +static void print(OpAsmPrinter &p, IncludeOp &op) { + bool standardInclude = op.is_standard_include(); + + p << IncludeOp::getOperationName() << " "; + if (standardInclude) + p << "<"; + p << "\"" << op.include() << "\""; + if (standardInclude) + p << ">"; +} + +static ParseResult parseIncludeOp(OpAsmParser &parser, OperationState &result) { + bool standardInclude = !parser.parseOptionalLess(); + + StringAttr include; + OptionalParseResult includeParseResult = + parser.parseOptionalAttribute(include, "include", result.attributes); + if (!includeParseResult.hasValue()) + return parser.emitError(parser.getNameLoc()) << "expected string attribute"; + + if (standardInclude && parser.parseOptionalGreater()) + return parser.emitError(parser.getNameLoc()) + << "expected trailing '>' for standard include"; + + if (standardInclude) + result.addAttribute("is_standard_include", + UnitAttr::get(parser.getBuilder().getContext())); + + return success(); +} + +//===----------------------------------------------------------------------===// // TableGen'd op method definitions //===----------------------------------------------------------------------===// diff --git a/mlir/test/Dialect/EmitC/ops.mlir b/mlir/test/Dialect/EmitC/ops.mlir index 3a48ff4..25d6f2a 100644 --- a/mlir/test/Dialect/EmitC/ops.mlir +++ b/mlir/test/Dialect/EmitC/ops.mlir @@ -1,7 +1,7 @@ -// RUN: mlir-opt -verify-diagnostics %s | FileCheck %s +// RUN: mlir-opt %s | mlir-opt | FileCheck %s -"emitc.include" (){include = "test.h", is_standard_include} : () -> () -emitc.include "test.h" is_standard_include +emitc.include <"test.h"> +emitc.include "test.h" // CHECK-LABEL: func @f(%{{.*}}: i32, %{{.*}}: !emitc.opaque<"int32_t">) { func @f(%arg0: i32, %f: !emitc.opaque<"int32_t">) { -- 2.7.4