Analysis: infer when a refcount is required and add colors in DebugVisitor
[scilab.git] / scilab / modules / ast / includes / analysis / data / Block.hxx
index 787dd3d..53f4243 100644 (file)
@@ -14,7 +14,6 @@
 #define __BLOCK_HXX__
 
 #include <iostream>
-#include <map>
 #include <vector>
 
 #include "allexp.hxx"
@@ -24,6 +23,7 @@
 #include "symbol.hxx"
 #include "TIType.hxx"
 #include "gvn/GVN.hxx"
+#include "tools.hxx"
 #include "dynlib_ast.h"
 
 namespace analysis
@@ -41,9 +41,10 @@ protected:
     DataManager * dm;
     ast::Exp * exp;
     Block * parent;
-    std::map<symbol::Symbol, Info> symMap;
+    tools::SymbolMap<Info> symMap;
     std::vector<Block *> blocks;
     GVN * gvn;
+    bool isReturn;
     const unsigned int id;
 
 public:
@@ -54,11 +55,11 @@ public:
     };
 
     Block(DataManager * _dm);
-    Block(const unsigned int _id, Block * _parent, ast::Exp * _exp) : dm(_parent->dm), parent(_parent), exp(_exp), gvn(&_parent->getGVN()), id(_id) { }
+    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();
 
-    inline std::map<symbol::Symbol, Info> & getMap()
+    inline tools::SymbolMap<Info> & getMap()
     {
         return symMap;
     }
@@ -85,49 +86,58 @@ public:
         return symMap.emplace(sym, info).first->second;
     }
 
-    inline static Info & addSym(std::map<symbol::Symbol, Info> & M, const symbol::Symbol & sym, Info & info)
+    inline ast::Exp * getExp()
     {
-        Data * old = info.data;
-        info.data = nullptr;
-        Info & i = M.emplace(sym, info).first->second;
-        i.data = old;
-        info.data = old;
+        return exp;
+    }
 
-        return i;
+    inline void setReturn(const bool _isReturn)
+    {
+        isReturn = _isReturn;
     }
 
-    inline ast::Exp * getExp()
+    inline bool getReturn() const
     {
-        return exp;
+        return isReturn;
     }
 
+    static Info & addSym(tools::SymbolMap<Info> & M, const symbol::Symbol & sym, Info & info);
+
     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);
+    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 & addRead(const symbol::Symbol & sym, ast::Exp * exp);
-    Info & addWrite(const symbol::Symbol & sym, const TIType & Rtype, ast::Exp * exp);
-    Info & addDefine(const symbol::Symbol & sym, const TIType & Rtype, ast::Exp * exp);
-    Info & addShare(const symbol::Symbol & Lsym, const symbol::Symbol & Rsym, const TIType & Rtype, ast::Exp * exp);
-    Info & addMacroDef(ast::FunctionDec * dec);
-    std::vector<TIType> addCall(AnalysisVisitor & visitor, const unsigned int lhs, const symbol::Symbol & sym, std::vector<TIType> & in, ast::CallExp * callexp);
-    Info & addClear(const symbol::Symbol & sym, ast::Exp * exp);
     Info & putAndClear(const symbol::Symbol & sym, ast::Exp * exp);
-
-    virtual Block * getDefBlock(const symbol::Symbol & sym, std::map<symbol::Symbol, Info>::iterator & it);
+    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()
-    {
-        return *gvn;
-    }
+    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