Analysis: try to restore it !
[scilab.git] / scilab / modules / ast / includes / analysis / data / Block.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 __BLOCK_HXX__
14 #define __BLOCK_HXX__
15
16 #include <iostream>
17 #include <map>
18 #include <vector>
19
20 #include "allexp.hxx"
21 #include "allvar.hxx"
22 #include "Data.hxx"
23 #include "Info.hxx"
24 #include "symbol.hxx"
25 #include "TIType.hxx"
26 #include "gvn/GVN.hxx"
27 #include "dynlib_ast.h"
28
29 namespace analysis
30 {
31     class AnalysisVisitor;
32     class DataManager;
33
34     class EXTERN_AST Block
35     {
36
37         friend class DataManager;
38
39     protected:
40
41         DataManager * dm;
42         ast::Exp * exp;
43         Block * parent;
44         std::map<symbol::Symbol, Info> symMap;
45         std::vector<Block *> blocks;
46         GVN * gvn;
47         bool isReturn;
48         const unsigned int id;
49
50     public:
51
52         enum BlockKind
53         {
54             NORMAL, LOOP, EXCLUSIVE, MACRO
55         };
56
57         Block(DataManager * _dm);
58         Block(const unsigned int _id, Block * _parent, ast::Exp * _exp) : dm(_parent->dm), parent(_parent), exp(_exp), gvn(&_parent->getGVN()), isReturn(false), id(_id) { }
59
60         virtual ~Block();
61
62         inline std::map<symbol::Symbol, Info> & getMap()
63         {
64             return symMap;
65         }
66
67         inline Info & addSym(const symbol::Symbol & sym, Data * data)
68         {
69 #ifdef DEBUG_DATAMANAGER
70             if (symMap.find(sym) != symMap.end())
71             {
72                 std::wcerr << L"Table " << id << L" already contains " << sym << std::endl;
73             }
74 #endif
75             return symMap.emplace(sym, data).first->second;
76         }
77
78         inline Info & addSym(const symbol::Symbol & sym, const Info & info)
79         {
80 #ifdef DEBUG_DATAMANAGER
81             if (symMap.find(sym) != symMap.end())
82             {
83                 std::wcerr << L"Table " << id << L" already contains " << sym << std::endl;
84             }
85 #endif
86             return symMap.emplace(sym, info).first->second;
87         }
88
89         inline ast::Exp * getExp()
90         {
91             return exp;
92         }
93
94         inline void setReturn(const bool _isReturn)
95         {
96             isReturn = _isReturn;
97         }
98
99         inline bool getReturn() const
100         {
101             return isReturn;
102         }
103
104         static Info & addSym(std::map<symbol::Symbol, Info> & M, const symbol::Symbol & sym, Info & info);
105
106         Info & setDefaultData(const symbol::Symbol & sym);
107         void merge(std::map<symbol::Symbol, Info> & M, std::map<symbol::Symbol, Info> & N);
108         void pullup(std::map<symbol::Symbol, Info> & M);
109         Info & putSymsInScope(const symbol::Symbol & sym, Block * block, Info & info);
110         Info & putSymsInScope(const symbol::Symbol & sym);
111         Info & putAndClear(const symbol::Symbol & sym, ast::Exp * exp);
112
113         virtual void addLocal(const symbol::Symbol & sym, const TIType & type, const bool isIntIterator);
114         virtual int getTmpId(const TIType & type, const bool isIntIterator);
115         virtual void releaseTmp(const int id);
116         virtual Info & addRead(const symbol::Symbol & sym, ast::Exp * exp);
117         virtual Info & addWrite(const symbol::Symbol & sym, const TIType & Rtype, ast::Exp * exp);
118         virtual Info & addDefine(const symbol::Symbol & sym, const TIType & Rtype, const bool isAnInt, ast::Exp * exp);
119         virtual Info & addShare(const symbol::Symbol & Lsym, const symbol::Symbol & Rsym, const TIType & Rtype, ast::Exp * exp);
120         virtual Info & addMacroDef(ast::FunctionDec * dec);
121         virtual std::vector<TIType> addCall(AnalysisVisitor & visitor, const unsigned int lhs, const symbol::Symbol & sym, std::vector<TIType> & in, ast::CallExp * callexp);
122         virtual Info & addClear(const symbol::Symbol & sym, ast::Exp * exp);
123
124         virtual Block * getDefBlock(const symbol::Symbol & sym, std::map<symbol::Symbol, Info>::iterator & it, const bool global);
125         virtual Info & getInfo(const symbol::Symbol & sym);
126         virtual Block * addBlock(const unsigned int id, BlockKind kind, ast::Exp * exp);
127         virtual void finalize();
128         virtual bool requiresAnotherTrip();
129         virtual void addGlobal(const symbol::Symbol & sym);
130         virtual GVN & getGVN();
131
132         friend std::wostream & operator<<(std::wostream & out, const Block & block);
133     };
134
135 } // namespace analysis
136
137 #endif // __BLOCK_HXX__