FLANG
ConvertVariable.h
1//===- Lower/ConvertVariable.h -- lowering of variables to FIR --*- 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//===----------------------------------------------------------------------===//
15//===----------------------------------------------------------------------===//
16
17#ifndef FORTRAN_LOWER_CONVERT_VARIABLE_H
18#define FORTRAN_LOWER_CONVERT_VARIABLE_H
19
20#include "flang/Lower/Support/Utils.h"
21#include "flang/Lower/SymbolMap.h"
22#include "flang/Optimizer/Builder/FIRBuilder.h"
23#include "flang/Optimizer/Dialect/FIRAttr.h"
24#include "flang/Semantics/symbol.h"
25#include "mlir/IR/Value.h"
26#include "llvm/ADT/DenseMap.h"
27
28namespace cuf {
29class DataAttributeAttr;
30}
31
32namespace Fortran {
33namespace semantics {
34class Scope;
35} // namespace semantics
36
37namespace lower {
39class CallerInterface;
41class SymMap;
42namespace pft {
43struct Variable;
44}
45
50 std::tuple<const Fortran::semantics::Scope *, std::size_t>;
51using AggregateStoreMap = llvm::DenseMap<AggregateStoreKey, mlir::Value>;
52
58 SymMap &symMap, AggregateStoreMap &storeMap);
59
62
67
72
78
84 const std::vector<std::pair<semantics::SymbolRef, std::size_t>>
85 &commonBlocks);
86
93mlir::Value genCommonBlockMember(AbstractConverter &converter,
94 mlir::Location loc,
96 mlir::Value commonValue,
97 std::size_t commonSize);
98
104 StatementContext &, mlir::Value preAlloc = {});
105void mapSymbolAttributes(AbstractConverter &, const semantics::SymbolRef &,
106 SymMap &, StatementContext &,
107 mlir::Value preAlloc = {});
108
113 AbstractConverter &, const Fortran::lower::CallerInterface &caller,
114 SymMap &symMap);
115
120 AbstractConverter &, const Fortran::lower::CallerInterface &caller,
121 SymMap &symMap, const Fortran::semantics::Symbol &dummySymbol);
122
123// TODO: consider saving the initial expression symbol dependence analysis in
124// in the PFT variable and dealing with the dependent symbols instantiation in
125// the fir::GlobalOp body at the fir::GlobalOp creation point rather than by
126// having genExtAddrInInitializer and genInitialDataTarget custom entry points
127// here to deal with this while lowering the initial expression value.
128
132 mlir::Location, mlir::Type boxType,
133 const SomeExpr &initialTarget,
134 bool couldBeInEquivalence = false);
135
137fir::GlobalOp defineGlobal(Fortran::lower::AbstractConverter &converter,
139 llvm::StringRef globalName, mlir::StringAttr linkage,
140 cuf::DataAttributeAttr dataAttr = {});
141
143fir::ExtendedValue
144genExtAddrInInitializer(Fortran::lower::AbstractConverter &converter,
145 mlir::Location loc, const SomeExpr &addr);
146
148void createIntrinsicModuleGlobal(Fortran::lower::AbstractConverter &converter,
149 const pft::Variable &);
150
153void createRuntimeTypeInfoGlobal(Fortran::lower::AbstractConverter &converter,
154 const Fortran::semantics::Symbol &typeInfoSym);
155
158fir::FortranVariableFlagsAttr
159translateSymbolAttributes(mlir::MLIRContext *mlirContext,
160 const Fortran::semantics::Symbol &sym,
161 fir::FortranVariableFlagsEnum extraFlags =
162 fir::FortranVariableFlagsEnum::None);
163
167void genDeclareSymbol(Fortran::lower::AbstractConverter &converter,
168 Fortran::lower::SymMap &symMap,
169 const Fortran::semantics::Symbol &sym,
170 const fir::ExtendedValue &exv,
171 fir::FortranVariableFlagsEnum extraFlags =
172 fir::FortranVariableFlagsEnum::None,
173 bool force = false);
174
177mlir::Type getCrayPointeeBoxType(mlir::Type);
178
183fir::ExtendedValue genPackArray(Fortran::lower::AbstractConverter &converter,
184 const Fortran::semantics::Symbol &sym,
185 fir::ExtendedValue exv);
186
191void genUnpackArray(Fortran::lower::AbstractConverter &converter,
192 mlir::Location loc, fir::FortranVariableOpInterface def,
193 const Fortran::semantics::Symbol &sym);
194
195} // namespace lower
196} // namespace Fortran
197#endif // FORTRAN_LOWER_CONVERT_VARIABLE_H
Definition AbstractConverter.h:87
Definition CallInterface.h:282
Definition StatementContext.h:46
Definition SymbolMap.h:182
Definition symbol.h:809
Definition ParserActions.h:24
bool hasDefaultInitialization(const Fortran::semantics::Symbol &sym)
Does this variable have a default initialization?
Definition ConvertVariable.cpp:78
void mapSymbolAttributes(AbstractConverter &, const pft::Variable &, SymMap &, StatementContext &, mlir::Value preAlloc={})
Definition ConvertVariable.cpp:2093
std::tuple< const Fortran::semantics::Scope *, std::size_t > AggregateStoreKey
Definition ConvertVariable.h:49
fir::FortranVariableFlagsAttr translateSymbolAttributes(mlir::MLIRContext *mlirContext, const Fortran::semantics::Symbol &sym, fir::FortranVariableFlagsEnum extraFlags=fir::FortranVariableFlagsEnum::None)
Definition ConvertVariable.cpp:1802
void instantiateVariable(AbstractConverter &, const pft::Variable &var, SymMap &symMap, AggregateStoreMap &storeMap)
Definition ConvertVariable.cpp:2555
void createRuntimeTypeInfoGlobal(Fortran::lower::AbstractConverter &converter, const Fortran::semantics::Symbol &typeInfoSym)
Definition ConvertVariable.cpp:2658
fir::GlobalOp defineGlobal(Fortran::lower::AbstractConverter &converter, const Fortran::lower::pft::Variable &var, llvm::StringRef globalName, mlir::StringAttr linkage, cuf::DataAttributeAttr dataAttr={})
Create the global op and its init if it has one.
Definition ConvertVariable.cpp:496
void mapCallInterfaceSymbolsForResult(AbstractConverter &, const Fortran::lower::CallerInterface &caller, SymMap &symMap)
Definition ConvertVariable.cpp:2631
void createIntrinsicModuleGlobal(Fortran::lower::AbstractConverter &converter, const pft::Variable &)
Create a global variable for an intrinsic module object.
Definition ConvertVariable.cpp:2652
mlir::Value genInitialDataTarget(Fortran::lower::AbstractConverter &, mlir::Location, mlir::Type boxType, const SomeExpr &initialTarget, bool couldBeInEquivalence=false)
create initial-data-target fir.box in a global initializer region.
Definition ConvertVariable.cpp:229
void genUnpackArray(Fortran::lower::AbstractConverter &converter, mlir::Location loc, fir::FortranVariableOpInterface def, const Fortran::semantics::Symbol &sym)
Definition ConvertVariable.cpp:2733
void initializeCloneAtRuntime(Fortran::lower::AbstractConverter &converter, const Fortran::semantics::Symbol &sym, Fortran::lower::SymMap &symMap)
Call clone initialization runtime routine to initialize sym's value.
Definition ConvertVariable.cpp:900
void defineCommonBlocks(AbstractConverter &, const std::vector< std::pair< semantics::SymbolRef, std::size_t > > &commonBlocks)
void defineModuleVariable(AbstractConverter &, const pft::Variable &var)
Definition ConvertVariable.cpp:2522
fir::ExtendedValue genExtAddrInInitializer(Fortran::lower::AbstractConverter &converter, mlir::Location loc, const SomeExpr &addr)
Generate address addr inside an initializer.
Definition ConvertVariable.cpp:203
mlir::Type getCrayPointeeBoxType(mlir::Type)
Definition ConvertVariable.cpp:2667
void defaultInitializeAtRuntime(Fortran::lower::AbstractConverter &converter, const Fortran::semantics::Symbol &sym, Fortran::lower::SymMap &symMap)
Call default initialization runtime routine to initialize var.
Definition ConvertVariable.cpp:816
fir::ExtendedValue genPackArray(Fortran::lower::AbstractConverter &converter, const Fortran::semantics::Symbol &sym, fir::ExtendedValue exv)
Definition ConvertVariable.cpp:2679
mlir::Value genCommonBlockMember(AbstractConverter &converter, mlir::Location loc, const Fortran::semantics::Symbol &sym, mlir::Value commonValue, std::size_t commonSize)
Definition ConvertVariable.cpp:1598
void mapCallInterfaceSymbolsForDummyArgument(AbstractConverter &, const Fortran::lower::CallerInterface &caller, SymMap &symMap, const Fortran::semantics::Symbol &dummySymbol)
Definition ConvertVariable.cpp:2638
void genDeclareSymbol(Fortran::lower::AbstractConverter &converter, Fortran::lower::SymMap &symMap, const Fortran::semantics::Symbol &sym, const fir::ExtendedValue &exv, fir::FortranVariableFlagsEnum extraFlags=fir::FortranVariableFlagsEnum::None, bool force=false)
Definition ConvertVariable.cpp:1990
Definition bit-population-count.h:20
Definition ConvertVariable.h:28
Definition PFTBuilder.h:410