16#include <mlir/TableGen/AttrOrTypeDef.h>
25 using HeaderGenerator::HeaderGenerator;
37 static constexpr char fmt[] = R
"(
38/* Get '{5}' parameter from a {6}::{3} {1}. */
39MLIR_CAPI_EXPORTED {7} {0}{2}{3}Get{4}(Mlir{1});
41 assert(dialect && "Dialect must be set");
42 assert(!
paramName.empty() &&
"paramName must be set");
58 static constexpr char fmt[] = R
"(
59/* Get count of '{5}' parameter from a {6}::{3} {1}. */
60MLIR_CAPI_EXPORTED intptr_t {0}{2}{3}Get{4}Count(Mlir{1});
62/* Get element at index from '{5}' parameter from a {6}::{3} {1}. */
63MLIR_CAPI_EXPORTED {7} {0}{2}{3}Get{4}At(Mlir{1}, intptr_t pos);
65 assert(dialect && "Dialect must be set");
66 assert(!
paramName.empty() &&
"paramName must be set");
83 static constexpr char fmt[] = R
"(
84/* Create a {5}::{3} {1} with the given parameters. */
85MLIR_CAPI_EXPORTED Mlir{1} {0}{2}{3}Get(MlirContext ctx{4});
87 assert(dialect && "Dialect must be set");
90 std::string paramListBuffer;
91 llvm::raw_string_ostream paramListStream(paramListBuffer);
92 for (
const auto ¶m : def.getParameters()) {
93 mlir::StringRef cppType = param.getCppType();
97 paramListStream <<
", intptr_t " << param.getName() <<
"Count, "
116 const mlir::tblgen::Dialect &defDialect = def.getDialect();
137 for (
const auto ¶m : def.getParameters()) {
139 mlir::StringRef cppType = param.getCppType();
150 std::optional<mlir::StringRef> extraDecls = def.getExtraDecls();
151 if (extraDecls.has_value()) {
167 using ImplementationGenerator::ImplementationGenerator;
179#include <mlir/CAPI/IR.h>
180#include <mlir/CAPI/Support.h>
181#include <llvm/ADT/TypeSwitch.h>
189 static constexpr char fmt[] = R
"(
190intptr_t {0}{2}{3}Get{4}Count(Mlir{1} inp) {{
191 return static_cast<intptr_t>(llvm::cast<{3}>(unwrap(inp)).get{4}().size());
194{5} {0}{2}{3}Get{4}At(Mlir{1} inp, intptr_t pos) {{
195 return {6}(llvm::cast<{3}>(unwrap(inp)).get{4}()[pos]);
199 assert(!
paramName.empty() &&
"paramName must be set");
214 static constexpr char fmt[] = R
"(
215{5} {0}{2}{3}Get{4}(Mlir{1} inp) {{
216 return {6}(llvm::cast<{3}>(unwrap(inp)).get{4}());
219 assert(!className.empty() && "className must be set");
220 assert(!
paramName.empty() &&
"paramName must be set");
235 static constexpr char fmt[] = R
"(
236Mlir{1} {0}{2}{3}Get(MlirContext ctx{4}) {{
237 return wrap({3}::get(unwrap(ctx){5}));
240 assert(!className.empty() && "className must be set");
243 std::string paramListBuffer;
244 std::string argListBuffer;
245 llvm::raw_string_ostream paramListStream(paramListBuffer);
246 llvm::raw_string_ostream argListStream(argListBuffer);
248 for (
const auto ¶m : def.getParameters()) {
249 mlir::StringRef pName = param.getName();
250 mlir::StringRef cppType = param.getCppType();
255 paramListStream <<
", intptr_t " << pName <<
"Count, " << capiElemType <<
" *" << pName;
259 argListStream <<
", ::llvm::ArrayRef<" << capiElemType <<
">(" << pName <<
", " << pName
262 argListStream <<
", ::llvm::ArrayRef<" << capiElemType <<
">(unwrapList(" << pName <<
", "
263 << pName <<
"Count))";
267 paramListStream <<
", " << capiType <<
' ' << pName;
270 argListStream <<
", ";
272 argListStream << pName;
273 }
else if (capiType ==
"MlirAttribute" || capiType ==
"MlirType") {
275 argListStream <<
"::llvm::cast<" << cppType <<
">(unwrap(" << pName <<
"))";
278 argListStream <<
"unwrap(" << pName <<
")";
295 const mlir::tblgen::Dialect &defDialect = def.getDialect();
316 for (
const auto ¶m : def.getParameters()) {
318 mlir::StringRef cppType = param.getCppType();
329 std::optional<mlir::StringRef> extraDecls = def.getExtraDecls();
330 if (extraDecls.has_value()) {
std::string mapCppTypeToCapiType(StringRef cppType)
mlir::StringRef extractArrayRefElementType(mlir::StringRef cppType)
Extract element type from ArrayRef<...>
llvm::cl::opt< bool > GenTypeOrAttrParamGetters
bool isPrimitiveType(mlir::StringRef cppType)
Check if a C++ type is a known primitive type.
llvm::cl::opt< bool > GenTypeOrAttrGet
llvm::cl::opt< bool > GenIsA
llvm::cl::opt< std::string > DialectName
llvm::cl::opt< std::string > FunctionPrefix
bool isArrayRefType(mlir::StringRef cppType)
Check if a C++ type is an ArrayRef type.
std::string toPascalCase(mlir::StringRef str)
Convert names separated by underscore or colon to PascalCase.
llvm::cl::opt< bool > GenExtraClassMethods
Generator for attribute/type C implementation files.
mlir::StringRef paramName
void setParamName(mlir::StringRef name)
Set the parameter name for code generation.
virtual void genDefaultGetBuilderImpl(const mlir::tblgen::AttrOrTypeDef &def) const
Generate default Get builder implementation.
virtual void genPrologue() const
virtual ~AttrOrTypeImplementationGenerator()=default
virtual void genArrayRefParameterImpls(mlir::StringRef cppType) const
void genCompleteRecord(const mlir::tblgen::AttrOrTypeDef def)
std::string paramNameCapitalized
virtual void genParameterGetterImpl(mlir::StringRef cppType) const
virtual void setDialectAndClassName(const mlir::tblgen::Dialect *d, mlir::StringRef cppClassName)
Set the dialect and class name for code generation.
mlir::StringRef className
virtual void genExtraMethods(mlir::StringRef extraDecl) const
Generate code for extra methods from an extraClassDeclaration
const mlir::tblgen::Dialect * dialect
std::string dialectNameCapitalized
Generator for common C implementation file elements.
virtual void genIsAImpl() const