blob: 12c0c1b6309d054e0847709d09a7469fc3502f29 [file] [log] [blame]
Chris Lattner7121b802018-07-04 20:45:39 -07001//===- Operation.cpp - MLIR Operation Class -------------------------------===//
2//
3// Copyright 2019 The MLIR Authors.
4//
5// Licensed under the Apache License, Version 2.0 (the "License");
6// you may not use this file except in compliance with the License.
7// You may obtain a copy of the License at
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing, software
12// distributed under the License is distributed on an "AS IS" BASIS,
13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14// See the License for the specific language governing permissions and
15// limitations under the License.
16// =============================================================================
17
18#include "mlir/IR/Operation.h"
Chris Lattnerdf1a2fc2018-07-05 21:20:59 -070019#include "AttributeListStorage.h"
Chris Lattner7121b802018-07-04 20:45:39 -070020using namespace mlir;
21
Chris Lattner55315d52018-07-18 19:06:45 -070022Operation::Operation(Identifier name, bool isInstruction,
23 ArrayRef<NamedAttribute> attrs, MLIRContext *context)
24 : nameAndIsInstruction(name, isInstruction) {
Chris Lattnerdf1a2fc2018-07-05 21:20:59 -070025 this->attrs = AttributeListStorage::get(attrs, context);
26
Chris Lattner7121b802018-07-04 20:45:39 -070027#ifndef NDEBUG
28 for (auto elt : attrs)
29 assert(elt.second != nullptr && "Attributes cannot have null entries");
30#endif
31}
32
33Operation::~Operation() {
34}
35
Chris Lattnerdf1a2fc2018-07-05 21:20:59 -070036ArrayRef<NamedAttribute> Operation::getAttrs() const {
37 if (!attrs)
38 return {};
39 return attrs->getElements();
40}
41
Chris Lattnerff0d5902018-07-05 09:12:11 -070042/// If an attribute exists with the specified name, change it to the new
43/// value. Otherwise, add a new attribute with the specified name/value.
Chris Lattnerdf1a2fc2018-07-05 21:20:59 -070044void Operation::setAttr(Identifier name, Attribute *value,
45 MLIRContext *context) {
Chris Lattnerff0d5902018-07-05 09:12:11 -070046 assert(value && "attributes may never be null");
Chris Lattnerdf1a2fc2018-07-05 21:20:59 -070047 auto origAttrs = getAttrs();
48
49 SmallVector<NamedAttribute, 8> newAttrs(origAttrs.begin(), origAttrs.end());
50
Chris Lattnerff0d5902018-07-05 09:12:11 -070051 // If we already have this attribute, replace it.
Chris Lattnerdf1a2fc2018-07-05 21:20:59 -070052 for (auto &elt : newAttrs)
Chris Lattnerff0d5902018-07-05 09:12:11 -070053 if (elt.first == name) {
54 elt.second = value;
Chris Lattnerdf1a2fc2018-07-05 21:20:59 -070055 attrs = AttributeListStorage::get(newAttrs, context);
Chris Lattnerff0d5902018-07-05 09:12:11 -070056 return;
57 }
58
59 // Otherwise, add it.
Chris Lattnerdf1a2fc2018-07-05 21:20:59 -070060 newAttrs.push_back({name, value});
61 attrs = AttributeListStorage::get(newAttrs, context);
Chris Lattnerff0d5902018-07-05 09:12:11 -070062}
63
64/// Remove the attribute with the specified name if it exists. The return
65/// value indicates whether the attribute was present or not.
Chris Lattnerdf1a2fc2018-07-05 21:20:59 -070066auto Operation::removeAttr(Identifier name, MLIRContext *context)
67 -> RemoveResult {
68 auto origAttrs = getAttrs();
69 for (unsigned i = 0, e = origAttrs.size(); i != e; ++i) {
70 if (origAttrs[i].first == name) {
71 SmallVector<NamedAttribute, 8> newAttrs;
72 newAttrs.reserve(origAttrs.size() - 1);
73 newAttrs.append(origAttrs.begin(), origAttrs.begin() + i);
74 newAttrs.append(origAttrs.begin() + i + 1, origAttrs.end());
75 attrs = AttributeListStorage::get(newAttrs, context);
Chris Lattner7121b802018-07-04 20:45:39 -070076 return RemoveResult::Removed;
77 }
78 }
79 return RemoveResult::NotFound;
80}