22#include "llvm/ADT/SmallSet.h"
23#include "llvm/ADT/StringRef.h"
26#define GEN_PASS_DEF_CONVERTMEMREFTOEMITC
27#include "mlir/Conversion/Passes.h.inc"
34emitc::IncludeOp addStandardHeader(
OpBuilder &builder, ModuleOp module,
35 StringRef headerName) {
37 return emitc::IncludeOp::create(
38 builder, module.getLoc(), includeAttr,
42struct ConvertMemRefToEmitCPass
45 void runOnOperation()
override {
47 ConvertMemRefToEmitCOptions
options;
48 options.lowerToCpp = this->lowerToCpp;
54 target.addIllegalDialect<memref::MemRefDialect>();
55 target.addLegalDialect<emitc::EmitCDialect>();
57 if (
failed(applyPartialConversion(getOperation(),
target,
58 std::move(patterns))))
59 return signalPassFailure();
61 mlir::ModuleOp module = getOperation();
62 llvm::SmallSet<StringRef, 4> existingHeaders;
63 mlir::OpBuilder builder(module.getBody(), module.getBody()->begin());
64 module.walk([&](mlir::emitc::IncludeOp includeOp) {
65 if (includeOp.getIsStandardInclude())
66 existingHeaders.insert(includeOp.getInclude());
69 module.walk([&](mlir::emitc::CallOpaqueOp callOp) {
70 StringRef expectedHeader;
81 if (!existingHeaders.contains(expectedHeader)) {
82 addStandardHeader(builder, module, expectedHeader);
83 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 * freeFunctionName
constexpr const char * alignedAllocFunctionName
static llvm::ManagedStatic< PassManagerOptions > options
StringAttr getStringAttr(const Twine &bytes)
This class helps build Operations.
static WalkResult advance()
Include the generated interface declarations.
void populateMemRefToEmitCConversionPatterns(RewritePatternSet &patterns, const TypeConverter &converter)