License Header change: Removed the LICENSE_END before beta
[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  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 #ifndef __FUNCTIONBLOCK_HXX__
17 #define __FUNCTIONBLOCK_HXX__
18
19 #include <list>
20 #include <vector>
21 #include <set>
22 #include <map>
23
24 #include "tools.hxx"
25 #include "allexp.hxx"
26 #include "Block.hxx"
27 #include "MacroDef.hxx"
28 #include "TypeLocal.hxx"
29 #include "LocalInfo.hxx"
30 #include "ArgIOInfo.hxx"
31 #include "TemporaryManager.hxx"
32 #include "TITypeSignatureTuple.hxx"
33 #include "gvn/ConstraintManager.hxx"
34 #include "LoopAnalyzer.hxx"
35
36 namespace analysis
37 {
38
39 struct MacroOut;
40 class CompleteMacroSignature;
41
42 class FunctionBlock : public Block
43 {
44
45     uint64_t functionId;
46     std::wstring name;
47     std::vector<symbol::Symbol> in;
48     std::vector<symbol::Symbol> out;
49     tools::SymbolOrdSet globals;
50     std::vector<ArgIOInfo> types_in;
51     std::vector<ArgIOInfo> types_out;
52     tools::SymbolMap<LocalInfo> locals;
53     std::vector<GVN::Value *> inValues;
54     unsigned int lhs;
55     unsigned int rhs;
56     int maxVarId;
57     GVN fgvn;
58     LoopAnalyzer loopAnalyzer;
59     ConstraintManager constraintManager;
60     TemporaryManager tempManager;
61
62 public:
63
64     FunctionBlock(const unsigned int id, Block * parent, ast::Exp * exp);
65
66     virtual ~FunctionBlock()
67         {
68             // we got a clone
69             delete exp;
70         }
71
72     inline ConstraintManager & getConstraintManager()
73     {
74         return constraintManager;
75     }
76     inline const std::vector<GVN::Value *> & getInValues() const
77     {
78         return inValues;
79     }
80     inline void setName(const std::wstring & _name)
81     {
82         name = _name;
83     }
84     inline const std::wstring & getName() const
85     {
86         return name;
87     }
88     inline unsigned int getLHS() const
89     {
90         return lhs;
91     }
92     inline unsigned int getRHS() const
93     {
94         return rhs;
95     }
96
97     inline const std::vector<ArgIOInfo> & getTypesIn() const
98     {
99         return types_in;
100     }
101
102     inline const std::vector<ArgIOInfo> & getTypesOut() const
103     {
104         return types_out;
105     }
106
107     inline const tools::SymbolMap<LocalInfo> & getTypesLocals() const
108     {
109         return locals;
110     }
111
112     inline int getMaxVarId() const
113     {
114         return maxVarId;
115     }
116
117     inline void setLhsRhs(const unsigned int _lhs, const unsigned int _rhs)
118     {
119         lhs = _lhs;
120         rhs = _rhs;
121     }
122
123     inline void setFunctionId(const uint64_t id)
124         {
125             functionId = id;
126         }
127
128     inline uint64_t getFunctionId() const
129         {
130             return functionId;
131         }
132
133     inline const MPolyConstraintSet & getVerifiedConstraints() const
134     {
135         return constraintManager.getVerifiedConstraints();
136     }
137
138     inline const ConstraintManager::UnverifiedSet & getUnverifiedConstraints() const
139     {
140         return constraintManager.getUnverifiedConstraints();
141     }
142
143     inline const std::set<symbol::Symbol> & getGlobalConstants() const
144     {
145         return constraintManager.getGlobalConstants();
146     }
147
148     inline const std::map<TypeLocal, std::stack<int>> & getTemp() const
149     {
150         return tempManager.getTemp();
151     }
152
153     inline const std::map<TypeLocal, int> getTempCount(int & total) const
154     {
155         int _total = 0;
156         std::map<TypeLocal, int> map;
157         for (const auto & p : getTemp())
158         {
159             _total += p.second.size();
160             map.emplace(p.first, p.second.size());
161         }
162
163         total = _total;
164
165         return map;
166     }
167
168     inline const LoopAnalyzer & getLoopAnalyzer() const
169     {
170         return loopAnalyzer;
171     }
172
173     void finalize() override;
174     void addGlobal(const symbol::Symbol & sym) override;
175     Block * getDefBlock(const symbol::Symbol & sym, tools::SymbolMap<Info>::iterator & it, const bool global) override;
176     void addLocal(const symbol::Symbol & sym, const TIType & type, const bool isAnInt) override;
177     int getTmpId(const TIType & type, const bool isAnInt) override;
178     void releaseTmp(const int id, ast::Exp * exp) override;
179     void needRefCount(const tools::SymbolSet & set) override;
180
181     bool addIn(const TITypeSignatureTuple & tuple, const std::vector<GVN::Value *> & values);
182     void setGlobals(const tools::SymbolOrdSet & v);
183     //TITypeSignatureTuple getGlobals(std::vector<symbol::Symbol> & v);
184     MacroOut getOuts(CompleteMacroSignature & cms);
185     void setInOut(MacroDef * macrodef, const unsigned int rhs, const std::vector<TIType> & _in);
186
187     friend std::wostream & operator<<(std::wostream & out, const FunctionBlock & fblock);
188 };
189
190 } // namespace analysis
191
192 #endif // __FUNCTIONBLOCK_HXX__