xref: /llvm-project/clang/lib/CIR/CodeGen/CIRGenModule.h (revision 7eb73b95cb336cde14d5c755a09cd880bd3d5df9)
11bb52e94SNathan Lanza //===--- CIRGenModule.h - Per-Module state for CIR gen ----------*- C++ -*-===//
21bb52e94SNathan Lanza //
31bb52e94SNathan Lanza // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
41bb52e94SNathan Lanza // See https://llvm.org/LICENSE.txt for license information.
51bb52e94SNathan Lanza // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61bb52e94SNathan Lanza //
71bb52e94SNathan Lanza //===----------------------------------------------------------------------===//
81bb52e94SNathan Lanza //
91bb52e94SNathan Lanza // This is the internal per-translation-unit state used for CIR translation.
101bb52e94SNathan Lanza //
111bb52e94SNathan Lanza //===----------------------------------------------------------------------===//
121bb52e94SNathan Lanza 
131bb52e94SNathan Lanza #ifndef LLVM_CLANG_LIB_CIR_CODEGEN_CIRGENMODULE_H
141bb52e94SNathan Lanza #define LLVM_CLANG_LIB_CIR_CODEGEN_CIRGENMODULE_H
151bb52e94SNathan Lanza 
16ffb19f40SDavid Olsen #include "CIRGenBuilder.h"
171bb52e94SNathan Lanza #include "CIRGenTypeCache.h"
18a43b2e13SDavid Olsen #include "CIRGenTypes.h"
191bb52e94SNathan Lanza 
20c695a325SDavid Olsen #include "mlir/IR/Builders.h"
211bb52e94SNathan Lanza #include "mlir/IR/BuiltinOps.h"
221bb52e94SNathan Lanza #include "mlir/IR/MLIRContext.h"
23a43b2e13SDavid Olsen #include "clang/Basic/SourceManager.h"
24c695a325SDavid Olsen #include "llvm/ADT/StringRef.h"
251bb52e94SNathan Lanza 
261bb52e94SNathan Lanza namespace clang {
271bb52e94SNathan Lanza class ASTContext;
281bb52e94SNathan Lanza class CodeGenOptions;
291bb52e94SNathan Lanza class Decl;
30c695a325SDavid Olsen class GlobalDecl;
311bb52e94SNathan Lanza class LangOptions;
321bb52e94SNathan Lanza class TargetInfo;
33a43b2e13SDavid Olsen class VarDecl;
341bb52e94SNathan Lanza 
3540e54509SShoaib Meenai namespace CIRGen {
361bb52e94SNathan Lanza 
371bb52e94SNathan Lanza /// This class organizes the cross-function state that is used while generating
381bb52e94SNathan Lanza /// CIR code.
391bb52e94SNathan Lanza class CIRGenModule : public CIRGenTypeCache {
401bb52e94SNathan Lanza   CIRGenModule(CIRGenModule &) = delete;
411bb52e94SNathan Lanza   CIRGenModule &operator=(CIRGenModule &) = delete;
421bb52e94SNathan Lanza 
431bb52e94SNathan Lanza public:
44*7eb73b95SDavid Olsen   CIRGenModule(mlir::MLIRContext &mlirContext, clang::ASTContext &astContext,
451bb52e94SNathan Lanza                const clang::CodeGenOptions &cgo,
461bb52e94SNathan Lanza                clang::DiagnosticsEngine &diags);
471bb52e94SNathan Lanza 
481bb52e94SNathan Lanza   ~CIRGenModule() = default;
491bb52e94SNathan Lanza 
501bb52e94SNathan Lanza private:
51ffb19f40SDavid Olsen   CIRGenBuilderTy builder;
52c695a325SDavid Olsen 
531bb52e94SNathan Lanza   /// Hold Clang AST information.
54*7eb73b95SDavid Olsen   clang::ASTContext &astContext;
551bb52e94SNathan Lanza 
561bb52e94SNathan Lanza   const clang::LangOptions &langOpts;
571bb52e94SNathan Lanza 
581bb52e94SNathan Lanza   /// A "module" matches a c/cpp source file: containing a list of functions.
591bb52e94SNathan Lanza   mlir::ModuleOp theModule;
601bb52e94SNathan Lanza 
61c695a325SDavid Olsen   clang::DiagnosticsEngine &diags;
62c695a325SDavid Olsen 
631bb52e94SNathan Lanza   const clang::TargetInfo ⌖
641bb52e94SNathan Lanza 
65a43b2e13SDavid Olsen   CIRGenTypes genTypes;
66a43b2e13SDavid Olsen 
671bb52e94SNathan Lanza public:
68c695a325SDavid Olsen   mlir::ModuleOp getModule() const { return theModule; }
69ffb19f40SDavid Olsen   CIRGenBuilderTy &getBuilder() { return builder; }
70*7eb73b95SDavid Olsen   clang::ASTContext &getASTContext() const { return astContext; }
71a43b2e13SDavid Olsen   CIRGenTypes &getTypes() { return genTypes; }
72ffb19f40SDavid Olsen   mlir::MLIRContext &getMLIRContext() { return *builder.getContext(); }
73c695a325SDavid Olsen 
74c695a325SDavid Olsen   /// Helpers to convert the presumed location of Clang's SourceLocation to an
75c695a325SDavid Olsen   /// MLIR Location.
76c695a325SDavid Olsen   mlir::Location getLoc(clang::SourceLocation cLoc);
77c695a325SDavid Olsen   mlir::Location getLoc(clang::SourceRange cRange);
78c695a325SDavid Olsen 
791791b25fSShoaib Meenai   void emitTopLevelDecl(clang::Decl *decl);
80c695a325SDavid Olsen 
81c695a325SDavid Olsen   /// Emit code for a single global function or variable declaration. Forward
82c695a325SDavid Olsen   /// declarations are emitted lazily.
831791b25fSShoaib Meenai   void emitGlobal(clang::GlobalDecl gd);
84c695a325SDavid Olsen 
851791b25fSShoaib Meenai   void emitGlobalDefinition(clang::GlobalDecl gd,
86c695a325SDavid Olsen                             mlir::Operation *op = nullptr);
871791b25fSShoaib Meenai   void emitGlobalFunctionDefinition(clang::GlobalDecl gd, mlir::Operation *op);
88a43b2e13SDavid Olsen   void emitGlobalVarDefinition(const clang::VarDecl *vd,
89a43b2e13SDavid Olsen                                bool isTentative = false);
90c695a325SDavid Olsen 
91c695a325SDavid Olsen   /// Helpers to emit "not yet implemented" error diagnostics
92c695a325SDavid Olsen   DiagnosticBuilder errorNYI(SourceLocation, llvm::StringRef);
93a43b2e13SDavid Olsen 
94a43b2e13SDavid Olsen   template <typename T>
95a43b2e13SDavid Olsen   DiagnosticBuilder errorNYI(SourceLocation loc, llvm::StringRef feature,
96a43b2e13SDavid Olsen                              const T &name) {
97a43b2e13SDavid Olsen     unsigned diagID =
98a43b2e13SDavid Olsen         diags.getCustomDiagID(DiagnosticsEngine::Error,
99a43b2e13SDavid Olsen                               "ClangIR code gen Not Yet Implemented: %0: %1");
100a43b2e13SDavid Olsen     return diags.Report(loc, diagID) << feature << name;
101a43b2e13SDavid Olsen   }
102a43b2e13SDavid Olsen 
103c695a325SDavid Olsen   DiagnosticBuilder errorNYI(SourceRange, llvm::StringRef);
104a43b2e13SDavid Olsen 
105a43b2e13SDavid Olsen   template <typename T>
106a43b2e13SDavid Olsen   DiagnosticBuilder errorNYI(SourceRange loc, llvm::StringRef feature,
107a43b2e13SDavid Olsen                              const T &name) {
108a43b2e13SDavid Olsen     return errorNYI(loc.getBegin(), feature, name) << loc;
109a43b2e13SDavid Olsen   }
1101bb52e94SNathan Lanza };
11140e54509SShoaib Meenai } // namespace CIRGen
11240e54509SShoaib Meenai 
11340e54509SShoaib Meenai } // namespace clang
1141bb52e94SNathan Lanza 
1151bb52e94SNathan Lanza #endif // LLVM_CLANG_LIB_CIR_CODEGEN_CIRGENMODULE_H
116