Analysis: infer when a refcount is required and add colors in DebugVisitor
[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 "LocalInfo.hxx"
27 #include "ArgIOInfo.hxx"
28 #include "TemporaryManager.hxx"
29 #include "TITypeSignatureTuple.hxx"
30 #include "gvn/ConstraintManager.hxx"
31 #include "LoopAnalyzer.hxx"
32
33 namespace analysis
34 {
35
36 struct MacroOut;
37
38 class FunctionBlock : public Block
39 {
40
41     std::wstring name;
42     std::vector<symbol::Symbol> in;
43     std::vector<symbol::Symbol> out;
44     tools::SymbolOrdSet globals;
45     std::vector<ArgIOInfo> types_in;
46     std::vector<ArgIOInfo> types_out;
47     tools::SymbolMap<LocalInfo> locals;
48     std::vector<GVN::Value *> inValues;
49     unsigned int lhs;
50     unsigned int rhs;
51     int maxVarId;
52     GVN fgvn;
53     LoopAnalyzer loopAnalyzer;
54     ConstraintManager constraintManager;
55     TemporaryManager tempManager;
56
57 public:
58
59     FunctionBlock(const unsigned int id, Block * parent, ast::Exp * exp);
60     virtual ~FunctionBlock() { }
61
62     inline ConstraintManager & getConstraintManager()
63     {
64         return constraintManager;
65     }
66     inline const std::vector<GVN::Value *> & getInValues() const
67     {
68         return inValues;
69     }
70     inline void setName(const std::wstring & _name)
71     {
72         name = _name;
73     }
74     inline const std::wstring & getName() const
75     {
76         return name;
77     }
78     inline unsigned int getLHS() const
79     {
80         return lhs;
81     }
82     inline unsigned int getRHS() const
83     {
84         return rhs;
85     }
86
87     inline const std::vector<ArgIOInfo> & getTypesIn() const
88     {
89         return types_in;
90     }
91
92     inline const std::vector<ArgIOInfo> & getTypesOut() const
93     {
94         return types_out;
95     }
96
97     inline const tools::SymbolMap<LocalInfo> & getTypesLocals() const
98     {
99         return locals;
100     }
101
102     inline int getMaxVarId() const
103     {
104         return maxVarId;
105     }
106
107     inline void setLhsRhs(const unsigned int _lhs, const unsigned int _rhs)
108     {
109         lhs = _lhs;
110         rhs = _rhs;
111     }
112
113     inline const MPolyConstraintSet & getConstraints() const
114     {
115         return constraintManager.getSet();
116     }
117
118     inline const std::set<symbol::Symbol> & getGlobalConstants() const
119     {
120         return constraintManager.getGlobalConstants();
121     }
122
123     inline const std::map<TypeLocal, std::stack<int>> & getTemp() const
124     {
125         return tempManager.getTemp();
126     }
127
128     inline const std::map<TypeLocal, int> getTempCount(int & total) const
129     {
130         int _total = 0;
131         std::map<TypeLocal, int> map;
132         for (const auto & p : getTemp())
133         {
134             _total += p.second.size();
135             map.emplace(p.first, p.second.size());
136         }
137
138         total = _total;
139
140         return map;
141     }
142
143     inline const LoopAnalyzer & getLoopAnalyzer() const
144     {
145         return loopAnalyzer;
146     }
147
148     void finalize() override;
149     void addGlobal(const symbol::Symbol & sym) override;
150     Block * getDefBlock(const symbol::Symbol & sym, tools::SymbolMap<Info>::iterator & it, const bool global) override;
151     void addLocal(const symbol::Symbol & sym, const TIType & type, const bool isAnInt) override;
152     int getTmpId(const TIType & type, const bool isAnInt) override;
153     void releaseTmp(const int id, ast::Exp * exp) override;
154     void needRefCount(const tools::SymbolSet & set) override;
155
156     bool addIn(const TITypeSignatureTuple & tuple, const std::vector<GVN::Value *> & values);
157     void setGlobals(const tools::SymbolOrdSet & v);
158     //TITypeSignatureTuple getGlobals(std::vector<symbol::Symbol> & v);
159     MacroOut getOuts();
160     void setInOut(MacroDef * macrodef, const unsigned int rhs, const std::vector<TIType> & _in);
161
162     friend std::wostream & operator<<(std::wostream & out, const FunctionBlock & fblock);
163 };
164
165 } // namespace analysis
166
167 #endif // __FUNCTIONBLOCK_HXX__