Analysis: enable symbolic analysis of the matrice dimensions
[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     const unsigned int id;
48
49 public:
50
51     enum BlockKind
52     {
53         NORMAL, LOOP, EXCLUSIVE, MACRO
54     };
55
56     Block(DataManager * _dm);
57     Block(const unsigned int _id, Block * _parent, ast::Exp * _exp) : dm(_parent->dm), parent(_parent), exp(_exp), gvn(&_parent->getGVN()), id(_id) { }
58
59     virtual ~Block();
60
61     inline std::map<symbol::Symbol, Info> & getMap()
62     {
63         return symMap;
64     }
65
66     inline Info & addSym(const symbol::Symbol & sym, Data * data)
67     {
68 #ifdef DEBUG_DATAMANAGER
69         if (symMap.find(sym) != symMap.end())
70         {
71             std::wcerr << L"Table " << id << L" already contains " << sym << std::endl;
72         }
73 #endif
74         return symMap.emplace(sym, data).first->second;
75     }
76
77     inline Info & addSym(const symbol::Symbol & sym, const Info & info)
78     {
79 #ifdef DEBUG_DATAMANAGER
80         if (symMap.find(sym) != symMap.end())
81         {
82             std::wcerr << L"Table " << id << L" already contains " << sym << std::endl;
83         }
84 #endif
85         return symMap.emplace(sym, info).first->second;
86     }
87
88     inline static Info & addSym(std::map<symbol::Symbol, Info> & M, const symbol::Symbol & sym, Info & info)
89     {
90         Data * old = info.data;
91         info.data = nullptr;
92         Info & i = M.emplace(sym, info).first->second;
93         i.data = old;
94         info.data = old;
95
96         return i;
97     }
98
99     inline ast::Exp * getExp()
100     {
101         return exp;
102     }
103
104     Info & setDefaultData(const symbol::Symbol & sym);
105     void merge(std::map<symbol::Symbol, Info> & M, std::map<symbol::Symbol, Info> & N);
106     void pullup(std::map<symbol::Symbol, Info> & M);
107     Info & putSymsInScope(const symbol::Symbol & sym, Block * block, Info & info);
108     Info & putSymsInScope(const symbol::Symbol & sym);
109     Info & addRead(const symbol::Symbol & sym, ast::Exp * exp);
110     Info & addWrite(const symbol::Symbol & sym, const TIType & Rtype, ast::Exp * exp);
111     Info & addDefine(const symbol::Symbol & sym, const TIType & Rtype, ast::Exp * exp);
112     Info & addShare(const symbol::Symbol & Lsym, const symbol::Symbol & Rsym, const TIType & Rtype, ast::Exp * exp);
113     Info & addMacroDef(ast::FunctionDec * dec);
114     std::vector<TIType> addCall(AnalysisVisitor & visitor, const unsigned int lhs, const symbol::Symbol & sym, std::vector<TIType> & in, ast::CallExp * callexp);
115     Info & addClear(const symbol::Symbol & sym, ast::Exp * exp);
116     Info & putAndClear(const symbol::Symbol & sym, ast::Exp * exp);
117
118     virtual Block * getDefBlock(const symbol::Symbol & sym, std::map<symbol::Symbol, Info>::iterator & it);
119     virtual Info & getInfo(const symbol::Symbol & sym);
120     virtual Block * addBlock(const unsigned int id, BlockKind kind, ast::Exp * exp);
121     virtual void finalize();
122     virtual bool requiresAnotherTrip();
123     virtual void addGlobal(const symbol::Symbol & sym);
124
125     virtual GVN & getGVN()
126     {
127         return *gvn;
128     }
129
130     friend std::wostream & operator<<(std::wostream & out, const Block & block);
131 };
132
133 } // namespace analysis
134
135 #endif // __BLOCK_HXX__