[flang-commits] [flang] 3a84d84 - [flang] Finish adding AbstractConverter.h

Eric Schweitz via flang-commits flang-commits at lists.llvm.org
Mon Jun 22 08:18:32 PDT 2020


Author: Eric Schweitz
Date: 2020-06-22T08:18:15-07:00
New Revision: 3a84d84adcd59e62f37792b1f2c6859fb84971cd

URL: https://github.com/llvm/llvm-project/commit/3a84d84adcd59e62f37792b1f2c6859fb84971cd
DIFF: https://github.com/llvm/llvm-project/commit/3a84d84adcd59e62f37792b1f2c6859fb84971cd.diff

LOG: [flang] Finish adding AbstractConverter.h

This adds the abstract converter interface. The abstract converter is an
interface that supports the conversion of front-end data structures to
MLIR. This interface will be instantiated by the bridge in a future
commit.

Differential revision: https://reviews.llvm.org/D82268

Added: 
    

Modified: 
    flang/include/flang/Lower/AbstractConverter.h

Removed: 
    


################################################################################
diff  --git a/flang/include/flang/Lower/AbstractConverter.h b/flang/include/flang/Lower/AbstractConverter.h
index 0716b841fa1e..5121c22ed352 100644
--- a/flang/include/flang/Lower/AbstractConverter.h
+++ b/flang/include/flang/Lower/AbstractConverter.h
@@ -9,11 +9,127 @@
 #ifndef FORTRAN_LOWER_ABSTRACTCONVERTER_H
 #define FORTRAN_LOWER_ABSTRACTCONVERTER_H
 
-namespace Fortran::lower {
+#include "flang/Common/Fortran.h"
+#include "mlir/IR/Module.h"
 
-// temporary stub
-class AbstractConverter;
+namespace Fortran {
+namespace common {
+template <typename>
+class Reference;
+}
+namespace evaluate {
+struct DataRef;
+template <typename>
+class Expr;
+class FoldingContext;
+struct SomeType;
+} // namespace evaluate
 
-} // namespace Fortran::lower
+namespace parser {
+class CharBlock;
+}
+namespace semantics {
+class Symbol;
+}
+
+namespace lower {
+namespace pft {
+struct Variable;
+}
+
+using SomeExpr = Fortran::evaluate::Expr<Fortran::evaluate::SomeType>;
+using SymbolRef = Fortran::common::Reference<const Fortran::semantics::Symbol>;
+class FirOpBuilder;
+
+//===----------------------------------------------------------------------===//
+// AbstractConverter interface
+//===----------------------------------------------------------------------===//
+
+/// The abstract interface for converter implementations to lower Fortran
+/// front-end fragments such as expressions, types, etc. to the FIR dialect of
+/// MLIR.
+class AbstractConverter {
+public:
+  //===--------------------------------------------------------------------===//
+  // Symbols     
+  //===--------------------------------------------------------------------===//
+
+  /// Get the mlir instance of a symbol.
+  virtual mlir::Value getSymbolAddress(SymbolRef sym) = 0;
+
+  //===--------------------------------------------------------------------===//
+  // Expressions
+  //===--------------------------------------------------------------------===//
+
+  /// Generate the address of the location holding the expression, someExpr
+  virtual mlir::Value genExprAddr(const SomeExpr &,
+                                  mlir::Location *loc = nullptr) = 0;
+  /// Generate the address of the location holding the expression, someExpr
+  mlir::Value genExprAddr(const SomeExpr *someExpr, mlir::Location loc) {
+    return genExprAddr(*someExpr, &loc);
+  }
+
+  /// Generate the computations of the expression to produce a value
+  virtual mlir::Value genExprValue(const SomeExpr &,
+                                   mlir::Location *loc = nullptr) = 0;
+  /// Generate the computations of the expression, someExpr, to produce a value
+  mlir::Value genExprValue(const SomeExpr *someExpr, mlir::Location loc) {
+    return genExprValue(*someExpr, &loc);
+  }
+
+  /// Get FoldingContext that is required for some expression
+  /// analysis.
+  virtual Fortran::evaluate::FoldingContext &getFoldingContext() = 0;
+
+  //===--------------------------------------------------------------------===//
+  // Types
+  //===--------------------------------------------------------------------===//
+
+  /// Generate the type of a DataRef
+  virtual mlir::Type genType(const Fortran::evaluate::DataRef &) = 0;
+  /// Generate the type of an Expr
+  virtual mlir::Type genType(const SomeExpr &) = 0;
+  /// Generate the type of a Symbol
+  virtual mlir::Type genType(SymbolRef) = 0;
+  /// Generate the type from a category
+  virtual mlir::Type genType(Fortran::common::TypeCategory tc) = 0;
+  /// Generate the type from a category and kind
+  virtual mlir::Type genType(Fortran::common::TypeCategory tc, int kind) = 0;
+  /// Generate the type from a Variable
+  virtual mlir::Type genType(const pft::Variable &) = 0;
+
+  //===--------------------------------------------------------------------===//
+  // Locations
+  //===--------------------------------------------------------------------===//
+
+  /// Get the converter's current location
+  virtual mlir::Location getCurrentLocation() = 0;
+  /// Generate a dummy location
+  virtual mlir::Location genLocation() = 0;
+  /// Generate the location as converted from a CharBlock
+  virtual mlir::Location genLocation(const Fortran::parser::CharBlock &) = 0;
+
+  //===--------------------------------------------------------------------===//
+  // FIR/MLIR
+  //===--------------------------------------------------------------------===//
+
+  /// Get the OpBuilder
+  virtual Fortran::lower::FirOpBuilder &getFirOpBuilder() = 0;
+  /// Get the ModuleOp
+  virtual mlir::ModuleOp &getModuleOp() = 0;
+  /// Get the MLIRContext
+  virtual mlir::MLIRContext &getMLIRContext() = 0;
+  /// Unique a symbol
+  virtual std::string mangleName(const Fortran::semantics::Symbol &) = 0;
+  /// Unique a compiler generated identifier. A short prefix should be provided
+  /// to hint at the origin of the identifier.
+  virtual std::string uniqueCGIdent(llvm::StringRef prefix,
+                                    llvm::StringRef name) = 0;
+
+  virtual ~AbstractConverter() = default;
+};
+
+} // namespace lower
+} // namespace Fortran
 
 #endif // FORTRAN_LOWER_ABSTRACTCONVERTER_H


        


More information about the flang-commits mailing list