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