This adds a `func`, `call` and `return` operation to the EmitC dialect, closely related to the corresponding operations of the Func dialect. In contrast to the operations of the Func dialect, the EmitC operations do not support multiple results. The `emitc.func` op features a `specifiers` argument that for example allows, with corresponding support in the emitter, to emit `inline static` functions. Furthermore, this adds patterns and a pass to convert the Func dialect to EmitC. A `func.func` op that is `private` is converted to `emitc.func` with a `"static"` specifier.
48 lines
1.5 KiB
C++
48 lines
1.5 KiB
C++
//===- FuncToEmitC.cpp - Func to EmitC Pass ---------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements a pass to convert the Func dialect to the EmitC dialect.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "mlir/Conversion/FuncToEmitC/FuncToEmitCPass.h"
|
|
|
|
#include "mlir/Conversion/FuncToEmitC/FuncToEmitC.h"
|
|
#include "mlir/Dialect/EmitC/IR/EmitC.h"
|
|
#include "mlir/Dialect/Func/IR/FuncOps.h"
|
|
#include "mlir/Pass/Pass.h"
|
|
#include "mlir/Transforms/DialectConversion.h"
|
|
|
|
namespace mlir {
|
|
#define GEN_PASS_DEF_CONVERTFUNCTOEMITC
|
|
#include "mlir/Conversion/Passes.h.inc"
|
|
} // namespace mlir
|
|
|
|
using namespace mlir;
|
|
|
|
namespace {
|
|
struct ConvertFuncToEmitC
|
|
: public impl::ConvertFuncToEmitCBase<ConvertFuncToEmitC> {
|
|
void runOnOperation() override;
|
|
};
|
|
} // namespace
|
|
|
|
void ConvertFuncToEmitC::runOnOperation() {
|
|
ConversionTarget target(getContext());
|
|
|
|
target.addLegalDialect<emitc::EmitCDialect>();
|
|
target.addIllegalOp<func::CallOp, func::FuncOp, func::ReturnOp>();
|
|
|
|
RewritePatternSet patterns(&getContext());
|
|
populateFuncToEmitCPatterns(patterns);
|
|
|
|
if (failed(
|
|
applyPartialConversion(getOperation(), target, std::move(patterns))))
|
|
signalPassFailure();
|
|
}
|