Implement IR support for attributes.
PiperOrigin-RevId: 203293376
diff --git a/lib/IR/Attributes.cpp b/lib/IR/Attributes.cpp
new file mode 100644
index 0000000..0a773f1
--- /dev/null
+++ b/lib/IR/Attributes.cpp
@@ -0,0 +1,57 @@
+//===- Attributes.cpp - MLIR Attribute Implementation ---------------------===//
+//
+// Copyright 2019 The MLIR Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// =============================================================================
+
+#include "mlir/IR/Attributes.h"
+#include "llvm/Support/raw_ostream.h"
+#include "mlir/Support/STLExtras.h"
+using namespace mlir;
+
+void Attribute::print(raw_ostream &os) const {
+ switch (getKind()) {
+ case Kind::Bool:
+ os << (cast<BoolAttr>(this)->getValue() ? "true" : "false");
+ break;
+ case Kind::Integer:
+ os << cast<IntegerAttr>(this)->getValue();
+ break;
+ case Kind::Float:
+ // FIXME: this isn't precise, we should print with a hex format.
+ os << cast<FloatAttr>(this)->getValue();
+ break;
+ case Kind::String:
+ // FIXME: should escape the string.
+ os << '"' << cast<StringAttr>(this)->getValue() << '"';
+ break;
+ case Kind::Array: {
+ auto elts = cast<ArrayAttr>(this)->getValue();
+ if (elts.empty())
+ os << "[]";
+ else {
+ os << "[ ";
+ interleave(elts,
+ [&](Attribute *attr) { attr->print(os); },
+ [&]() { os << ", "; });
+ os << " ]";
+ }
+ break;
+ }
+ }
+}
+
+void Attribute::dump() const {
+ print(llvm::errs());
+}