[MLIR][Python] Make init parameters follow the field definition order (#186574) Currently, Python-defined operations automatically generate an `__init__` function to serve as the operation builder. Previously, the parameters of this `__init__` function followed a fairly complex set of rules. For example: * All result fields were moved to the front to align with other op builders. * Fields of `Optional` type were automatically moved to the end and treated as keyword parameters. * If the types of all result fields could be inferred automatically, then all result fields were removed from the parameter list. * Other than that, the parameter order followed the field definition order. These rules may seem reasonable, and they have worked well in practice, but they have one major drawback: users cannot easily tell what the actual `__init__` parameter list will look like when writing code, because the rules are simply too complicated. Users can inspect the signature at runtime via `MyOp.__init__.__signature__`, but this is clearly poor for the development experience. After some offline discussion with Rolf, we decided to replace this with the following rules, which is what this PR implements: * The parameters of `__init__` now strictly follow the field definition order. * By default, all parameters are required. A field becomes a keyword parameter only if it is declared with `= None`. * By default, no type inference is performed. A field becomes a keyword parameter and participates in type inference only if it is declared with `= infer_type()`. These new rules give users full control over the `__init__` parameter list, making it easy to understand the parameter order and explicitly control optional parameters and type inference. In addition, this makes it much easier in the future to use `dataclass_transform` so that type checkers can understand these automatically generated `__init__` methods, although there are still some issues to resolve at the moment. NOTE that this is a **breaking change**. Even so, I still believe it is worth making, mainly for two reasons: - the current number of users of Python-defined dialects is still quite limited; - this change will bring long-term benefits. Assisted by Copilot.
Welcome to the LLVM project!
This repository contains the source code for LLVM, a toolkit for the construction of highly optimized compilers, optimizers, and run-time environments.
The LLVM project has multiple components. The core of the project is itself called “LLVM”. This contains all of the tools, libraries, and header files needed to process intermediate representations and convert them into object files. Tools include an assembler, disassembler, bitcode analyzer, and bitcode optimizer.
C-like languages use the Clang frontend. This component compiles C, C++, Objective-C, and Objective-C++ code into LLVM bitcode -- and from there into object files, using LLVM.
Other components include: the libc++ C++ standard library, the LLD linker, and more.
Consult the Getting Started with LLVM page for information on building and running LLVM.
For information on how to contribute to the LLVM project, please take a look at the Contributing to LLVM guide.
Join the LLVM Discourse forums, Discord chat, LLVM Office Hours or Regular sync-ups.
The LLVM project has adopted a code of conduct for participants to all modes of communication within the project.