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/Optimizer/Dialect/FIRAttr.h"
22#include "flang/Semantics/symbol.h"
23#include "mlir/IR/Value.h"
24#include "llvm/ADT/DenseMap.h"
25
26namespace cuf {
27class DataAttributeAttr;
28}
29
30namespace fir {
31class ExtendedValue;
32class FirOpBuilder;
33class GlobalOp;
34class FortranVariableFlagsAttr;
35} // namespace fir
36
37namespace Fortran {
38namespace semantics {
39class Scope;
40} // namespace semantics
41
42namespace lower {
43class AbstractConverter;
44class CallerInterface;
45class StatementContext;
46class SymMap;
47namespace pft {
48struct Variable;
49}
50
55 std::tuple<const Fortran::semantics::Scope *, std::size_t>;
56using AggregateStoreMap = llvm::DenseMap<AggregateStoreKey, mlir::Value>;
57
63 SymMap &symMap, AggregateStoreMap &storeMap);
64
67
72
77
83
89 const std::vector<std::pair<semantics::SymbolRef, std::size_t>>
90 &commonBlocks);
91
95mlir::Value genCommonBlockMember(AbstractConverter &converter,
96 mlir::Location loc,
98 mlir::Value commonValue);
99
105 StatementContext &, mlir::Value preAlloc = {});
106void mapSymbolAttributes(AbstractConverter &, const semantics::SymbolRef &,
107 SymMap &, StatementContext &,
108 mlir::Value preAlloc = {});
109
114 AbstractConverter &, const Fortran::lower::CallerInterface &caller,
115 SymMap &symMap);
116
121 AbstractConverter &, const Fortran::lower::CallerInterface &caller,
122 SymMap &symMap, const Fortran::semantics::Symbol &dummySymbol);
123
124// TODO: consider saving the initial expression symbol dependence analysis in
125// in the PFT variable and dealing with the dependent symbols instantiation in
126// the fir::GlobalOp body at the fir::GlobalOp creation point rather than by
127// having genExtAddrInInitializer and genInitialDataTarget custom entry points
128// here to deal with this while lowering the initial expression value.
129
133 mlir::Location, mlir::Type boxType,
134 const SomeExpr &initialTarget,
135 bool couldBeInEquivalence = false);
136
139 fir::FirOpBuilder &builder, fir::GlobalOp global,
140 std::function<void(fir::FirOpBuilder &)> genInit);
141
145 mlir::Location loc, const SomeExpr &addr);
146
149 const pft::Variable &);
150
154 const Fortran::semantics::Symbol &typeInfoSym);
155
158fir::FortranVariableFlagsAttr
159translateSymbolAttributes(mlir::MLIRContext *mlirContext,
161 fir::FortranVariableFlagsEnum extraFlags =
162 fir::FortranVariableFlagsEnum::None);
163
166cuf::DataAttributeAttr
167translateSymbolCUFDataAttribute(mlir::MLIRContext *mlirContext,
168 const Fortran::semantics::Symbol &sym);
169
176 const fir::ExtendedValue &exv,
177 fir::FortranVariableFlagsEnum extraFlags =
178 fir::FortranVariableFlagsEnum::None,
179 bool force = false);
180
183mlir::Type getCrayPointeeBoxType(mlir::Type);
184
185} // namespace lower
186} // namespace Fortran
187#endif // FORTRAN_LOWER_CONVERT_VARIABLE_H
Definition: AbstractConverter.h:82
Definition: CallInterface.h:282
Definition: StatementContext.h:46
Definition: SymbolMap.h:146
Definition: symbol.h:712
Definition: BoxValue.h:478
Definition: FIRBuilder.h:55
mlir::Value genCommonBlockMember(AbstractConverter &converter, mlir::Location loc, const Fortran::semantics::Symbol &sym, mlir::Value commonValue)
Definition: ConvertVariable.cpp:1429
void createGlobalInitialization(fir::FirOpBuilder &builder, fir::GlobalOp global, std::function< void(fir::FirOpBuilder &)> genInit)
Call genInit to generate code inside global initializer region.
Definition: ConvertVariable.cpp:469
bool hasDefaultInitialization(const Fortran::semantics::Symbol &sym)
Does this variable have a default initialization?
Definition: ConvertVariable.cpp:76
void mapSymbolAttributes(AbstractConverter &, const pft::Variable &, SymMap &, StatementContext &, mlir::Value preAlloc={})
Definition: ConvertVariable.cpp:1936
fir::FortranVariableFlagsAttr translateSymbolAttributes(mlir::MLIRContext *mlirContext, const Fortran::semantics::Symbol &sym, fir::FortranVariableFlagsEnum extraFlags=fir::FortranVariableFlagsEnum::None)
Definition: ConvertVariable.cpp:1639
void instantiateVariable(AbstractConverter &, const pft::Variable &var, SymMap &symMap, AggregateStoreMap &storeMap)
Definition: ConvertVariable.cpp:2389
void createRuntimeTypeInfoGlobal(Fortran::lower::AbstractConverter &converter, const Fortran::semantics::Symbol &typeInfoSym)
Definition: ConvertVariable.cpp:2492
void mapCallInterfaceSymbolsForResult(AbstractConverter &, const Fortran::lower::CallerInterface &caller, SymMap &symMap)
Definition: ConvertVariable.cpp:2465
void createIntrinsicModuleGlobal(Fortran::lower::AbstractConverter &converter, const pft::Variable &)
Create a global variable for an intrinsic module object.
Definition: ConvertVariable.cpp:2486
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:228
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:802
void defineCommonBlocks(AbstractConverter &, const std::vector< std::pair< semantics::SymbolRef, std::size_t > > &commonBlocks)
std::tuple< const Fortran::semantics::Scope *, std::size_t > AggregateStoreKey
Definition: ConvertVariable.h:55
void defineModuleVariable(AbstractConverter &, const pft::Variable &var)
Definition: ConvertVariable.cpp:2355
fir::ExtendedValue genExtAddrInInitializer(Fortran::lower::AbstractConverter &converter, mlir::Location loc, const SomeExpr &addr)
Generate address addr inside an initializer.
Definition: ConvertVariable.cpp:202
mlir::Type getCrayPointeeBoxType(mlir::Type)
Definition: ConvertVariable.cpp:2502
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:777
cuf::DataAttributeAttr translateSymbolCUFDataAttribute(mlir::MLIRContext *mlirContext, const Fortran::semantics::Symbol &sym)
Definition: ConvertVariable.cpp:1680
void mapCallInterfaceSymbolsForDummyArgument(AbstractConverter &, const Fortran::lower::CallerInterface &caller, SymMap &symMap, const Fortran::semantics::Symbol &dummySymbol)
Definition: ConvertVariable.cpp:2472
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:1824
Definition: bit-population-count.h:20
Definition: ConvertVariable.h:26
Definition: AbstractConverter.h:31
Definition: PFTBuilder.h:400