1d80d3a35SRiver Riddle //===- TestBuiltinAttributeInterfaces.cpp ---------------------------------===//
2d80d3a35SRiver Riddle //
3d80d3a35SRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d80d3a35SRiver Riddle // See https://llvm.org/LICENSE.txt for license information.
5d80d3a35SRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d80d3a35SRiver Riddle //
7d80d3a35SRiver Riddle //===----------------------------------------------------------------------===//
8d80d3a35SRiver Riddle
9d80d3a35SRiver Riddle #include "TestAttributes.h"
1036d3efeaSRiver Riddle #include "mlir/IR/BuiltinOps.h"
11d80d3a35SRiver Riddle #include "mlir/Pass/Pass.h"
12444683a9SJeff Niu #include "llvm/ADT/TypeSwitch.h"
13d80d3a35SRiver Riddle #include "llvm/Support/FormatVariadic.h"
14d80d3a35SRiver Riddle
15d80d3a35SRiver Riddle using namespace mlir;
16d80d3a35SRiver Riddle using namespace test;
17d80d3a35SRiver Riddle
187faf75bbSMehdi Amini // Helper to print one scalar value, force int8_t to print as integer instead of
197faf75bbSMehdi Amini // char.
207faf75bbSMehdi Amini template <typename T>
printOneElement(InFlightDiagnostic & os,T value)217faf75bbSMehdi Amini static void printOneElement(InFlightDiagnostic &os, T value) {
227faf75bbSMehdi Amini os << llvm::formatv("{0}", value).str();
237faf75bbSMehdi Amini }
247faf75bbSMehdi Amini
25d80d3a35SRiver Riddle namespace {
26d80d3a35SRiver Riddle struct TestElementsAttrInterface
27d80d3a35SRiver Riddle : public PassWrapper<TestElementsAttrInterface, OperationPass<ModuleOp>> {
MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID__anon4358a8840111::TestElementsAttrInterface285e50dd04SRiver Riddle MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestElementsAttrInterface)
295e50dd04SRiver Riddle
30d80d3a35SRiver Riddle StringRef getArgument() const final { return "test-elements-attr-interface"; }
getDescription__anon4358a8840111::TestElementsAttrInterface31d80d3a35SRiver Riddle StringRef getDescription() const final {
32d80d3a35SRiver Riddle return "Test ElementsAttr interface support.";
33d80d3a35SRiver Riddle }
runOnOperation__anon4358a8840111::TestElementsAttrInterface34d80d3a35SRiver Riddle void runOnOperation() override {
35d80d3a35SRiver Riddle getOperation().walk([&](Operation *op) {
36d80d3a35SRiver Riddle for (NamedAttribute attr : op->getAttrs()) {
375550c821STres Popp auto elementsAttr = dyn_cast<ElementsAttr>(attr.getValue());
38d80d3a35SRiver Riddle if (!elementsAttr)
39d80d3a35SRiver Riddle continue;
407faf75bbSMehdi Amini testElementsAttrIteration<int64_t>(op, elementsAttr, "int64_t");
41d80d3a35SRiver Riddle testElementsAttrIteration<uint64_t>(op, elementsAttr, "uint64_t");
42d80d3a35SRiver Riddle testElementsAttrIteration<APInt>(op, elementsAttr, "APInt");
43d80d3a35SRiver Riddle testElementsAttrIteration<IntegerAttr>(op, elementsAttr, "IntegerAttr");
44d80d3a35SRiver Riddle }
45d80d3a35SRiver Riddle });
46d80d3a35SRiver Riddle }
47d80d3a35SRiver Riddle
48d80d3a35SRiver Riddle template <typename T>
testElementsAttrIteration__anon4358a8840111::TestElementsAttrInterface49d80d3a35SRiver Riddle void testElementsAttrIteration(Operation *op, ElementsAttr attr,
50d80d3a35SRiver Riddle StringRef type) {
51d80d3a35SRiver Riddle InFlightDiagnostic diag = op->emitError()
52d80d3a35SRiver Riddle << "Test iterating `" << type << "`: ";
53d80d3a35SRiver Riddle
54*a5757c5bSChristian Sigg if (!isa<mlir::IntegerType>(attr.getElementType())) {
55c836b4adSRik Huijzer diag << "expected element type to be an integer type";
56c836b4adSRik Huijzer return;
57c836b4adSRik Huijzer }
58c836b4adSRik Huijzer
59d80d3a35SRiver Riddle auto values = attr.tryGetValues<T>();
60d80d3a35SRiver Riddle if (!values) {
61d80d3a35SRiver Riddle diag << "unable to iterate type";
62d80d3a35SRiver Riddle return;
63d80d3a35SRiver Riddle }
64d80d3a35SRiver Riddle
657faf75bbSMehdi Amini llvm::interleaveComma(*values, diag,
667faf75bbSMehdi Amini [&](T value) { printOneElement(diag, value); });
67d80d3a35SRiver Riddle }
68d80d3a35SRiver Riddle };
69be0a7e9fSMehdi Amini } // namespace
70d80d3a35SRiver Riddle
71d80d3a35SRiver Riddle namespace mlir {
72d80d3a35SRiver Riddle namespace test {
registerTestBuiltinAttributeInterfaces()73d80d3a35SRiver Riddle void registerTestBuiltinAttributeInterfaces() {
74d80d3a35SRiver Riddle PassRegistration<TestElementsAttrInterface>();
75d80d3a35SRiver Riddle }
76d80d3a35SRiver Riddle } // namespace test
77d80d3a35SRiver Riddle } // namespace mlir
78