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