blob: d21d8a82d768d149a5d31127e08fe1f4e77fd2bd [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"
19using namespace mlir;
20
21Operation::Operation(Identifier name, ArrayRef<NamedAttribute> attrs)
22 : name(name), attrs(attrs.begin(), attrs.end()) {
23#ifndef NDEBUG
24 for (auto elt : attrs)
25 assert(elt.second != nullptr && "Attributes cannot have null entries");
26#endif
27}
28
29Operation::~Operation() {
30}
31
Chris Lattnerff0d5902018-07-05 09:12:11 -070032/// If an attribute exists with the specified name, change it to the new
33/// value. Otherwise, add a new attribute with the specified name/value.
34void Operation::setAttr(Identifier name, Attribute *value) {
35 assert(value && "attributes may never be null");
36 // If we already have this attribute, replace it.
37 for (auto &elt : attrs)
38 if (elt.first == name) {
39 elt.second = value;
40 return;
41 }
42
43 // Otherwise, add it.
44 attrs.push_back({name, value});
45}
46
47/// Remove the attribute with the specified name if it exists. The return
48/// value indicates whether the attribute was present or not.
Chris Lattner7121b802018-07-04 20:45:39 -070049auto Operation::removeAttr(Identifier name) -> RemoveResult {
50 for (unsigned i = 0, e = attrs.size(); i != e; ++i) {
51 if (attrs[i].first == name) {
52 attrs.erase(attrs.begin()+i);
53 return RemoveResult::Removed;
54 }
55 }
56 return RemoveResult::NotFound;
57}