diff --git a/mlir/include/mlir/Dialect/DLTI/DLTI.h b/mlir/include/mlir/Dialect/DLTI/DLTI.h index f268fea340a6f..84cf6eabc5fa9 100644 --- a/mlir/include/mlir/Dialect/DLTI/DLTI.h +++ b/mlir/include/mlir/Dialect/DLTI/DLTI.h @@ -28,6 +28,12 @@ namespace dlti { /// query interface-implementing attrs, starting from attr obtained from `op`. FailureOr query(Operation *op, ArrayRef keys, bool emitError = false); + +/// Perform a DLTI-query at `op` using each string in `keys` as a separate DLTI +/// entry key, recursively querying on query interface-implementing attrs, +/// starting from attr obtained from `op`. +FailureOr query(Operation *op, ArrayRef keys, + bool emitError = false); } // namespace dlti } // namespace mlir diff --git a/mlir/lib/Dialect/DLTI/DLTI.cpp b/mlir/lib/Dialect/DLTI/DLTI.cpp index 2510e774f2b2a..b057554c40d8c 100644 --- a/mlir/lib/Dialect/DLTI/DLTI.cpp +++ b/mlir/lib/Dialect/DLTI/DLTI.cpp @@ -508,6 +508,9 @@ getClosestQueryable(Operation *op) { FailureOr dlti::query(Operation *op, ArrayRef keys, bool emitError) { + if (!op) + return failure(); + if (keys.empty()) { if (emitError) { auto diag = op->emitError() << "target op of failed DLTI query"; @@ -562,6 +565,19 @@ dlti::query(Operation *op, ArrayRef keys, bool emitError) { return currentAttr; } +FailureOr dlti::query(Operation *op, ArrayRef keys, + bool emitError) { + if (!op) + return failure(); + + MLIRContext *ctx = op->getContext(); + SmallVector entryKeys(keys.size()); + for (StringRef key : keys) + entryKeys.push_back(StringAttr::get(ctx, key)); + + return dlti::query(op, entryKeys, emitError); +} + constexpr const StringLiteral mlir::DLTIDialect::kDataLayoutAttrName; constexpr const StringLiteral mlir::DLTIDialect::kDataLayoutEndiannessKey; constexpr const StringLiteral mlir::DLTIDialect::kDataLayoutEndiannessBig;