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"
33 emitc::IncludeOp addStandardHeader(
OpBuilder &builder, ModuleOp module,
34 StringRef headerName) {
36 return emitc::IncludeOp::create(
37 builder, module.getLoc(), includeAttr,
41 struct ConvertMemRefToEmitCPass
42 :
public impl::ConvertMemRefToEmitCBase<ConvertMemRefToEmitCPass> {
44 void runOnOperation()
override {
46 ConvertMemRefToEmitCOptions
options;
47 options.lowerToCpp = this->lowerToCpp;
61 target.addIllegalDialect<memref::MemRefDialect>();
62 target.addLegalDialect<emitc::EmitCDialect>();
66 return signalPassFailure();
68 mlir::ModuleOp module = getOperation();
69 llvm::SmallSet<StringRef, 4> existingHeaders;
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);
static MLIRContext * getContext(OpFoldResult val)
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 describes a specific conversion target.
This class helps build Operations.
void addConversion(FnT &&callback)
Register a conversion function.
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
static WalkResult advance()
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)
LogicalResult applyPartialConversion(ArrayRef< Operation * > ops, const ConversionTarget &target, const FrozenRewritePatternSet &patterns, ConversionConfig config=ConversionConfig())
Below we define several entry points for operation conversion.