| # Developer Guide |
| |
| This document attempts to describe a few developer policies used in MLIR (such |
| as coding standards used) as well as development approach (such as, testing |
| methods). |
| |
| ## Style guide |
| |
| MLIR follows the [LLVM style](https://llvm.org/docs/CodingStandards.html) guide. |
| We also adhere to the following, that deviates from, or isn't specified in the |
| LLVM style guide: |
| |
| * Adopts [camelBack](https://llvm.org/docs/Proposals/VariableNames.html); |
| * Except for IR units (Region, Block, and Operation), non-nullable output |
| arguments are passed by non-const reference in general. |
| * IR constructs are not designed for [const correctness](UsageOfConst.md). |
| * Do *not* use recursive algorithms if the recursion can't be bounded |
| statically: that is avoid recursion if there is a possible IR input that can |
| trigger a stack overflow (for example traversing use-def chains in a |
| recursive way). At the moment, we tolerate it for the two following cases: |
| * The nesting of the IR: we use recursion when traversing nested regions. |
| * Type nesting: recursion may be used for the nesting of composite types. |
| |
| Please run clang-format on the files you modified with the `.clang-format` |
| configuration file available in the root directory. Check the clang-format |
| [documentation](https://clang.llvm.org/docs/ClangFormat.html) for more details |
| on integrating it with your development environment. In particular, if clang is |
| installed system-wide, running `git clang-format origin/master` will update the |
| files in the working directory with the relevant formatting changes; don't |
| forget to include those to the commit. |
| |
| ## Pass name and other command line options |
| |
| To avoid collision between options provided by different dialects, the naming |
| convention is to prepend the dialect name to every dialect-specific passes and |
| options in general. Options that are specific to a pass should also be prefixed |
| with the pass name. For example, the affine dialect provides a loop tiling pass |
| that is registered on the command line as `-affine-tile`, and with a tile size |
| option that can be set with `-affine-tile-size`. |
| |
| ## Testing guidelines |
| |
| See here for the [testing guide](TestingGuide.md). |