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/Common/Fortran.h"
17 #include "flang/Lower/AbstractConverter.h"
18 #include "flang/Optimizer/Builder/FIRBuilder.h"
19 #include "flang/Optimizer/Support/KindMapping.h"
20 #include "mlir/IR/BuiltinOps.h"
21 
22 namespace Fortran {
23 namespace common {
24 class IntrinsicTypeDefaultKinds;
25 } // namespace common
26 namespace evaluate {
27 class IntrinsicProcTable;
28 class TargetCharacteristics;
29 } // namespace evaluate
30 namespace parser {
31 class AllCookedSources;
32 struct Program;
33 } // namespace parser
34 namespace semantics {
35 class SemanticsContext;
36 } // namespace semantics
37 
38 namespace lower {
39 
40 //===----------------------------------------------------------------------===//
41 // Lowering bridge
42 //===----------------------------------------------------------------------===//
43 
44 /// The lowering bridge converts the front-end parse trees and semantics
45 /// checking residual to MLIR (FIR dialect) code.
46 class LoweringBridge {
47 public:
48   /// Create a lowering bridge instance.
49   static LoweringBridge
create(mlir::MLIRContext & ctx,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)50   create(mlir::MLIRContext &ctx,
51          const Fortran::common::IntrinsicTypeDefaultKinds &defaultKinds,
52          const Fortran::evaluate::IntrinsicProcTable &intrinsics,
53          const Fortran::evaluate::TargetCharacteristics &targetCharacteristics,
54          const Fortran::parser::AllCookedSources &allCooked,
55          llvm::StringRef triple, fir::KindMapping &kindMap) {
56     return LoweringBridge(ctx, defaultKinds, intrinsics, targetCharacteristics,
57                           allCooked, triple, kindMap);
58   }
59 
60   //===--------------------------------------------------------------------===//
61   // Getters
62   //===--------------------------------------------------------------------===//
63 
getMLIRContext()64   mlir::MLIRContext &getMLIRContext() { return context; }
65 
66   /// Get the ModuleOp. It can never be null, which is asserted in the ctor.
getModule()67   mlir::ModuleOp &getModule() { return *module.get(); }
68 
getDefaultKinds()69   const Fortran::common::IntrinsicTypeDefaultKinds &getDefaultKinds() const {
70     return defaultKinds;
71   }
getIntrinsicTable()72   const Fortran::evaluate::IntrinsicProcTable &getIntrinsicTable() const {
73     return intrinsics;
74   }
75   const Fortran::evaluate::TargetCharacteristics &
getTargetCharacteristics()76   getTargetCharacteristics() const {
77     return targetCharacteristics;
78   }
getCookedSource()79   const Fortran::parser::AllCookedSources *getCookedSource() const {
80     return cooked;
81   }
82 
83   /// Get the kind map.
getKindMap()84   const fir::KindMapping &getKindMap() const { return kindMap; }
85 
86   /// Create a folding context. Careful: this is very expensive.
87   Fortran::evaluate::FoldingContext createFoldingContext() const;
88 
validModule()89   bool validModule() { return getModule(); }
90 
91   //===--------------------------------------------------------------------===//
92   // Perform the creation of an mlir::ModuleOp
93   //===--------------------------------------------------------------------===//
94 
95   /// Read in an MLIR input file rather than lowering Fortran sources.
96   /// This is intended to be used for testing.
97   void parseSourceFile(llvm::SourceMgr &);
98 
99   /// Cross the bridge from the Fortran parse-tree, etc. to MLIR dialects
100   void lower(const Fortran::parser::Program &program,
101              const Fortran::semantics::SemanticsContext &semanticsContext);
102 
103 private:
104   explicit LoweringBridge(
105       mlir::MLIRContext &ctx,
106       const Fortran::common::IntrinsicTypeDefaultKinds &defaultKinds,
107       const Fortran::evaluate::IntrinsicProcTable &intrinsics,
108       const Fortran::evaluate::TargetCharacteristics &targetCharacteristics,
109       const Fortran::parser::AllCookedSources &cooked, llvm::StringRef triple,
110       fir::KindMapping &kindMap);
111   LoweringBridge() = delete;
112   LoweringBridge(const LoweringBridge &) = delete;
113 
114   const Fortran::common::IntrinsicTypeDefaultKinds &defaultKinds;
115   const Fortran::evaluate::IntrinsicProcTable &intrinsics;
116   const Fortran::evaluate::TargetCharacteristics &targetCharacteristics;
117   const Fortran::parser::AllCookedSources *cooked;
118   mlir::MLIRContext &context;
119   std::unique_ptr<mlir::ModuleOp> module;
120   fir::KindMapping &kindMap;
121 };
122 
123 } // namespace lower
124 } // namespace Fortran
125 
126 #endif // FORTRAN_LOWER_BRIDGE_H
127