xref: /llvm-project/flang/lib/Semantics/data-to-inits.h (revision 28a686a704fab6631d18160e5f8ee2e07620ebe1)
1 //===-- lib/Semantics/data-to-inits.h -------------------------------------===//
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_SEMANTICS_DATA_TO_INITS_H_
10 #define FORTRAN_SEMANTICS_DATA_TO_INITS_H_
11 
12 #include "flang/Common/default-kinds.h"
13 #include "flang/Common/interval.h"
14 #include "flang/Evaluate/fold-designator.h"
15 #include "flang/Evaluate/initial-image.h"
16 #include <list>
17 #include <map>
18 
19 namespace Fortran::parser {
20 struct DataStmtSet;
21 struct DataStmtValue;
22 } // namespace Fortran::parser
23 namespace Fortran::evaluate {
24 class ExpressionAnalyzer;
25 }
26 namespace Fortran::semantics {
27 
28 class Symbol;
29 
30 struct SymbolDataInitialization {
31   using Range = common::Interval<common::ConstantSubscript>;
SymbolDataInitializationSymbolDataInitialization32   explicit SymbolDataInitialization(std::size_t bytes) : image{bytes} {}
33   SymbolDataInitialization(SymbolDataInitialization &&) = default;
34 
NoteInitializedRangeSymbolDataInitialization35   void NoteInitializedRange(Range range) {
36     if (initializedRanges.empty() ||
37         !initializedRanges.back().AnnexIfPredecessor(range)) {
38       initializedRanges.emplace_back(range);
39     }
40   }
NoteInitializedRangeSymbolDataInitialization41   void NoteInitializedRange(
42       common::ConstantSubscript offset, std::size_t size) {
43     NoteInitializedRange(Range{offset, size});
44   }
NoteInitializedRangeSymbolDataInitialization45   void NoteInitializedRange(evaluate::OffsetSymbol offsetSymbol) {
46     NoteInitializedRange(offsetSymbol.offset(), offsetSymbol.size());
47   }
48 
49   evaluate::InitialImage image;
50   std::list<Range> initializedRanges;
51 };
52 
53 using DataInitializations = std::map<const Symbol *, SymbolDataInitialization>;
54 
55 // Matches DATA statement variables with their values and checks
56 // compatibility.
57 void AccumulateDataInitializations(DataInitializations &,
58     evaluate::ExpressionAnalyzer &, const parser::DataStmtSet &);
59 
60 // For legacy DATA-style initialization extension: integer n(2)/1,2/
61 void AccumulateDataInitializations(DataInitializations &,
62     evaluate::ExpressionAnalyzer &, const Symbol &,
63     const std::list<common::Indirection<parser::DataStmtValue>> &);
64 
65 void ConvertToInitializers(
66     DataInitializations &, evaluate::ExpressionAnalyzer &);
67 
68 } // namespace Fortran::semantics
69 #endif // FORTRAN_SEMANTICS_DATA_TO_INITS_H_
70