15#include "mlir/Dialect/DLTI/DLTI.h"
16#include "mlir/Dialect/OpenACC/OpenACC.h"
17#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
18#include "mlir/IR/MLIRContext.h"
19#include "mlir/Target/LLVMIR/Import.h"
24#include "llvm/IR/DataLayout.h"
29void CIRGenerator::anchor() {}
34 : diags(diags), fs(
std::move(
vfs)), codeGenOpts{cgo},
35 handlingTopLevelDecls{0} {}
38 assert(deferredInlineMemberFuncDefs.empty() || diags.hasErrorOccurred());
42 mlir::MLIRContext *mlirContext = mod.getContext();
43 mlir::DataLayoutSpecInterface dlSpec =
44 mlir::translateDataLayout(dl, mlirContext);
45 mod->setAttr(mlir::DLTIDialect::kDataLayoutAttrName, dlSpec);
51 this->astContext = &astContext;
53 mlirContext = std::make_unique<mlir::MLIRContext>();
55 mlirContext->loadDialect<mlir::DLTIDialect, cir::CIRDialect>();
56 mlirContext->getOrLoadDialect<mlir::acc::OpenACCDialect>();
57 mlirContext->getOrLoadDialect<mlir::omp::OpenMPDialect>();
59 cgm = std::make_unique<clang::CIRGen::CIRGenModule>(
60 *
mlirContext.get(), astContext, codeGenOpts, diags);
61 mlir::ModuleOp mod =
cgm->getModule();
62 llvm::DataLayout layout =
63 llvm::DataLayout(astContext.getTargetInfo().getDataLayoutString());
72 if (diags.hasUnrecoverableErrorOccurred())
75 HandlingTopLevelDeclRAII handlingDecl(*
this);
85 if (!diags.hasErrorOccurred() &&
cgm)
94 if (diags.hasErrorOccurred())
106 deferredInlineMemberFuncDefs.push_back(d);
115 if (deferredInlineMemberFuncDefs.empty())
123 HandlingTopLevelDeclRAII handlingDecls(*
this);
124 for (
unsigned i = 0; i != deferredInlineMemberFuncDefs.size(); ++i)
125 cgm->emitTopLevelDecl(deferredInlineMemberFuncDefs[i]);
126 deferredInlineMemberFuncDefs.clear();
134 if (diags.hasErrorOccurred())
139 HandlingTopLevelDeclRAII handlingDecl(*
this,
false);
141 cgm->updateCompletedType(d);
145 if (astContext->getTargetInfo().getCXXABI().isMicrosoft())
150 if (astContext->getLangOpts().OpenMP) {
152 if (
auto *drd = dyn_cast<OMPDeclareReductionDecl>(member)) {
153 if (astContext->DeclMustBeEmitted(drd))
155 "HandleTagDeclDefinition: OMPDeclareReductionDecl");
156 }
else if (
auto *dmd = dyn_cast<OMPDeclareMapperDecl>(member)) {
157 if (astContext->DeclMustBeEmitted(dmd))
159 "HandleTagDeclDefinition: OMPDeclareMapperDecl");
166 if (diags.hasErrorOccurred())
173 if (diags.hasErrorOccurred())
176 cgm->handleCXXStaticMemberVarInstantiation(D);
181 llvm::StringRef mangledName =
cgm->getMangledName(FD);
183 mlir::dyn_cast_if_present<cir::FuncOp>(
cgm->getGlobalValue(mangledName));
192 if (diags.hasErrorOccurred())
195 cgm->emitTentativeDefinition(d);
199 if (diags.hasErrorOccurred())
static void setMLIRDataLayout(mlir::ModuleOp &mod, const llvm::DataLayout &dl)
void HandleTagDeclDefinition(clang::TagDecl *d) override
HandleTagDeclDefinition - This callback is invoked each time a TagDecl to (e.g.
CIRGenerator(clang::DiagnosticsEngine &diags, llvm::IntrusiveRefCntPtr< llvm::vfs::FileSystem > fs, const clang::CodeGenOptions &cgo)
mlir::ModuleOp getModule() const
std::unique_ptr< clang::CIRGen::CIRGenModule > cgm
void HandleTranslationUnit(clang::ASTContext &astContext) override
HandleTranslationUnit - This method is called when the ASTs for entire translation unit have been par...
bool verifyModule() const
void HandleVTable(clang::CXXRecordDecl *rd) override
Callback involved at the end of a translation unit to notify the consumer that a vtable for the given...
bool HandleTopLevelDecl(clang::DeclGroupRef group) override
HandleTopLevelDecl - Handle the specified top-level declaration.
void CompleteTentativeDefinition(clang::VarDecl *d) override
CompleteTentativeDefinition - Callback invoked at the end of a translation unit to notify the consume...
void HandleTagDeclRequiredDefinition(const clang::TagDecl *D) override
This callback is invoked the first time each TagDecl is required to be complete.
void HandleOpenACCRoutineReference(const clang::FunctionDecl *FD, const clang::OpenACCRoutineDecl *RD) override
Callback to handle the end-of-translation unit attachment of OpenACC routine declaration information.
void HandleInlineFunctionDefinition(clang::FunctionDecl *d) override
This callback is invoked each time an inline (method or friend) function definition in a class is com...
void HandleCXXStaticMemberVarInstantiation(clang::VarDecl *D) override
HandleCXXStaticMemberVarInstantiation - Tell the consumer that this.
std::unique_ptr< mlir::MLIRContext > mlirContext
void Initialize(clang::ASTContext &astContext) override
Initialize - This is called to initialize the consumer, providing the ASTContext.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Represents a C++ struct/union/class.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
Decl - This represents one declaration (or definition), e.g.
SourceLocation getBeginLoc() const LLVM_READONLY
Concrete class used by the front-end to report problems and issues.
Represents a function declaration or definition.
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
ArrayRef< const OpenACCClause * > clauses() const
Represents the declaration of a struct/union/class/enum.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Represents a variable declaration or definition.
void registerAllDialects(mlir::DialectRegistry ®istry)
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
The JSON file list parser is used to communicate input to InstallAPI.
Diagnostic wrappers for TextAPI types for error reporting.
static bool coverageMapping()
static bool cleanupAfterErrorDiags()
static bool generateDebugInfo()