[Mlir-commits] [mlir] d774fbc - [MLIR] Add document about creating a dialect.

Stephen Neuendorffer llvmlistbot at llvm.org
Fri Mar 6 16:38:12 PST 2020


Author: Stephen Neuendorffer
Date: 2020-03-06T16:37:57-08:00
New Revision: d774fbc350a077c5442d73d56f41a9c2bdd679a1

URL: https://github.com/llvm/llvm-project/commit/d774fbc350a077c5442d73d56f41a9c2bdd679a1
DIFF: https://github.com/llvm/llvm-project/commit/d774fbc350a077c5442d73d56f41a9c2bdd679a1.diff

LOG: [MLIR] Add document about creating a dialect.

Goal is also to document best naming practices from here:
https://llvm.discourse.group/t/rfc-canonical-file-paths-to-dialects/621

Differential Revision: https://reviews.llvm.org/D75762

Added: 
    mlir/docs/CreatingADialect.md

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/mlir/docs/CreatingADialect.md b/mlir/docs/CreatingADialect.md
new file mode 100644
index 000000000000..3a987fd0c5d3
--- /dev/null
+++ b/mlir/docs/CreatingADialect.md
@@ -0,0 +1,158 @@
+# Creating a Dialect
+
+[TOC]
+
+Public dialects are typically separated into at least 3 directories:
+* mlir/include/mlir/Dialect/Foo   (for public include files)
+* mlir/lib/Dialect/Foo            (for sources)
+* mlir/lib/Dialect/Foo/IR         (for operations)
+* mlir/lib/Dialect/Foo/Transforms (for transforms)
+* mlir/test/Dialect/Foo           (for tests)
+
+Along with other public headers, the 'include' directory contains a
+TableGen file in the [ODS format](OpDefinitions.md), describing the
+operations in the dialect.  This is used to generate operation
+declarations (FooOps.h.inc) and definitions (FooOps.cpp.inc) and
+operation interface declarations (FooOpsInterfaces.h.inc) and
+definitions (FooOpsInterfaces.cpp.inc).
+
+The 'IR' directory typically contains implementations of functions for
+the dialect which are not automatically generated by ODS.  These are
+typically defined in FooDialect.cpp, which includes FooOps.cpp.inc and
+FooOpsInterfaces.h.inc.
+
+The 'Transforms' directory contains rewrite rules for the dialect,
+typically described in TableGen file using the [DDR
+format](DeclarativeRewrites.md).
+
+Note that dialect names should not generally be suffixed with “Ops”,
+although some files pertaining to the operations of a dialect (e.g.
+FooOps.cpp) might be.
+
+## CMake best practices
+
+### TableGen Targets
+
+Operations in dialects are typically declared using the ODS format in
+tablegen in a file FooOps.td.  This file forms the core of a dialect and
+is declared using add_mlir_dialect().
+
+```cmake
+
+add_mlir_dialect(FooOps FooOps)
+
+```
+
+This generates the correct rules to run mlir-tblgen, along with a
+'MLIRFooOpsIncGen' target which can be used to declare dependencies.
+
+Dialect transformations are typically declared in a file FooTransforms.td.
+Targets for TableGen are described in typical llvm fashion.
+```cmake
+set(LLVM_TARGET_DEFINITIONS FooTransforms.td)
+mlir_tablegen(FooTransforms.h.inc -gen-rewriters)
+add_public_tablegen_target(MLIRFooTransformIncGen)
+```
+
+The result is another 'IncGen' target, which runs mlir-tblgen.
+
+### Library Targets
+
+Dialects may have multiple libraries.  Each library is typically
+declared with add_mlir_dialect_library().  Dialect libraries often
+depend on the generation of header files from TableGen (specified
+using the DEPENDS keyword).  Dialect libraries may also depend on
+other dialect libraries.  Typically this dependence is declared using
+target_link_libraries() and the PUBLIC keyword.  For instance:
+
+```cmake
+
+add_mlir_dialect_library(FooOps
+	DEPENDS
+	MLIRFooOpsIncGen
+	MLIRFooTransformsIncGen
+	)
+target_link_libraries(FooOps
+	PUBLIC
+	BarOps
+	<some-other-library>
+	)
+
+```
+
+add_mlir_dialect_library() is a thin wrapper around add_llvm_library()
+which collects a list of all the dialect libraries.  This list is
+often useful for linking tools (e.g. mlir-opt) which should have
+access to all dialects.  This list is also linked into libMLIR.so.
+The list can be retrieved from the MLIR_DIALECT_LIBS global property:
+
+```cmake
+
+get_property(dialect_libs GLOBAL PROPERTY MLIR_DIALECT_LIBS)
+
+```
+
+Note that although the Bar dialect also uses TableGen to declare its
+operations, it is not necessary to explicitly depend on the
+corresponding IncGen targets.  The PUBLIC link dependency is
+sufficient.  Also note that we avoid using add_dependencies
+explicitly, since the dependencies need to be available to the
+underlying add_llvm_library() call, allowing it to correctly create
+new targets with the same sources.
+
+
+
+# Dialect Conversions
+
+Conversions from “X” to “Y” live in mlir/include/mlir/Conversion/XToY,
+mlir/lib/Convresion/XToY and mlir/test/Conversion/XToY, respectively.
+
+Default file names for conversion should omit “Convert” from their
+name, e.g. lib/VectorToLLVM/VectorToLLVM.cpp.
+
+Conversion passes should live separately from conversions themselves
+for convenience of users that only care about a pass and not about its
+implementation with patterns or other infrastructure. For example
+include/mlir/VectorToLLVM/VectorToLLVMPass.h.
+
+Common conversion functionality from or to dialect “X” that does not
+belong to the dialect definition can be located in
+mlir/lib/Conversion/XCommon, for example
+mlir/lib/Conversion/GPUCommon.
+
+## CMake best practices
+
+Each conversion typically exists in a separate library, declared with
+add_mlir_conversion_library().  Conversion libraries typically depend
+on their source and target dialects, but may also depend on other
+dialects (e.g. MLIRStandard).  Typically this dependence is specifid
+using target_link_libraries() and the PUBLIC keyword.  For instance:
+
+```cmake
+
+add_mlir_conversion_library(MLIRBarToFoo
+	BarToFoo.cpp
+
+   ADDITIONAL_HEADER_DIRS
+   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/BarToFoo
+	)
+target_link_libraries(MLIRBarToFoo
+	PUBLIC
+	BarOps
+	FooOps
+	)
+
+```
+
+add_mlir_conversion_library() is a thin wrapper around
+add_llvm_library() which collects a list of all the conversion
+libraries.  This list is often useful for linking tools
+(e.g. mlir-opt) which should have access to all dialects.  This list
+is also linked in libMLIR.so.  The list can be retrieved from the
+MLIR_CONVERSION_LIBS global property:
+
+```cmake
+
+get_property(dialect_libs GLOBAL PROPERTY MLIR_CONVERSION_LIBS)
+
+```


        


More information about the Mlir-commits mailing list