21#include "llvm/ADT/SmallSet.h"
22#include "llvm/ADT/StringRef.h"
25#define GEN_PASS_DEF_CONVERTMEMREFTOEMITC
26#include "mlir/Conversion/Passes.h.inc"
33emitc::IncludeOp addStandardHeader(
OpBuilder &builder, ModuleOp module,
34 StringRef headerName) {
36 return emitc::IncludeOp::create(
37 builder, module.getLoc(), includeAttr,
41struct ConvertMemRefToEmitCPass
44 void runOnOperation()
override {
45 TypeConverter converter;
46 ConvertMemRefToEmitCOptions
options;
49 converter.addConversion([](Type type) -> std::optional<Type> {
61 target.addIllegalDialect<memref::MemRefDialect>();
62 target.addLegalDialect<emitc::EmitCDialect>();
64 if (
failed(applyPartialConversion(getOperation(),
target,
66 return signalPassFailure();
68 mlir::ModuleOp module = getOperation();
69 llvm::SmallSet<StringRef, 4> existingHeaders;
70 mlir::OpBuilder builder(module.getBody(), module.getBody()->begin());
71 module.walk([&](mlir::emitc::IncludeOp includeOp) {
72 if (includeOp.getIsStandardInclude())
73 existingHeaders.insert(includeOp.getInclude());
76 module.walk([&](mlir::emitc::CallOpaqueOp callOp) {
77 StringRef expectedHeader;
87 if (!existingHeaders.contains(expectedHeader)) {
88 addStandardHeader(builder, module, expectedHeader);
89 existingHeaders.insert(expectedHeader);
constexpr const char * mallocFunctionName
constexpr const char * cppStandardLibraryHeader
constexpr const char * cStringLibraryHeader
constexpr const char * cStandardLibraryHeader
constexpr const char * memcpyFunctionName
constexpr const char * cppStringLibraryHeader
constexpr const char * alignedAllocFunctionName
static llvm::ManagedStatic< PassManagerOptions > options
StringAttr getStringAttr(const Twine &bytes)
This class helps build Operations.
static WalkResult advance()
::mlir::Pass::Option< bool > lowerToCpp
bool isSupportedEmitCType(mlir::Type type)
Determines whether type is valid in EmitC.
Include the generated interface declarations.
void populateMemRefToEmitCTypeConversion(TypeConverter &typeConverter)
const FrozenRewritePatternSet & patterns
void populateMemRefToEmitCConversionPatterns(RewritePatternSet &patterns, const TypeConverter &converter)