//===-- BuiltinBytecode.td - Builtin bytecode defs ---------*- tablegen -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This is the Builtin bytecode reader/writer definition file.
//
//===----------------------------------------------------------------------===//
#ifndef BUILTIN_BYTECODE
#define BUILTIN_BYTECODE
include "mlir/IR/BytecodeBase.td"
def LocationAttr : AttributeKind;
def ShapedType: WithType<"ShapedType", Type>;
def Location : CompositeBytecode {
dag members = (attr
WithGetter<"(LocationAttr)$_attrType", WithType<"LocationAttr", LocationAttr>>:$value
);
let cBuilder = "Location($_args)";
}
def String :
WithParser <"succeeded($_reader.readString($_var))",
WithBuilder<"$_args",
WithPrinter<"$_writer.writeOwnedString($_getter)",
WithGetter <"$_attrType",
WithType <"StringRef">>>>>;
def ArrayAttr : DialectAttribute<(attr
Array<Attribute>:$value
)>;
let cType = "StringAttr" in {
def StringAttr : DialectAttribute<(attr
String:$value
)> {
let printerPredicate = "::llvm::isa<NoneType>($_val.getType())";
}
def StringAttrWithType : DialectAttribute<(attr
String:$value,
Type:$type
)> { let printerPredicate = "!::llvm::isa<NoneType>($_val.getType())"; }
}
def NamedAttribute : CompositeBytecode {
dag members = (attr
StringAttr:$name,
Attribute:$value
);
let cBuilder = "NamedAttribute($_args)";
}
def DictionaryAttr : DialectAttribute<(attr
Array<NamedAttribute>:$value
)>;
def FlatSymbolRefAttr: DialectAttribute<(attr
StringAttr:$rootReference
)>;
def SymbolRefAttr: DialectAttribute<(attr
StringAttr:$rootReference,
Array<FlatSymbolRefAttr>:$nestedReferences
)>;
def TypeAttr: DialectAttribute<(attr
Type:$value
)>;
def UnitAttr: DialectAttribute<(attr)>;
def IntegerAttr: DialectAttribute<(attr
Type:$type,
KnownWidthAPInt<"type">:$value
)> {
let cBuilder = "get<$_resultType>(context, type, *value)";
}
defvar FloatType = Type;
def FloatAttr : DialectAttribute<(attr
FloatType:$type,
KnownSemanticsAPFloat<"type">:$value
)> {
let cBuilder = "get<$_resultType>(context, type, *value)";
}
def CallSiteLoc : DialectAttribute<(attr
LocationAttr:$callee,
LocationAttr:$caller
)>;
def FileLineColLoc : DialectAttribute<(attr
StringAttr:$filename,
VarInt:$line,
VarInt:$column
)>;
let cType = "FusedLoc",
cBuilder = "cast<FusedLoc>(get<FusedLoc>(context, $_args))" in {
def FusedLoc : DialectAttribute<(attr
Array<Location>:$locations
)> {
let printerPredicate = "!$_val.getMetadata()";
}
def FusedLocWithMetadata : DialectAttribute<(attr
Array<Location>:$locations,
Attribute:$metadata
)> {
let printerPredicate = "$_val.getMetadata()";
}
}
def NameLoc : DialectAttribute<(attr
StringAttr:$name,
LocationAttr:$childLoc
)>;
def UnknownLoc : DialectAttribute<(attr)>;
def DenseResourceElementsAttr : DialectAttribute<(attr
ShapedType:$type,
ResourceHandle<"DenseResourceElementsHandle">:$rawHandle
)> {
// Note: order of serialization does not match order of builder.
let cBuilder = "get<$_resultType>(context, type, *rawHandle)";
}
let cType = "RankedTensorType" in {
def RankedTensorType : DialectType<(type
Array<SignedVarIntList>:$shape,
Type:$elementType
)> {
let printerPredicate = "!$_val.getEncoding()";
}
def RankedTensorTypeWithEncoding : DialectType<(type
Attribute:$encoding,
Array<SignedVarIntList>:$shape,
Type:$elementType
)> {
let printerPredicate = "$_val.getEncoding()";
// Note: order of serialization does not match order of builder.
let cBuilder = "get<$_resultType>(context, shape, elementType, encoding)";
}
}
def DenseArrayAttr : DialectAttribute<(attr
Type:$elementType,
VarInt:$size,
Blob:$rawData
)>;
def DenseElementsAttr : WithType<"DenseElementsAttr", Attribute>;
def DenseIntOrFPElementsAttr : DialectAttribute<(attr
ShapedType:$type,
Blob:$rawData
)> {
let cBuilder = "cast<$_resultType>($_resultType::getFromRawBuffer($_args))";
}
def DenseStringElementsAttr : DialectAttribute<(attr
ShapedType:$type,
WithGetter<"$_attrType.isSplat()", VarInt>:$_isSplat,
WithBuilder<"$_args",
WithType<"SmallVector<StringRef>",
WithParser <"succeeded(readPotentiallySplatString($_reader, type, _isSplat, $_var))",
WithPrinter<"writePotentiallySplatString($_writer, $_name)">>>>:$rawStringData
)>;
def DenseIntElementsAttr : WithType<"DenseIntElementsAttr", Attribute>;
def SparseElementsAttr : DialectAttribute<(attr
ShapedType:$type,
DenseIntElementsAttr:$indices,
DenseElementsAttr:$values
)>;
def DistinctAttr : DialectAttribute<(attr
Attribute:$referencedAttr
)>;
// Types
// -----
def IntegerType : DialectType<(type
// Yes not pretty,
WithParser<"succeeded($_reader.readVarInt($_var))",
WithBuilder<"$_args",
WithPrinter<"$_writer.writeVarInt($_name.getWidth() << 2 | $_name.getSignedness())",
WithType <"uint64_t">>>>:$_widthAndSignedness,
// Split up parsed varint for create method.
LocalVar<"uint64_t", "_widthAndSignedness >> 2">:$width,
LocalVar<"IntegerType::SignednessSemantics",
"static_cast<IntegerType::SignednessSemantics>(_widthAndSignedness & 0x3)">:$signedness
)>;
def IndexType : DialectType<(type)>;
def FunctionType : DialectType<(type
Array<Type>:$inputs,
Array<Type>:$results
)>;
def BFloat16Type : DialectType<(type)>;
def Float16Type : DialectType<(type)>;
def Float32Type : DialectType<(type)>;
def Float64Type : DialectType<(type)>;
def Float80Type : DialectType<(type)>;
def Float128Type : DialectType<(type)>;
def ComplexType : DialectType<(type
Type:$elementType
)>;
def MemRefLayout: WithType<"MemRefLayoutAttrInterface", Attribute>;
let cType = "MemRefType" in {
def MemRefType : DialectType<(type
Array<SignedVarIntList>:$shape,
Type:$elementType,
MemRefLayout:$layout
)> {
let printerPredicate = "!$_val.getMemorySpace()";
}
def MemRefTypeWithMemSpace : DialectType<(type
Attribute:$memorySpace,
Array<SignedVarIntList>:$shape,
Type:$elementType,
MemRefLayout:$layout
)> {
let printerPredicate = "!!$_val.getMemorySpace()";
// Note: order of serialization does not match order of builder.
let cBuilder = "get<$_resultType>(context, shape, elementType, layout, memorySpace)";
}
}
def NoneType : DialectType<(type)>;
def TupleType : DialectType<(type
Array<Type>:$types
)>;
let cType = "UnrankedMemRefType" in {
def UnrankedMemRefType : DialectType<(type
Type:$elementType
)> {
let printerPredicate = "!$_val.getMemorySpace()";
let cBuilder = "get<$_resultType>(context, elementType, Attribute())";
}
def UnrankedMemRefTypeWithMemSpace : DialectType<(type
Attribute:$memorySpace,
Type:$elementType
)> {
let printerPredicate = "$_val.getMemorySpace()";
// Note: order of serialization does not match order of builder.
let cBuilder = "get<$_resultType>(context, elementType, memorySpace)";
}
}
def UnrankedTensorType : DialectType<(type
Type:$elementType
)>;
let cType = "VectorType" in {
def VectorType : DialectType<(type
Array<SignedVarIntList>:$shape,
Type:$elementType
)> {
let printerPredicate = "!$_val.isScalable()";
}
def VectorTypeWithScalableDims : DialectType<(type
Array<BoolList>:$scalableDims,
Array<SignedVarIntList>:$shape,
Type:$elementType
)> {
let printerPredicate = "$_val.isScalable()";
// Note: order of serialization does not match order of builder.
let cBuilder = "get<$_resultType>(context, shape, elementType, scalableDims)";
}
}
/// This enum contains marker codes used to indicate which attribute is
/// currently being decoded, and how it should be decoded. The order of these
/// codes should generally be unchanged, as any changes will inevitably break
/// compatibility with older bytecode.
def BuiltinDialectAttributes : DialectAttributes<"Builtin"> {
let elems = [
ArrayAttr,
DictionaryAttr,
StringAttr,
StringAttrWithType,
FlatSymbolRefAttr,
SymbolRefAttr,
TypeAttr,
UnitAttr,
IntegerAttr,
FloatAttr,
CallSiteLoc,
FileLineColLoc,
FusedLoc,
FusedLocWithMetadata,
NameLoc,
UnknownLoc,
DenseResourceElementsAttr,
DenseArrayAttr,
DenseIntOrFPElementsAttr,
DenseStringElementsAttr,
SparseElementsAttr,
DistinctAttr
];
}
def BuiltinDialectTypes : DialectTypes<"Builtin"> {
let elems = [
IntegerType,
IndexType,
FunctionType,
BFloat16Type,
Float16Type,
Float32Type,
Float64Type,
Float80Type,
Float128Type,
ComplexType,
MemRefType,
MemRefTypeWithMemSpace,
NoneType,
RankedTensorType,
RankedTensorTypeWithEncoding,
TupleType,
UnrankedMemRefType,
UnrankedMemRefTypeWithMemSpace,
UnrankedTensorType,
VectorType,
VectorTypeWithScalableDims
];
}
#endif // BUILTIN_BYTECODE