a9327619069359593a9f237084b858e020c96de2
[scilab.git] / scilab / modules / ast / includes / analysis / data / FunctionBlock.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2014 - Scilab Enterprises - Calixte DENIZET
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #ifndef __FUNCTIONBLOCK_HXX__
14 #define __FUNCTIONBLOCK_HXX__
15
16 #include <list>
17 #include <vector>
18 #include <set>
19 #include <map>
20
21 #include "tools.hxx"
22 #include "allexp.hxx"
23 #include "Block.hxx"
24 #include "MacroDef.hxx"
25 #include "TypeLocal.hxx"
26 #include "TemporaryManager.hxx"
27 #include "TITypeSignatureTuple.hxx"
28 #include "gvn/ConstraintManager.hxx"
29 #include "LoopAnalyzer.hxx"
30
31 namespace analysis
32 {
33
34 struct MacroOut;
35
36 class FunctionBlock : public Block
37 {
38
39     std::wstring name;
40     std::vector<symbol::Symbol> in;
41     std::vector<symbol::Symbol> out;
42     tools::SymbolOrdSet globals;
43     std::vector<std::pair<symbol::Symbol, TypeLocal>> types_in;
44     std::vector<std::pair<symbol::Symbol, TypeLocal>> types_out;
45     tools::SymbolMap<std::set<TypeLocal>> locals;
46     std::vector<GVN::Value *> inValues;
47     unsigned int lhs;
48     unsigned int rhs;
49     int maxVarId;
50     GVN fgvn;
51     LoopAnalyzer loopAnalyzer;
52     ConstraintManager constraintManager;
53     TemporaryManager tempManager;
54
55 public:
56
57     FunctionBlock(const unsigned int id, Block * parent, ast::Exp * exp);
58     virtual ~FunctionBlock() { }
59
60     inline ConstraintManager & getConstraintManager()
61     {
62         return constraintManager;
63     }
64     inline const std::vector<GVN::Value *> & getInValues() const
65     {
66         return inValues;
67     }
68     inline void setName(const std::wstring & _name)
69     {
70         name = _name;
71     }
72     inline const std::wstring & getName() const
73     {
74         return name;
75     }
76     inline unsigned int getLHS() const
77     {
78         return lhs;
79     }
80     inline unsigned int getRHS() const
81     {
82         return rhs;
83     }
84
85     inline const std::vector<std::pair<symbol::Symbol, TypeLocal>> & getTypesIn() const
86     {
87         return types_in;
88     }
89
90     inline const std::vector<std::pair<symbol::Symbol, TypeLocal>> & getTypesOut() const
91     {
92         return types_out;
93     }
94
95     inline const tools::SymbolMap<std::set<TypeLocal>> & getTypesLocals() const
96     {
97         return locals;
98     }
99
100     inline int getMaxVarId() const
101     {
102         return maxVarId;
103     }
104
105     inline void setLhsRhs(const unsigned int _lhs, const unsigned int _rhs)
106     {
107         lhs = _lhs;
108         rhs = _rhs;
109     }
110
111     inline const MPolyConstraintSet & getConstraints() const
112     {
113         return constraintManager.getSet();
114     }
115
116     inline const std::set<symbol::Symbol> & getGlobalConstants() const
117     {
118         return constraintManager.getGlobalConstants();
119     }
120
121     inline const std::map<TypeLocal, std::stack<int>> & getTemp() const
122     {
123         return tempManager.getTemp();
124     }
125
126     inline const std::map<TypeLocal, int> getTempCount(int & total) const
127     {
128         int _total = 0;
129         std::map<TypeLocal, int> map;
130         for (const auto & p : getTemp())
131         {
132             _total += p.second.size();
133             map.emplace(p.first, p.second.size());
134         }
135
136         total = _total;
137
138         return map;
139     }
140
141     inline const LoopAnalyzer & getLoopAnalyzer() const
142     {
143         return loopAnalyzer;
144     }
145
146     void finalize() override;
147     void addGlobal(const symbol::Symbol & sym) override;
148     Block * getDefBlock(const symbol::Symbol & sym, tools::SymbolMap<Info>::iterator & it, const bool global) override;
149     void addLocal(const symbol::Symbol & sym, const TIType & type, const bool isAnInt) override;
150     int getTmpId(const TIType & type, const bool isAnInt) override;
151     void releaseTmp(const int id, ast::Exp * exp) override;
152
153     bool addIn(const TITypeSignatureTuple & tuple, const std::vector<GVN::Value *> & values);
154     void setGlobals(const tools::SymbolOrdSet & v);
155     //TITypeSignatureTuple getGlobals(std::vector<symbol::Symbol> & v);
156     MacroOut getOuts();
157     void setInOut(MacroDef * macrodef, const unsigned int rhs, const std::vector<TIType> & _in);
158
159     friend std::wostream & operator<<(std::wostream & out, const FunctionBlock & fblock);
160 };
161
162 } // namespace analysis
163
164 #endif // __FUNCTIONBLOCK_HXX__