19#include "llvm/ADT/TypeSwitch.h"
38 if (
auto intType = dyn_cast<IntegerType>(type)) {
39 return intType.getWidth();
41 if (llvm::isa<IndexType>(type)) {
42 return IndexType::kInternalStorageBitWidth;
45 <<
"expected integer or index type for IntegerAttr, but got: " << type;
50 Type type, FailureOr<APInt> &val) {
51 unsigned bitWidth = getIntegerBitWidth(reader, type);
58 FailureOr<APFloat> &val) {
59 auto ftype = dyn_cast<FloatType>(type);
70 rawStringData.resize(isSplat ? 1 : type.getNumElements());
71 for (StringRef &value : rawStringData)
78 DenseStringElementsAttr attr) {
79 bool isSplat = attr.isSplat();
83 for (StringRef str : attr.getRawStringData())
90 switch (lineCols.size()) {
92 return FileLineColRange::get(filename);
94 return FileLineColRange::get(filename, lineCols[0]);
96 return FileLineColRange::get(filename, lineCols[0], lineCols[1]);
98 return FileLineColRange::get(filename, lineCols[0], lineCols[1],
101 return FileLineColRange::get(filename, lineCols[0], lineCols[1],
102 lineCols[2], lineCols[3]);
112 lineCols, [&reader](uint64_t &val) {
return reader.
readVarInt(val); });
117 if (range.getStartLine() == 0 && range.getStartColumn() == 0 &&
118 range.getEndLine() == 0 && range.getEndColumn() == 0) {
122 if (range.getStartColumn() == 0 &&
123 range.getStartLine() == range.getEndLine()) {
130 if (range.getEndColumn() == range.getStartColumn() &&
131 range.getStartLine() == range.getEndLine()) {
137 if (range.getStartLine() == range.getEndLine()) {
159 if (!type.getElementType().isInteger(1)) {
160 rawData.append(blob.begin(), blob.end());
169 size_t numElements = type.getNumElements();
170 size_t packedSize = llvm::divideCeil(numElements, 8);
171 if (blob.size() == packedSize && blob.size() != numElements) {
173 rawData.resize(numElements);
174 for (
size_t i = 0; i < numElements; ++i)
175 rawData[i] = (blob[i / 8] & (1 << (i % 8))) ? 1 : 0;
179 rawData.append(blob.begin(), blob.end());
186 if (attr.getElementType().isInteger(1)) {
192 if (attr.isSplat()) {
194 data[0] = rawData[0] ? 0xFF : 0x00;
199 size_t numElements = attr.getNumElements();
200 data.resize(llvm::divideCeil(numElements, 8));
202 for (
size_t i = 0; i < numElements; ++i)
204 data[i / 8] |= (1 << (i % 8));
212#include "mlir/IR/BuiltinDialectBytecode.cpp.inc"
216 BuiltinDialectBytecodeInterface(Dialect *dialect)
217 : BytecodeDialectInterface(dialect) {}
222 Attribute readAttribute(DialectBytecodeReader &reader)
const override {
226 LogicalResult writeAttribute(Attribute attr,
227 DialectBytecodeWriter &writer)
const override {
228 return ::writeAttribute(attr, writer);
234 Type readType(DialectBytecodeReader &reader)
const override {
238 LogicalResult writeType(Type type,
239 DialectBytecodeWriter &writer)
const override {
240 return ::writeType(type, writer);
246 dialect->addInterfaces<BuiltinDialectBytecodeInterface>();
This class defines a virtual interface for reading a bytecode stream, providing hooks into the byteco...
virtual LogicalResult readBlob(ArrayRef< char > &result)=0
Read a blob from the bytecode.
virtual LogicalResult readVarInt(uint64_t &result)=0
Read a variable width integer.
virtual FailureOr< APInt > readAPIntWithKnownWidth(unsigned bitWidth)=0
Read an APInt that is known to have been encoded with the given width.
virtual InFlightDiagnostic emitError(const Twine &msg={}) const =0
Emit an error to the reader.
virtual LogicalResult readString(StringRef &result)=0
Read a string from the bytecode.
LogicalResult readList(SmallVectorImpl< T > &result, CallbackFn &&callback)
Read out a list of elements, invoking the provided callback for each element.
virtual FailureOr< APFloat > readAPFloatWithKnownSemantics(const llvm::fltSemantics &semantics)=0
Read an APFloat that is known to have been encoded with the given semantics.
This class defines a virtual interface for writing to a bytecode stream, providing hooks into the byt...
virtual void writeVarInt(uint64_t value)=0
Write a variable width integer to the output stream.
virtual void writeUnownedBlob(ArrayRef< char > blob)=0
Write a blob to the bytecode, which is not owned by the caller.
virtual void writeOwnedBlob(ArrayRef< char > blob)=0
Write a blob to the bytecode, which is owned by the caller and is guaranteed to not die before the en...
virtual void writeOwnedString(StringRef str)=0
Write a string to the bytecode, which is owned by the caller and is guaranteed to not die before the ...
MLIRContext is the top-level object for a collection of MLIR operations.
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
void addBytecodeInterface(BuiltinDialect *dialect)
Add the interfaces necessary for encoding the builtin dialect components in bytecode.
Include the generated interface declarations.