diff --git a/clang/include/clang/CIR/FrontendAction/CIRGenAction.h b/clang/include/clang/CIR/FrontendAction/CIRGenAction.h index 2ab612613b73..6618fbc54261 100644 --- a/clang/include/clang/CIR/FrontendAction/CIRGenAction.h +++ b/clang/include/clang/CIR/FrontendAction/CIRGenAction.h @@ -9,52 +9,181 @@ #ifndef LLVM_CLANG_CIR_CIRGENACTION_H #define LLVM_CLANG_CIR_CIRGENACTION_H +#include "clang/CodeGen/CodeGenAction.h" #include "clang/Frontend/FrontendAction.h" +#include -#include "mlir/IR/BuiltinOps.h" -#include "mlir/IR/OwningOpRef.h" +namespace llvm { +class LLVMIRContext; +class Module; +} // namespace llvm namespace mlir { class MLIRContext; class ModuleOp; +template class OwningOpRef; } // namespace mlir namespace cir { class CIRGenConsumer; +class CIRGenerator; class CIRGenAction : public clang::ASTFrontendAction { public: enum class OutputType { + EmitAssembly, EmitCIR, + EmitCIRFlat, + EmitLLVM, + EmitBC, + EmitMLIR, + EmitObj, + None }; private: friend class CIRGenConsumer; - mlir::OwningOpRef MLIRMod; + // TODO: this is redundant but just using the OwningModuleRef requires more of + // clang against MLIR. Hide this somewhere else. + std::unique_ptr> mlirModule; + std::unique_ptr llvmModule; - mlir::MLIRContext *MLIRCtx; + mlir::MLIRContext *mlirContext; + + mlir::OwningOpRef loadModule(llvm::MemoryBufferRef mbRef); protected: - CIRGenAction(OutputType Action, mlir::MLIRContext *MLIRCtx = nullptr); + CIRGenAction(OutputType action, mlir::MLIRContext *_MLIRContext = nullptr); std::unique_ptr CreateASTConsumer(clang::CompilerInstance &CI, llvm::StringRef InFile) override; + void ExecuteAction() override; + + void EndSourceFileAction() override; + public: ~CIRGenAction() override; - OutputType Action; + virtual bool hasCIRSupport() const override { return true; } + + CIRGenConsumer *cgConsumer; + OutputType action; }; class EmitCIRAction : public CIRGenAction { virtual void anchor(); public: - EmitCIRAction(mlir::MLIRContext *MLIRCtx = nullptr); + EmitCIRAction(mlir::MLIRContext *mlirCtx = nullptr); +}; + +class EmitCIRFlatAction : public CIRGenAction { + virtual void anchor(); + +public: + EmitCIRFlatAction(mlir::MLIRContext *mlirCtx = nullptr); +}; + +class EmitCIROnlyAction : public CIRGenAction { + virtual void anchor(); + +public: + EmitCIROnlyAction(mlir::MLIRContext *mlirCtx = nullptr); +}; + +class EmitMLIRAction : public CIRGenAction { + virtual void anchor(); + +public: + EmitMLIRAction(mlir::MLIRContext *mlirCtx = nullptr); +}; + +class EmitLLVMAction : public CIRGenAction { + virtual void anchor(); + +public: + EmitLLVMAction(mlir::MLIRContext *mlirCtx = nullptr); +}; + +class EmitBCAction : public CIRGenAction { + virtual void anchor(); + +public: + EmitBCAction(mlir::MLIRContext *mlirCtx = nullptr); }; +class EmitAssemblyAction : public CIRGenAction { + virtual void anchor(); + +public: + EmitAssemblyAction(mlir::MLIRContext *mlirCtx = nullptr); +}; + +class EmitObjAction : public CIRGenAction { + virtual void anchor(); + +public: + EmitObjAction(mlir::MLIRContext *mlirCtx = nullptr); +}; + +// Used for -fclangir-analysis-only: use CIR analysis but still use original +// LLVM codegen path +class AnalysisOnlyActionBase : public clang::CodeGenAction { + virtual void anchor(); + +protected: + std::unique_ptr + CreateASTConsumer(clang::CompilerInstance &CI, + llvm::StringRef InFile) override; + + AnalysisOnlyActionBase(unsigned _Act, + llvm::LLVMContext *_VMContext = nullptr); +}; + +class AnalysisOnlyAndEmitAssemblyAction : public AnalysisOnlyActionBase { + virtual void anchor() override; + +public: + AnalysisOnlyAndEmitAssemblyAction(llvm::LLVMContext *_VMContext = nullptr); +}; + +class AnalysisOnlyAndEmitBCAction : public AnalysisOnlyActionBase { + virtual void anchor() override; + +public: + AnalysisOnlyAndEmitBCAction(llvm::LLVMContext *_VMContext = nullptr); +}; + +class AnalysisOnlyAndEmitLLVMAction : public AnalysisOnlyActionBase { + virtual void anchor() override; + +public: + AnalysisOnlyAndEmitLLVMAction(llvm::LLVMContext *_VMContext = nullptr); +}; + +class AnalysisOnlyAndEmitLLVMOnlyAction : public AnalysisOnlyActionBase { + virtual void anchor() override; + +public: + AnalysisOnlyAndEmitLLVMOnlyAction(llvm::LLVMContext *_VMContext = nullptr); +}; + +class AnalysisOnlyAndEmitCodeGenOnlyAction : public AnalysisOnlyActionBase { + virtual void anchor() override; + +public: + AnalysisOnlyAndEmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext = nullptr); +}; + +class AnalysisOnlyAndEmitObjAction : public AnalysisOnlyActionBase { + virtual void anchor() override; + +public: + AnalysisOnlyAndEmitObjAction(llvm::LLVMContext *_VMContext = nullptr); +}; } // namespace cir #endif diff --git a/clang/include/clang/CIRFrontendAction/CIRGenAction.h b/clang/include/clang/CIRFrontendAction/CIRGenAction.h deleted file mode 100644 index 13c2a4381573..000000000000 --- a/clang/include/clang/CIRFrontendAction/CIRGenAction.h +++ /dev/null @@ -1,188 +0,0 @@ -//===---- CIRGenAction.h - CIR Code Generation Frontend Action -*- 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 -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_CIR_CIRGENACTION_H -#define LLVM_CLANG_CIR_CIRGENACTION_H - -#include "clang/CodeGen/CodeGenAction.h" -#include "clang/Frontend/FrontendAction.h" -#include - -namespace llvm { -class LLVMIRContext; -class Module; -} // namespace llvm - -namespace mlir { -class MLIRContext; -class ModuleOp; -template class OwningOpRef; -} // namespace mlir - -namespace cir { -class CIRGenConsumer; -class CIRGenerator; - -class CIRGenAction : public clang::ASTFrontendAction { -public: - enum class OutputType { - EmitAssembly, - EmitCIR, - EmitCIRFlat, - EmitLLVM, - EmitBC, - EmitMLIR, - EmitObj, - None - }; - -private: - friend class CIRGenConsumer; - - // TODO: this is redundant but just using the OwningModuleRef requires more of - // clang against MLIR. Hide this somewhere else. - std::unique_ptr> mlirModule; - std::unique_ptr llvmModule; - - mlir::MLIRContext *mlirContext; - - mlir::OwningOpRef loadModule(llvm::MemoryBufferRef mbRef); - -protected: - CIRGenAction(OutputType action, mlir::MLIRContext *_MLIRContext = nullptr); - - std::unique_ptr - CreateASTConsumer(clang::CompilerInstance &CI, - llvm::StringRef InFile) override; - - void ExecuteAction() override; - - void EndSourceFileAction() override; - -public: - ~CIRGenAction() override; - - virtual bool hasCIRSupport() const override { return true; } - - CIRGenConsumer *cgConsumer; - OutputType action; -}; - -class EmitCIRAction : public CIRGenAction { - virtual void anchor(); - -public: - EmitCIRAction(mlir::MLIRContext *mlirCtx = nullptr); -}; - -class EmitCIRFlatAction : public CIRGenAction { - virtual void anchor(); - -public: - EmitCIRFlatAction(mlir::MLIRContext *mlirCtx = nullptr); -}; - -class EmitCIROnlyAction : public CIRGenAction { - virtual void anchor(); - -public: - EmitCIROnlyAction(mlir::MLIRContext *mlirCtx = nullptr); -}; - -class EmitMLIRAction : public CIRGenAction { - virtual void anchor(); - -public: - EmitMLIRAction(mlir::MLIRContext *mlirCtx = nullptr); -}; - -class EmitLLVMAction : public CIRGenAction { - virtual void anchor(); - -public: - EmitLLVMAction(mlir::MLIRContext *mlirCtx = nullptr); -}; - -class EmitBCAction : public CIRGenAction { - virtual void anchor(); - -public: - EmitBCAction(mlir::MLIRContext *mlirCtx = nullptr); -}; - -class EmitAssemblyAction : public CIRGenAction { - virtual void anchor(); - -public: - EmitAssemblyAction(mlir::MLIRContext *mlirCtx = nullptr); -}; - -class EmitObjAction : public CIRGenAction { - virtual void anchor(); - -public: - EmitObjAction(mlir::MLIRContext *mlirCtx = nullptr); -}; - -// Used for -fclangir-analysis-only: use CIR analysis but still use original LLVM codegen path -class AnalysisOnlyActionBase : public clang::CodeGenAction { - virtual void anchor(); - -protected: - std::unique_ptr - CreateASTConsumer(clang::CompilerInstance &CI, - llvm::StringRef InFile) override; - - AnalysisOnlyActionBase(unsigned _Act, - llvm::LLVMContext *_VMContext = nullptr); -}; - -class AnalysisOnlyAndEmitAssemblyAction : public AnalysisOnlyActionBase { - virtual void anchor() override; - -public: - AnalysisOnlyAndEmitAssemblyAction(llvm::LLVMContext *_VMContext = nullptr); -}; - -class AnalysisOnlyAndEmitBCAction : public AnalysisOnlyActionBase { - virtual void anchor() override; - -public: - AnalysisOnlyAndEmitBCAction(llvm::LLVMContext *_VMContext = nullptr); -}; - -class AnalysisOnlyAndEmitLLVMAction : public AnalysisOnlyActionBase { - virtual void anchor() override; - -public: - AnalysisOnlyAndEmitLLVMAction(llvm::LLVMContext *_VMContext = nullptr); -}; - -class AnalysisOnlyAndEmitLLVMOnlyAction : public AnalysisOnlyActionBase { - virtual void anchor() override; - -public: - AnalysisOnlyAndEmitLLVMOnlyAction(llvm::LLVMContext *_VMContext = nullptr); -}; - -class AnalysisOnlyAndEmitCodeGenOnlyAction : public AnalysisOnlyActionBase { - virtual void anchor() override; - -public: - AnalysisOnlyAndEmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext = nullptr); -}; - -class AnalysisOnlyAndEmitObjAction : public AnalysisOnlyActionBase { - virtual void anchor() override; - -public: - AnalysisOnlyAndEmitObjAction(llvm::LLVMContext *_VMContext = nullptr); -}; -} // namespace cir - -#endif diff --git a/clang/lib/CIR/FrontendAction/CIRGenAction.cpp b/clang/lib/CIR/FrontendAction/CIRGenAction.cpp index a1123850dda2..c9031964ea3a 100644 --- a/clang/lib/CIR/FrontendAction/CIRGenAction.cpp +++ b/clang/lib/CIR/FrontendAction/CIRGenAction.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -#include "clang/CIRFrontendAction/CIRGenAction.h" +#include "clang/CIR/FrontendAction/CIRGenAction.h" #include "mlir/Dialect/Func/IR/FuncOps.h" #include "mlir/Dialect/MemRef/IR/MemRef.h" #include "mlir/IR/BuiltinOps.h" diff --git a/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp index 8dc375c28b85..4a54d90a6591 100644 --- a/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp +++ b/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp @@ -37,7 +37,7 @@ #include "mlir/IR/MLIRContext.h" #include "mlir/Pass/PassManager.h" #include "clang/CIR/Dialect/Passes.h" -#include "clang/CIRFrontendAction/CIRGenAction.h" +#include "clang/CIR/FrontendAction/CIRGenAction.h" #endif using namespace clang;