Analysis: infer when a refcount is required and add colors in DebugVisitor
[scilab.git] / scilab / modules / ast / includes / analysis / data / DataManager.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 __DATA_MANAGER_HXX__
14 #define __DATA_MANAGER_HXX__
15
16 #include <iostream>
17 #include <stack>
18 #include <set>
19 #include <string>
20 #include <unordered_map>
21 #include <vector>
22
23 //#define DEBUG_DATAMANAGER
24
25 #include "alldec.hxx"
26 #include "allexp.hxx"
27 #include "allvar.hxx"
28 #include "symbol.hxx"
29 #include "TIType.hxx"
30 #include "gvn/GVN.hxx"
31 #include "data/Block.hxx"
32
33 namespace analysis
34 {
35
36 class AnalysisVisitor;
37 class FunctionBlock;
38 class MacroDef;
39 class Data;
40 class Info;
41
42 class DataManager
43 {
44     friend class Block;
45
46     Block * root;
47     Block * current;
48     std::vector<Data *> data;
49     unsigned int id;
50     tools::SymbolSet globals;
51     std::stack<FunctionBlock *> callStack;
52     std::unordered_map<types::Macro *, MacroDef *> macroDefCache;
53     GVN gvn;
54
55 public:
56
57     DataManager();
58
59     ~DataManager();
60
61     GVN & getGVN();
62     GVN & getDefaultGVN();
63     MacroDef * getMacroDef(types::Macro * macro);
64     void addGlobal(const symbol::Symbol & sym);
65     void registerData(Data * _data, int line = 0, char * file = nullptr);
66     int getTmpId(const TIType & type, const bool isAnInt);
67     void releaseTmp(const int id, ast::Exp * exp);
68     Info & read(const symbol::Symbol & sym, ast::Exp * exp);
69     Info & write(const symbol::Symbol & sym, const TIType & Rtype, ast::Exp * exp);
70     Info & define(const symbol::Symbol & sym, const TIType & Rtype, const bool isAnInt, ast::Exp * exp);
71     Info & share(const symbol::Symbol & Lsym, const symbol::Symbol & Rsym, const TIType & Rtype, ast::Exp * exp);
72     Info & clear(const symbol::Symbol & sym, ast::Exp * exp);
73     Info & macrodef(ast::Exp * exp);
74     std::vector<TIType> call(AnalysisVisitor & visitor, const unsigned int lhs, const symbol::Symbol & sym, std::vector<TIType> & in, ast::CallExp * callexp);
75     void addBlock(Block::BlockKind kind, ast::Exp * exp);
76     Block * getCurrent();
77     void finalizeBlock();
78     bool requiresAnotherTrip();
79     void pushFunction(FunctionBlock * fblock);
80     FunctionBlock * poptopFunction();
81     FunctionBlock * topFunction();
82     void popFunction();
83     TIType getType(const symbol::Symbol & sym, const bool global = false);
84     Info & getInfo(const symbol::Symbol & sym);
85     friend std::wostream & operator<<(std::wostream & out, const DataManager & dm);
86
87     template<typename T>
88     bool getTypes(std::vector<TIType> & out, const T & syms)
89     {
90         Block * parent = getCurrent();
91         for (const auto & sym : syms)
92         {
93             tools::SymbolMap<Info>::iterator it;
94             Block * block = parent->getDefBlock(sym, it, false);
95             if (block)
96             {
97                 Info & i = it->second;
98                 out.emplace_back(i.type.type, i.type.isscalar());
99             }
100             else
101             {
102                 // TODO: get type in Scilab context
103                 return false;
104             }
105         }
106
107         return true;
108     }
109
110     static TIType getSymInScilabContext(GVN & gvn, const symbol::Symbol & sym, bool & exists);
111     static TIType getSymInScilabContext(GVN & gvn, const symbol::Symbol & sym, types::InternalType *& pIT);
112     static TIType getSymInScilabContext(GVN & gvn, const symbol::Symbol & sym, bool & exists, types::InternalType *& pIT);
113
114 };
115 }
116
117 #endif // __DATA_MANAGER_HXX__