Analysis: add info to delete useless data
[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 <vector>
18
19 #include "allexp.hxx"
20 #include "allvar.hxx"
21 #include "Data.hxx"
22 #include "Info.hxx"
23 #include "symbol.hxx"
24 #include "TIType.hxx"
25 #include "gvn/GVN.hxx"
26 #include "tools.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     tools::SymbolMap<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 tools::SymbolMap<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(tools::SymbolMap<Info> & M, const symbol::Symbol & sym, Info & info);
105
106     Info & setDefaultData(const symbol::Symbol & sym);
107     void merge(tools::SymbolMap<Info> & M, tools::SymbolMap<Info> & N);
108     void pullup(tools::SymbolMap<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     void clone(Info & info, const symbol::Symbol & sym, ast::Exp * exp);
113
114     virtual void addLocal(const symbol::Symbol & sym, const TIType & type, const bool isIntIterator);
115     virtual int getTmpId(const TIType & type, const bool isIntIterator);
116     virtual void releaseTmp(const int id, ast::Exp * exp);
117     virtual Info & addRead(const symbol::Symbol & sym, ast::Exp * exp);
118     virtual Info & addWrite(const symbol::Symbol & sym, const TIType & Rtype, ast::Exp * exp);
119     virtual Info & addDefine(const symbol::Symbol & sym, const TIType & Rtype, const bool isAnInt, ast::Exp * exp);
120     virtual Info & addShare(const symbol::Symbol & Lsym, const symbol::Symbol & Rsym, const TIType & Rtype, ast::Exp * exp);
121     virtual Info & addMacroDef(ast::FunctionDec * dec);
122     virtual std::vector<TIType> addCall(AnalysisVisitor & visitor, const unsigned int lhs, const symbol::Symbol & sym, std::vector<TIType> & in, ast::CallExp * callexp);
123     virtual Info & addClear(const symbol::Symbol & sym, ast::Exp * exp);
124
125     virtual Block * getDefBlock(const symbol::Symbol & sym, tools::SymbolMap<Info>::iterator & it, const bool global);
126     virtual Info & getInfo(const symbol::Symbol & sym);
127     virtual Block * addBlock(const unsigned int id, BlockKind kind, ast::Exp * exp);
128     virtual void finalize();
129     virtual bool requiresAnotherTrip();
130     virtual void addGlobal(const symbol::Symbol & sym);
131     virtual GVN & getGVN();
132     virtual void clone(const symbol::Symbol & sym, ast::Exp * exp);
133
134     friend std::wostream & operator<<(std::wostream & out, const Block & block);
135 };
136
137 } // namespace analysis
138
139 #endif // __BLOCK_HXX__