Warning: This file is not a C or C++ file. It does not have highlighting.

1//===-- Lower/HostAssociations.h --------------------------------*- 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#ifndef FORTRAN_LOWER_HOSTASSOCIATIONS_H
10#define FORTRAN_LOWER_HOSTASSOCIATIONS_H
11
12#include "mlir/IR/Location.h"
13#include "mlir/IR/Types.h"
14#include "mlir/IR/Value.h"
15#include "llvm/ADT/SetVector.h"
16
17namespace Fortran {
18namespace semantics {
19class Symbol;
20class Scope;
21} // namespace semantics
22
23namespace lower {
24class AbstractConverter;
25class SymMap;
26
27/// Internal procedures in Fortran may access variables declared in the host
28/// procedure directly. We bundle these variables together in a tuple and pass
29/// them as an extra argument.
30class HostAssociations {
31public:
32 /// Returns true iff there are no host associations.
33 bool empty() const { return tupleSymbols.empty() && globalSymbols.empty(); }
34
35 /// Returns true iff there are host associations that are conveyed through
36 /// an extra tuple argument.
37 bool hasTupleAssociations() const { return !tupleSymbols.empty(); }
38
39 /// Adds a set of Symbols that will be the host associated bindings for this
40 /// host procedure.
41 void addSymbolsToBind(
42 const llvm::SetVector<const Fortran::semantics::Symbol *> &symbols,
43 const Fortran::semantics::Scope &hostScope);
44
45 /// Code gen the FIR for the local bindings for the host associated symbols
46 /// for the host (parent) procedure using `builder`.
47 void hostProcedureBindings(AbstractConverter &converter, SymMap &symMap);
48
49 /// Code gen the FIR for the local bindings for the host associated symbols
50 /// for an internal (child) procedure using `builder`.
51 void internalProcedureBindings(AbstractConverter &converter, SymMap &symMap);
52
53 /// Return the type of the extra argument to add to each internal procedure.
54 mlir::Type getArgumentType(AbstractConverter &convert);
55
56 /// Is \p symbol host associated ?
57 bool isAssociated(const Fortran::semantics::Symbol &symbol) const {
58 return tupleSymbols.contains(&symbol) || globalSymbols.contains(&symbol);
59 }
60
61private:
62 /// Canonical vector of host associated local symbols.
63 llvm::SetVector<const Fortran::semantics::Symbol *> tupleSymbols;
64
65 /// Canonical vector of host associated global symbols.
66 llvm::SetVector<const Fortran::semantics::Symbol *> globalSymbols;
67
68 /// The type of the extra argument to be added to each internal procedure.
69 mlir::Type argType;
70
71 /// Scope of the parent procedure if addSymbolsToBind was called.
72 const Fortran::semantics::Scope *hostScope;
73};
74} // namespace lower
75} // namespace Fortran
76
77#endif // FORTRAN_LOWER_HOSTASSOCIATIONS_H
78

Warning: This file is not a C or C++ file. It does not have highlighting.

source code of flang/include/flang/Lower/HostAssociations.h