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