|
9 | 9 | #ifndef LLVM_CLANG_CIR_CIRGENACTION_H
|
10 | 10 | #define LLVM_CLANG_CIR_CIRGENACTION_H
|
11 | 11 |
|
| 12 | +#include "clang/CodeGen/CodeGenAction.h" |
12 | 13 | #include "clang/Frontend/FrontendAction.h"
|
| 14 | +#include <memory> |
13 | 15 |
|
14 |
| -#include "mlir/IR/BuiltinOps.h" |
15 |
| -#include "mlir/IR/OwningOpRef.h" |
| 16 | +namespace llvm { |
| 17 | +class LLVMIRContext; |
| 18 | +class Module; |
| 19 | +} // namespace llvm |
16 | 20 |
|
17 | 21 | namespace mlir {
|
18 | 22 | class MLIRContext;
|
19 | 23 | class ModuleOp;
|
| 24 | +template <typename T> class OwningOpRef; |
20 | 25 | } // namespace mlir
|
21 | 26 |
|
22 | 27 | namespace cir {
|
23 | 28 | class CIRGenConsumer;
|
| 29 | +class CIRGenerator; |
24 | 30 |
|
25 | 31 | class CIRGenAction : public clang::ASTFrontendAction {
|
26 | 32 | public:
|
27 | 33 | enum class OutputType {
|
| 34 | + EmitAssembly, |
28 | 35 | EmitCIR,
|
| 36 | + EmitCIRFlat, |
| 37 | + EmitLLVM, |
| 38 | + EmitBC, |
| 39 | + EmitMLIR, |
| 40 | + EmitObj, |
| 41 | + None |
29 | 42 | };
|
30 | 43 |
|
31 | 44 | private:
|
32 | 45 | friend class CIRGenConsumer;
|
33 | 46 |
|
34 |
| - mlir::OwningOpRef<mlir::ModuleOp> MLIRMod; |
| 47 | + // TODO: this is redundant but just using the OwningModuleRef requires more of |
| 48 | + // clang against MLIR. Hide this somewhere else. |
| 49 | + std::unique_ptr<mlir::OwningOpRef<mlir::ModuleOp>> mlirModule; |
| 50 | + std::unique_ptr<llvm::Module> llvmModule; |
35 | 51 |
|
36 |
| - mlir::MLIRContext *MLIRCtx; |
| 52 | + mlir::MLIRContext *mlirContext; |
| 53 | + |
| 54 | + mlir::OwningOpRef<mlir::ModuleOp> loadModule(llvm::MemoryBufferRef mbRef); |
37 | 55 |
|
38 | 56 | protected:
|
39 |
| - CIRGenAction(OutputType Action, mlir::MLIRContext *MLIRCtx = nullptr); |
| 57 | + CIRGenAction(OutputType action, mlir::MLIRContext *_MLIRContext = nullptr); |
40 | 58 |
|
41 | 59 | std::unique_ptr<clang::ASTConsumer>
|
42 | 60 | CreateASTConsumer(clang::CompilerInstance &CI,
|
43 | 61 | llvm::StringRef InFile) override;
|
44 | 62 |
|
| 63 | + void ExecuteAction() override; |
| 64 | + |
| 65 | + void EndSourceFileAction() override; |
| 66 | + |
45 | 67 | public:
|
46 | 68 | ~CIRGenAction() override;
|
47 | 69 |
|
48 |
| - OutputType Action; |
| 70 | + virtual bool hasCIRSupport() const override { return true; } |
| 71 | + |
| 72 | + CIRGenConsumer *cgConsumer; |
| 73 | + OutputType action; |
49 | 74 | };
|
50 | 75 |
|
51 | 76 | class EmitCIRAction : public CIRGenAction {
|
52 | 77 | virtual void anchor();
|
53 | 78 |
|
54 | 79 | public:
|
55 |
| - EmitCIRAction(mlir::MLIRContext *MLIRCtx = nullptr); |
| 80 | + EmitCIRAction(mlir::MLIRContext *mlirCtx = nullptr); |
| 81 | +}; |
| 82 | + |
| 83 | +class EmitCIRFlatAction : public CIRGenAction { |
| 84 | + virtual void anchor(); |
| 85 | + |
| 86 | +public: |
| 87 | + EmitCIRFlatAction(mlir::MLIRContext *mlirCtx = nullptr); |
| 88 | +}; |
| 89 | + |
| 90 | +class EmitCIROnlyAction : public CIRGenAction { |
| 91 | + virtual void anchor(); |
| 92 | + |
| 93 | +public: |
| 94 | + EmitCIROnlyAction(mlir::MLIRContext *mlirCtx = nullptr); |
| 95 | +}; |
| 96 | + |
| 97 | +class EmitMLIRAction : public CIRGenAction { |
| 98 | + virtual void anchor(); |
| 99 | + |
| 100 | +public: |
| 101 | + EmitMLIRAction(mlir::MLIRContext *mlirCtx = nullptr); |
| 102 | +}; |
| 103 | + |
| 104 | +class EmitLLVMAction : public CIRGenAction { |
| 105 | + virtual void anchor(); |
| 106 | + |
| 107 | +public: |
| 108 | + EmitLLVMAction(mlir::MLIRContext *mlirCtx = nullptr); |
| 109 | +}; |
| 110 | + |
| 111 | +class EmitBCAction : public CIRGenAction { |
| 112 | + virtual void anchor(); |
| 113 | + |
| 114 | +public: |
| 115 | + EmitBCAction(mlir::MLIRContext *mlirCtx = nullptr); |
56 | 116 | };
|
57 | 117 |
|
| 118 | +class EmitAssemblyAction : public CIRGenAction { |
| 119 | + virtual void anchor(); |
| 120 | + |
| 121 | +public: |
| 122 | + EmitAssemblyAction(mlir::MLIRContext *mlirCtx = nullptr); |
| 123 | +}; |
| 124 | + |
| 125 | +class EmitObjAction : public CIRGenAction { |
| 126 | + virtual void anchor(); |
| 127 | + |
| 128 | +public: |
| 129 | + EmitObjAction(mlir::MLIRContext *mlirCtx = nullptr); |
| 130 | +}; |
| 131 | + |
| 132 | +// Used for -fclangir-analysis-only: use CIR analysis but still use original |
| 133 | +// LLVM codegen path |
| 134 | +class AnalysisOnlyActionBase : public clang::CodeGenAction { |
| 135 | + virtual void anchor(); |
| 136 | + |
| 137 | +protected: |
| 138 | + std::unique_ptr<clang::ASTConsumer> |
| 139 | + CreateASTConsumer(clang::CompilerInstance &CI, |
| 140 | + llvm::StringRef InFile) override; |
| 141 | + |
| 142 | + AnalysisOnlyActionBase(unsigned _Act, |
| 143 | + llvm::LLVMContext *_VMContext = nullptr); |
| 144 | +}; |
| 145 | + |
| 146 | +class AnalysisOnlyAndEmitAssemblyAction : public AnalysisOnlyActionBase { |
| 147 | + virtual void anchor() override; |
| 148 | + |
| 149 | +public: |
| 150 | + AnalysisOnlyAndEmitAssemblyAction(llvm::LLVMContext *_VMContext = nullptr); |
| 151 | +}; |
| 152 | + |
| 153 | +class AnalysisOnlyAndEmitBCAction : public AnalysisOnlyActionBase { |
| 154 | + virtual void anchor() override; |
| 155 | + |
| 156 | +public: |
| 157 | + AnalysisOnlyAndEmitBCAction(llvm::LLVMContext *_VMContext = nullptr); |
| 158 | +}; |
| 159 | + |
| 160 | +class AnalysisOnlyAndEmitLLVMAction : public AnalysisOnlyActionBase { |
| 161 | + virtual void anchor() override; |
| 162 | + |
| 163 | +public: |
| 164 | + AnalysisOnlyAndEmitLLVMAction(llvm::LLVMContext *_VMContext = nullptr); |
| 165 | +}; |
| 166 | + |
| 167 | +class AnalysisOnlyAndEmitLLVMOnlyAction : public AnalysisOnlyActionBase { |
| 168 | + virtual void anchor() override; |
| 169 | + |
| 170 | +public: |
| 171 | + AnalysisOnlyAndEmitLLVMOnlyAction(llvm::LLVMContext *_VMContext = nullptr); |
| 172 | +}; |
| 173 | + |
| 174 | +class AnalysisOnlyAndEmitCodeGenOnlyAction : public AnalysisOnlyActionBase { |
| 175 | + virtual void anchor() override; |
| 176 | + |
| 177 | +public: |
| 178 | + AnalysisOnlyAndEmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext = nullptr); |
| 179 | +}; |
| 180 | + |
| 181 | +class AnalysisOnlyAndEmitObjAction : public AnalysisOnlyActionBase { |
| 182 | + virtual void anchor() override; |
| 183 | + |
| 184 | +public: |
| 185 | + AnalysisOnlyAndEmitObjAction(llvm::LLVMContext *_VMContext = nullptr); |
| 186 | +}; |
58 | 187 | } // namespace cir
|
59 | 188 |
|
60 | 189 | #endif
|
0 commit comments