FLANG
Bridge.h
1//===-- Lower/Bridge.h -- main interface to lowering ------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef FORTRAN_LOWER_BRIDGE_H
14#define FORTRAN_LOWER_BRIDGE_H
15
16#include "flang/Frontend/CodeGenOptions.h"
18#include "flang/Lower/AbstractConverter.h"
19#include "flang/Lower/EnvironmentDefault.h"
21#include "flang/Lower/StatementContext.h"
22#include "flang/Optimizer/Builder/FIRBuilder.h"
23#include "flang/Optimizer/Dialect/Support/KindMapping.h"
24#include "flang/Support/Fortran.h"
25#include "mlir/IR/BuiltinOps.h"
26#include "mlir/IR/OwningOpRef.h"
27#include <set>
28
29namespace llvm {
30class TargetMachine;
31} // namespace llvm
32
33namespace Fortran {
34namespace common {
36} // namespace common
37namespace evaluate {
38class IntrinsicProcTable;
40} // namespace evaluate
41namespace parser {
43struct Program;
44} // namespace parser
45namespace semantics {
47} // namespace semantics
48
49namespace lower {
50
51//===----------------------------------------------------------------------===//
52// Lowering bridge
53//===----------------------------------------------------------------------===//
54
57class LoweringBridge {
58public:
60 static LoweringBridge
61 create(mlir::MLIRContext &ctx,
64 const Fortran::evaluate::IntrinsicProcTable &intrinsics,
65 const Fortran::evaluate::TargetCharacteristics &targetCharacteristics,
66 const Fortran::parser::AllCookedSources &allCooked,
67 llvm::StringRef triple, fir::KindMapping &kindMap,
68 const Fortran::lower::LoweringOptions &loweringOptions,
69 const std::vector<Fortran::lower::EnvironmentDefault> &envDefaults,
70 const Fortran::common::LanguageFeatureControl &languageFeatures,
71 const llvm::TargetMachine &targetMachine,
72 const Fortran::frontend::TargetOptions &targetOptions,
73 const Fortran::frontend::CodeGenOptions &codeGenOptions) {
74 return LoweringBridge(ctx, semanticsContext, defaultKinds, intrinsics,
75 targetCharacteristics, allCooked, triple, kindMap,
76 loweringOptions, envDefaults, languageFeatures,
77 targetMachine, targetOptions, codeGenOptions);
78 }
80
81 //===--------------------------------------------------------------------===//
82 // Getters
83 //===--------------------------------------------------------------------===//
84
85 mlir::MLIRContext &getMLIRContext() { return context; }
86
88 mlir::ModuleOp getModule() { return *module; }
89 mlir::ModuleOp getModuleAndRelease() { return module.release(); }
90
91 const Fortran::common::IntrinsicTypeDefaultKinds &getDefaultKinds() const {
92 return defaultKinds;
93 }
94 const Fortran::evaluate::IntrinsicProcTable &getIntrinsicTable() const {
95 return intrinsics;
96 }
97 const Fortran::evaluate::TargetCharacteristics &
98 getTargetCharacteristics() const {
99 return targetCharacteristics;
100 }
101 const Fortran::parser::AllCookedSources *getCookedSource() const {
102 return cooked;
103 }
104
106 const fir::KindMapping &getKindMap() const { return kindMap; }
107
108 const Fortran::lower::LoweringOptions &getLoweringOptions() const {
109 return loweringOptions;
110 }
111
112 const std::vector<Fortran::lower::EnvironmentDefault> &
113 getEnvironmentDefaults() const {
114 return envDefaults;
115 }
116
117 const Fortran::common::LanguageFeatureControl &getLanguageFeatures() const {
118 return languageFeatures;
119 }
120
122 Fortran::evaluate::FoldingContext createFoldingContext();
123
124 Fortran::semantics::SemanticsContext &getSemanticsContext() const {
125 return semanticsContext;
126 }
127
128 Fortran::lower::StatementContext &fctCtx() { return functionContext; }
129
130 Fortran::lower::StatementContext &openAccCtx() { return openAccContext; }
131
132 bool validModule() { return getModule(); }
133
134 //===--------------------------------------------------------------------===//
135 // Perform the creation of an mlir::ModuleOp
136 //===--------------------------------------------------------------------===//
137
140 void parseSourceFile(llvm::SourceMgr &);
141
143 void lower(const Fortran::parser::Program &program,
144 const Fortran::semantics::SemanticsContext &semanticsContext);
145
146private:
147 explicit LoweringBridge(
148 mlir::MLIRContext &ctx,
149 Fortran::semantics::SemanticsContext &semanticsContext,
150 const Fortran::common::IntrinsicTypeDefaultKinds &defaultKinds,
151 const Fortran::evaluate::IntrinsicProcTable &intrinsics,
152 const Fortran::evaluate::TargetCharacteristics &targetCharacteristics,
153 const Fortran::parser::AllCookedSources &cooked, llvm::StringRef triple,
154 fir::KindMapping &kindMap,
155 const Fortran::lower::LoweringOptions &loweringOptions,
156 const std::vector<Fortran::lower::EnvironmentDefault> &envDefaults,
157 const Fortran::common::LanguageFeatureControl &languageFeatures,
158 const llvm::TargetMachine &targetMachine,
159 const Fortran::frontend::TargetOptions &targetOptions,
160 const Fortran::frontend::CodeGenOptions &codeGenOptions);
161 LoweringBridge() = delete;
162 LoweringBridge(const LoweringBridge &) = delete;
163
164 Fortran::semantics::SemanticsContext &semanticsContext;
165 Fortran::lower::StatementContext functionContext;
166 Fortran::lower::StatementContext openAccContext;
167 const Fortran::common::IntrinsicTypeDefaultKinds &defaultKinds;
168 const Fortran::evaluate::IntrinsicProcTable &intrinsics;
169 const Fortran::evaluate::TargetCharacteristics &targetCharacteristics;
170 const Fortran::parser::AllCookedSources *cooked;
171 mlir::MLIRContext &context;
172 mlir::OwningOpRef<mlir::ModuleOp> module;
173 fir::KindMapping &kindMap;
174 const Fortran::lower::LoweringOptions &loweringOptions;
175 const std::vector<Fortran::lower::EnvironmentDefault> &envDefaults;
176 const Fortran::common::LanguageFeatureControl &languageFeatures;
177 std::set<std::string> tempNames;
178 std::optional<mlir::DiagnosticEngine::HandlerID> diagHandlerID;
179};
180
181} // namespace lower
182} // namespace Fortran
183
184#endif // FORTRAN_LOWER_BRIDGE_H
Definition default-kinds.h:26
Definition Fortran-features.h:90
Definition CodeGenOptions.h:50
Options for controlling the target.
Definition TargetOptions.h:27
Definition Bridge.h:57
void parseSourceFile(llvm::SourceMgr &)
Definition Bridge.cpp:6761
mlir::ModuleOp getModule()
Get the ModuleOp. It can never be null, which is asserted in the ctor.
Definition Bridge.h:88
static LoweringBridge create(mlir::MLIRContext &ctx, Fortran::semantics::SemanticsContext &semanticsContext, const Fortran::common::IntrinsicTypeDefaultKinds &defaultKinds, const Fortran::evaluate::IntrinsicProcTable &intrinsics, const Fortran::evaluate::TargetCharacteristics &targetCharacteristics, const Fortran::parser::AllCookedSources &allCooked, llvm::StringRef triple, fir::KindMapping &kindMap, const Fortran::lower::LoweringOptions &loweringOptions, const std::vector< Fortran::lower::EnvironmentDefault > &envDefaults, const Fortran::common::LanguageFeatureControl &languageFeatures, const llvm::TargetMachine &targetMachine, const Fortran::frontend::TargetOptions &targetOptions, const Fortran::frontend::CodeGenOptions &codeGenOptions)
Create a lowering bridge instance.
Definition Bridge.h:61
const fir::KindMapping & getKindMap() const
Get the kind map.
Definition Bridge.h:106
Fortran::evaluate::FoldingContext createFoldingContext()
Create a folding context. Careful: this is very expensive.
Definition Bridge.cpp:6745
void lower(const Fortran::parser::Program &program, const Fortran::semantics::SemanticsContext &semanticsContext)
Cross the bridge from the Fortran parse-tree, etc. to MLIR dialects.
Definition Bridge.cpp:6750
Definition LoweringOptions.h:34
Definition provenance.h:281
Definition semantics.h:67
Definition KindMapping.h:48
Definition bit-population-count.h:20
Definition call.h:34
Definition ParserActions.h:24
Definition check-expression.h:19
Definition bit-population-count.h:20