00001 #pragma once
00002 #include <rose.h>
00003 #include <uniqueNameTraversal.h>
00004 #include <map>
00005 #include <virtualCFG.h>
00006
00007 namespace ssa_unfiltered_cfg
00008 {
00009
00011 class ChildUses
00012 {
00013 private:
00015 SgVarRefExp* currentVar;
00016
00018 std::set<SgVarRefExp*> uses;
00019
00020 public:
00021
00023 ChildUses() : currentVar(NULL) { }
00024
00025 ChildUses(SgVarRefExp* useNode, SgVarRefExp* var)
00026 {
00027 uses.insert(useNode);
00028 currentVar = var;
00029 }
00030
00035 ChildUses(const std::set<SgVarRefExp*>& useTree, SgVarRefExp* var = NULL)
00036 {
00037 uses = useTree;
00038 currentVar = var;
00039 }
00040
00045 std::set<SgVarRefExp*>& getUses()
00046 {
00047 return uses;
00048 }
00049
00054 void setUses(const std::set<SgVarRefExp*>& newUses)
00055 {
00056 uses = newUses;
00057 }
00058
00059 SgVarRefExp* getCurrentVar() const
00060 {
00061 return currentVar;
00062 }
00063 };
00064
00068 class DefsAndUsesTraversal : private AstBottomUpProcessing<ChildUses>
00069 {
00070 public:
00071
00072 typedef std::map<CFGNode, std::set<ssa_private::UniqueNameTraversal::VarName> > CFGNodeToVarsMap;
00073
00076 static void CollectDefsAndUses(SgNode* traversalRoot, CFGNodeToVarsMap& defs,
00077 std::map<SgNode*, std::set<SgVarRefExp*> >& uses);
00078
00079 private:
00081 CFGNodeToVarsMap cfgNodeToDefinedVars;
00082
00084 std::map<SgNode*, std::set<SgVarRefExp*> > astNodeToUsedVars;
00085
00086 public:
00087
00096 virtual ChildUses evaluateSynthesizedAttribute(SgNode* node, SynthesizedAttributesList attrs);
00097
00098 private:
00099
00101 void addUsesToNode(SgNode* node, std::set<SgVarRefExp*> uses);
00102
00104 void addDefForVarAtNode(SgVarRefExp* var, const CFGNode& node);
00105
00106 };
00107
00108 }