================
@@ -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

Reply via email to