[CIR] Add custom constructor declaration to CIR lowering TableGen (#176664)

While working on the lowering of `BlockAddressOp`, I ran into a
limitation of the current `CIRLoweringEmitter` infrastructure: some CIR
ops require shared mutable state across multiple lowering patterns, but
the generated patterns always use a fixed default constructor and cannot
accept additional context.

**Examples:**

* `BlockAddressOp` needs to coordinate with the lowering of its
referenced `LabelOp`, requiring shared bookkeeping (e.g.
`LLVMBlockAddressInfo`) to track lowered labels and resolve unresolved
block addresses once the corresponding `BlockTagOp` is available.
* This is not unique to block addresses: for example,
`CIRToLLVMAllocaOpLowering` will also need access to shared state such
as `stringGlobalsMap`, `argStringGlobalsMap`, and `argsVarMap`.

**Possible solution:**

* **Disable generated lowering**: mark the op with `hasLLVMLowering =
false` and manually define and register the lowering patterns. This
works, but feels misleading since the operation does have an LLVM
lowering it just cannot be generated automatically. This ambiguity also
suggests that `hasLLVMLowering` might be better named `genLLVMLowering`.
* **Custom constructors (this PR)**: extend the TableGen emitter to
allow defining a single custom constructor for the generated LLVM
lowering pattern, similar to MLIR’s `OpBuilder`. When a custom
constructor is provided, the default one is not generated and the
pattern must be manually registered in the RewritePatternSet.
4 files changed
tree: a486b8597b530fd3c4446283b1abdecf5d666a67
  1. .ci/
  2. .github/
  3. bolt/
  4. clang/
  5. clang-tools-extra/
  6. cmake/
  7. compiler-rt/
  8. cross-project-tests/
  9. flang/
  10. flang-rt/
  11. libc/
  12. libclc/
  13. libcxx/
  14. libcxxabi/
  15. libsycl/
  16. libunwind/
  17. lld/
  18. lldb/
  19. llvm/
  20. llvm-libgcc/
  21. mlir/
  22. offload/
  23. openmp/
  24. orc-rt/
  25. polly/
  26. runtimes/
  27. third-party/
  28. utils/
  29. .clang-format
  30. .clang-format-ignore
  31. .clang-tidy
  32. .git-blame-ignore-revs
  33. .gitattributes
  34. .gitignore
  35. .mailmap
  36. CODE_OF_CONDUCT.md
  37. CONTRIBUTING.md
  38. LICENSE.TXT
  39. pyproject.toml
  40. README.md
  41. SECURITY.md
README.md

The LLVM Compiler Infrastructure

OpenSSF Scorecard OpenSSF Best Practices libc++

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.

Getting the Source Code and Building LLVM

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.

Getting in touch

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.