15#include "mlir/Dialect/EmitC/IR/EmitC.h"
16#include "llvm/ADT/SmallString.h"
18using namespace mlir::emitc;
31 void emitStatement(IncludeOp op, EmissionPrinter &p)
override {
32 p <<
"#include " << (op.getIsStandardInclude() ?
"<" :
"\"")
33 << op.getInclude() << (op.getIsStandardInclude() ?
">" :
"\"") <<
"\n";
41 MatchResult matchInlinable(Value value)
override {
42 if (value.getDefiningOp<AddressOfOp>())
43 return Precedence::ADDRESS_OF;
47 void emitInlined(Value value, EmissionPrinter &p)
override {
48 auto addressOfOp = value.getDefiningOp<AddressOfOp>();
59 MatchResult matchInlinable(Value value)
override {
61 if (value.getDefiningOp<DereferenceOp>())
62 return Precedence::ADDRESS_OF;
66 void emitInlined(Value value, EmissionPrinter &p)
override {
67 auto dereferenceOp = value.getDefiningOp<DereferenceOp>();
84 MatchResult matchInlinable(Value value)
override {
85 if (
auto callOp = value.getDefiningOp<CallOpaqueOp>()) {
87 if (callOp->getNumResults() == 1 && !callOp.getTemplateArgs())
88 return Precedence::FUNCTION_CALL;
93 void emitInlined(Value value, EmissionPrinter &p)
override {
94 printCallOp(value.getDefiningOp<CallOpaqueOp>(), p);
97 bool matchStatement(Operation *op)
override {
99 if (
auto callOp = dyn_cast<CallOpaqueOp>(op))
100 return callOp->getNumResults() <= 1 && !callOp.getTemplateArgs();
104 void emitStatement(CallOpaqueOp callOp, EmissionPrinter &p)
override {
105 if (callOp->getNumResults() != 0)
108 printCallOp(callOp, p);
113 void printCallOp(CallOpaqueOp callOp, EmissionPrinter &p) {
114 p << callOp.getCallee();
118 if (!callOp.getArgs()) {
119 llvm::interleaveComma(callOp.getOperands(), p, [&](Value operand) {
120 p.getInlinable(operand).emitWithParensOnLowerPrecedence(
124 llvm::interleaveComma(callOp.getArgs().value(), p, [&](Attribute attr) {
125 if (auto idx = dyn_cast<IntegerAttr>(attr)) {
126 if (isa<IndexType>(idx.getType())) {
127 p.getInlinable(callOp.getOperands()[idx.getInt()])
128 .emitWithParensOnLowerPrecedence(Precedence::COMMA);
145 MatchResult matchInlinable(Value value)
override {
146 if (value.getDefiningOp<CastOp>())
147 return Precedence::CAST;
151 void emitInlined(Value value, EmissionPrinter &p)
override {
152 auto castOp = value.getDefiningOp<CastOp>();
154 p.
emitType(castOp.getDest().getType());
165 MatchResult matchInlinable(Value value)
override {
166 if (value.getDefiningOp<ConstantOp>())
167 return Precedence::LIT;
171 void emitInlined(Value value, EmissionPrinter &p)
override {
172 p.
emitAttr(value.getDefiningOp<ConstantOp>().getValue());
181 if (
auto varOp = value.getDefiningOp<VariableOp>()) {
182 if (!varOp->getAttrOfType<StringAttr>(
"name"))
184 return Precedence::VAR;
189 void emitInlined(Value value, EmissionPrinter &p)
override {
190 p << value.getDefiningOp()->getAttrOfType<StringAttr>(
"name").getValue();
193 void emitStatement(VariableOp op, EmissionPrinter &p)
override {
194 p.
emitType(op.getResult().getType());
195 p <<
" " << op->getAttrOfType<StringAttr>(
"name").getValue();
215 void emitType(OpaqueType type, EmissionPrinter &p)
override {
216 p << type.getValue();
222 void emitType(PointerType type, EmissionPrinter &p)
override {
230 void emitType(LValueType type, EmissionPrinter &p)
override {
241 void emitAttr(OpaqueAttr attr, EmissionPrinter &p)
override {
242 p << attr.getValue();
254 patterns.add<IncludeEmitter, AddressOfOpEmitter, DereferenceOpEmitter,
261 patterns.add<OpaqueTypeEmitter, PointerTypeEmitter, LValueTypeEmitter>();
static std::unique_ptr< Context > context
InlineEmitter getInlinable(Value value)
Emit the expression represented by the given value to the ostream associated with this printer accord...
void emitAttr(Attribute attr)
Emit the given attribute to the ostream associated with this printer according to the emission patter...
void emitType(Type type)
Emit the given type to the ostream associated with this printer according to the emission patterns re...
void emitWithParensOnLowerPrecedence(Precedence prec, StringRef lParen="(", StringRef rParen=")") const
void populateEmitCOpEmitters(OpEmissionPatternSet &patterns, MLIRContext *context)
Register EmitC operation emission patterns.
EmissionPatternSet< AttrEmissionPatternBase > AttrEmissionPatternSet
void populateEmitCTypeEmitters(TypeEmissionPatternSet &patterns)
Register EmitC type emission patterns.
void populateEmitCAttrEmitters(AttrEmissionPatternSet &patterns)
Register EmitC attribute emission patterns.
EmissionPatternSet< TypeEmissionPatternBase > TypeEmissionPatternSet
EmissionPatternSet< OpEmissionPatternBase > OpEmissionPatternSet
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
Emit a systemc.cpp.variable operation.
void emitStatement(VariableOp op, EmissionPrinter &p) override
void emitInlined(Value value, EmissionPrinter &p) override
MatchResult matchInlinable(Value value) override
Checks if this pattern is applicable to the given value to emit an inlinable expression.
This is a convenience class providing default implementations for attribute emission patterns.
This is a convenience class providing default implementations for operation emission patterns.
OpEmissionPattern(MLIRContext *context)
This is a convenience class providing default implementations for type emission patterns.