Program Listing for File analysis.h

Program Listing for File analysis.h#

Return to documentation for file (src/midend/programAnalysis/genericDataflow/analysis/analysis.h)

#include <featureTests.h>
#ifdef ROSE_ENABLE_SOURCE_ANALYSIS

#ifndef ANALYSIS_H
#define ANALYSIS_H

#include "VirtualCFGIterator.h"
#include "cfgUtils.h"
#include "CallGraphTraverse.h"
#include "analysisCommon.h"

class Analysis;

#include "lattice.h"
#include "nodeState.h"
#include "variables.h"
#include "varSets.h"
#include <vector>
#include <set>
#include <map>

extern int analysisDebugLevel;

class Analysis
{
  public:
    // a filter function to decide which raw CFG node to show (if return true) or hide (otherwise)
    // This is required to support custom filters of virtual CFG
    // Custom filter is set inside the intra-procedural analysis.
    // Inter-procedural analysis will copy the filter from its intra-procedural analysis during the call to its constructor.
    bool (*filter) (CFGNode cfgn);
    Analysis(bool (*f)(CFGNode) = defaultFilter):filter(f) {}
};

class InterProceduralAnalysis;

class IntraProceduralAnalysis : virtual public Analysis
{
        protected:
        InterProceduralAnalysis* interAnalysis;

        public:
        void setInterAnalysis(InterProceduralAnalysis* interAnalysis)
        { this->interAnalysis = interAnalysis; }

        // runs the intra-procedural analysis on the given function, returns true if
        // the function's NodeState gets modified as a result and false otherwise
        // state - the function's NodeState
        virtual bool runAnalysis(const Function& func, NodeState* state)=0;

        virtual ~IntraProceduralAnalysis();
};

class InterProceduralAnalysis : virtual public Analysis
{
        protected:
        IntraProceduralAnalysis* intraAnalysis;

        InterProceduralAnalysis(IntraProceduralAnalysis* intraAnalysis)
        {
                this->intraAnalysis = intraAnalysis;
                // inform the intra-procedural analysis that this inter-procedural analysis will be running it
                intraAnalysis->setInterAnalysis(this);
        }

        virtual void runAnalysis()=0;

        virtual ~InterProceduralAnalysis();
};

/********************************
 *** UnstructuredPassAnalyses ***
 ********************************/

// A driver class which simply iterates through all CFG nodes of a specified function
class UnstructuredPassIntraAnalysis : virtual public IntraProceduralAnalysis
{
        public:
        // runs the intra-procedural analysis on the given function, returns true if
        // the function's NodeState gets modified as a result and false otherwise
        // state - the function's NodeState
        bool runAnalysis(const Function& func, NodeState* state);

        virtual void visit(const Function& func, const DataflowNode& n, NodeState& state)=0;
};
// A driver class which simply iterates all function definitions one by one and call intra-procedural analysis on each of them.
class UnstructuredPassInterAnalysis : virtual public InterProceduralAnalysis
{
        public:
        UnstructuredPassInterAnalysis(IntraProceduralAnalysis& intraAnalysis) : InterProceduralAnalysis(&intraAnalysis)
        { }

        void runAnalysis();
};

#endif
#endif