[fir] Update fir.field_index op

Move the parser, printer, verifier and builder out of the .td file.
Rename lenparams to typeparams to be in sync with fir-dev.

This patch is part of the upstreaming effort from fir-dev branch.

Reviewed By: rovka

Differential Revision: https://reviews.llvm.org/D110690
This commit is contained in:
Valentin Clement 2021-09-30 12:51:14 +02:00
parent e5e0e00831
commit 220f314f94
No known key found for this signature in database
GPG Key ID: 086D54783C928776
2 changed files with 67 additions and 55 deletions

View File

@ -1827,66 +1827,15 @@ def fir_FieldIndexOp : fir_OneResultOp<"field_index", [NoSideEffect]> {
let arguments = (ins let arguments = (ins
StrAttr:$field_id, StrAttr:$field_id,
TypeAttr:$on_type, TypeAttr:$on_type,
Variadic<AnyIntegerType>:$lenparams Variadic<AnyIntegerType>:$typeparams
); );
let parser = [{ let parser = "return parseFieldIndexOp(parser, result);";
llvm::StringRef fieldName;
auto &builder = parser.getBuilder();
mlir::Type recty;
if (parser.parseOptionalKeyword(&fieldName) ||
parser.parseComma() ||
parser.parseType(recty))
return mlir::failure();
result.addAttribute(fieldAttrName(), builder.getStringAttr(fieldName));
if (!recty.dyn_cast<RecordType>())
return mlir::failure();
result.addAttribute(typeAttrName(), mlir::TypeAttr::get(recty));
if (!parser.parseOptionalLParen()) {
llvm::SmallVector<mlir::OpAsmParser::OperandType, 8> operands;
llvm::SmallVector<mlir::Type, 8> types;
auto loc = parser.getNameLoc();
if (parser.parseOperandList(operands,
mlir::OpAsmParser::Delimiter::None) ||
parser.parseColonTypeList(types) ||
parser.parseRParen() ||
parser.resolveOperands(operands, types, loc, result.operands))
return mlir::failure();
}
mlir::Type fieldType = fir::FieldType::get(builder.getContext());
if (parser.addTypeToList(fieldType, result.types))
return mlir::failure();
return mlir::success();
}];
let printer = [{ let printer = "::print(p, *this);";
p << ' '
<< (*this)->getAttrOfType<mlir::StringAttr>(fieldAttrName()).getValue()
<< ", " << (*this)->getAttr(typeAttrName());
if (getNumOperands()) {
p << '(';
p.printOperands(lenparams());
auto sep = ") : ";
for (auto op : lenparams()) {
p << sep;
if (op)
p.printType(op.getType());
else
p << "()";
sep = ", ";
}
}
}];
let builders = [OpBuilder<(ins "llvm::StringRef":$fieldName, let builders = [OpBuilder<(ins "llvm::StringRef":$fieldName,
"mlir::Type":$recTy, CArg<"mlir::ValueRange","{}">:$operands), "mlir::Type":$recTy, CArg<"mlir::ValueRange","{}">:$operands)>];
[{
$_state.addAttribute(fieldAttrName(),
$_builder.getStringAttr(fieldName));
$_state.addAttribute(typeAttrName(), TypeAttr::get(recTy));
$_state.addOperands(operands);
}]
>];
let extraClassDeclaration = [{ let extraClassDeclaration = [{
static constexpr llvm::StringRef fieldAttrName() { return "field_id"; } static constexpr llvm::StringRef fieldAttrName() { return "field_id"; }

View File

@ -1225,6 +1225,69 @@ void fir::ExtractValueOp::build(mlir::OpBuilder &builder,
build(builder, result, resTy, aggVal, aa); build(builder, result, resTy, aggVal, aa);
} }
//===----------------------------------------------------------------------===//
// FieldIndexOp
//===----------------------------------------------------------------------===//
static mlir::ParseResult parseFieldIndexOp(mlir::OpAsmParser &parser,
mlir::OperationState &result) {
llvm::StringRef fieldName;
auto &builder = parser.getBuilder();
mlir::Type recty;
if (parser.parseOptionalKeyword(&fieldName) || parser.parseComma() ||
parser.parseType(recty))
return mlir::failure();
result.addAttribute(fir::FieldIndexOp::fieldAttrName(),
builder.getStringAttr(fieldName));
if (!recty.dyn_cast<RecordType>())
return mlir::failure();
result.addAttribute(fir::FieldIndexOp::typeAttrName(),
mlir::TypeAttr::get(recty));
if (!parser.parseOptionalLParen()) {
llvm::SmallVector<mlir::OpAsmParser::OperandType> operands;
llvm::SmallVector<mlir::Type> types;
auto loc = parser.getNameLoc();
if (parser.parseOperandList(operands, mlir::OpAsmParser::Delimiter::None) ||
parser.parseColonTypeList(types) || parser.parseRParen() ||
parser.resolveOperands(operands, types, loc, result.operands))
return mlir::failure();
}
mlir::Type fieldType = fir::FieldType::get(builder.getContext());
if (parser.addTypeToList(fieldType, result.types))
return mlir::failure();
return mlir::success();
}
static void print(mlir::OpAsmPrinter &p, fir::FieldIndexOp &op) {
p << ' '
<< op.getOperation()
->getAttrOfType<mlir::StringAttr>(fir::FieldIndexOp::fieldAttrName())
.getValue()
<< ", " << op.getOperation()->getAttr(fir::FieldIndexOp::typeAttrName());
if (op.getNumOperands()) {
p << '(';
p.printOperands(op.typeparams());
const auto *sep = ") : ";
for (auto op : op.typeparams()) {
p << sep;
if (op)
p.printType(op.getType());
else
p << "()";
sep = ", ";
}
}
}
void fir::FieldIndexOp::build(mlir::OpBuilder &builder,
mlir::OperationState &result,
llvm::StringRef fieldName, mlir::Type recTy,
mlir::ValueRange operands) {
result.addAttribute(fieldAttrName(), builder.getStringAttr(fieldName));
result.addAttribute(typeAttrName(), TypeAttr::get(recTy));
result.addOperands(operands);
}
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// InsertOnRangeOp // InsertOnRangeOp
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//