18#include <mlir/TableGen/AttrOrTypeDef.h>
25 using HeaderGenerator::HeaderGenerator;
37 static constexpr char fmt[] = R
"(
39MLIR_CAPI_EXPORTED {7} {0}{2}_{3}Get{4}(Mlir{1});
42 assert(!
paramName.empty() &&
"paramName must be set");
58 static constexpr char fmt[] = R
"(
60MLIR_CAPI_EXPORTED intptr_t {0}{2}_{3}Get{4}Count(Mlir{1});
63MLIR_CAPI_EXPORTED {7} {0}{2}_{3}Get{4}At(Mlir{1}, intptr_t pos);
66 assert(!
paramName.empty() &&
"paramName must be set");
83 static constexpr char fmt[] = R
"(
85MLIR_CAPI_EXPORTED Mlir{1} {0}{2}_{3}Get(MlirContext ctx{4});
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 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>
190 static constexpr char fmt[] = R
"(
191intptr_t {0}{2}_{3}Get{4}Count(Mlir{1} inp) {{
192 auto size = llvm::cast<{3}>(unwrap(inp)).get{4}().size();
193 assert(std::in_range<intptr_t>(size) && "lossy conversion");
194 return static_cast<intptr_t>(size);
197{5} {0}{2}_{3}Get{4}At(Mlir{1} inp, intptr_t pos) {{
198 return {6}(llvm::cast<{3}>(unwrap(inp)).get{4}()[pos]);
201 assert(!className.empty() && "className must be set");
202 assert(!
paramName.empty() &&
"paramName must be set");
217 static constexpr char fmt[] = R
"(
218{5} {0}{2}_{3}Get{4}(Mlir{1} inp) {{
219 return {6}(llvm::cast<{3}>(unwrap(inp)).get{4}());
222 assert(!className.empty() && "className must be set");
223 assert(!
paramName.empty() &&
"paramName must be set");
238 static constexpr char fmt[] = R
"(
239Mlir{1} {0}{2}_{3}Get(MlirContext ctx{4}) {{
241 return wrap({3}::get(unwrap(ctx){5}));
244 assert(!className.empty() && "className must be set");
247 std::string paramListBuffer;
248 std::string argListBuffer;
249 std::string prefixBuffer;
250 llvm::raw_string_ostream paramListStream(paramListBuffer);
251 llvm::raw_string_ostream argListStream(argListBuffer);
252 llvm::raw_string_ostream prefixStream(prefixBuffer);
254 for (
const auto ¶m : def.getParameters()) {
255 mlir::StringRef pName = param.getName();
256 mlir::StringRef cppType = param.getCppType();
261 paramListStream <<
", intptr_t " << pName <<
"Count, " << capiElemType <<
" const *"
266 argListStream <<
", ::llvm::ArrayRef<" << cppElemType <<
">(" << pName <<
", " << pName
269 prefixStream <<
"SmallVector<Attribute> storage;";
270 argListStream <<
", llvm::map_to_vector(unwrapList(" << pName <<
"Count, " << pName
271 <<
", storage), [](auto a) {return llvm::cast<RecordAttr>(a);})";
275 paramListStream <<
", " << capiType <<
' ' << pName;
278 argListStream <<
", ";
280 argListStream << pName;
281 }
else if (capiType ==
"MlirAttribute" || capiType ==
"MlirType") {
283 argListStream <<
"::llvm::cast<" << cppType <<
">(unwrap(" << pName <<
"))";
286 argListStream <<
"unwrap(" << pName <<
")";
304 mlir::tblgen::Dialect defDialect = def.getDialect();
325 for (
const auto ¶m : def.getParameters()) {
327 mlir::StringRef cppType = param.getCppType();
338 std::optional<mlir::StringRef> extraDecls = def.getExtraDecls();
339 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 genCompleteRecord(const mlir::tblgen::AttrOrTypeDef &def)
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 void genArrayRefParameterImpls(mlir::StringRef cppType) const
~AttrOrTypeImplementationGenerator() override=default
std::string paramNameCapitalized
virtual void genParameterGetterImpl(mlir::StringRef cppType) const
mlir::StringRef className
mlir::StringRef dialectNamespace
virtual void genExtraMethods(mlir::StringRef extraDecl) const
Generate code for extra methods from an extraClassDeclaration
virtual void setNamespaceAndClassName(const mlir::tblgen::Dialect &d, mlir::StringRef cppClassName)
Set the dialect and class name for code generation.
std::string dialectNameCapitalized
Generator for common C implementation file elements.
virtual void genIsAImpl() const