Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions mlir/include/mlir/Dialect/LLVMIR/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ mlir_tablegen(LLVMIntrinsicFromLLVMIRConversions.inc -gen-intr-from-llvmir-conve
mlir_tablegen(LLVMConvertibleLLVMIRIntrinsics.inc -gen-convertible-llvmir-intrinsics)
add_mlir_dialect_tablegen_target(MLIRLLVMIntrinsicConversionsIncGen)

set(LLVM_TARGET_DEFINITIONS LLVMDialectBytecode.td)
mlir_tablegen(LLVMDialectBytecode.cpp.inc -gen-bytecode -bytecode-dialect="LLVM")
add_public_tablegen_target(MLIRLLVMDialectBytecodeIncGen)

set(LLVM_TARGET_DEFINITIONS BasicPtxBuilderInterface.td)
mlir_tablegen(BasicPtxBuilderInterface.h.inc -gen-op-interface-decls)
mlir_tablegen(BasicPtxBuilderInterface.cpp.inc -gen-op-interface-defs)
Expand Down
364 changes: 364 additions & 0 deletions mlir/include/mlir/Dialect/LLVMIR/LLVMDialectBytecode.td
Original file line number Diff line number Diff line change
@@ -0,0 +1,364 @@
//===-- LLVMDialectBytecode.td - LLVM 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 LLVM bytecode reader/writer definition file.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_DIALECT_BYTECODE
#define LLVM_DIALECT_BYTECODE

include "mlir/IR/BytecodeBase.td"

//===----------------------------------------------------------------------===//
// Bytecode classes for attributes and types.
//===----------------------------------------------------------------------===//

def String :
WithParser <"succeeded($_reader.readString($_var))",
WithBuilder<"$_args",
WithPrinter<"$_writer.writeOwnedString($_getter)",
WithType <"StringRef">>>>;

class Attr<string type> : WithType<type, Attribute>;

class OptionalAttribute<string type> :
WithParser <"succeeded($_reader.readOptionalAttribute($_var))",
WithPrinter<"$_writer.writeOptionalAttribute($_getter)",
WithType<type, Attribute>>>;

class OptionalInt<string type> :
WithParser <"succeeded(readOptionalInt($_reader, $_var))",
WithPrinter<"writeOptionalInt($_writer, $_getter)",
WithType<"std::optional<" # type # ">", VarInt>>>;

class OptionalArrayRef<string eltType> :
WithParser <"succeeded(readOptionalArrayRef<"
# eltType # ">($_reader, $_var))",
WithPrinter<"writeOptionalArrayRef<"
# eltType # ">($_writer, $_getter)",
WithType<"SmallVector<"
# eltType # ">", Attribute>>>;

class EnumClassFlag<string flag, string getter> :
WithParser<"succeeded($_reader.readVarInt($_var))",
WithBuilder<"(" # flag # ")$_args",
WithPrinter<"$_writer.writeVarInt((uint64_t)$_name." # getter # ")",
WithType<"uint64_t", VarInt>>>>;

//===----------------------------------------------------------------------===//
// General notes
// - For each attribute or type entry, the argument names should match
// LLVMAttrDefs.td
// - The mnemonics are either LLVM or builtin MLIR attributes and types, but
// regular C++ types are also allowed to match builders and parsers.
// - DIScopeAttr and DINodeAttr are empty base classes, custom encoding not
// needed.
//===----------------------------------------------------------------------===//

//===----------------------------------------------------------------------===//
// AliasScopeAttr
//===----------------------------------------------------------------------===//

def AliasScopeAttr : DialectAttribute<(attr
Attr<"Attribute">:$id,
Attr<"AliasScopeDomainAttr">:$domain,
OptionalAttribute<"StringAttr">:$description
)>;

//===----------------------------------------------------------------------===//
// DIBasicTypeAttr
//===----------------------------------------------------------------------===//

def DIBasicTypeAttr : DialectAttribute<(attr
VarInt:$tag,
String:$name,
VarInt:$sizeInBits,
VarInt:$encoding
)>;

//===----------------------------------------------------------------------===//
// DIExpressionAttr, DIExpressionElemAttr
//===----------------------------------------------------------------------===//

def DIExpressionElemAttr : DialectAttribute<(attr
VarInt:$opcode,
OptionalArrayRef<"uint64_t">:$arguments
)>;

def DIExpressionAttr : DialectAttribute<(attr
OptionalArrayRef<"DIExpressionElemAttr">:$operations
)>;

//===----------------------------------------------------------------------===//
// DIFileAttr
//===----------------------------------------------------------------------===//

def DIFileAttr : DialectAttribute<(attr
String:$name,
String:$directory
)>;

//===----------------------------------------------------------------------===//
// DILocalVariableAttr
//===----------------------------------------------------------------------===//

def DILocalVariableAttr : DialectAttribute<(attr
Attr<"DIScopeAttr">:$scope,
OptionalAttribute<"StringAttr">:$name,
OptionalAttribute<"DIFileAttr">:$file,
VarInt:$line,
VarInt:$arg,
VarInt:$alignInBits,
OptionalAttribute<"DITypeAttr">:$type,
EnumClassFlag<"DIFlags", "getFlags()">:$_rawflags,
LocalVar<"DIFlags", "(DIFlags)_rawflags">:$flags
)> {
// DILocalVariableAttr direct getter uses a `StringRef` for `name`. Since the
// more direct getter is prefered during bytecode reading, force the base one
// and prevent crashes for empty `StringAttr`.
let cBuilder = "$_resultType::get(context, $_args)";
}

//===----------------------------------------------------------------------===//
// DISubroutineTypeAttr
//===----------------------------------------------------------------------===//

def DISubroutineTypeAttr : DialectAttribute<(attr
VarInt:$callingConvention,
OptionalArrayRef<"DITypeAttr">:$types
)>;

//===----------------------------------------------------------------------===//
// DICompileUnitAttr
//===----------------------------------------------------------------------===//

def DICompileUnitAttr : DialectAttribute<(attr
Attr<"DistinctAttr">:$id,
VarInt:$sourceLanguage,
Attr<"DIFileAttr">:$file,
OptionalAttribute<"StringAttr">:$producer,
Bool:$isOptimized,
EnumClassFlag<"DIEmissionKind", "getEmissionKind()">:$_rawEmissionKind,
LocalVar<"DIEmissionKind", "(DIEmissionKind)_rawEmissionKind">:$emissionKind,
EnumClassFlag<"DINameTableKind", "getNameTableKind()">:$_rawNameTableKind,
LocalVar<"DINameTableKind",
"(DINameTableKind)_rawNameTableKind">:$nameTableKind
)>;

//===----------------------------------------------------------------------===//
// DISubprogramAttr
//===----------------------------------------------------------------------===//

def DISubprogramAttr : DialectAttribute<(attr
OptionalAttribute<"DistinctAttr">:$recId,
Bool:$isRecSelf,
OptionalAttribute<"DistinctAttr">:$id,
OptionalAttribute<"DICompileUnitAttr">:$compileUnit,
OptionalAttribute<"DIScopeAttr">:$scope,
OptionalAttribute<"StringAttr">:$name,
OptionalAttribute<"StringAttr">:$linkageName,
OptionalAttribute<"DIFileAttr">:$file,
VarInt:$line,
VarInt:$scopeLine,
EnumClassFlag<"DISubprogramFlags", "getSubprogramFlags()">:$_rawflags,
LocalVar<"DISubprogramFlags", "(DISubprogramFlags)_rawflags">:$subprogramFlags,
OptionalAttribute<"DISubroutineTypeAttr">:$type,
OptionalArrayRef<"DINodeAttr">:$retainedNodes,
OptionalArrayRef<"DINodeAttr">:$annotations
)>;

//===----------------------------------------------------------------------===//
// DICompositeTypeAttr
//===----------------------------------------------------------------------===//

def DICompositeTypeAttr : DialectAttribute<(attr
OptionalAttribute<"DistinctAttr">:$recId,
Bool:$isRecSelf,
VarInt:$tag,
OptionalAttribute<"StringAttr">:$name,
OptionalAttribute<"DIFileAttr">:$file,
VarInt:$line,
OptionalAttribute<"DIScopeAttr">:$scope,
OptionalAttribute<"DITypeAttr">:$baseType,
EnumClassFlag<"DIFlags", "getFlags()">:$_rawflags,
LocalVar<"DIFlags", "(DIFlags)_rawflags">:$flags,
VarInt:$sizeInBits,
VarInt:$alignInBits,
OptionalAttribute<"DIExpressionAttr">:$dataLocation,
OptionalAttribute<"DIExpressionAttr">:$rank,
OptionalAttribute<"DIExpressionAttr">:$allocated,
OptionalAttribute<"DIExpressionAttr">:$associated,
OptionalArrayRef<"DINodeAttr">:$elements
)>;

//===----------------------------------------------------------------------===//
// DIDerivedTypeAttr
//===----------------------------------------------------------------------===//

def DIDerivedTypeAttr : DialectAttribute<(attr
VarInt:$tag,
OptionalAttribute<"StringAttr">:$name,
OptionalAttribute<"DITypeAttr">:$baseType,
VarInt:$sizeInBits,
VarInt:$alignInBits,
VarInt:$offsetInBits,
OptionalInt<"unsigned">:$dwarfAddressSpace,
OptionalAttribute<"DINodeAttr">:$extraData
)>;

//===----------------------------------------------------------------------===//
// DIImportedEntityAttr
//===----------------------------------------------------------------------===//

def DIImportedEntityAttr : DialectAttribute<(attr
VarInt:$tag,
Attr<"DIScopeAttr">:$scope,
Attr<"DINodeAttr">:$entity,
OptionalAttribute<"DIFileAttr">:$file,
VarInt:$line,
OptionalAttribute<"StringAttr">:$name,
OptionalArrayRef<"DINodeAttr">:$elements
)>;

//===----------------------------------------------------------------------===//
// DIGlobalVariableAttr, DIGlobalVariableExpressionAttr
//===----------------------------------------------------------------------===//

def DIGlobalVariableAttr : DialectAttribute<(attr
OptionalAttribute<"DIScopeAttr">:$scope,
OptionalAttribute<"StringAttr">:$name,
OptionalAttribute<"StringAttr">:$linkageName,
Attr<"DIFileAttr">:$file,
VarInt:$line,
Attr<"DITypeAttr">:$type,
Bool:$isLocalToUnit,
Bool:$isDefined,
VarInt:$alignInBits
)>;

def DIGlobalVariableExpressionAttr : DialectAttribute<(attr
Attr<"DIGlobalVariableAttr">:$var,
OptionalAttribute<"DIExpressionAttr">:$expr
)>;

//===----------------------------------------------------------------------===//
// DILabelAttr
//===----------------------------------------------------------------------===//

def DILabelAttr : DialectAttribute<(attr
Attr<"DIScopeAttr">:$scope,
OptionalAttribute<"StringAttr">:$name,
OptionalAttribute<"DIFileAttr">:$file,
VarInt:$line
)> {
// DILabelAttr direct getter uses a `StringRef` for `name`. Since the
// more direct getter is prefered during bytecode reading, force the base one
// and prevent crashes for empty `StringAttr`.
let cBuilder = "$_resultType::get(context, $_args)";
}

//===----------------------------------------------------------------------===//
// DILexicalBlockAttr, DILexicalBlockFileAttr
//===----------------------------------------------------------------------===//

def DILexicalBlockAttr : DialectAttribute<(attr
Attr<"DIScopeAttr">:$scope,
OptionalAttribute<"DIFileAttr">:$file,
VarInt:$line,
VarInt:$column
)>;

def DILexicalBlockFileAttr : DialectAttribute<(attr
Attr<"DIScopeAttr">:$scope,
OptionalAttribute<"DIFileAttr">:$file,
VarInt:$discriminator
)>;

//===----------------------------------------------------------------------===//
// DINamespaceAttr
//===----------------------------------------------------------------------===//

def DINamespaceAttr : DialectAttribute<(attr
OptionalAttribute<"StringAttr">:$name,
OptionalAttribute<"DIScopeAttr">:$scope,
Bool:$exportSymbols
)>;

//===----------------------------------------------------------------------===//
// DISubrangeAttr
//===----------------------------------------------------------------------===//

def DISubrangeAttr : DialectAttribute<(attr
OptionalAttribute<"Attribute">:$count,
OptionalAttribute<"Attribute">:$lowerBound,
OptionalAttribute<"Attribute">:$upperBound,
OptionalAttribute<"Attribute">:$stride
)>;

//===----------------------------------------------------------------------===//
// LoopAnnotationAttr
//===----------------------------------------------------------------------===//

def LoopAnnotationAttr : DialectAttribute<(attr
OptionalAttribute<"BoolAttr">:$disableNonforced,
OptionalAttribute<"LoopVectorizeAttr">:$vectorize,
OptionalAttribute<"LoopInterleaveAttr">:$interleave,
OptionalAttribute<"LoopUnrollAttr">:$unroll,
OptionalAttribute<"LoopUnrollAndJamAttr">:$unrollAndJam,
OptionalAttribute<"LoopLICMAttr">:$licm,
OptionalAttribute<"LoopDistributeAttr">:$distribute,
OptionalAttribute<"LoopPipelineAttr">:$pipeline,
OptionalAttribute<"LoopPeeledAttr">:$peeled,
OptionalAttribute<"LoopUnswitchAttr">:$unswitch,
OptionalAttribute<"BoolAttr">:$mustProgress,
OptionalAttribute<"BoolAttr">:$isVectorized,
OptionalAttribute<"FusedLoc">:$startLoc,
OptionalAttribute<"FusedLoc">:$endLoc,
OptionalArrayRef<"AccessGroupAttr">:$parallelAccesses
)>;

//===----------------------------------------------------------------------===//
// Attributes & Types with custom bytecode handling.
//===----------------------------------------------------------------------===//

// All the attributes with custom bytecode handling.
def LLVMDialectAttributes : DialectAttributes<"LLVM"> {
let elems = [
AliasScopeAttr,
DIBasicTypeAttr,
DICompileUnitAttr,
DICompositeTypeAttr,
DIDerivedTypeAttr,
DIExpressionElemAttr,
DIExpressionAttr,
DIFileAttr,
DIGlobalVariableAttr,
DIGlobalVariableExpressionAttr,
DIImportedEntityAttr,
DILabelAttr,
DILexicalBlockAttr,
DILexicalBlockFileAttr,
DILocalVariableAttr,
DINamespaceAttr,
DISubprogramAttr,
DISubrangeAttr,
DISubroutineTypeAttr,
LoopAnnotationAttr
// Referenced attributes currently missing support:
// AccessGroupAttr, LoopVectorizeAttr, LoopInterleaveAttr, LoopUnrollAttr,
// LoopUnrollAndJamAttr, LoopLICMAttr, LoopDistributeAttr, LoopPipelineAttr,
// LoopPeeledAttr, LoopUnswitchAttr
];
}

def LLVMDialectTypes : DialectTypes<"LLVM"> {
let elems = [];
}

#endif // LLVM_DIALECT_BYTECODE
2 changes: 2 additions & 0 deletions mlir/lib/Dialect/LLVMIR/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@ add_mlir_dialect_library(MLIRLLVMDialect
IR/LLVMMemorySlot.cpp
IR/LLVMTypes.cpp
IR/LLVMTypeSyntax.cpp
IR/LLVMDialectBytecode.cpp

ADDITIONAL_HEADER_DIRS
${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/LLVMIR

DEPENDS
MLIRLLVMDialectBytecodeIncGen
MLIRLLVMOpsIncGen
MLIRLLVMTypesIncGen
MLIRLLVMIntrinsicOpsIncGen
Expand Down
Loading