================ @@ -0,0 +1,69 @@ +//===- IdiomRecognizer.cpp - pareparation work for LLVM lowering ----------===// +// +// 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 pass is responsible for recognizing idioms (such as uses of functions +// and types to the C/C++ standard library) and replacing them with Clang IR +// operators for later optimization. +// +//===----------------------------------------------------------------------===// + +#include "PassDetail.h" +#include "mlir/Dialect/Func/IR/FuncOps.h" +#include "mlir/IR/BuiltinAttributes.h" +#include "mlir/IR/Region.h" +#include "clang/AST/ASTContext.h" +#include "clang/AST/Mangle.h" +#include "clang/Basic/Module.h" +#include "clang/CIR/Dialect/Builder/CIRBaseBuilder.h" +#include "clang/CIR/Dialect/IR/CIRDialect.h" +#include "clang/CIR/Dialect/Passes.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/StringMap.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/ADT/Twine.h" +#include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/Path.h" + +using namespace mlir; +using namespace cir; + +namespace mlir { +#define GEN_PASS_DEF_IDIOMRECOGNIZER +#include "clang/CIR/Dialect/Passes.h.inc" +} // namespace mlir + +namespace { + +struct IdiomRecognizerPass : public impl::IdiomRecognizerBase<IdiomRecognizerPass> { + IdiomRecognizerPass() = default; + void runOnOperation() override; + + clang::ASTContext *astCtx; + void setASTContext(clang::ASTContext *c) { astCtx = c; } + + /// Tracks current module. + ModuleOp theModule; +}; +} // namespace + +void IdiomRecognizerPass::runOnOperation() { + auto *op = getOperation(); + if (isa<::mlir::ModuleOp>(op)) + theModule = cast<::mlir::ModuleOp>(op); +} + +std::unique_ptr<Pass> mlir::createIdiomRecognizerPass() { + return std::make_unique<IdiomRecognizerPass>(); +} + +std::unique_ptr<Pass> +mlir::createIdiomRecognizerPass(clang::ASTContext *astCtx) { + auto pass = std::make_unique<IdiomRecognizerPass>(); + pass->setASTContext(astCtx); + return std::move(pass); ---------------- HendrikHuebner wrote:
The call to `std::move` is necessary since the return type is `Pass`, so for the upcast there needs to be a `std::move` https://github.com/llvm/llvm-project/pull/172486 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
