#pragma once #include "dvm.h" #include "SgUtils.h" #include "VarUsages.h" #include #include #include #include #include #include class ReadWriteAnalyzer { std::map> &funcInfo; // TODO: could be not initilized; should be rebuilt on invalidate() std::map> modified_pars; // func -> used for [in, inout, out] params, std::map usages_by_statement; // maps statements to variables used in them std::set initialized; // files was inited void init(SgFile*); VarUsages findUsagesInStatement(SgStatement* st) const; VarUsages findUsagesInAssignment(SgStatement* st) const; void findReadUsagesInExpression(SgExpression* ex, VarUsages& toExtend) const; const std::set compound_statements = { FOR_NODE, LOOP_NODE, FUNC_HEDR, PROC_HEDR }; VarUsages gatherUsagesForCompound(SgStatement* st) const; public: explicit ReadWriteAnalyzer(std::map> &funcInfo) : funcInfo(funcInfo) { } void invalidate(const std::string& fileName) { initialized.erase(fileName); } VarUsages get_usages(SgStatement*); VarUsages get_usages(std::vector&); VarUsages findUsagesInExpr(SgExpression* exp) const; VarUsages findUsagesInFuncCall(SgExpression*, const std::string&) const; void print() const; static std::map> load_modified_pars(const std::map>&); };