Analysis: infer when a refcount is required and add colors in DebugVisitor
[scilab.git] / scilab / modules / ast / includes / analysis / data / Block.hxx
index d859da0..53f4243 100644 (file)
@@ -14,7 +14,6 @@
 #define __BLOCK_HXX__
 
 #include <iostream>
-#include <map>
 #include <vector>
 
 #include "allexp.hxx"
 #include "symbol.hxx"
 #include "TIType.hxx"
 #include "gvn/GVN.hxx"
+#include "tools.hxx"
 #include "dynlib_ast.h"
 
 namespace analysis
 {
-    class AnalysisVisitor;
-    class DataManager;
+class AnalysisVisitor;
+class DataManager;
 
-    class EXTERN_AST Block
-    {
+class EXTERN_AST Block
+{
 
-        friend class DataManager;
+    friend class DataManager;
 
-    protected:
+protected:
 
-        DataManager * dm;
-        ast::Exp * exp;
-        Block * parent;
-        std::map<symbol::Symbol, Info> symMap;
-        std::vector<Block *> blocks;
-        GVN * gvn;
-        bool isReturn;
-        const unsigned int id;
+    DataManager * dm;
+    ast::Exp * exp;
+    Block * parent;
+    tools::SymbolMap<Info> symMap;
+    std::vector<Block *> blocks;
+    GVN * gvn;
+    bool isReturn;
+    const unsigned int id;
 
-    public:
+public:
 
-        enum BlockKind
-        {
-            NORMAL, LOOP, EXCLUSIVE, MACRO
-        };
+    enum BlockKind
+    {
+        NORMAL, LOOP, EXCLUSIVE, MACRO
+    };
 
-        Block(DataManager * _dm);
-        Block(const unsigned int _id, Block * _parent, ast::Exp * _exp) : dm(_parent->dm), parent(_parent), exp(_exp), gvn(&_parent->getGVN()), isReturn(false), id(_id) { }
+    Block(DataManager * _dm);
+    Block(const unsigned int _id, Block * _parent, ast::Exp * _exp) : dm(_parent->dm), parent(_parent), exp(_exp), gvn(&_parent->getGVN()), isReturn(false), id(_id) { }
 
-        virtual ~Block();
+    virtual ~Block();
 
-        inline std::map<symbol::Symbol, Info> & getMap()
-        {
-            return symMap;
-        }
+    inline tools::SymbolMap<Info> & getMap()
+    {
+        return symMap;
+    }
 
-        inline Info & addSym(const symbol::Symbol & sym, Data * data)
-        {
+    inline Info & addSym(const symbol::Symbol & sym, Data * data)
+    {
 #ifdef DEBUG_DATAMANAGER
-            if (symMap.find(sym) != symMap.end())
-            {
-                std::wcerr << L"Table " << id << L" already contains " << sym << std::endl;
-            }
-#endif
-            return symMap.emplace(sym, data).first->second;
-        }
-
-        inline Info & addSym(const symbol::Symbol & sym, const Info & info)
+        if (symMap.find(sym) != symMap.end())
         {
-#ifdef DEBUG_DATAMANAGER
-            if (symMap.find(sym) != symMap.end())
-            {
-                std::wcerr << L"Table " << id << L" already contains " << sym << std::endl;
-            }
-#endif
-            return symMap.emplace(sym, info).first->second;
-        }
-
-        inline static Info & addSym(std::map<symbol::Symbol, Info> & M, const symbol::Symbol & sym, Info & info)
-        {
-            Data * old = info.data;
-            info.data = nullptr;
-            Info & i = M.emplace(sym, info).first->second;
-            i.data = old;
-            info.data = old;
-
-            return i;
-        }
-
-        inline ast::Exp * getExp()
-        {
-            return exp;
-        }
-
-        inline void setReturn(const bool _isReturn)
-        {
-            isReturn = _isReturn;
+            std::wcerr << L"Table " << id << L" already contains " << sym << std::endl;
         }
+#endif
+        return symMap.emplace(sym, data).first->second;
+    }
 
-        inline bool getReturn() const
+    inline Info & addSym(const symbol::Symbol & sym, const Info & info)
+    {
+#ifdef DEBUG_DATAMANAGER
+        if (symMap.find(sym) != symMap.end())
         {
-            return isReturn;
+            std::wcerr << L"Table " << id << L" already contains " << sym << std::endl;
         }
+#endif
+        return symMap.emplace(sym, info).first->second;
+    }
 
-        Info & setDefaultData(const symbol::Symbol & sym);
-        void merge(std::map<symbol::Symbol, Info> & M, std::map<symbol::Symbol, Info> & N);
-        void pullup(std::map<symbol::Symbol, Info> & M);
-        Info & putSymsInScope(const symbol::Symbol & sym, Block * block, Info & info);
-        Info & putSymsInScope(const symbol::Symbol & sym);
-
-        virtual Info & addRead(const symbol::Symbol & sym, ast::Exp * exp);
-        virtual Info & addWrite(const symbol::Symbol & sym, const TIType & Rtype, ast::Exp * exp);
-        virtual Info & addDefine(const symbol::Symbol & sym, const TIType & Rtype, ast::Exp * exp);
-        virtual Info & addShare(const symbol::Symbol & Lsym, const symbol::Symbol & Rsym, const TIType & Rtype, ast::Exp * exp);
-        virtual Info & addMacroDef(ast::FunctionDec * dec);
-        virtual std::vector<TIType> addCall(AnalysisVisitor & visitor, const unsigned int lhs, const symbol::Symbol & sym, std::vector<TIType> & in, ast::CallExp * callexp);
-        virtual Info & addClear(const symbol::Symbol & sym, ast::Exp * exp);
-
-        virtual Block * getDefBlock(const symbol::Symbol & sym, std::map<symbol::Symbol, Info>::iterator & it, const bool global);
-        virtual Info & getInfo(const symbol::Symbol & sym);
-        virtual Block * addBlock(const unsigned int id, BlockKind kind, ast::Exp * exp);
-        virtual void finalize();
-        virtual bool requiresAnotherTrip();
-        virtual void addGlobal(const symbol::Symbol & sym);
-
-        virtual GVN & getGVN()
-        {
-            return *gvn;
-        }
+    inline ast::Exp * getExp()
+    {
+        return exp;
+    }
 
-        Info & putAndClear(const symbol::Symbol & sym, ast::Exp * exp);
+    inline void setReturn(const bool _isReturn)
+    {
+        isReturn = _isReturn;
+    }
 
-        friend std::wostream & operator<<(std::wostream & out, const Block & block);
-    };
+    inline bool getReturn() const
+    {
+        return isReturn;
+    }
+
+    static Info & addSym(tools::SymbolMap<Info> & M, const symbol::Symbol & sym, Info & info);
+
+    Info & setDefaultData(const symbol::Symbol & sym);
+    void merge(tools::SymbolMap<Info> & M, tools::SymbolMap<Info> & N);
+    void pullup(tools::SymbolMap<Info> & M);
+    Info & putSymsInScope(const symbol::Symbol & sym, Block * block, Info & info);
+    Info & putSymsInScope(const symbol::Symbol & sym);
+    Info & putAndClear(const symbol::Symbol & sym, ast::Exp * exp);
+    void clone(Info & info, const symbol::Symbol & sym, ast::Exp * exp);
+
+    virtual void addLocal(const symbol::Symbol & sym, const TIType & type, const bool isIntIterator);
+    virtual int getTmpId(const TIType & type, const bool isIntIterator);
+    virtual void releaseTmp(const int id, ast::Exp * exp);
+    virtual Info & addRead(const symbol::Symbol & sym, ast::Exp * exp);
+    virtual Info & addWrite(const symbol::Symbol & sym, const TIType & Rtype, ast::Exp * exp);
+    virtual Info & addDefine(const symbol::Symbol & sym, const TIType & Rtype, const bool isAnInt, ast::Exp * exp);
+    virtual Info & addShare(const symbol::Symbol & Lsym, const symbol::Symbol & Rsym, const TIType & Rtype, ast::Exp * exp);
+    virtual Info & addMacroDef(ast::FunctionDec * dec);
+    virtual std::vector<TIType> addCall(AnalysisVisitor & visitor, const unsigned int lhs, const symbol::Symbol & sym, std::vector<TIType> & in, ast::CallExp * callexp);
+    virtual Info & addClear(const symbol::Symbol & sym, ast::Exp * exp);
+
+    virtual Block * getDefBlock(const symbol::Symbol & sym, tools::SymbolMap<Info>::iterator & it, const bool global);
+    virtual Info & getInfo(const symbol::Symbol & sym);
+    virtual Block * addBlock(const unsigned int id, BlockKind kind, ast::Exp * exp);
+    virtual void finalize();
+    virtual bool requiresAnotherTrip();
+    virtual void addGlobal(const symbol::Symbol & sym);
+    virtual GVN & getGVN();
+    virtual void clone(const symbol::Symbol & sym, ast::Exp * exp);
+    virtual void needRefCount(const tools::SymbolSet & set);
+
+    friend std::wostream & operator<<(std::wostream & out, const Block & block);
+
+private:
+
+    void needRefCount(const tools::SymbolSet & set1, const tools::SymbolSet & set2);
+
+};
 
 } // namespace analysis